Explorar el Código

文档模板管理

user5 hace 4 años
padre
commit
0b288aea8b

+ 68 - 1
src/main/java/com/jeeplus/common/bos/BosController.java

@@ -1,13 +1,15 @@
 package com.jeeplus.common.bos;
 
+import com.jeeplus.common.utils.FtlUtils;
 import com.jeeplus.modules.iim.entity.MailPage;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
-import java.io.InputStream;
+import java.io.*;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -54,4 +56,69 @@ public class BosController {
         return map;
     }
 
+
+    /**
+     * 上传doc文件并初为保存为ftl模板
+     * @param file
+     * @return
+     */
+    @RequestMapping("uploadFtl")
+    @ResponseBody
+    public Map uploadFtl(HttpServletRequest request, MultipartFile file) throws IOException {
+        Map map = new HashMap();
+        if(file.getSize()<1){
+            return null;
+        }
+        //获取文件名
+        String orgFileName = file.getOriginalFilename();
+
+        //将文件保存到相对路径
+        String path = this.getClass().getResource("/").getPath();
+        path = path.substring(1, path.length());
+
+        StringBuilder fileName=new StringBuilder(path);
+        fileName.append("freemarker/").append(orgFileName);
+        //保存文件
+        File saveFile = new File(fileName.toString());
+        if(!saveFile.exists()){
+            try {
+                FtlUtils.createDirectoryAndFile(saveFile);
+                file.transferTo(saveFile);
+                try {
+                    FtlUtils.createFMLFile(fileName.toString());
+                    FtlUtils.createFtl(fileName.toString());
+                } catch (Throwable throwable) {
+                    throwable.printStackTrace();
+                }
+                //删除模板
+                saveFile.delete();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        //获取保存模板文件的路径
+        String ftlPath=fileName.toString().substring(0,fileName.toString().lastIndexOf(".")+1)+"ftl";
+        //file 转 MultipartFile
+        File ftlFile = new File(ftlPath);
+        InputStream stream = new FileInputStream(ftlFile);
+        MultipartFile multipartFile = new MockMultipartFile(ftlFile.getName(), stream);
+        //重新设置上传到云端的路径
+        String storeAs = request.getParameter("storeAs");
+        storeAs = storeAs.substring(0,storeAs.lastIndexOf(".")+1)+"ftl";
+        try {
+            path = "/"+storeAs;
+            BOSClientUtil bosClientUtil = new BOSClientUtil();
+            InputStream inputStream = multipartFile.getInputStream();
+            String upload = bosClientUtil.upload(path, inputStream);
+            map.put("name",multipartFile.getName());
+            map.put("msg","上传成功");
+            map.put("code","1");
+            map.put("url",upload);
+        }catch (Exception e){
+            map.put("msg","上传失败");
+            map.put("code","0");
+        }
+        return map;
+    }
+
 }

+ 882 - 0
src/main/java/com/jeeplus/common/utils/FtlEnum.java

@@ -0,0 +1,882 @@
+package com.jeeplus.common.utils;
+
+import com.google.common.collect.Lists;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * doc转ftl模板enum工具类
+ * @author 徐滕
+ * @version 2020-08-26
+ */
+public enum FtlEnum {
+    /**
+     * 星光眉头图片Base64
+     */
+    PICSTR("PICSTR", "iVBORw0KGgoAAAANSUhEUgAABu0AAAFCCAYAAAD1xZBDAAAACXBIWXMAAC4jAAAuIwF4pT92AAAK\n" +
+            "TWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQ\n" +
+            "WaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec\n" +
+            "5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28A\n" +
+            "AgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0\n" +
+            "ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaO\n" +
+            "WJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHi\n" +
+            "wmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryM\n" +
+            "AgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0l\n" +
+            "YqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHi\n" +
+            "NLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYA\n" +
+            "QH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6c\n" +
+            "wR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBie\n" +
+            "whi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1c\n" +
+            "QPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqO\n" +
+            "Y4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hM\n" +
+            "WEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgoh\n" +
+            "JZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSU\n" +
+            "Eko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/p\n" +
+            "dLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Y\n" +
+            "b1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7O\n" +
+            "UndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsb\n" +
+            "di97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W\n" +
+            "7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83\n" +
+            "MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxr\n" +
+            "PGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW\n" +
+            "2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1\n" +
+            "U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd\n" +
+            "8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H0\n" +
+            "8PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+H\n" +
+            "vqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsG\n" +
+            "Lww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjg\n" +
+            "R2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4\n" +
+            "qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWY\n" +
+            "EpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1Ir\n" +
+            "eZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/Pb\n" +
+            "FWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYj\n" +
+            "i1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVk\n" +
+            "Ve9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0Ibw\n" +
+            "Da0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vz\n" +
+            "DoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+y\n" +
+            "CW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawt\n" +
+            "o22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtd\n" +
+            "UV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3r\n" +
+            "O9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0\n" +
+            "/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv95\n" +
+            "63Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+\n" +
+            "UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAA\n" +
+            "ADqYAAAXb5JfxUYAAKQtSURBVHja7P17nCTXXd//v1eyZFm+TK9vAmQ8bUEwNtjT9oK5mm0FmR8h\n" +
+            "wLZDpMBXDtsCIpFAsq2QIEGAbZF8iTYX1ApXKYTtDYgkXr6oNyQEkBL1YO62rB6MsQlY6sGWsYTx\n" +
+            "9tiSbVmX+f1RpzW9s13VdTlVdU7V6/l4zGMv05eqU+f+qXPqwO7urgAAAAAAAAAAAACU5wKSAAAA\n" +
+            "AAAAAAAAACgXQTsAAAAAAAAAAACgZATtAAAAAAAAAAAAgJIRtAMAAAAAAAAAAABKRtAOAAAAAAAA\n" +
+            "AAAAKBlBOwAAAAAAAAAAAKBkBO0AAAAAAAAAAACAkhG0AwAAAAAAAAAAAEpG0A4AAAAAAAAAAAAo\n" +
+            "GUE7AAAAAAAAAAAAoGQE7QAAAAAAAAAAAICSEbQDAAAAAAAAAAAASkbQDgAAAAAAAAAAACgZQTsA\n" +
+            "AAAAAAAAAACgZATtAAAAAAAAAAAAgJIRtAMAAAAAAAAAAABKRtAOAAAAAAAAAAAAKBlBOwAAAAAA\n" +
+            "AAAAAKBkBO0AAAAAAAAAAACAkhG0AwAAAAAAAAAAAEpG0A4AAAAAAAAAAAAoGUE7AAAAAAAAAAAA\n" +
+            "oGQE7QAAAAAAAAAAAICSEbQDAAAAAAAAAAAASkbQDgAAAAAAAAAAACgZQTsAAAAAAAAAAACgZATt\n" +
+            "AAAAAAAAAAAAgJIRtAMAAAAAAAAAAABKRtAOAAAAAAAAAAAAKBlBOwAAAAAAAAAAAKBkBO0AAAAA\n" +
+            "AAAAAACAkhG0AwAAAAAAAAAAAEpG0A4AAAAAAAAAAAAoGUE7AAAAAAAAAAAAoGQE7QAAAAAAAAAA\n" +
+            "AICSEbQDAAAAAAAAAAAASkbQDgAAAAAAAAAAACgZQTsAAAAAAAAAAACgZATtAAAAAAAAAAAAgJIR\n" +
+            "tAMAAAAAAAAAAABKRtAOAAAAAAAAAAAAKBlBOwAAAAAAAAAAAKBkzyEJsrnsbR8mEfCsR+663ObH\n" +
+            "fYek6yS9TNKHJf2spLenzqvXPswF8sCjd12u3d1dEgIAAAAAAAAAaoagHeCmn5D0vQv/frWkKyV9\n" +
+            "paQeyQMAAAAAAAAAQLWwPSbgnr+pcwN2i45JuookAgAAAAAAAACgWgjaARZddu3DNrah/Lsrfv+3\n" +
+            "0xwXAAAAAAAAAABwF0E7IAcZg2QvXvH7lxR4LAAAAAAAAAAAoAAE7YCcZAiW7a74/YECjgEAAAAA\n" +
+            "AAAAABSIoB2QozKDZgTsAAAAAAAAAADwx3NIAiBfl137sB656/LCvxMAALjpwIEDJAKAumlJmkqa\n" +
+            "eXS8fUkNc9wjSePd3d0ZlxIAAAB5ImgHFKDIwB0BO9jG5DIiNM3P1PwAKF5DUldSZ6Esjs0PYFtf\n" +
+            "0kRBAAOIayjpqPn7lvn3yPG+Q1/SEfP3w/PjP3DgwJmF4weqqmt+ZOr8ofkT8Nbu7i6JAMAbB6i0\n" +
+            "srnsbR8mEZBIjODdf5H0rRG//0VJf39pfiRg571H77rcuc4kQTuE6Ei6e9//bSmYgJsoCBhMZO+O\n" +
+            "+oakgfYm/XbM50/2fSdQN2MFE8rLbGkvgDeWPytc4KbhQh18nfk3EKf9PhtRRw3lZgAvqm6d90OG\n" +
+            "pm8y5TKjQpqSHgoprwNTXulPIK6uK3mG+W8APiFolxFBO6SxInBH0K7GCNrBI2NFT2YtDvDH5meU\n" +
+            "4fv6ko7HeN2mzg1SwD9t8yOuYyxJGo1NUw7H4o55JNPR+TdqELjLR9P8Oa1QnX5fzP7C0PzMHDju\n" +
+            "maS1BHVrn/YKFdGVdHLFa06ZskqeR5Shgpt9diT16DNY0TBpOe8njMWNI0g7iCQm5LQLSAKgeHkE\n" +
+            "1wjYAShYK+brNiQdUzDZOzODtU6K72vHfN1hBcG9+xa+r2sGOPBjIDoy13B+Hafa26IJ6crFYvm4\n" +
+            "TdIDJl0HCcoy6l0uh0v+/yRlM5e2daJglcukZum7Yeqns6YdKLvtXkvw2sO0V5XTydBn9V0zxmuO\n" +
+            "LuT5fsz3oJx8PDI/7YK/u6291flrps8wZkyWWX9hnHTS9BeG9OeB6iFoB5TEZpCNgB2AEkxTvGfN\n" +
+            "DN7uVvI7LVsZvu+kOV4GM+5r6fyJ0vWFa9glic4xyfDedQUB9XkAry8mUrBcT+EBjJMqfiJwUVd7\n" +
+            "K3J7nufhhjmPeVpvmPSdeN5+pTn2Iwv1/lDlTDanrVfnx92h6jivrI4U3CzSdvxYO6avOu+z0v+I\n" +
+            "zvPHFQQOxqrvjXIt7W2Xm2caDBTssNBPkI+PmJ+ibyxYNtY7bI6hTdGx2qYeNf35sQigV12SOgCe\n" +
+            "I2gHlMhGsI2AHYCSzDK+/2jCAds04/etiS1ZfLc4Gcpg3045XEzb4/I/OAD7mtrbhinMSOVMEjVN\n" +
+            "nXBYe6tI56u0Oh6m9UDLg6MbCibj+h7noSxt93xFT5H1U9b8vK5gsrxTo7qiG1EXdE1ZPaLgZpH7\n" +
+            "FEwuu9iWN5b0F+f9j7q0kWnP8bDKDbaXmWfGpq46ti8NbLaNA/P5Mn22kaKDg90VfelujmnSMd8V\n" +
+            "Vq/fp+oEHdrmp+nAsRzW3sq7Bl3YytlfB0xEkLbSCNoBJcsSdCNgB6BEYwuf0Uvw2pmF79sQwZ4q\n" +
+            "WNfehB8DleBZSjbTdkiSYkFfq7cJXFO2Z5am1Qn5/yPaWx3Tlx8TV23tbSMW5rj83FqsZelzNgqs\n" +
+            "n2y1LYOa1BNt7QXlJjo/GLCsrB6Wm8G7qDpvQ3uryaosax2zGGyfqvpbcbeW5Jl5GswDKE0LZezY\n" +
+            "krYuqk1orOjv5bkqOM4Y73gF+pxDk8/v09621r2cxydxxuBHxS4zVdNZUgdsmDzXIXmqiaAd4IA0\n" +
+            "wbeXve0vSTgAdZoUmJFctZBkkDu/m3Qg7ia1aYNBPhbK49EE+WbgWBsyX0F6VvZXPNjWT1DvjeXX\n" +
+            "DQs2j3VDxQRM2pY+Zz1hfp7Iz0nsxbI/f3bVIGZZXQzeNR3Iq8dWvGZ+fj5epyT9K1ksA/OtuLuq\n" +
+            "JxvBu2FEnTjO0A+erwoeW6z3mgny0FFT7/nYj28t6SPNn836kMp5juD+umpEV7YSGhF1wJopw32S\n" +
+            "qXoI2gGOWAjc7Ua97pkDFzx5yXWPhf36IknPMxX3iyW9RNJl5uezJb3C/Fy+8P8vN699kXnvc7ga\n" +
+            "AAoyS/DaiaXvnJDs5+mbtmeq8u92b6Z4zzHV+3kzeeTpBsUCSrYael4WO46ey3zSdCT3Vly3lWyS\n" +
+            "fH5ndcuTfLRu+fOaBRyzre/YSfDaobm2R+VXQKhrjntZfTBM0J64cCNOP2Gd4tN1cqF8nVS9d0hY\n" +
+            "DN41Epax9ZzbhHnwfGih/CXtj2cNPJZlVXqX8RzBZe0vffpqjNVX7XpRhZWr2IfJecClAvkdn9aj\n" +
+            "d332hS9+4mzoa/7351z55ZJ+StILJT1f0qWSLpH0goW/XyrpYvOWC82fB8zP3DPmz13z90/v+3lM\n" +
+            "0qckfdL8PC7pE+bnEUl/Kemj5nWPmf+fSfoMV7J2Wjp/+6mZ9iaSp+ZnIlZL4Vyjgr/vFHlwqfbC\n" +
+            "wO4+Sbcr+WR92eZ3vnfNz7RG1y+PPD2hWNReQ+kmmYYKJmVdrWuPmJ9N03cZO3BMadJ5TXsrI1wu\n" +
+            "r+0cPrOIa2Yr0Bi3Le2YfDk339qs70FdEXWOR804IUl9cMyUiZ6KnYBsKv7K4sXzS1uGXdXM+fM7\n" +
+            "qs+2sVH5Zp4Occp4nNesL2kTpkq+anJ+bP0M1ylNedhYOP5ZxcrKfCvSvqnTBhnPMWmbz9jXby2t\n" +
+            "XgFe5Tap1gjaAcW6VMHqt/kquFebRvyl5t8v+63P/prXdaZnQj/gY8998WsOaPc1F+w+48o5PSPp\n" +
+            "CfPziKQPKgjm/bWkv5L0x5I+ZP79MfODanUiHgj53ZEl/7dlOuQjuTFRhuIGDPttqtjJmB35F4gq\n" +
+            "yv5B/TEzaO6o+OBXI+P7D5u8ORDbhGQpmwzws2maMhRWx3UUvdWNC3pafVfvMmvmvDqOt0PzVQVl\n" +
+            "B++aSh4oWEzrsdwO3DUsf951EdeqsfC7LO1X21KfI+51CasLjpv3jxyuJ9pavspu0UbKvF30jThp\n" +
+            "+wxVmyRteVYnuGCcMo8f116AOqycdxX/JoL9bULacrOmYIvHTopzayj9TQ8bcnM1vK22Yr5ld8+M\n" +
+            "UwYp+9tJ3nOGLrn3BjVvk2qNoB1g3yWSPkvB1pNfIOmLJX2O+b/PVxCgu1RLtqe95OlPa/ecxXDn\n" +
+            "u3D3aR3Y3XXpfC9QsK3m80wn7dUhr/u0gtV4fybpLyQ9LOl9kv5E0kcUrNz7dN0zz8tTPN/Qs87q\n" +
+            "hvk5Jmlbe3ecwT+zjO/vF3y8QxGIiEqbZc9kmKQcsGfRsvAZ84mQjhmwTCp+/WyfX48ikUnTXJM1\n" +
+            "hU84370wEB+b10/21VFTlbtlbZZ8cER7k1Iut0PSXvDulDnmotuJrG2h64G7lqXPiRMEG2gvQDTJ\n" +
+            "kCY2jjnJd/cUHiAfmuOZOlrf5d1ezLfMvCXnfmND6YPnUrUmSZs5f/5UWDR/ptym6bfOMpaxeZvQ\n" +
+            "tNCeHZbd5xvG/c6hJ2UpbVmZj1N6yraiMU672aWIea2dsgwSuKsIgnZAehcqeDbc55gB4hebhvs1\n" +
+            "Cp4fd2maDz2g3aqm1yXm52WSvnLf7z4p6cMKgngPSXq3ghV6DysI6MFdA4U/yyLOIGW+VURXrLyr\n" +
+            "k60SrveIZA81VhBEX18yqLxPwcqGoYfntaFgJXDek31lm1n8rOuUbpK7a9qDNQV39Q5qXKcPtTcB\n" +
+            "P1/52dmXHpvmd2va266xavqm3p16crzzbfzaKi5w15CdFYnz1Y1FHntcbYufE1U3NXVu0CVLMLNV\n" +
+            "YD3aVPSk/OK1dU2zwLprviJpmmNZtFGHTCvQ32jl/Pn0x5c7rPO3h2wr/UrVscd58aj2ds1wWdZt\n" +
+            "lOcrGntKdiNz3HqwK25YrUJfOks5mombMb1G0A6I57mmUf5CSV8l6Qrz91cpeK4csrlUwSrEz9/3\n" +
+            "/zsKAnnvlXS/pHcqmFj+K5LMKV2Fb5EZt8Pr63O0sqTZSVU/mGBzwJ510DFJ8Z6O9p7HWHVjhd9l\n" +
+            "ftJMHHQLOI5GDp85X3XXZvAa6UalD84OtBeoWnxmWFf1uqu+o/PviF0W/B6r+LvXizZfaZhnG2e7\n" +
+            "bt6QdNbT9Hb1eUBNC59xKsa17ofkwXmaJMkrrQzHekvCerSv1dvQHlYxK1fT1HdFWpe9Zw3mZX6d\n" +
+            "fO5rtHL63K2C0qalc7fK9bEen4+T2hk/a+hxPrzN1NuuXse2xc+a38jcU7wdQuL0q0+p+gHypmmH\n" +
+            "RhUda3QsjBWOmfw0FLx0YHd3l1TI4LK3fZhEqGC5MA3A50n6GkmvlfQ6838X5/nFjz/n+frFzaOK\n" +
+            "eqbdL7/q7+jbDw/1wic/Udfr81FJ71KwEu8+Se+X9GCVTvCRX/wctwrEgQNxXjZUtm1lFjuY3Yrn\n" +
+            "4ZbODXKGbYfig7SdiDQrt9qmzGep25PomgHU/Fl4Ve/sdrS3ZV+Z5TPPjumWqhm421+npLGt9JPr\n" +
+            "q77/dgUT0zNV31TRk8rzus/GNfPBpvJfIcRg9lxnVHwwJUxDdoKgq/oMTQU7dYTZUbItJrPkqVcl\n" +
+            "+J5Vx53lHFyo7+rqRrm/QijvMrtfUTcpNky+nK/67xbY95gp3XNgEV3vNR3tP87HiXmcc5y6flU7\n" +
+            "dbAG/e7FMretva3mJ+Z3Y8/Pbyx7N/i9QSHBYGJCbmOlHRD4XElfaiqzb1Cwiu5SksVJL5X09ebn\n" +
+            "n0n6lIKJ2F9VEMx7p/y9S9pnA9kJ2lVla5moweRo3/8t2w6l6qaOH19rYSC2pmJXmpVlFLN8yuN0\n" +
+            "2NDeFjRVMrHwGcMM722u+P0xk2d6qnbwu6PVE9gnF9J7U9VfbYfiHTHt1diRtjSrnRj1xqo2ac20\n" +
+            "cXH6We0Mx3oqYf8mSVu0ZvraHYf6SQTswtuCgafH3srhM4vcYn2oc1f9T8z1mBTw3ZOKtumbKdqT\n" +
+            "tqW0mG8P3HEwXZo5fe6a9h4dEmU7og7eqsmcwmhhbDpfiX0kIh/7xmZ9Mpa7AXBEIGiHunqVpC9X\n" +
+            "8Gy1r1SwLeOLSJbcPLPkz/23dFygYCXMAQXPC4zreeZafrn596MK7l7/NUm/ZzrQT3IJChmo2JqA\n" +
+            "PG46YZMKplMvpIPt6rZWVbGdYtC/31EFQdduha/RGa1+Pk2egbtmQWVwQDmzqhVzEuKk9oJ3Va3f\n" +
+            "4zhpzr9r2rpVz6vZVrxAQFPZJ9F3YlybJN8zLqh+J3hwrr7ceAZay8JnDGK8Jk57tKG95zBHyZJu\n" +
+            "wwSvbSj5zW5xA7It7QUqJsrnRqkexaySbNcbSbeLzXrs+/uw66a8zNtbJB8XdFK2QbYCDkdqUlb2\n" +
+            "j7VWtVXTiL5Psyb5c5ygHa37TXKLNy/BIwTtUBcv1V6A7i2SXi2eRRfXrqQnJH1awSTnhxVM6jwm\n" +
+            "6XHz8wnzf49K+rj5eULSZxQEzJ5UEKh72nzm09oL4El7gbr5n89Z+LnIXKuDkl4s6SWSXijpBeb/\n" +
+            "X2gGvp8l6WXmNf8/8yNJfynpHZJ+U8HWeg9ySXPTV7btCxcNKtipaCoISIaZP3ug49E5+TJZOk3w\n" +
+            "2q7CJ9GPqNrB1XHMwXFeD7YuYpC5pmBCc5xjPdg23zE0ddlU1Zakrj6s4Maaqj3Ps5lwQmBs8sj8\n" +
+            "p7HkNZOE9Ux/RRsTt/4bZUiD5pLzLKJ+J2h3fjlzQcvCZwxX/L6T4PofNfl7ZKk+W7SVML+nbT8H\n" +
+            "MdK1s6Qu2DT1ycT8e/HvaRTdV719yXXrKv0uH6dC8laWz6yClsXP2i64nR9E9PvuVrEr/rK4cV/Z\n" +
+            "HKm8bTddSK/NGpSVsM9PW0evZXy/T+NWJOsb9uTvSvBaImiHKuftN0r6Mkl/S9IhSS8nWZb6pBm4\n" +
+            "PaQgIPdR8/MBBRMh8wDdx82fn3T0PC5WEMB7oYJVk2sKJo++SNIrJP1dSd8s6a8l/R9JfyDpgwqC\n" +
+            "kbDXcdrS6lUDcTsV7RWdsYbpdPTlx6R4nIHrETNA6npyzaeq3mTpquu0oXLvVGubdJ/mVIbj4sHW\n" +
+            "5+vp3InSY+bnjKmrqjq4bKZ4z3EFk77dikwq9BO+fn7Ha8uh899UtpUIedVLRSn72Tlj2Q22repD\n" +
+            "FaFlIU+uylOdhJ85XHGd0x7zIMFrG0oftNsw9eZwRVlc1q+e9zN9sxmSXln6YdOQ8tG2VJbr1J7b\n" +
+            "KBNZdWOMPxe3p3bVssBimc/Jc6FNd/F6NQq4Lqv6IpMVfYa2qh+0myq4AaPON1qkGa+MVP0bSiuD\n" +
+            "oB2q5EWS3izpKklfJ+m1JMmzPqkgIPd+8+eHFQRXPqggiPUxBUE5n33GnMtfL/zfO/a95oCkyxUE\n" +
+            "cC9RsGrvI9pbAQg7AzRbD2XurBj49pTfip88BsFxO5RHzXkPyU6F6ypeEPKwygmuDhfy0e2m4z2z\n" +
+            "+PkTJVs9eVLhE19ptApKx1nBn3vE/GyaazauUJlpKH3gfkPBqrsb5f9dn52U59+XOysOe6q3tqq1\n" +
+            "gtqFc8l6E9eqflBDySfrop6R1FL6idhmgrKc5XtkvicqbUamTl0TirbleXu2YfGziuzrxC17tvut\n" +
+            "Ni1b/dko+ZgmJX//pqPj4bzHKztaHVRZ1cZ3VI8VVT1zPTaEJH2gNknhB4J28N1LJf1NSd+oYBL1\n" +
+            "lTVPj09J+pCk9yqYeP0jSX8s6RHzU/dVZbsmfT5E0cnN0OJEwaoOcbegjnORg8m5gfaeRQI3r9NR\n" +
+            "c32KHBA1F/5+zHS4u5bzyVjJJkFHsrc6pVHAIHiYY7karaj/DivYQviMGWROK1BmbNS/t2lv1d3U\n" +
+            "UjkZmj+n2numU17XvZ2hzTtuyty45Ot4yuP2ZqrsK9RuqVh7u+PA+bQzvn9b8bbGTOOIee/I4jEf\n" +
+            "LzBt1xW92m5mzo3VB8WXu478Df63LX7WVoF1UFfJbh4ayc1VSL2c+li+2pK7j4xo5/z5ccaWq+qZ\n" +
+            "w2ZcNat4PpmZOuCBJX2IqZbvAjH28Dzvs/hZcXa0giMI2sFHlylYSfdWSV+h4FlmtfHUBc/R0wcu\n" +
+            "lIJnyf2pggDdH0v6PQXBqL8UwTmUa6ggoJBVa8XvfNmWsaF0d4KPzHnOyFKFDcCS5qnbzKC/qE7v\n" +
+            "WOdOTuexUmmcML/afLB1I6d025S9gNCqgWN7ycBxv/nKuyo8183WxMVhU5a6yrZF4+LnyZTpwx6k\n" +
+            "YdkDZ5/zoY1yPaxYezaqQN3QiFEumhk+f2A+f5ZDfVaE7op82xdBuzLK3dTj429ZHgu62n65OMba\n" +
+            "ZLx3jm25vfq9meNnn4qZpycx2+FRDfLLRMHWsvPzHVGEUBUE7eCLNUlvkXS1pCslvayuCfG5j33o\n" +
+            "D5//1OPf/+kLL3nokqc//RdkDThoIDtBu7UVndC5sePp0Uv5vnWFb+FUxQF+2bop3zdScc9BGmv5\n" +
+            "3fy3aW/V3czCdyR1WHa2+csjPxW99eJEwdalcerAKjzXzeY1W5N0t7IHM6ey93zVIrRL/v44zw2r\n" +
+            "uiqd/47c2Oq0ZaE+yDPgPl+tttg++PS8t1aMPL3sWT/zFVCThXZnYKG+vC5GObLxPdQjfrTno4KO\n" +
+            "uaN0N3Guq9znU8fte7dUTwO5HcTM67ose6Zh1vIxqkmeGYpHi6CCCNrBZRcqeEbdNZL+tmqw9eUz\n" +
+            "By7QUweii+VXPfK771UwwQK4PGjdlJ3JlnbIQKa78PeJ4+nRzfDeI1p9N3WZqvK8lIbS35Ee9Xyc\n" +
+            "PAb1OyHpfsT8vqNsE0dTJXuu3dxxMzB0qTxeV1LZ6Sv+RJLvz3Vr5/CZx811y5KPR+L5FknyK6ph\n" +
+            "R+6sTmh5Un8NcqzLyu5/9Uz/ZmrqxHHI62YW8l2ctnZGEXWarTK7peICmL0M77V1w5mN/N2OGJ9k\n" +
+            "vRY+9oVcH9vnkaanEo5ZxjFe0xHgZxmDQdAOLvoiSd9ifl5fk3N+4ukDF773uU8/8buvfPyDXyHp\n" +
+            "UMRrL/rYL7xca9/+1+QUuGyo/O6QbuzrLLvc6egq+zaeA9Mxn5Ktcr1OWRQZXB0pPMC4YcpDO2O5\n" +
+            "GCtdEHOobJM+LYvpdEblBbtnCiaS7k7wHpurJYvSVH6B+56yTcYNzPt9uLFgZvF6JLUtnmlRJT1H\n" +
+            "+kRN+bGFeWPh750Mn7NpuRy1Y/R949zAOVNxNxTFfd1hiqmzNgrODzbKSdb8ZPOGs4nsr9ZtZnjv\n" +
+            "lkmjs2Rt6/nOtm0LY9Fl1lSv1XaIP0aekQx+IGgHV7xAwWq6owq2v7ykBuf8kKR3SLpXOvD7n7jo\n" +
+            "BX9+6VOf2n3To394StFBO0nSzn9+iSTpsmsfJvfARSMFk6Z5TJh29nVypw6ng40O+HwlV5tslVqr\n" +
+            "gOs0MPl+VkDZOroiv4yVLXA3Ubqg3YaCSeNBhrxuS8+BOjDpiuMjC9duVoFyVeZnz0w+3L+d7E5E\n" +
+            "uWhlzINp2qOZ7N3l30xZb6FafS8X+NJfmVk65sMLfYlpzfLcjlitWwU2y2xR9VDP4vG2HO13NTOm\n" +
+            "z4ys7UXfN+04NM44oyOCdthzRqzA9ApBO5TtNZK+TdK1kq6o+Lk+IekPFUzI/U9J75X02OILzv7C\n" +
+            "yyTp4iQf+shdlxO4g4tmWh1cSKuz73vajqZBQ/buKD4st7fJdN3aigHxhqXvGCifOyX3Ty7EOZYH\n" +
+            "lH57yHGG4+ub70w6UdC0PCCZOpDv+pLuS/ieDZP+XSULupaxBVLb8XI/WMiH4xjpOc5YZ0/l380V\n" +
+            "I6EqtuTOBG3L8udtm/p0GvO7GyF9stbC35sL7aONfsBhBTdk+rrVcZZ6dkLx856tMrujYlbaNWVv\n" +
+            "Vdu6qV96jo4l09aZY7K1F+3bZs7XqmPy0YxLV3t5rehEjgjaoSxfIumfSfomSZdW+DwfVzBx+p9N\n" +
+            "Y/xneXwJgTs4aqR8gnbthb9vKPmkuK96Wh2AaZjXtRVMoszMz8T8fvHvrg1aymKz83rUXKO8B8pn\n" +
+            "FG+y4qS53kmveZY8kjZ42bSYPkNH8tZY6Z7vOQ/ctRQ/+FjGYNz1OmAmVpKtqkemJENlzBw6lrbl\n" +
+            "z1s3ZXmg1au60rS/HYvHepv5vI7qMUlKHWvHYv99vK+/PikgL9kqs+OC0qtv+fOOmb7jxLF8sUG5\n" +
+            "dI7tvu8wY3lbNcaYb5E55NLVXl8Eb71D0A5FulTBJOM/MB3DAxU9z08qWFF3WtJvSvrzOG964uQL\n" +
+            "Mn0pgTs4aKTgjsss241N9/27Iz+eUVTWwK2pve3g4gQKlt2ZH3dyoJnhXLopJgiaGdOvH3EsNvWU\n" +
+            "/6TFWPHvMB4r3VaZaYJNc0cVf1XEXMNS2uzIrdVDfaW7sWDNnEfb4QFWns8mmso/Y8+Od0g3BTlo\n" +
+            "KJ9Vv2umf9MxPzbriE4OdeNYyVdM+2ZTTADaErf/HrbF8yTjtWhZLP/9AtIrj5tCh6rGDYk7tO+l\n" +
+            "j8eLulZxy3yXPFF6v2hs/uyWNF7YJg/4iaAdivAySW+T9F2SXlvRc/ykpHdJ+mVJvyHp/yZ58yN3\n" +
+            "fY6VgyBwBweNMgysdnT+pEybJI00MZ2y9QwDj8MFHOfREtLmeEHfU0QeTdLZnz/jrqVkk5yTjHmh\n" +
+            "r2QB0ZaltHFtQDJW+q0rF1fcuSbPfL4l/+4SPyO/nuu0LbbGhHt1Q5z+y4Zpn9qyExBrJGjr5s9v\n" +
+            "uy1B/W3rOEH/fd6nO1xS3z2Oww4dS5o+V8ehtjFt328ggum+9H2z5rVJgnLZFLsrlGW4MA68T9Lt\n" +
+            "Kn473jGXwU8XkATI0Ssk3aJge8gfVzUDdu+U9E9Np+qwpJ9Q4oDd5VYP6JG7Lrf+mUBJndFlnYsO\n" +
+            "SUqnzHFFrASdKJjcSXJMIyVbzTbJeIxHZXfLy7gGDuaJLMe0ITfvjGzn8Jm3SDpo+lQTz8r9kOMF\n" +
+            "MtUNOwn6eIs3o2TVSfjaJPX5/DgbZAvE0CcJSufSODNtvUH7np+W5c/LOmaZUr94Uafs3x1nvh1v\n" +
+            "kX2DKZfCT6y0Qx6+QNL1Cu6wf0kFz+8hBZOfpyX9XpYPyjO4xqo7OGKc4b2jff9u6tw7UJdt7ZjE\n" +
+            "/s/LKmzLmiSi7k69McFg7ShZr/ImCfPvhpI9a25i4Rj7Cb6vbeH7Nh0dlAxN2qcN6B419eHIoXNq\n" +
+            "W/ysLdnf7q5oM8+OdxjjNQ3tbfc7dvhcxipuJTXyqxsGpt2JuzJ5HhBrZ2yvejFfd91COUiyetpm\n" +
+            "gBHVNjT9pnWSojQuldNmivecEpPzvuSPLQtjrSTXumP6dTMuY6EGEWO7ltx+DAIcQNAONn2RgrsG\n" +
+            "rlXw/Loq+aSkeyT9goLtLx/z4aAJ3Pnn0bsul35xt0qnNFOwbdiRhO9b9lyqzr5/dzN2dvuyO9E3\n" +
+            "kf3VJ03tbWcRt2M+Tpnm8Ms4xTU+at43jJmfsyp6gDh0+HqNlC2YPjR1gSsDO1vbX52S/edKYnWa\n" +
+            "x2lPxgoCE8dNm9ITk4GI1lC6rYB3tDexNVaygNhIwcRXmrqxGfO7btzXvkwSnuf8ppkeWQQx+grH\n" +
+            "SIbSbDh0LM2UY9v9kjw2AdFaFj9rYOlzktzo0pV/28/7rLui7C1uoz0jubAMQTvY8GozmPl2Sc+r\n" +
+            "2Ln9iYJA3UjS+21+cFFbWBK488ej1d3WdKTkwYXBks5Le9+/JzXIFlOlmyTtmvclXdmzbd43i5G+\n" +
+            "TaUPQqR5GHKW75OCrffifMf+QXLS4MRmQXljnGGQOI6ZrzaVLTiTZICYNQiU9WHueRtkzL9rSrZS\n" +
+            "Mk9tS59DwM6uuGUoTjnp69xJoCPmunfFs/Bgv25Y7PMl7fOsmzzdSfG9cd5zakkblqZfdsyUnTHZ\n" +
+            "BCvKQjfn/rvNvnWWfr0Ny/rtLaXb2SDJFr0uuiWkbpqKoJ0NDdkL6u5Y7EtNExxXTwTtitSP8Zqk\n" +
+            "O+GgZgjaIYvPlfR9kr5T0gsqdF5PSvpNST8n6X9JesL2FxT9zDkCd+57tNrPIRwp2dZw2yEdysXA\n" +
+            "3ya5JtJM56/smW/DMdVe0Gaa4TvaGQb6UyXfWz/L90nF7OXfUnHB5LTfs6ZgYqUd8zuyBtOKGiAO\n" +
+            "HS+TE2W/2/moOc9xyefStvAZmwxQJQWTjd199fY0x+/bipF/mlq+Cn1N0t2SbhcrhrBcJ8V7dva1\n" +
+            "EWnatiPmu0cp2qcoYTcWpG1/+8rneaCojqnJc3cv6b/Pf2z2AbqyE7QbiGDAWHZ3cElSV+yQ/oWM\n" +
+            "8WwZyd7Kqoni3xy9bsr8kMtZSH8o7pjv6EJ9DJyDoB3SeLGk75H0TyS9tELn9deS/puk/yTp3Xl9\n" +
+            "ySMlBWfm30vwzj0VD9jJdEoHCQYynSUd2c6SDqqLgzWX9HRukG5m+fObBZ9P04O8XnS+TLsS7nDM\n" +
+            "QdvUwjGua3Uws23hewYe5I+xsk+O9VX+pK+N7+/R+j+bJxYH9bcpmKAdyO6kTpJy0l/x+2PaCzbO\n" +
+            "uITIWDf09uWjaYa8PTJ/7y7k9Xk/aLEvNDHHGjWhdktEWUib7w+b7x2TVRBhJOmtClb25NEO2G7P\n" +
+            "JVZgl20QkU+msrelOe1bcX2xvMaefRG0K0I34euTPMICNULQDklcKukGBcG6ZoXOa6ogUHdK0gfz\n" +
+            "/KJHHAjOsOrOLTUI2C12TrtafcfRdSGdz/0d5bFj57ct94IGs5yPqeh2oCloSTk4nKFMjhQ9GTSx\n" +
+            "dJydFZ/VyPj5m/LjWVsjZQ/auTDpm3Xy55Tqsb1xHMvaxA1JJ00ZHZo/beTvONuXtWPm0SPiORw4\n" +
+            "v41et5AnpxnKUld7W2WuLdRX8zrr+L7vjuqLDlf0r9LqiaAd4vUXitC21LZMuWTWtWK+btUquyzX\n" +
+            "Jm1d1azx9Vhly3IfOOn1ZbVdMf2hIyned1J7K6oBSdIFJAFi+hZJvyfpxyvUCL9b0neYBvhfKeeA\n" +
+            "nUseqU+gyGmP1us6zBRMouxEDDjeGtGB7Oz7t0udmS1Tj8zI1ShYlnKwptWrnWyVs3bOA2FfBp5j\n" +
+            "S5/TKfEc2hnfvyNW2SUpo8ckPWTyeGvFBMEq/Riv6SY4vg2TpxtcKqSsl2zXBd0Ebdd6SP20KmCX\n" +
+            "tW08Im5CghuasvOssxFJmVsfIG49mtcY9HDKnyo+Q69t6XMGDowF+xQv5/pDi/Up/Wo8i6AdVnmD\n" +
+            "pF+V9MuSXl+Rc/pdSddI+jIFdzPsFPGlrgXKCNyV69F6pv9EwaTjqYX/2zH/bkUM+vYPKl26o3Nb\n" +
+            "rDRAuWUqi96KgcHMUhvZXPH7LIOTHfkTtJspCPK7MnFQxnd3qS/Py79xHJX0gIIgWTNFGYuzyq6p\n" +
+            "5CtBCdwhbd2wGdHv2055DIdNPh5lOIci2pMO2QUOsJUPhySldXHb1G3SvxAtxQ+irurzjXI4vqRj\n" +
+            "i3URuMtTL8N71ynTWETQDmGeK+kmSb8j6Rsrck5/Iuk7JX21pNOSnirqi10NkBG4K8ej9U73qYJJ\n" +
+            "2wPmp2H+PY14T3vfvycOnU9fTECj3PKURVGr7VbdcdvK8Nm+DWzGFj5jo8Tj72R4b9QkfV0lLV+H\n" +
+            "tbfyrml5AqGfIT+OReCu7pJuBdXLqW3rmHKV5gaJdkFp1Sa7wAE28uG22MotD3H7xV2Syqnrscoo\n" +
+            "p3mDNGWwR78tt7ySdaXpEbErCQyCdljmayW9Q9Ktkp5XgfP5c0nfI+lNkn5e0m6RX+56YIzAXbEe\n" +
+            "Jb3T6FjomOZlxOXxRrOi57WZ8f2rBm22ylsrp2sz8Ox62UrPdgnH3lD6gOGOmFyymR+Oai9411+R\n" +
+            "tjum/PVX/GR53uKGuDOYflp8t+fYl5sfS5r8eFuCujXLquk2WQYOsJEPGQeV2/8fkwzelBUpv9Vt\n" +
+            "adrTNQfHUI2FPqmv7WTXYl5pUvTwHJIAC14p6YclfVdFzudBST+pIFC3w+UNNw/cXXbtwyRGjgjY\n" +
+            "WesouzRAmXF5vBkwNeXOtqo2TRWsvklrTcEk5zDnPN6I+F3aOxI3Pbymto636VkZ7Fe0/JXdhhyN\n" +
+            "WcaPF3AuR0w90uWy0j5H2FG+23I1MvYVhzHr1yxld80cJ33I+O1d33Kb1M7hM30rsza2+xuSPUur\n" +
+            "U4toa69M+b6ust0IVLUxaN5jlkmGPuRQ7sytzExaH17ot26ZdJt4klc6lj5nzVyburRJCEHQDnPf\n" +
+            "KelfSfqsCpzLRxXcwflTks6WeSC+rWJ75K7LCdzlhICd1UHlmGRBCs2KnpeNAWBP4RMvY+U74d/K\n" +
+            "8N6hh9dr7HF+TjsQ3ZJ/KyKRzlFTJ/VJilpJUjf0lG+war4aeKJg676kN4Wsm2PMu85q0Z9NdE1s\n" +
+            "90MOK9sNT3Uqs2HYGrM8t6uYG6HS1lHtio0f1y18ztDB6zQ/LpfGyMN9dfOG+TlSw3J+2PQVqGdr\n" +
+            "jO0x8fmS7pb0c/I/YPekpDskfYmCACQBuxodt8sI2GWyv9O/RZIgw6CrisYWPmND4cGzWc7pn/a6\n" +
+            "7MjfO7y3Pc3P7ZTv61L91MpxrnmttBR/QnOz4Hp7kvJ9PS4rKq5j4TOGJGMpY5a8Vyvj/DbORr8/\n" +
+            "7/KSdo5k3bH8NCLLWRl7oSII2tXbd0r6PdlbwlumeyW9WdJ3y85kWCa+B74I3GHJwGGo4HmQYT8z\n" +
+            "BcGDgalTGjkNKidcDuAcU0uf0w35f1tlrml5MDyo+TVrltAOpLnT+Bbq7VoakAS10Y75ujKea5m2\n" +
+            "7lkvYHw8I+ugxHGd6yuHuEbhetQfTrZxZZeVLH3t47ITnLTVNp4h25U23oNj2B6znl4h6d9K+tYK\n" +
+            "nMufK5gQ+kUuq11slWlHRVbZDbR6S4I17W01c8z83xnz3nHK721ob5sjGx1SuKO1kDfGBQ0+pxVN\n" +
+            "S1vn1VH46oId2Xn2ic3ByNDjazbz8Jg7Kd6zLe4Gz9spy3VbV3Ymc+fPyhxxiSqvG/N1/YLa4S1L\n" +
+            "fcZ2zvmX/ix8as/38/GZwj5pRKT7kOQpVDvj+3dUzI1MY2V7juDIjM9dGKP0ZO+5m1WtC1ATBO3q\n" +
+            "55sk/aSkV3p+Ho9L+gkFwcePuXRgVVqlRuAOxkDp9hE/Yn42FUzWjC10ksdcjkpYUxDcnQd4t7QX\n" +
+            "wBvnNGCo8uTCls4PcCe1bgYGy9J+ouzPfgm7ps0Un3XG8+s5kX/PZmineE+Xqi5X2zmkcVt2gnZS\n" +
+            "MPkz4jJVWjNm27Op4lZfzmK0O3Hz76p6PG27uEPWSZxek5D8l7a+2g7pR2T5zKYn6Wmj3RjmfIwt\n" +
+            "BcHFgeq5qiysXu1RHRSqYWF8NSooD08sjAOHcmMXtqmCuaPbYrQDVTegGNYbQbv6WJN0q4LtI333\n" +
+            "m5K+Xw4+26qK20oSuIOCIMqm0k9OHJZ0n4JVsf0E7+vk0CGFPW3Lg9MN7QXx5g+3H5sBhI3BTpXz\n" +
+            "jq3BYEv5BcYnEfVDUkOKX+GSBhlvFzdZ5F0vjUg+lKwT4zVptsWcZOhz2qp3Vn3/rKRyX9d6clmf\n" +
+            "s69gW7c0hiFjkiyf2fQgLZvKHoTYybn9mfdF1xQEqfpi4nrer6LucK+NW6VfYD2ZdWeUI6bMuVDe\n" +
+            "hqben6i+wXuAoF1NvFHSfzR/+uxR04n+WRcPrsrPgSNwlzLDVitPdE2nKUtH8LgZLHZjvn7/AH2T\n" +
+            "XFUb6+bniMkv7Yyft1Xxzv5E2VfCzcvcOMfP36+Z4j3bIlhRtE6Ka9Qn2WKZZSz3VT23oo0dOIaW\n" +
+            "p33DVfpKvr2TrXIxI78Vnh/aKm4rVOTfni8zyrlsDRfGm2sKVtt0F8aiVbdszLNDv8qZa5FE0TuD\n" +
+            "jJV9J4/btHfjbNl9yA5ZEHVH0K76vlPBnQkv8Pw8zkj6Pkkf4JKWg8Bd7U1NXXI84+ccXRjYR2np\n" +
+            "/O1pJlyGWtow+SVL0GhQ8TSaWfqcZo6fP03wfXW+lkkG5kVpJ3x9V9wRW1S77Kod+bUi9jDZKbGG\n" +
+            "Vq/YmU9YPqDg5pl2zLohbf2x/6YOV+uhUQXzQ0fSyYW/98SqeBd1LXxGP+fj2wgZCzyg5Lu2VEWf\n" +
+            "flUp2hnfX/SYZSw72++PtLfKDUCJLiAJKusSBc+u+zn5HbD7mKQbTOff2YBdlVfZ7T/PupwrQgcM\n" +
+            "2xY+56hW78m/rJNMx9Et0wK/q5PhvVuq/sSRrbLRzOla74R8RprBcBWu5djCZ8wcLX9siwmZNn5G\n" +
+            "MlTaqnph/szFrvn3huJPtqdt04Yx27Qy292tJe9tye6W40Vr7Ev7NQUBvCHFxClNZd8aczPn/v+q\n" +
+            "OuK46WM0Kn6d9telA7JvKddhPWNZKbo/bOv71kz93SAbAOUiaFdNL5P0PyR9j+fn8U5JXy3pTpcP\n" +
+            "so5BLAJ3tda3+DnNiN+3l/zfhOR3yqqBwbbKffbojoIAQrsG12KW00TB3DSnvNJM+DmnRCDA9sB8\n" +
+            "lZbiT1ok3Razq+Bu3haX09q1apecnjuS3iAm6+ugE+P3M5076deJ+dljk5eS2FKxK3DS9kn7S+rB\n" +
+            "BxQ8+3ngaV7oafn2+UepC7wqs3HkmUe7Mfsbh035q2rfoZnT2BvJZB0/llH3TVK0nWE2VP0AOeA8\n" +
+            "gnbV83rT6f9aj8/hGUm3SrpS0vtcPtA6B68I3NXWUHZW262tGITs39phRwTtXMwLtyi4k3BTQYDs\n" +
+            "FknXSXqVGXSOLX5fnADgjoLAzpVmkNFTPYI8ts5xPWIQmEVYPmgl/JxBRa5X1vQssj5sJ3htN0Fe\n" +
+            "7CpYiXFEwYR1lyo1c308n/h/wOSPvrl+jQKPo09bXQsNRW/BdeNCPmjta2OaMb9jlLBOLLoOmSr5\n" +
+            "jUmn9p1XR3tbSkrSMfk5SdqL+B2BO3dkLSN5P1O4n7C/OlY1b8xr7Etzyk85OhnLyjDk2k4k7Zr+\n" +
+            "8kD2g882x94E7oCS8Uy7avlmST8v6SUen8NU0ndL+g0up/t4zl24R6sd1Ozvm2RI62jIAHJZJ3lC\n" +
+            "rnI2L0SxNRAZmjwwMgP1HQWB33nwYmIGFaOaXoe8y8fMDEDTbhMzihgMxrVZoXpglvH9RebzbszX\n" +
+            "JdkWs6nzA7AnFUy+dYWk2tp7Xuxi2drQuc+h3TJ5b2bK0vzPqexsd+bzFl5XOnAMA2Xfus6FeuHU\n" +
+            "Qj5o6vwVWJ2Y+aRvXrsWI991cmgftmIe490JPq+38O+Glk/qHtZeMGLmSV5YdY2OLozzUY6mhfql\n" +
+            "n+PxtVP0MdcU3KhynaoV2GrtaxdQXt/KdllZbOfXFNyoccy0DwNL+XgkO8+1W+xP+tQmAZVC0K46\n" +
+            "flDSj0q60ONz+FVJ/0jSh3w42BxXmh3w6aIRuKuloelYrln4rJbOn2hZ1kkek+y1tfhMuibJUZqJ\n" +
+            "0gXtzmj5RF0rRb1TJZsKJmdtTgbY1lC8Sb6k29KFtR/zid0uxS2RdszXLV7LZRM611moI3zlQh9j\n" +
+            "5lF6dSPqgt6Ker6reBPRU5O3xxH9zVPKb0V9nPw8MsdwdMXrbtf5q9Gi+tE+TZLGra+Pyt62bcjv\n" +
+            "OoXJe8VXluM7WdF+4ry/N1V9b0osS0vp5zmiykonos4/adqFgXn/1KH+DIE7oCQE7apxDX9G0nd5\n" +
+            "fh4/ajoluz4cbM5bQ3oXeCVwtzxvHKj2qQ4V3Blmo1M8idGhnZC7aqtHEsSypXxXaYyU7s7NQUTZ\n" +
+            "tzEA9tVY6YJ2p1TcaoVOzNd1Ewzi2yvy0VFT3w8o0rHZyg8nlW1SnXa6Hpohbc22zp/QW1bPb5jP\n" +
+            "mMbMU01Tx7TM3yfaW10/zbFsjBLUf2PTV9nY1yaPTV02XVIPrgr0bZj3dh3PC0lu5lmj+JTGRj4a\n" +
+            "53h8hzO+/6Spe0YVuFbThfRYU7Cat2qrCV3XyfDeYUT/d1UduKZgh4Tjpr/fT9GOTXMaE84Ddx2x\n" +
+            "ahooDEE7v71Q0i/I7vLnon1U0g2SfoXL+azn+njQdQ/cLQvk7qrSgbuB7ATtmjEnACZUDd4PPNPY\n" +
+            "TDFJ0DeDnU0FkxR1GVjMcv78kZJvi3tKdp5nN6zg9Rrp3K0L49hRcavspHiTFrckrJ/jHP9tJj8P\n" +
+            "hbj1rC1MqiNNvbBj/n9/O9SO+IxBgrZtUHDZSPrsrmHC+ipuPX7UnEPf0bywTnHwQtvCtVr34HoP\n" +
+            "zbn6PmYc6PygfpWCkr62c3H76WHtVSPhZx01P2mCd2PlcyPnhilfLpWzlgPH0lgY7/bEDlGw6AKS\n" +
+            "wFsvl/Q/5XfA7j2S/qY8C9g9kv+zyi719YI+Uu3nuIWec9R578qT5aPJTRXveR+rNGN0knfEHV0+\n" +
+            "55OsA/CkA915IOSw6cT3SOtEg80wMzNwjGt7Rdq3El7XqpmYNEqiV3BduKqPmXRbzLbiB/EHsvdM\n" +
+            "zKpjcgBF6i5pN9o6f9KsEVHeuwUe75kU78mz35CkHpTp03RS9q+pQ1F0eSvTmmkPGxXoH26FjIko\n" +
+            "0/lrKH3Aa6DwmyjTXrujkh4y17+Z0/g5aTl7wJF6ZWSOZdeUm26JxzF/lvR9Jh80KEqwgaCdn14p\n" +
+            "6dclvdnjczijIGD3Hl8OeFVwxqIX+Zw56xK4S5ofKhq4s9Eh3N/5bIcMXlBP4wSvbev81Z9rClbt\n" +
+            "jGrQeZ5amiiI0o/5OWGrLhbFnbQ8peo+P6Gf4LW3qNiVZ52Y1ziv812rSbkFfNLS+ZOZ7ZC2ox3x\n" +
+            "ORsFlu1RwtefUr6rWfop3jNU8mf6DhVMZs60t01nf8nPQAQCbJYP1zSUbas/36ypGjeyDCPOrUlR\n" +
+            "K7X/G9UvHkT8Put1SxK8myj5jYFJnTTHUmY/vbGvX3FSe8/DLUpvyZj2mCmrtK3IjKCdf/6GpHsk\n" +
+            "vcHjc/h/Jb1VwdaYONfzJV3m+0lUOXCXJXhbwcDdKIfPXLayY0zVUFvTBJ324Yp8VfXO86SA9J4q\n" +
+            "eK5GlPlzjaKOJ8l1GFT4mg21ehXIjqQbVfz2aJ0Yg9Rpgs9rKvlWuetii0zAJe19/74uoq7vJPys\n" +
+            "POvZuKvEb1e+d+qnqQelvZsYkhgvvPewgknE40t+joltcW1xMR07Nby+G3J3S9kk9VZUXdCguJXW\n" +
+            "/40ar8xW1P82LAbvovLBqIC0Ourg+HpdwWq3Io6rEVHXzJ8B2KVIIQueaeeX1yjYEvNVnh7/05K+\n" +
+            "V9LP+nbgBQahPsv8eK9qz7izlQfmgbuKPOtuKrsPOg7rJE+o/r3OI0XoafWzNuad53ZF85SNcxon\n" +
+            "mEgY6NyJoG3zf0OtXhkXdxC1WYPy3zUDvv2rROd37A5UzkrDTsTvzih5MK2f8jiOmDQaClFstcU7\n" +
+            "YgIf4ZoL+WRVW9pZ8VkDubV99Y5pm8YFpF8aGwnTjL4zlEMZuz3HPklb2Z6Dvei4KctjT6/bzPS1\n" +
+            "jkTUBV2yd275ME37MbA09onrqPaeD9sPGdMdKyC9NhSs6r5FxQfLo+qiw+a4Tpl6MI96q7eiz7ym\n" +
+            "YPVfU/7fSICSELTzx2sUbIn5Sk+P/5OmYfll3w684FVjL5N0cVUybRUCd3ld/11VJnA3lr2gXZuJ\n" +
+            "h8qZFvAdjQSTEvN9+K9T9YIAU2WfcB/HfN3Q/LQXvjvJtW4l+J6qm5n8O9DehO6s5HqvE5GPtpV8\n" +
+            "oqihbNtzDUzenApR+SirU0q/Egj10FL8gN2qtmhdq2+2KdKaB3n/mILVE3Ha6jHZlfJqcYwmU/Z7\n" +
+            "OR5vn/bnHCOFP1t4vsJpSDIV1v9d1U9d1Q/L44aoNQUB6uaSvvnI9NmLamfnz1/tFdj+TLT6+dvz\n" +
+            "4GZfdndvSTL/EHaNgJXYHtMPb5D0m/I3YPcxSd8sDwN2JViv2gn5ulVmEc8wrMh2mVk7ZdN9HeVV\n" +
+            "rwH266UYCJ2saMc5S3ncTFHWxkoXTGnFeM12zSYjpgvpOSn5WNoRv+soeYCoo2yTFWtiYipvZ5hM\n" +
+            "QAxdU39PYrwO+Rgq3tZ4MwWrolDv/rFNE8/Of+L59Rut+P1APN/Otk6K98RZZdfO+biPhrS7o4LT\n" +
+            "b0PB1pRx26mizJ9xP7F4LXoJxzZHGcsgDVbauW9d0q9IeoWnxz+T9HcUTAZ6p4SA05uqmIl9WnFX\n" +
+            "9DWvwIq7ccb3T82fTS0PWm8KCNdQ+kmJ+cOqxxVKj5FW33EYNfgvyuEcj6el4G7Ksar9PLw8dUL+\n" +
+            "/0almwTrWcozPa5pbnokARL02aI0M7RDiDc30FO8rbb6pj7f37/e0bk3iHSV7sbRpDfXtMVKqiL7\n" +
+            "x0ctf2bLo/M/pXK2FrdppvAtMqW9G5raZHdr0qRlP0ZeaxRw7N0l9fFQxWyRud/i1p0Dh8riPKiY\n" +
+            "dcvMtPMPRxeuFRALQTu3vdw01E1Pj/9jkt4q6bd8O/ASV4e9pqqZOe80zRoULHNFoOeBu5myPUtn\n" +
+            "bP7shPx+QlPg/YAzTx1lW8EzUrWecTdSEIxMalPF3Y0ZZ0C8o3R3IzZMnbKmYJKjxcAosZaWT96e\n" +
+            "UbqAWUv2tufqm3w65TJZdYY0hUW9BK89VbO815SdQEpP8YJ2M+2tjhysaJfTBO2mSvacnr4I2hUl\n" +
+            "j76PT8877VfkOo4UfRPEYTMWyqsPP85Q11Wl/xtlO2bfuFXA8S+rWycqdovM/fXFfMvMbk5j7bT9\n" +
+            "h3lQsZdyvJll/oGtbZEIQTt3vVDBCrsNT4//r00H43e4lLG9SNLrSYZ0fN2Gc87zwN0kZV21I4J2\n" +
+            "ZRqbDv6WGexNzM/Uct5weVC+ZtKhKf/vyJU5h1NKPinYK3hQvMow5fUY7xtE2byjsbNwXCPzXTNV\n" +
+            "77lB3ZBJibRpaDNvrSmYHOlQfVtvwwEbmgnrionqtXq2KztBuzUtX1UR1i6OyZq106vxud+ucm4G\n" +
+            "aOTwmSOtvhlvoPyCdnUKsqfp58YdhzYLOP7NiPxxW4npupHjWDtLOV8zZaud4tpnnX84uTCeBCIR\n" +
+            "tHP3uvyCpK/y9Pj/StK3yNOAXYnBny+UdDnZHx5K22EaLQxywgYFE5I3N7OFzvRi0HXHpPtsIf1n\n" +
+            "JV2L9ooBkI07B9e0t+KuCvpKNil4XcHXNk46D1Ke97KbB47KzsRww+SVNQVbzRxLMGAuQivj+7vm\n" +
+            "2rRW1NdFH9d+bLu33FjpJ9fGJB8stj9J7j5v7Pt3R9LdC32RkYLAlEt5tGHOs7VwfDOL7V+SOntI\n" +
+            "lnNOQ+XfBNZVOStrXDDf9s7HfljYWG3Vjjbr1AdWdBK+Psn2wM2C+oHLDFVu0G4+1h7Izd1Pjpqy\n" +
+            "m6TetlG/DlWt3X6QE4J2bvpJ+Tsp8deS/rakd/p48CWv1rqKrF9vHq+2GyrY/iCpvvmzHfEaOjL5\n" +
+            "GYW0NWvam/wtuy26r6DvOWzyY78C13Wq4C7jOM8wuK6EQX57xe/TbJfWVPQkzfzh4+McBsP785Gv\n" +
+            "1iMGoetyawKwLQJNgGvaSr6KrLnv3719fZGj5me+BdlQ5QdEhgt9o3nfoRezLe1Y7rc0VI1dAqqk\n" +
+            "5UD71K1x+vcqeE5jrd7Rpi+CdlnL7XqO5ayV8/GfihjDzpRuFxbbmg5f/zJ2t1t8JiXtOEJdQBI4\n" +
+            "559LusHTY39c0t8VAbu0ZfH/Iftj18/Dnir5CpPFrUs6Ia/ZIkfkaqTgTnYEjqs6q+16ZoAWZkfl\n" +
+            "BOxaWr0KY5DicwcxPnekbFsXpannAKAOGinbk+aSNmKZdQU3X5zV3iRXGfo6/2am+RZb4xVtTJz2\n" +
+            "L6k2WQ9L8kRdnxu4qWpOfo9ivGa+2q4qir6O3RR5bZygfczzeZA3xjj+oQPXdEr1fJ4N1WuLcKRA\n" +
+            "0M4tb5V0wtNjf0rS35dndz4/ctflz/6U7IskfQFFAB7rJXjtts69G6wT8roJyZr7gKhPMpw3qGlU\n" +
+            "5Fy6ZiC3vfB/W+b/miUN4NoxBsGTFJ8ZZ0XofBvULBhYAcD5xrKzGjdO/X9UwSr8iYqdpG4qeleJ\n" +
+            "wwomJVsp2780WmQ97EO/vnomJV77Kxd+TkX87soVr83rnG3pJHx9z5F6+saYY5Oxyr0ZeocxVGSf\n" +
+            "BgjF9pjueJ2Cu/Q83R1P/0R7zyBwngNBuv2OSLqIYgDPBxRxtuTbMR3j2UJHds2RDnsdDcz1OExS\n" +
+            "SNq7U3VQoevr0rm0c5hwSPKerNugjiSdUfptY7cVTOqOV7yuKzsT4FtaHqg8nuNnL9PSucHwZobz\n" +
+            "2xFbYwIuGcre1lLTBP2RDTN27ptjGCjf1RnDGK9Zk/SAlq9k75BVkLMm/flKmmn1c+3mY5i25T7S\n" +
+            "OKIPP4moc9sZvvNMCWOTJH3SU0o2R9HK6bjPJBzjDUybWbRt0/5NKMpAcgTt3NCQ9EvKd9l0nn5M\n" +
+            "0s/4cKAOBusk6UJJf49igAromfos7I6hHZ3/wN1uxOfRuStGR8FE2bI2aMsMyMbmzzTXJMtz6a6M\n" +
+            "8Zqu7N6lNiNL5DowDpNkq5nFz0s6QXVcQbApbf3SDSkviwG5xbKSptwknUCIqpPHIWmQVddSHd1O\n" +
+            "+PopxQhwhu32N035Xjd1Wk97N6rYbseTtjXzidHhwv/ZDqZsiWdY4Vx9kqCyJop3c0RXxd3Y1Mrp\n" +
+            "uwYltGNx7Sj5cxMbORzztpKvNB+aOqLIZ1Tf4ni9dLuy7cJyn6VrCYQiaFe+CyT9gqQv9vT4/z9J\n" +
+            "/8LVg3M0SLffVyvYHhOogq6CSZee9ia1d0yHqKfzJ1LaKwYoyN/MXIeO9u6anMiN4FWcwWDb8ndO\n" +
+            "yRK5De7XVgwmk0o7EBwq/Z2vM1OXdc3nTBytq7aV38TNKYvnPKZoWEvH4yQDCtZ36FjWtBe8a1lu\n" +
+            "y9Oc52LgrmOpTp+asj6qWR/5sOw/9vt4xerMpthmrcri1mcdBUGiIsZw7Rz6cJsqvl+YpH7up0jb\n" +
+            "dg7H3Et5jYcF1ntlPDs9TXqU3ZYyDkIkgnblOy7pGz099i1J3+nSAXkSpNvvevm7LSoQ1qHtmwFk\n" +
+            "1ECjqfC7BrfFiqciTUSQdDEtkM/gXhHlfZji89KuXNhQtm0yhx4MREcMMFETDZKgFC0Ve8d+XGs5\n" +
+            "9GnStjUnF9IqiflNF2P6Z0gw9kJ1jRUv2LJm+sejAo6pZfnztlT8NsJdxd/tbEvpVgE2LR/zZobr\n" +
+            "O9C5N1bnxYeAnStjfh/SCSUiaFeur5X0Q54e+1lJ36ZgBU2pPA3UzV0hnnGA6pqu+H0nw3uBPJwR\n" +
+            "weK8tCN+10850M7iuBkoVbWuyXMgSv0Ml7RIglJ0HT62NbnzbK+TCcbLp0y7NCZ7IYGmWGVXdUnG\n" +
+            "Jh2VH7RLOpbaMuOEosdgnQSv7aX8Dts3t3Qz5qOB8l1td7v8CUS1S25vT9HeYxWCduV5oaSfVbA9\n" +
+            "po96kt5Xxhd7HqTb7x9IupTigJqK6nTSgUFcDUufsyW3JyF9dyTk/9OssmvKzgTVUPlsW+OCKVkO\n" +
+            "QI5aFj6jLn29VasaTim4eYV6G2n0SYLKmyR4baegY1pX+FacSev2DXPcwwLTtBkxNllWR6dpr2yP\n" +
+            "MU5ZaCcGym+13RmlD27WzTZphTguIAlKc0LS53t67Kck/eciv/CRuy5/9qdCXirpOygKqKmGoh+o\n" +
+            "PSWJam8r5utalr6rLVbZ5SVqAqGf4vNsDXIOi0AtAKTRyuEzxzVLwzOSXqW950EDacohq+ywaE3F\n" +
+            "rUBvh/z/RMGc4aJtU+eFOVlwn7wT83U7GcYdTcvHPLTwGTPlE+jfZkyVSF/MOyAGVtqV4+slfben\n" +
+            "x/5OSf+oqC+rWJBuv56kl1McUFOrOspTkqj2iurI7qj8gN38u0cKJi2nqtbkZTtigJd0ANqwPCgc\n" +
+            "mHRn4ASftUgCFMzGXfrjmqbdjmnHRmSjWLa0fNK8q/QBq1Mh/Y8sn1lGnh6QPWpjU/G3/W3L/jbp\n" +
+            "s5C+R1g91jX5s2H+PTHj/6jVbfPngA4LSM9ezNd1M4wRbPbNti3WLwNz/ja37sySTnXsAwxJBsRB\n" +
+            "0K6cAc5PSTrg4bE/Luk7JX0yzy+peKBubl3SP6Y4oMY6jg16UV9DBwYZ88nPozp/smhnxcC7KfvP\n" +
+            "SyiyLdx1IO17Ynsp+K2R4b20tyjLNIfPfKvlNr0l6TaLn3dGTG4mNQupp9oZ857tz9wqOF3aKv7Z\n" +
+            "jbtkRy+0cvjMSYryMklRvooI3LVjjp02le3mCpvXwfY4pSfpbkufdQt9ycRtGhALQbvi/aikKzw9\n" +
+            "9h+R9J68Prwmwbq5H5P0IooDaqqh6LvstkiiUjXNwKBp/j3IMGBpeXC+IweO4UxEmVhT8ZMyddMT\n" +
+            "QTsAKNKO7Aftzsj91WtDMWFXVYOCv49+C8oefyUdn3Rivi7vwF03ZhvVdeQ67OTQto2UbPVmmG2x\n" +
+            "4jepdZIAcfFMu2J9uQrcWtKyd0i6Pa8Pr1nA7i2Svo3igBpb1WGfkUSlGitY7XXY/Nxt/q+Z4rMa\n" +
+            "Dg4Y95s4kOZDsl2p1hJMJAAAgknErH0N2yYepFuDrFNJWwX35bop+783cqlqYaPA72rHfF1LybZV\n" +
+            "zusZdw3F2wK3r2w3ljRlZxtpKb9t/HuW6qIZRS6RTZIAcRG0K86Fkv69/Fzd+ISCrRyftv3Bj9x1\n" +
+            "ed0Cdi+U9B/k5/aogC2dFb8fk0Sl6Wr53V+HJT2kYu/qnVXse1YNxrbJfqVqOXQsTS5H5bUV3Jk8\n" +
+            "JCngqYmFdq9udujjpuJ6mm0p27aaSTVS9sdPiRUx9Gvz6c/EHWMmNcjhPHoxXrNpoazY7MvnVW4n\n" +
+            "Cra2TOsMbRqQL7bHLM51kr7S02O/TZa3q6tZoG7Rj0n6QooDaqyh6K0xpXyecQI7A4zjZtDVLaCT\n" +
+            "PqlZ2g9k97k58BfbplS3fu0omDDiGsN3Y2Vb6T6uWXrNt1qjj1udvDLfFm5Q8PemaUO2ZGfV0i05\n" +
+            "nldbbAdve8xdhI7iBZE7KT57zZT/tsVx4apysCM7u2+0LR3vZs5j4oHCb9qNUxcByBFBu+IazOOe\n" +
+            "HvtUQaDJmhoH7N4q6XspDqi5OAPGKclUmjgDjHVJ9ynYMrmv6JVqLQ/Oeaa9SZdZiccxNOm5bCuV\n" +
+            "rYVjmy6UkbH5/wn5M/H7GiZ/NhQEUyYUf+SkY9q+IySFs/oOHEPTszQbZRjfnqlZX++UgsnNGUUt\n" +
+            "sU25F7Q7Y/pso5LqiV7C92zLXgAhz7qyL4J2NrUsl52wfvKG6UuvGg+mvVlpzZS1loU6tBPjOLqW\n" +
+            "6mpbY+BhAePgjqQHEr7vFjFnA+SOoF0xvk/SKzw99h+S9AkbH1TjYJ0kvVF7D9QF6qwb4zVjkqnU\n" +
+            "AV5cx7S36m4U8pqGQ8cbNRg8rmASZKDygnczcwwnFQTpRqYsUB6y1w2kIcqoS+f14xrJ4bzjJEFi\n" +
+            "E9NWpXl2Ur9G6bStfJ7LVAdbKv55s+Ml9cHOQp9spHKDr4OEbcp81dCM7OTUGKoItsdgUXmoo+jg\n" +
+            "Ui/jd6+bstfO+DmrjuOU7AXjbeSHHRWzjfpEQRDueILjGlDkgfzxTLv8NeXv6qrfk/RLNj6o5gG7\n" +
+            "l5l0ZNIGDGZWT+7skEyltldJ66k1SXebAU7T8oBxXPCAdB68m6q87T6GCp552lIwqTkmWwJe1aE9\n" +
+            "U4c8oODGhlV1atlt3haXDRkMUrznFtVrZfOAbPKsWYJ66TrZWVmTpu95ncmnN0o6aPqaXdNHm5WY\n" +
+            "fm0lX7HdFjsJFKWR8+c3HT73Tsbfx3FY2W74aCl6JeeW5fGfjW3Qi2w/+gn6hANxIwBQCIJ2+fuX\n" +
+            "Km4/aZt2FUxe7mb5kEfuurzuAbuLJN0l6dUUBSBWR5iBZXlaGd57xFy7nsXPLMuagmfLTWRvOyHX\n" +
+            "NM3grOtpHwVwzVDSQ6buiDtRY+sZQ8pQjmdcOmTM90kCv5uq1yo7+rXnGoX8/7aCLSdvlPQq03cc\n" +
+            "lpyv+3JvYjppmlxH/quUpEGgIscwUd/Vlb2b13s5vXf+zNFZAemRZ5nPqqPVN5Oxyg4oENtj5uvV\n" +
+            "kq7x9Nh/R9I9ad9c80DdotskvYVkANRQvLvsGFyWp5Xx/fNgV0N2JuWmJafHhuI/u883A+3drd0z\n" +
+            "A1XKHpBe0sm0LQWTOi1L39/iEqAkbQWrkzZi5PkOyVVrU0lXmjwzM/2OiSf9q5Y5/rKOtZ+wnblO\n" +
+            "5QY+UU3bIflwzdTvoyW/61r8/rWFNieJpqSjEb/vWR4H2eiTnSphLDw11/G+FWPIGUUBKAYr7fJ1\n" +
+            "TNLFnh77v0n7RgJ2z7pF0veQDMCzneE4d9nRCSxP2+K1nsvyQPk4A5VWAelyTNVbdbe4vdKGgq38\n" +
+            "ehQBJzRJgsrb1N6kNdxwwIGfTU/Tbmbyc9TxnyHPwxhrbxXb2JM8MTT9pKnKCTy3lOy5mwTsqqfl\n" +
+            "yHFEjc06Icd92IHj7kf87vYcyouNMWNZZXisYNXzMqyyAwpG0C4/r5D0Nk+P/V2S/keaNxKwe9YP\n" +
+            "SfoRkgGQtPecnzgmJFdpbA2q5ndBNjJ8RtznPDUyHmvc71lXcNdhvwLXOWwgeZuCO2QbFIXS60tU\n" +
+            "1ykRvED1zEy+vk7nBu/OmP/rkOfhqZ72VujMn+PcK/gYBgleS8CumloeHGMnpPzYlnSuoKHwVXab\n" +
+            "OR1j1uu1pXKfaz4w/dVlY0jacqBABO3y8w8kvdDTYx8o4bPseHbdOX5MwbMMAQSGir+XPR3BagwG\n" +
+            "Wxk/c1Jg3kziuPwPbHUifjd/NmGLIoGaaCqYsBkp/7vBT8nuNlE2jMkCsNymtrW3erAjAgjwu33o\n" +
+            "L/n/2wrM170EbRMBu+pqO3IcUeP0tX19nKait6RM24+apShDy2wrn5WzDSXfMn2/gQPXuqtgFeKO\n" +
+            "giDiG8TN1UDhCNrl44WSvsPTY9+W9CtJ3kCw7lkXS/qPkn6ApACe1VeyidAxSVaJweBE2VYMTQs6\n" +
+            "74mW30kY5YjJp42KXut1BdtAdTOU+bH2tsBqUbxKMSMJlmoomKQZmPL/kIIJ2CM5f2/eAbsmlxYA\n" +
+            "rI9hwm46PKr8V9w1FX+HBwJ21dZx5DgmCY4za59n2+Trg9q7ESTpZzZCyumO8lsBnnXcs7OiLPcV\n" +
+            "LLCYmr/nOR7tmc9viYAdUIrnkAS5+GYF22P66GckfSrOCwnWneMyST8v6RtICuCczvpxksELbYuf\n" +
+            "Nd/SY5DhM6YFnfdUwQqbpHeCbpj3tj0bxDTNscdx0pxfN0OZP2z+vWPSeSR/nmFTFluD77oPrpv7\n" +
+            "8m4rYf63qYgVdusUHUBt2d/GuulInV7Venrq8LGt6hveZvozw5yOYaR4O5UQsKv+eHrNk2M9YsrO\n" +
+            "TNmC2rfLTlC8F5J2eY7fso6pBzE/f92MsXrmp451QJvqAVVH0M6+A5K+y9Njn0n6T3FeSMDuHF8r\n" +
+            "6Q5Jn0dSAJKCCYq+pGMJ37dJ0nnb6d0x13yivdWSrQyfF3cg1bJw7iMFd3MmnfReM+ea58DPtk7C\n" +
+            "1x81adxWtkDbmvms+QTYGZPuQ4peLnmaNigoky5Mcrm4JeaiKXkXFXJY+W9zm6ZcjLg059TPXQWT\n" +
+            "zOum/9h1MI36MV930tSj4xy+f9VNJvPVQmOyVaXLyyDnsZTtPkN3oe+f1KZ5v42+SVPLA3/X5Txu\n" +
+            "yzqmXnW9Z0vGWCe1F7yjPgAqhO0x7XuNpDd7euy/KumjUS/g2XXnuFDSD0v6XyJgh/rpK9iaYWT+\n" +
+            "3jad7KHpaB8jibzRUrbJ7R1z/Qf7BgqtnAeF88GsDaOU75sH7lqeXOtuivfMVxXGOcehgpWWqxwx\n" +
+            "A8yZeU+LYgijrewTHl25EbC7LkaZa1v4niz14NTi+TbIvgDlIkTT9BOnClaorS/0o3oOXrMkOzCM\n" +
+            "ZHeL4pZW71Qy73uPyVqVrjvGGfozsxyOKU6foZuiTG9KutLkaVv9kt6StCtiVWqWMU2cZ/YNIsZr\n" +
+            "95nzo90BKoKgnX3XKAjm+OiuqF8SrDuvMb5H0o9KuojkQA3NO+NHzMDyPgWT8EczDC4mJGspOhby\n" +
+            "wv5r11S2SfOi80KWAdw8cOf6AKmp9FsDzs+xG7N93ErwuUcVPENvYj6fgWZ2W54ed0PB5Od9yhbM\n" +
+            "ciEPFbldWYssDzg9ZqyztqkLH1JwQ58P2/x1E75+zbRdNtqeeTu4qo1vMm6qlKYZT7W199zdqcrZ\n" +
+            "0jur9QTlfDFYN865HBcVsMtSx/VjvGa8op9/1OSdDsUK8B9BO7sukvR3PT32D0r67bBfErB71vMV\n" +
+            "BCh+23QwgDpq5DTonpG0pcjSqd8OGQC1M3xmGdukTpQt0OFD4C7r4G2+/Uo3xmvbJm8ksaG9bab6\n" +
+            "qm/wrm3hM3ytS1sLbUvb03PYkV/PF5rSBALIQdf0i+7T6lVrE8eOvZfiPRvK9iznuYGit2s/pexb\n" +
+            "lsM96wpWoN4n6W7ZCXCPczhOW5+ZZ7Buf39SBfbLso5/4/bJVp3LmslHQ3EzJOA1nmln1+slvdbT\n" +
+            "Y/91SY/v/0+Cdc86oGAV5Q9L+iKSAzVH569a1zLLXZz9iMFSWpOS0mJoBsxpbZjP6Dh6rbuWPuek\n" +
+            "9rbDDTPT3nNWkk46rGnvweoD8zOjqNZCO+TvvtQh8+3Kiv7+Zob3Tsl2qJBN2Z8AbirZVol1LmNN\n" +
+            "0zfoKv5zgncU//lxRbVD6ynfe9Tkv2HK93dW5LUbZScwiHpwse98ypSPcYHnXuSNVFn6rknqwVHM\n" +
+            "MetR7a3enFAkAP8QtLOroyC446P/uf8/CNhJClZPdhRMHn4lyQFICiYgTinbJMYyY5K2lHYrre2I\n" +
+            "QVCWQUuRg4pxigFQlCNy8xkjTdndYmde9rsrrmNPQZAvjcXgXV/1mahqUpdmNinhO7dV3qRIs0J5\n" +
+            "F8ha9/Utf2ZbBO1Wlft2ynSa3+gwc+h8uhnfPzDtwCTle8PSqUPbDkf6QlsJxxRbZrw4KrA+nCoI\n" +
+            "co8L7pe1M6TpOOH5xZ2LWTef3ZM/u0AAMNge054Dkr7W02N/TNLvL/4HATs9T9K3SXqnpLeLgB2w\n" +
+            "bFB7pfx9dhICnQzv7Yf8f0PZAkSTktJiaik/dx0tr7Yd1epA2lDS7Rm/Z01BMHUqf7dMTGJd9dW2\n" +
+            "WJa3CzzuLQWri8uquxop37dJ3gVyN6rwuR1W8Ky6+TOtk9gpud4Mq0s7GT9jTekmxpshdegZ87sx\n" +
+            "RQkltu+LZglee50p5wMVfwPDoOD6paX0W5oOUrynn7BeOilW6gLeYaWdPZ8r6Q2eHvv9kh6d/6Pm\n" +
+            "AbvXKHgu4bfK361OgaKMFUyyjszAHf5pp3xfXqvsdhIOsFqW02Oo7Kvtjiq4m3Hm0HXu5vS5x0z5\n" +
+            "H0e8pmfyRNaVfusKnvVxuxmozipYHhsW6+Y6n79MPVJEEGlTwSRv2vzYtHAMLQFw0ZbYkizMmoKA\n" +
+            "35apP2cKJvWT1GdZ6s/ukv5qQ3ae2T1/vl0vw7nMtw0dVGTcUFR7iL0+UJ6ffThBORsypk49po4y\n" +
+            "VfKdj46Zes61cSryx1jBUwTt7HmzpEt8PPBnDlz4BxfsPr1b02DdxZK+QNLXSfpGSV+tYEtMAPHM\n" +
+            "TCd1qOzbZU5IzkJ1lH5yorvic9MaJ3z9muU0GSl70G6ePgOHBpF5Bi96Ma5bx5RvG9frmPm8rqp3\n" +
+            "57mtAZWvA3GbW7iOFWxXm6dTyh4Qb1o4jkZB9W3cY5kJqI60fdMdubnyvsr1fhLrOfeNOkoWtBub\n" +
+            "PLOm4GaQrtzcWvU+sqwX8uwfJ2njD8vNxwbkNd5Ko5/hO/tKPv9y1Iw32vTXaqVBEviJ7THtebOL\n" +
+            "B/X0gQv16Qsv0acufN7Sn8ef83x95oKL7q1RwO4yBSsir5f089rbc/7fK9jqj4AdkE5X2bcWpONY\n" +
+            "rE7K922uGHy1MxxT2YO6qaq3RWbex3IkZrraPI75qrt+xcqkrQHVxMNzb1n+vLzT4EaHyvlGha8j\n" +
+            "ULaZkm+3e0rubf2IYqUJCLYUzFO0Vf1nIeJc2wqCtrbkOZ5K+tn9mlzDNOPfHWXbQnlq2ps0/cax\n" +
+            "COQAzmOlnb10/HKXDmhXB/T4RS/Qyz/1qNYf29Zzn3lCuzpw3us+c8HFT/6j9/3spZIOSUte4Jdd\n" +
+            "BYHo5yhYQfdS02F+haTPMn9/jaSDZFkgt87qVPZXPyEfnZTv662YcMhy5/LYgXQZK/sk+IbcWHHS\n" +
+            "UPYVsLaMlHwbl1WOmzzXVTWC/i0Ln+Hrc0abOZTjvFwnd7Z7ajqaRkCV9CTdHaPuHZm6YepRm9NV\n" +
+            "ccH2bdXn2ZdpAjBTilptTbW3c0XWcfSZnPvEST+7Dqvt2imv28DCteqnHFvNA3dt1ffG6ZYAxxG0\n" +
+            "s+OzJP0NVw5mVwf0xIXP1T9838/qe/7kZ/TKx/5CF+4+HZUHRlxCAJY68T0FDzqG2zopBxe3K/rO\n" +
+            "8XaGY9pWsXelh02oDBVswWgjjYclX+eeY/muJ/vbdR6p0KCzaeEzpgycn7Upu89b3TH5bFKRPON7\n" +
+            "eQGKMlKwI0vH1FXThbp2slAOh46Xq4apwzrKtkV6GteZtHqgJnlmSLFBQhNTPrOWkVEBx5lUX/k+\n" +
+            "D9GFcXWaPuXAUr8/7U2R88Bdy9N0z3rct5V03E0BMRG0s+M1ki515WAev+gF+ifv/Q/61+/8oTgv\n" +
+            "P8DlA2B5kNpXfe6k9VU3xXu2tXqLk26GYxqXMDgO+//5c0WyaKv8SZtuAd+xmeC1M3NMtp+JsmEG\n" +
+            "rW35vR1ZM8d8XfWBd1idYitot6VgUmZaoXTzuawARRuH9FO62pv465mfkUNtSld7wbqyttJdXJ18\n" +
+            "i4JV8tsmnaYZ6qKu0q/eP5VjH21W4fr1ypz7rEdVbxNl25Vip6Cxx1bC+uSwub7Dil63dor3DGTv\n" +
+            "Jo9+hjyzYa5L18N0b3iaX5gnQ2wE7ez4MlcO5KkLLtLnPvZBff8f/ThXBUBZRrKzUgn5dXCPpHhf\n" +
+            "b8XgoqlsE0KjAgZISY4l68RBq+Tr3M1xUDDfBmyS4rqNtTdpZ9Oa9lbcTTwtmzbyzLjG574sLWzk\n" +
+            "s00FAbuZg+nWzFCGAWSvtxZ3l1hXsI3mGZW/bXNLdrbay2r/dsJ9c1wTC+mTpR84FVsEu9bHaJO8\n" +
+            "z5aRtGOQQUHHOE0x5uubMcOsYtcr7fh3YPl6nEk5vpfJbzO5t0MLUHsXkARWvMqVA/nMBRfpb3z8\n" +
+            "z3TwiY9xVQCUZUYSOK2T4j1ntDo4081wTFkfxG3b2MJnbJR8DnkMvLYV3GXdWhh8p9FXPkGDeeCu\n" +
+            "4WG5bMjO5OrE03PfH2A+7Eg5PiW3t15tpXzfNKfjmQqoj7A28Ij2Vn+XeWxlBux2JL1By1fWjBkr\n" +
+            "AJHt6JmUffRBQceYpq+5rtU7ttRlXH0qhzow67U/pvTPuweQE1ba2fGFrhzIAUlPHyAWCwAI1Uv4\n" +
+            "+h3FC8h1MxzTyLE0GsnOsxlbKieI0pb9oOGW7AYverK/TaZ07oq7mUflsmXpGvl0zjbPPUyW59rt\n" +
+            "XyHiorTnlke9tCOCdlUtRzhfX9Gr2ddMG3eLip+o7qjc7bdcfP4n4JOxkq+a6hXYBxwr3U4Gx0y/\n" +
+            "qkp1Q5rxbz+na5J029L9htp7bmsd3JgxL97n0bk2qVb9RNAuuxdJ+jxXDubipz+j9zVeo4eff7ku\n" +
+            "f/xhrg4AYFErRWe+E2MQ2Fa2CaKRY+k0szDwkcpb8WV7MGg7YDcfXN6ufLbS3TB5qu1R2bRxrBP5\n" +
+            "Kc/rNFbywNaOqffGFR6Aj3NKa9/SoUrWSILCNBT/BqjjJo/2VNyEeqvEtCFgBxTfnsbZEcWmLOV7\n" +
+            "qOrcZNJMMVY8pfyCYgNlu+l0zeSjVk3K2aTEvmtDxd5oyXP0PMWSrOwOSnqBKwdz4e5TevR5L9fx\n" +
+            "Nx7nylTXAZIAQEq9hK+/PWZntpvhmLblXtBOjh5THG3Z2VpwLo+A3VzfXP88HJZf2/DYGCCPPc6z\n" +
+            "rqTJPL/7kJaNDO+d5HA8g5LSoUnTjhL6UkmCpEfl79bNSRCwA+xIUoa2Mo7D0phl6L9vlNhfsK2T\n" +
+            "cuyTl6Gph7PYUDW3Ma3iuA81wEq77F4o6VKXDugFTz6m//J5f08X6Bnd+J6BrvjEQ7pw9+nzXndg\n" +
+            "d1cX7j79FJfQO89IuohkqIynzTUF8tZIOLjYUrwgX9LP3W9UUmd31YB4rHRbv5TN5kBrvjXqLMdB\n" +
+            "f0/S3Tl9/nFzHcceXLe2hc8YyU+HI+qWrMYmH8eZYD+Tc363aStDntnO4Rw35W/QGEiqm+I9Gypu\n" +
+            "6+ZpCWlCwA6wa1urV8fkeWNdnHFU2tU7x0x9OPL8GiVtC/JcZTc3VPZdTI6ba0N9DpSMoF12L5OD\n" +
+            "K59e8ORj+qXP+1b92iu+Xq94/GFd9Mxn9r3igD5z4cWPf997bvumax48/QiX0StvogGtlKck/Zmk\n" +
+            "n5P06yQHctRR/DvD59vDxR2wZNmWa5DyfY2M6bFqgDv28Bq3ZXeVXbeA9makbM8dizN4bcntQExT\n" +
+            "2be28/V5du2I37UslcOxVj8bpoznTs2vfdp6c5AhPdLWi8tsKtuNG4DNNqud83c0lH6iuqjAXdHj\n" +
+            "xK2C+gtAnUxX1DVlBuzi9q3i9M+nHrc3SbbG3CmonzmQnUcPDOTXYwaASiJol90rXT2w5z/5uD59\n" +
+            "4SV6f+PV2l3y+6cPXPjkDV/905NrHjx9lsvolS+Q9FqSoVJeL+lbJP0zSf++AufT4pI6KclAoZNg\n" +
+            "ENXLcEybjg/W8gwmlX2NV7lFxd0B25X0UE6fvW7SpefwdbMxKB7JT1Hn3rT0HSNFTyzdqPK2akoz\n" +
+            "+b+lYHI8baB3nCGtFp1RMOnma95D9azL/ee2FBG4myj+CuOsyg4cAFU1iRiD3O5Av3ac8f3z56f5\n" +
+            "WH80U/QbBwWNeaeWxq+HzfhsSFEEysMz7bK7zOWDu3D3aT336Sd0yZKf5z/1SR3Y3b34xX//Ua6i\n" +
+            "Xy4kCSrrVklfWoHzaHApndNW/Ims6xIMxDrKNkE2cDzdxp5dY1sBxlMqdtXRVEGQMC/H5PZzrzoW\n" +
+            "PmPkcd0UpmXpO6LS5kzJ9VCSZ49sm/q5lTHPRNVrQwWTPXNb5t+bCiYJb5F0pYJdRjoiYAekMQ/c\n" +
+            "5dlfLqL/QsCOMRrs91mixkibkt4gN25Em8jO89OGHpahkZLdFLFTcF/TVpr2qTOoo1AugnbZvcTj\n" +
+            "Yz9w0TNPXnDRM0/qsmsf5koC5XuOqrHFVJNL6Zx+zNedStjRzzJo3Jb7E77jkt+fxzVepYwH2ssM\n" +
+            "Zndy/Pyew/msnfH92/JzW7KGogPNtgaXMwXBORfzxSRmmbzOtK3z+rmToXxPY+THA+anZf7dNmnV\n" +
+            "F8+uA/1HGzaU780xeZfTTRGw81GLJMiN7ZWtUwU3ydxifl4l954baaOeOSJ/AncNc84bCd83KLiu\n" +
+            "tDW+Xnd8/ORzn2FWUv6FZwjaZfdCj4/9QkkXzf9B4A6gTrHYwYNbHdo4K7BOKVmwpq1sK7v6Gc+r\n" +
+            "7fhgdKvAa9yRnVV2Wyrv+QWznAeGHUfLZ1vZJ3qGntZNq67JmuxNMC5LozMqf3veQcj/byqYpHuD\n" +
+            "SYPhvjp9I8N39k2+Y/AOF/srdZJnezvK8bNPiYAdUISxabP7cu9xAk2L/YijHvRl2+YaJO1/Fb3K\n" +
+            "bj6mOmPps3oO9xezzjlNSjruHfEMWMTEM+2ye67Hx37R/uO/7NqH9chdl3NVgfL8iefH38zYGR6T\n" +
+            "Bazrx3hNmtVV/QzHtO3A4GwW83VpnwtQZF62MRjcMXlgVuI1GZp8lUfgf11B8MO1QVLXUrr5qBOz\n" +
+            "XbBxzUamntvY939lGym4k75tyt44xvn2Mnzfhvk5vlAXjxd+pjSZ8FjS3QLSaEm6zdJnbeR4nFNT\n" +
+            "vtdzSOMuWQ3wRsvy5zVMP6Qnu6sLj1rsF9vUNmOTtDdH9koaW40U/xnFUda0t9NC1ZQ15h0JiImg\n" +
+            "XXYHPD72iyVdsv8/CdwBpZlI+q+en0OTy5ho0NNUvkGE5sIgKEya1VVtlbvKzlZ5i/u6NOc6LOg8\n" +
+            "+so+Kbcjd7bc6Um6O8eB98SxeqCT8f2b8jPQ0og5mdCWvTuUu5IeMH934caBubHiB/kbsjuhtW7a\n" +
+            "iKML7cHYpM1EgF+m4uav/XXLUYufd538vUkEqPN402YfvS/7W4HOuRC4a2hvW/BOxjFWmX3NkaST\n" +
+            "FvvP/YqVi+2M72+lfN+WyttytCF4h+0xs3vC42M/IOmly37BVplA4TYlfYv832qmzaWM3dGbKphA\n" +
+            "zrMTvKpTOA/YJc13WY7ZpcnyOMYpO+STAo6taanj35E7E/QjUx/moeNY3uqovltjdmO+7ojFQeZE\n" +
+            "e8+H6XiabjbyTJQNScdM2zSV29siAbDffwlDwG6vDh6JZ8PBHza2z++aPsFtOfdBpHK3ymyZvuLd\n" +
+            "pi+0biHdyjKzOJ5aV/VWWE9L+M6yt5am3fIQK+2ye8zz4/8CSfct+wUr7pCzT0r6iKQPSHrUNF47\n" +
+            "kj5hfvdp+b2SNY4Dkj4l6X2S3iXpmQqcUzPDexs1yfsNMxiZD3qOm0kA2524xooO9qb53qTf2c44\n" +
+            "AOx51vEcmbopySB1UNCxDSwMnq+TeysT+mF9k4wOO3aeWQfAvgXA09YDHYvnOZbfK3H6BX7XuoIJ\n" +
+            "utvMRENfbJ/pQ/9iRjJ441QB/ZesKy12TB085nKpu5CeRxTcANInWeCwTsb3t5Vta8i0jppxnu2x\n" +
+            "cZw609aWwpuW6s2mzp9fae9r91v7Xp/HYwa6qtaNG6OM758kHKsN6UMjDYJ22Z31/Pg/N+qXBO5g\n" +
+            "ya6kP1MQmHq3pN+X9LCkRxQErVAdrYzvHdUgjfo6/zkmG6Yj15a9FU89hQd0sjyTJEuHfdPSNW4r\n" +
+            "/zs993fsjyY4xyIGNW1lf1aBq3fOj5X+WYJx0m3swDk2LVw/XwfP3YQTCn2xwiNNutk030LTxeBd\n" +
+            "01K9ULaGpT7YmKLihSK2yJrp/Gd5JuHS1tkujG/2B0CPa28LvRlJBAd1Mr7/vhKPfT427hTUrrUt\n" +
+            "97GaCY+7WWIfL47D5hhd6f9l7bfZmI+4XcGKzP3zADPTbo4stZ8tqrL6ImiX3SOeH//KiNx8q0yC\n" +
+            "d0hoV9L/kXSPpN+Q9H4Fq+dQbRskwcpO17GQ362Zzn3XQkeyofDJoNuVfqKol3FA0bWUjv2Cr1tf\n" +
+            "8YJ2Oypm+5CGsgcxXN/qqp/TZEFLbkxqZ83DOypuRaftvJv03NflTrC1zHTLcr3PmM/IGgg/qmAC\n" +
+            "bSB3VpjYmOS6T0Bx5n2FWQHfNUrZN0+7fXpV69+wfvlh0zaRVnBNU3afaVmGNdM++7iqdV1uB+HS\n" +
+            "aKsaN9GdkZ3gY28hPSY5p7utOgGe4Zl22fn+8LdXK+YWhDznDjG933Ss3iTpKkknTCNGwK76snYo\n" +
+            "WjVIo0GMwcndyh746Wr5SrTrlD5g18g4YLploYPcUzABMjSf2U5wDCPZWYE1S/DaqTn+OJ33aQH5\n" +
+            "qJ9xIOjDs2nGyufZdi4MWJrKPpEyUHkThI0S8u5A9dZXttXFQ1PP2tiOb03BCpOJuPsX1aufiyrP\n" +
+            "k4K+a5TiPWdEECpJu7Vh+iwNyhgcMqzQucz7HG0ua6mqkP5bsnuD7aSA9rxH/V9fBO2y+4jnx/+F\n" +
+            "kl4S98UE7hBiV8Fquo6CCZy+gq0wUS+tjO9vVDx92oofbDqZsUO5/73bkt6QcQA3UPpJ4y3tBfza\n" +
+            "Cp6RdERB4OK4grsodxVMegxM57S98NPV3l7wRyxdj6Qd7L6CVYrLbFpI3yT56FiG9/sQsFtMc9fq\n" +
+            "KRfOq+xVdp0M9VLavLuh/LeSc7ntyFLmt7U3cd+VvedozSequwLsaNbgHLcLrr8n5jvjOiW2e9zf\n" +
+            "Z4hT//oSuGtySZ0cA9vWU3HPoduW9NYCvmfDjBeHOeVj6jy/8nnScfwZMwZue3ate6reik0kwPaY\n" +
+            "2X1cwTO5nufp8a8peK7dR+O+gefcYcEzkn5FwQT875Ictdeu2IDHtmHC159M+b6mzt0K6Yyyb8PU\n" +
+            "VraVQd2Y+eSwin/YedKO82jfOYxU3B3zDWWb7PMpYCfl82y7Rsnn1FT2VXb9kgecR02eHyQ4556y\n" +
+            "BZ5k+hpj1ev5Sg0LZbYfUh/b2DZrzbRVLdU3qAokMSrpO+PUv771EVzru88Dd20RAKibhkPH0jX9\n" +
+            "pSIsbqOb5fmZSfugHZ27NaENE7JxrDrOFbMVY8Qt0/aN5e/2+kWWZTiKoF12ZyU9Ln+DdhdI+mpJ\n" +
+            "DyR5E4E7SPo1Sf9a0m+TFDDaGd+/VuG06SrdXVJpAnfzgeOOgsnagYXjzzIoumXfQGjm+bUss/Pf\n" +
+            "zzBg8nUybiC7QbsNB84ni6JXaYS5raSB5ED12h5pqGx32G6HlPuugmCqrbJ1zLQ9XU/T+UpH6jqe\n" +
+            "C1x9ZfSBhooO2u0omAQfc3nOqyeTlskNk94dkq/wcSSCPHuyoO/a/9zLQYHfPb9haGq53rJ9o2AV\n" +
+            "teROgLNnxsZHzLWbmfwwUjGPq8hLR8WuloXDCNpltyPpLyS91ONz+DJJP5H0TfOtMgne1c4fSfoB\n" +
+            "BUE7YLEDZyPo1q7opEE/w3uTDkomCrZqnMrO5FBf6SeNN5ec+1DpJkJs2vYwD7WVbqWS75NxI3O9\n" +
+            "qrA1SFvZt3ft1rytOay97XKrrmchv/RWTAqMLdbFR0270/cwrV2oH2cC8jGJaEd3TNs0IZnO0VD6\n" +
+            "G2SOLPR1ET+9maDOpqniburaH7Cb99cHKvYm3K7l9ntKPoxVVl1q2zqepFtX58+pbIaMc4Bn8Uy7\n" +
+            "7J6R9F7Pz+GwpOenfTPPuauNJxWsrPsqEbDD+doWBxxV01X2gMNIybYPncjOBGBbwTPn0tgJ6UjP\n" +
+            "zOeeKvGaTD0cII1SXoO2/A+E9ysyyB1m/IzbxUqIeZ1ahzY160rGzRX1xrwu3rF43MfFagnAl3aU\n" +
+            "gF24nrIFH46KoF3S9Eb2vlERAbNlAbt5n2JU8DnbnjegLlytRRKkMtD580GHl/wA5yBoZ8fU8+O/\n" +
+            "XNLrsnwAgbvKe4+kr5X0g5IeIzmwRNvRzrcL+hY+Y03FP+C+ofRBhh1FP9NjZgaXr1KwfeZOwdfE\n" +
+            "t0HZMMVAfEtubWGS9fx3KlAPZN3msC/MB7mNCp9fS9knvnYUb8J4JvuBuyFZtNS8Aywz0vm7DLQt\n" +
+            "9BFapm3qmc+rQj++KTtBpJMOlsm8r89M0u6Sn7HJg33TNrUWxhp9pb9BEMXaWjG+K7KfuiP7wd5J\n" +
+            "xa7XpqQbZfdG2QbFACgOQTs73un58R+Q9I1ZP+Syax8meFdNv6BgguwdJAUitB37HFd0ZW9bv6ID\n" +
+            "d4MMx96LOfCZmgFe0wwEizL1KA/1lHyLvE1TlqYVKksDS5+zVcKxd5Rua9P9dcmMpuZZrYqeV9PU\n" +
+            "81nvlu8lKP8T2Z34WhcrTMrSIAkQYmbaoi0Fwbu3ys4EdUdBwOU2SfdJekhBkGZq6rKB6ed15E9Q\n" +
+            "ry97K5ZGjpXLZgH5bJnDpi97XEEw8wGTT86KgJ0vY5tVAbv5MRSxk8oZ5XNj4tjzPLBj0v86SQfN\n" +
+            "9RpUbDzoq7b8vwEVJeCZdna8R9ITkp7r8Tl8k+mgPpX1gy679mGec1cNT0v6fkk/TlIgBluD25aW\n" +
+            "B+4m8nPCumv58zZM57tbwHEfTfne65R8pcVMe9s4FvGsu4kn+aet5Fvk3a5qbjM0lJ2JnaLrkYay\n" +
+            "rzy6xfJEwpbKfaakrbIxrlgebyiY4M3anp5KkeeGCibVj1g6l76KWXHXpPtVKWwNlX/fp1VQf2rd\n" +
+            "/IRd0x0LfbEs5b+r8BsFbebD9YL67a7oSbqbolZaP7mbUz0aJ2C32P4fzekc57sIjHJMR9/6yNva\n" +
+            "W8kali5jERx3of1tmnJ6pKRjmHIZ/EPQzo4PS/qApNd6fA6vk/RGSX9o48MI3HnvE6azRacbcbQt\n" +
+            "ftaagjt143Ta54P9WcqBv43j7kf8rpHTwOmomQCY5HQ9W0q/qinNZLEWrmPHnFfez2SYeFCuGgkH\n" +
+            "pfNtYoaqpqnJX1knAsYFH/c4Y34+I/vbDc1otpws72NlnyjaVPrJ4a6pG22sDl839fko53RrknWA\n" +
+            "Uo1M/yNpO7emcoO067K3E8YqnZrlhytl5waUuo6FsxjmUK6SBOxs9teXjXPaBYzhJnI/aLdtythQ\n" +
+            "8Xe2Qflmpj1omTH70YK/n3zgIYJ2dnxG0u/K76DdAUnXylLQTtp7zh3BO+9MJf09m3kByMH+wX5Z\n" +
+            "dyyVdddaV/mspmoo3fPTZAZoXQv1zyDndN2SH0GLcYLrsK29gGeVDSwMcIpMo2HGgf+W2GawDgPP\n" +
+            "huwE7LaUbXJ4ZvLbfZbOq6P8g3YA3GibWcURPWZpqj4TpmOVv6KkrkYKth+1Zb6yLem4qW/6AGsW\n" +
+            "j6NdUB9+rOKDKXHHeiPFD9RVtc9cBRNTroYq9gaHCUnvH4J29rxD0nd5fg5XS/ohBausrGHVnVf+\n" +
+            "TMHzDf8vSQE4rZXT5w6UbuLYRsBu8Rh6OXZgxx5c32GC63BG9Xne2UTBSqK0dxHvqLggQjfjoH8+\n" +
+            "QTHLKR0PVyAvVEHT5EkbATsb+WVs6hQbE60dmmqUUJ7anva/fJZ3v60KGo4cR1Ft/8y0AV3ZDSJh\n" +
+            "dbrbasOzBMqmshfMLzJg59o4MUugbr9NsQW1a8ba2+6/iPZzQpL7h6CdPe9QsOLuYo/P4bMVBO5+\n" +
+            "3vYHs+rOC38p6ZtFwA7wwTSHz+wrXZDB9jPUZmZwcqwGg7FlejGvw465ZoOa5f2upIdSvndU0DF2\n" +
+            "lG2SKs+AneR/gNfGs5Bc0LI0UN+ynF965vOyHlfdVpegfEfl5gqJqpuZtpnHKoTX0ZOanvvQ/FlE\n" +
+            "4M7ntsbmsY9kJ2jXy5hv+6ZeWC/5ONJci20Vt33usj7uyJSdseXzshG0q2tdlpeJ6XM/kPP3bNMf\n" +
+            "9xNBO3v+wnTIvtTz8/g+Sf9Z0lN5fDir7pwebB2R9H6SAnDejuwHarpKdzfkdcrnGWpD5RO0K3Kl\n" +
+            "VRodSbfFeN1828Q6Dpymkm5JmV/7BRxfK2OZKOKO4rH83spsUIF83JKdgF0eK22nsneHfJNJgkI1\n" +
+            "OHYvyn4VjRQ8y2yoc5+7PF54Tbum5XKiehuafH+swumctf6aWk7vQcb+xS2WxnddZdty+4zKeVb3\n" +
+            "WMXfAHJGe8E6l8+JPl0+dVfasW2S6w8PEbSz52lJvyb/g3avVbDa6lfy+gJW3TnnSQXPM3wnSQHH\n" +
+            "zAMsk4WfWQ3Ou2l+5lr7BoNDyx3mlpJPgu8oCDDl1QGcmO+wvVXEyOHr3oo5ULtFxQSfXDYw+S/J\n" +
+            "loKnChhotpQtEFPUFkATj699HjctFK0rO6sObK9y3l/GemK7O9/43Edq1eQaNSp8buN9/ddlv0c9\n" +
+            "817P9G82cs5/1F974520AZpNi+OMsemrpAnYzp+nV1ZdVkTQbtv0t0YFjFFs9P2rstOFq2PbPPvd\n" +
+            "Q5LYTxeQBNYbx90KnMf3SzqQ95fMg3co3T9WEHAGyuwEzm1JeoOCu3UbprM+MJ3nWU3Sc2rOd/4z\n" +
+            "MIOn+Y/NTn1LyYMM863Y8h4c5/H5rnZY41yHTVM2+sLM1A07CQaZPQeu4apy1SxoMDwz3+froNbn\n" +
+            "tqCv7AG7HUlvzTlPz1S/rXeBIjRIApTY1yxTnm3WtvwOJtju16Rtv+c3Zdru92ylfF9Z/b28x7in\n" +
+            "FMx1NM21mhZwTpME46ay0qXuY9u8+t3bXDt/EbSz6z3Kfy/aInyZ7OyDvdJl1z5M8K5cPyvpDpIB\n" +
+            "FjoZ2xY7yRM6FoVoKLjZJEmQ4ZSKexi47e/YdDhfDSOuw46kG1XsQ9h9MDFpsmoAuq18nw8nZQ/Y\n" +
+            "nSngGPcbeXjNbd79XVZ9e9xCGrQKun5DD9K1ZSlfVcVIcN0GSYCaGudY3w49T5tJDp+XJlDWyaEv\n" +
+            "OlOyG+3mffdBiddjKvs3t20r2C3loEmPMsako5Lfj3LqsR5J6y+CdnY9LemXKnIuxyVdVNSXEbgr\n" +
+            "xe8rmAgGXOgEVmXQ5YuGGSzEfcj2fGVHV8UFFmwPZvqOXouOwifxbtfeXZg430TBpP2ZkDx7u/n9\n" +
+            "JMdjaClbwO4W5TNJUrW6dkv27/4uyjyPZLkhbjF4Py3ouKchZSuJvPN1w9J5VoHvK01suEXBbjF5\n" +
+            "/lxJ0wuP+/5ly6M/W3aAx1Z/tuy0vl35Pvag59mYzVZabCp4BnxT5a4elLLN17j+XPgqmMp+sPgM\n" +
+            "181vBO3se7ukT1bgPFqSvqPIL5yvuiOAV4hPmM7Dp0kKODQI2xQTTkUN2seKf7d3kSs7Ftkc1JyR\n" +
+            "u6vsWiFp/iozwJ2RZVcOcDomva5TMGk733Im7/TrKH3AbtscZ7/EdPNlhdG2ygls2swjWVbXnFJ5\n" +
+            "wfthhvf68uyTsaqhLwBI1t9MWqdnNbL0OYt87yufyen4h4q/E852AW3I0PRn4hzL0IHrknXce0rB\n" +
+            "Yw3acudGuSzlb8CY1Ls+6ZbKey4kLCFoZ98HJf1qRc7lRyS9pIwvXgzgEcTLxQ9Iej/JAIumCu7Q\n" +
+            "y6JPMuauofgTyPPVdW2VsxJhUpMO6+IAalNBIKesNPe9DhqaemRcwMCyK+lupQvYzVcAjktOs54H\n" +
+            "13XLpJWP5WGQIY8s1gddlTdRslg/lTnxkJeq3Dl+Sv7vVDATAJfZ6pfbrHOvq0AdPnTgs4vqZ3S1\n" +
+            "+oaxgSPXZZyy/3NKwY2EXbl541Ka9N0Ru74Ume9sjZ/a9K38R9AuHz9TkfP4HEk/6sKBEMSz6jck\n" +
+            "/TTJgBz0lX5Jv8sroarWEYwTsLtFwcoO3wfCPnRYJwqCqQfMsVIO3DeQdDJlfrxS7twVPjFl3VWn\n" +
+            "PB1wNk3aHkv5/sXg/diR/J7G0INr1ZPfExrzbVO7FahXJ5b6OD5cM6AMLQfKqM1yep1D7UzaduRU\n" +
+            "zmOtQYw6p+hnfnci5gt2HOs7jBJey3mwbur4GCZpO9QVwR+f+kJlPCsdOSFol4/flvQHFTmXGyS9\n" +
+            "2bWDIoiXaaB4g6RdkgI5DVi6KTqCLN0vrpO+KmA3H3D0HenobWd4r68T/nBXwwzgj6XIx9fJjdV1\n" +
+            "+/UVb7uiost90c/QtKVjBtxptsN0LVg3N0x5DUcOX6d5Hhs6dExJ0uuMqVMaqs7d720L13TswXmO\n" +
+            "BZTXhym6LVhmmvH9Wwq2HRx6XK63Fdw0lff4dxajjeiVMF/Q1vLA3cCxfl+cdtmXYN1i+vcTvP52\n" +
+            "8Uy0ImXNQzfK30cKYAmCdvl4WtJtFTmXCxWsyrrU5YMkiBfbv1W2SXBglYmCVQZxn5XEnUDFaCk6\n" +
+            "0ODqgGOS8PU7ZnAxPxfyFWyWobGkIwneM5+UacntVUdduRG4mwc3mx5OEDTMNU66HeaOzn3uydjR\n" +
+            "CYSkKzJ7BR1b0vTadDiPDRW++mDb5JPrJB1UMCEzFPbXYz4YcKngoTMqf6Xd4g1QE8fSZ6jVN61u\n" +
+            "KZhQf4Npg/oF1jk7EeO/MtJyZurs7X3p41r9OFrRn/ApWLc/T8SZqzklP7bSr5qtlO95A32M6jmw\n" +
+            "u8uCmywue9uHw351saR3S/qiipzqj0v6Pt9P4pG7Lq/CtfgWSb+c4n1TSa+X9AlKruMcq5cPHDiQ\n" +
+            "9q1dMyBZXzLoGpsBzpgLXoi2pPtCOuN9hwcbYce9bDJhJCYxkY+WqaviBmO2TbnyLT+2FW9Frk3b\n" +
+            "C2V34nEeGSlZQHc+OTWSHzcXNEw7EacMnFEQVCrKdEk/Y39aD01aTz1I546CCV2ZemeqejzjNG57\n" +
+            "v8wtKm4CPMtxFl02gCzt1GK+7Vpuq5IMdn3pU3VNu762b5w1UjHPWo7Sl3R8yf9fWfJYvKG9Gy6G\n" +
+            "jvaHlpWbItucPNN+GFEnnBI7IZVlLOlwzNfumLw4SF0ZExNyGkG7jCKCdpL0XZL+Y0VO9SlJXyvp\n" +
+            "t6p2DT0M5KUN2v1TVWcFaLVVJ2i32ClsmY74hAtcmoH2nmcxlntbkCQZBO8sDIJHYkUdih+whw1w\n" +
+            "h/L/ZoSWgonphrJvWbd/EKqFtmBSkbLbVbxnHM4DlAP5GYTpKFhJuOocWwVf15ZJ1/V96TxW+ROl\n" +
+            "iK8p6aGE79ky17hX4HG2lS5otym2rIL7dfi8XE0W6tA82qvdmGVmIL9W3jcWxlou9XEa5njW96Vv\n" +
+            "m2IRq48xNuPQLdPejCt0fm1zTo2FfDsSN1aXqa/lQfZFO6Z+HGStZ4gJuY2gXUYrgnaXKFht95qK\n" +
+            "nO6Dkr5M0kfrcG0dDualCdp9SMGqz49Taj1QvaAdYHMQLAYSKNhY4Xc8zld5jsRkLIPr882DCkNV\n" +
+            "46aVrsIDlDsKJn8mZAmkNNXqVZNjlR+QnSn+yuszCibV6LfABR3tBbmn5mcxb04KKlcTLV/Vv2Pa\n" +
+            "y4HqscK46Gt/N+014LymKZvL+hnbpn4c2qqriQm5jaBdRiuCdpL0zaazXhVnFASNnq7TdXYsgJcm\n" +
+            "aPeDkv41JdYTBO0AwCV97QVl5tv7jkWgDnuD6/kKoZ19+WNawfPtmAmDxeDK/LknlAdk0dK5WxHv\n" +
+            "LJQll+rbjoIJs7DAnU9bsgJllfWhgsDdfGXfvJwj37qrZdJ5QnIATteRfe0F16fKaTcXYkJuI2iX\n" +
+            "UYygnST9f5L+ToVO+6ckfW/drrVDgbukQbuZpNdK+ktKbMbyfu3DxeQPgnYA4OLgaSYmYLFc0/yM\n" +
+            "a1YmGqrONqdwR1vub6ne1N7zBxvaW7FEeQAAAF4gJuQ2gnYZxQzafb7pwD+/Qqd+TNJ/qNO19jho\n" +
+            "d1LSd1BaY5bpiMBcYfmEoB0AAAAAAACAHBATchtBu4xiBu0k6Uck3VKhU39a0tWK9zDjynAkcJc0\n" +
+            "aPc1kt5BaV0otxkDc7nnFYJ2AAAAAAAAAHJATMhtBO0yShC0u0TSH0h6fYVO/zFJXy/pd+p0zR0I\n" +
+            "3CUJ2r1XwfZFT9WqXBYQlMs1vxC0AwAAAAAAAJADYkJuew5JUJhPK3gO3H2SLqzIOb1A0q9I+joF\n" +
+            "DxCuhcuufdilrTJXOaMKBexcCsYlPWaP8gwAAAAAAAAAoASstMsowUq7uROSvr9iyfBBBYG799fp\n" +
+            "2pcYhEmy0u4rJP2+02XIw0Bc7vmGlXYAAAAAAAAAckBMyG2stCteX9JVkt5YoXP6XEn/S9LfUs0C\n" +
+            "d477M0nvdumA6hagi0oDVt4BAAAAAAAAABYRtCvepyR1Jf2ugu0lq6Ip6dclfZOk99ThQnqwTeYf\n" +
+            "SvqMC+mE8HQheAcAAAAAAAAAkKQLSIJSvEfSjRU8r3VJv6FgS8ZacDwg9Zukjx95iHQCAAAAAAAA\n" +
+            "ABC0K8/PSbqrguf12Qq2yvyGulxIhwMu7yNd/MpHBPAAAAAAAAAAoL4I2pXreyRNKnhea5LulvQd\n" +
+            "dbmQDgZaPqwSny9I4AkAAAAAAAAAgGQI2pVrR9K3SvqrCp7bxZL+k6Q+l7kUfy7pE2V8MQE7AAAA\n" +
+            "AAAAAACSI2hXvj+VdEQlBVgKcFzSf5HUqPqFdCxY9UHSAAAAAAAAAAAAfxC0c8PvSfr7kp6u6Pl9\n" +
+            "q6R7Jb2u6hfSoaDVVo3PHQAAAAAAAAAA7xC0c8cZSd9d4fM7JOm3JF1b9QvpSPDqwRqeMwAAAAAA\n" +
+            "AAAA3iJo55afk/T9FT6/hqRflPTTkl5c5QvpQBBrVqNzBQAAAAAAAADAewTt3PNvFTwHrsr+oaTf\n" +
+            "lXRVlU+y5GDWx2twjgAAAAAAAAAAVAZBOzf9qKRbKn6Or5b065L+jaTnc8mt2pX0eN5fQsAOAAAA\n" +
+            "AAAAAAB7CNq5qy/pRyp+jhdK+ueSfltSu4onWFJg60lJn67geQEAAAAAAAAAUFkE7dz2L1XtZ9zN\n" +
+            "tSTdK+knJL20aidXQoDrMwoCd1U5HwAAAAAAAAAAKo+gnfv+raQbJD1T8fO8UNL3SvoDSW+r2skV\n" +
+            "HOjaNT++nwcAAAAAAAAAALVB0M4Pd0r6e5I+UYNzvULSL0j6bwpW4FWG7wEvAnYAAAAAAAAAAOSH\n" +
+            "oJ0/flnS10v6YE3O9xpJvyvp30n67KqclK+BLwJ2AAAAAAAAAADki6CdX35X0pWS3lmT832epO+T\n" +
+            "dL+kfy5prQon5VsAjIAdAAAAAAAAAAD5I2jnnw9IeoukX6rROX+2pH+jIFj53ZKeTzYoBgE7AAAA\n" +
+            "AAAAAACKQdDOTzuSrpX0Q5KeqdF5/w1JPyPpDyX9I3m88s6HYBgBOwAAAAAAAAAAikPQzm//r6Rv\n" +
+            "kvShmp33ayX9lKQHJP2ApJf7eBIuB8UI2AEAAAAAAAAAUCyCdv77NUlvlvS/anjur5L0YwqCd/9a\n" +
+            "0hW+nYCLwTECdgAAAAAAAAAAFI+gXTVMJX2DpGOSHq/h+X+OpJslTSSdlPRVPh28S0EyAnYAAAAA\n" +
+            "AAAAAJSDoF21/AdJXyPpd2p6/i+U1JX025Luk3RU0kt9OHAXgmUE7BK5VNIbJb1G0oUkBwAAAAAA\n" +
+            "AAAgK4J21fNuSV8r6UclPVHjdGhLGkr6I0k/I+krJR1w+YDLDJoRsIttQ9JxST+sIEj8kKSnSRYA\n" +
+            "AAAAAAAAQFYE7arpCQWBhbak3615Wny2pO9WsPrw9yT9M0mf7+rBlhE8I2C30usk3SLpnQq2X31E\n" +
+            "0r+UtCnp0yQPAAAAAAAAAMCG55AElfb7kq6U1JP0LyS9qObp8WXm5xZJ/0fSr0i6R9KH6pogBOyW\n" +
+            "ep6k10v6JgXPinyDpA9K+neSfl7SYyQRKuBqSVdIOmT+HuZOSQ9KulfS/ZaP4Sbz560Rrzltvvd+\n" +
+            "cwxAlcuEy8cD8i3yd1DS9THaxhOSzpo28kGSLbUrTLk5uNAn2e+sSW8t/AnQztDOAFVrh+iDAI5h\n" +
+            "pV31fUbSv1HwrLv/TXJICp5H9o0KAjDvkfSLkr5F0otdOLiiAmkE7M7xAgUB7r6kBxQEvP+FglWZ\n" +
+            "fUlfqOCZkQTsktld8nNPjPfds+R9H7BwPNeHHNOtGT/3ppDPvSnj5y5LhzsydsTnx/p2c95Xx0iz\n" +
+            "WyW9y1yD6y0MTN6+kO6r0v5q85p7JH0sRZqGXfOrMp7HB1Lm7SSuCjl2G3nr7SGfe4el8kiZ8Ot4\n" +
+            "fCsn1OVu5ds0aZr05wPms2y1AWl/7jHHYDv9rlpo5+K0jTeZ13zAvO/qAq5lmj6d7fTftVSnXL1Q\n" +
+            "Fm5dka8OLlyTpPXBboE/+/PkHStef0eOdfH85woH63mf6vq808Gn/khRdYbL5abstCm73JRZn+ah\n" +
+            "qHaoKn2QVWU07/5OUXnNRr85bZ8ZDiJoVx9bpjL+Nkl/SnI8qyHpWkm/rCCAd1rSt0t6ZZkHlXdA\n" +
+            "jYCdLpT0WknfZa75exWsvjwu6dWS/lrSv1YQrLtF0icpKpVwfcT/H8zh+25VcFeqC25a6IindYXp\n" +
+            "KL8r5XndZDqRaTv2BxcmA66oQX6919RPtvPWTSHXYPEuzrxQJvw5Hupy8q1LrtC5E1Z35HStV7nK\n" +
+            "HMMd5jpkndg7qGBC/B6lD5JftfAZdWgbs+aje0x6HcpQH3xA2W9qKNvVlspDVep51+r6MtOB/oi/\n" +
+            "5aYMt6rafc4qt0P0Qaqbxxb7zG/n2viLoF39/FdJb5L0wwom6LDncyT9XUmnFATwNk2n9c2Snl/0\n" +
+            "weQVWKtpwO5CBavmrpX0EwpW000k/UdzzedB2o9I+leSNiT9oKQPUywq41BEx/ig8rtD7I6Sz/ug\n" +
+            "GTDfajktk3bub7J4DIdqNDC4QeHbjrxdySdsDkVch6jvokzYLxOuHg91OfnWB9er/Bs4Dpp8cUeG\n" +
+            "9H+XxTx7lfm8KpZ7G66WvWDbfNL1ao/TI2t9mWd9W1Y970JdX2Y60M74XW7KdIfgWztEH6R++Y6V\n" +
+            "dx7imXb19HEFgYlfMgW3K+likuUcL1KwpejXmH9PtfdMpT+Q9CeSnsj7IC679mE9ctflVj+vJp6r\n" +
+            "YMXclyoIuh5SELS7JOT1fyrpPyvYMvUjZP/KdlaiXK/gWQx5DLhvUjnPQZkPvuNMas6fHbfY8b5q\n" +
+            "xWe/XdKXaHWg51CMCYB7df4z625dMVCZf3+VnZV0sznXZWlwk/l93Pzw9pDfnVD4qj7KhP0y4erx\n" +
+            "UJeTb30yn7D6EpV7I+L1Ju1OJMxP92j1jRcP7svPVyv6zvyD5nPfIp4Du/8a3ZGi/Ny04hrNy46v\n" +
+            "z++6KkPbn2fgoax6vuy6vsx0oJ3xv9yUyaVyQztEHwTL3bow7ocnCNrV24MK7qy/Q9IPKFhxhOWa\n" +
+            "5udbJD0j6c8VrNYaK9h69D3K6XlntgJ3FQ7YHZD0MklvULDl5WHz5xUKVthF+T2T/39Z0uNk88pa\n" +
+            "fKhyVOf1qpw6mLeqnIeyr1qNdtp0xJed84mFAcb1IR30+SqDt8TsIO43D0iFTTicWBgEXl3jAeJp\n" +
+            "c47L7o67yeSrOJMHd4Tkh/sVP/BHmbBTJlw9Hupy8m1RTih+oO36iPOfbwF0Q8Lvv1PJJo9XTZrd\n" +
+            "aq5DnM+c33QS9XnztvFsyPW8acUxzYOZrgaTkqZ/lLMx6oSoidL7FX7jyqp+iLQ3YXo25DrGrduW\n" +
+            "tfH3JqjL0lzrq1OUnbm8VlOUXc+XWdeXmQ6utzNF1hm+lRtX0ibvcuN6fepqO0QfpBp5LU6/+YoY\n" +
+            "7QaBO88QtIMkvds0AG+W9E8lfbPYOjXKBZK+wPz8PfN/H5T0kKR3KAjg/ZGC1XmfsvGFl137IT1y\n" +
+            "1ysyvL8yAbuLJF2mYPvKz1Ow1esXSfpcSS+J+RlPS/o1ST8t6TcVBGFRbVcr3jaCV+c4AXCHil0V\n" +
+            "dpPC74Sb37AR51zvND9h21tepeg7fQ+FDFAfNAP3VYPM+yVdE/H919ek03mzScdDIXnr/hVpGfUc\n" +
+            "u2tKOqe6lglXj4e6nHxbZD5JMsl4whxf2I0H83YgyaTl6YR55IT2ntEUNul6veJN9ISdx/y4bogx\n" +
+            "MXPC/NwRMUGTZBKvaKdVzF34USvM523rqj7EvB8StkoiKnAct38yXzm/370593EOKl3QJ88t/lyo\n" +
+            "58uo68tMBx/amaLqDB/LjUtpk2e5cb0+dbUdog9SjbwWt998g1YHeV24MQUxEZjBondIequkrzIV\n" +
+            "9lMkSWyfq2ArzX+h4LmBW5L+WNL/lvQvJf19k64vTlvuDn77R1MdmKcBu+cqCM692aRdX0GgbUvB\n" +
+            "1qT/Q9LtCp5R11K8gN0jCp5n9yYFgelfFwG7uog7QMrzoe6HVNw+4lcofHXb/aYDnXRwd0Lhk5FR\n" +
+            "6XtVRIfywYTffzrkXOvy8PMbIgaDt67Ie7dGDBTL2qqormXCxeOhLiffup5P7lVwo8fZEo99frPJ\n" +
+            "nQnbu/1586qI+vgaJZvguiHiesa547rqolZp3qBkk2p3RqR11Pe4Ls3KnzK3xiyini+6ri8zHWhn\n" +
+            "qlFuXFF2uaEdog+CvSBv1I1kPIfSEwTtsMzvm0L+ZZJ+TtInSJLELjIN1d+U9EMKnpf225LeJ2ki\n" +
+            "6VcVBKK+Q9LXKdh68/kKtnoM9dK3fURKEGhyPGB3iYIg5hsVbM3ak/QzJp3+yKTVb5m0Oy7pb0l6\n" +
+            "jaQXJvye35H0vQpW5/0TBStLUR9XhHROT0R0ZvNyq4qZ1AkbLJ1N0Rnfn2b3hgxco7YuW9aRvDfl\n" +
+            "99saOPvaAY+aBFl23aPu7pxvdVSmOpYJF4+Hupx860M+iXpuXJE3b9wckvaHtHry/KaIa3Iiw/U8\n" +
+            "EfF9B1VPB1ek950Wy868HfZRmroyr3N1qZ4vsq4vMx1oZ/wvN665tSLXuIrtEH2Qeom6geJQjeok\n" +
+            "rxG0Q5R3S/oHCp4VdkLSR0iSzF4u6XWSvlFBIOo/SfoNSe9VsILsfvPvH5d0o4KVZF9v3vMSSZf+\n" +
+            "1me9+aIV37H70Ute+vhF3/Gpss7xIkkvWDjXt0j6NgWBs3+l4Plxv68gMPen2nse022SvlvBisQv\n" +
+            "yNjAPyrpPypYqffVkn5KwUo71M/1EZ2Y+0uYAHh7AYODsA5Y0tVtSjBhkKTTl/YY7g+ZPKjTYCBq\n" +
+            "oHarzp+4DtsCZb7dkQvqViZ8KKPU5eRbV0VtxVyUsxH1cFR7dHVEfZz1uaJhq6YPqr53uoetQMqa\n" +
+            "3j7XsWF5JMnNT8te/6DFa+ZSPV9EXV9mOtDOVKPcuOjtgmvtEH2QegrbrUhcGz/wTDvE8QFTEd8m\n" +
+            "6W2S/h8Fq6Ngz6WSXml+pGD13YIDT1/89BOznYvXPn7yC44+52s+8o7QD3rqgudc/N1f9dPfrOA5\n" +
+            "e5+S9Lj589OSnpT0GUm7OnfF3gHtBfEvNnXDhZKeZ36ev/D355njvVRBcG5N0udI+mxJDfN/LzQ/\n" +
+            "L1JxNwc8I2lT0i8pWMlIkA5hnZHTCibdTuv8ib4rTKf2tIUB3tklnz/fNiSvPfXDnoFxr4Vzmn/O\n" +
+            "/fvO66yS7YmeZWXczUvO78Ga5ekbJL0r5DovPksiai/7LHdPUyaylQkfyih1OfnWVWfNNdk/8XSw\n" +
+            "hONIc03DJlRsTczcEfK9dXj2a1HpvazsPGipXJbVDid5PteyuvhORW/T7Xo9X2ZdX2Y60M5Uo9y4\n" +
+            "mDZllBvaoehySx+kvm4Ouf5XmTbgLEnkLoJ2SOIRSf9ewbPErpL0nZK+QUHwBvm6UNJLLtx9+iUH\n" +
+            "dncjX/ipCy+55H2NLxy+4MnH5v/1jIJA3VOSnjY/z5g/5y4w3zH/rgvMz8UKVs657I8l/U9J/03S\n" +
+            "A2QVxByMRg2Wrrc0WJ0HV/a71Xx+HsGmsICYzW0QT2hvwvTOFR29sLvu0g7k7iRbP7tKbtldrIcW\n" +
+            "8lfUc+zKmjChTLh3PNTl5Nuq5JMiXWXpPWctXtM7Tdt6xZJ24ZD8D9wncVDhqy9t1Ak3m88/K//6\n" +
+            "JcuCPlcr/kqLq5bkYRt5q+x6vqy6vsx0oJ3xv9y4wIVyQztEHwTRcwenFR64O00SuYvtMZHGU5J+\n" +
+            "3RT6DQXPZnsvyVKMA9pd+fuLn/nM/nJ+ifZWxb1Y0kslXbbw8zLz/y82r3mhgtV1rgbs/kLSTyrY\n" +
+            "+vKQ6bQQsMOyAWxU5/RsSCfF1vMWop5BltfDf8M65DY7Y6e1t3/92RhpoJCBHA9AznYNwgZZN0Wk\n" +
+            "7fzalYUy4d7xUJeTb33LJwdD0qbI/HhFyDGETU6GPe/uXsvHdjpBfqqyqyLSx0ZeuVfpn0dUtmV5\n" +
+            "7grF22J22RZ/d1osV2XW82XV9WWmA+2M/+XGBS6UG9qhaPRBcDoib8BhBO2Q1Z9LukXSlyp4btmv\n" +
+            "SnqMZEEOPibpv0vqKnjO4j+W9DsKVhECywZSyzqId8bswNja4/uElk/iXaXwh0GnVVSHPOmA4sGI\n" +
+            "NN41Azr2VE/uZkVPEO/nynPs6lwmXCyj1OXkW5+ErUJ5sMDvvyOivQsTNmFl+87zsM87WMN6o4j0\n" +
+            "9tH9IekQ5zlj1+dUL7lSzxdd15eZDrQz/pcbl5RZbmiHVqMPgvsTzBnAIQTtYMunJP1XSd8sqSUC\n" +
+            "KrDjLyXdrSBQ93pJRySdUhDAA6KEDaJOL/n32ZABlq0O5jUh/3+T7N0dHNXpKnuS6poYg9k7FATw\n" +
+            "3mXShSDeamdjpO2im+XOXc51LROullHqcvKtL8Im//KcAL3CfO89Wr4t8VzU3e4HCzruexPmqaoK\n" +
+            "K48PUoSW1p9Rde2iZVv82cjDLtXzRdb1ZaYD7Yz/5cY1ZZUb2qHV6IPgwZB24wqSxm0E7ZCHD+jc\n" +
+            "rQv/uaTfl/QkSYMY/q+kn5X0dyR9sfnzlKSHSRokcH3IQHTZYPTOkM7t1ZaO5X4t35LwoOxuG3LQ\n" +
+            "ocHB/vOPu8Jr/ky2eRDvA2awx7Ya4Wkb53kaJ+TWfvV1LROullHqcvKtD94ue8+Huce0MXF+PmDa\n" +
+            "pah26LSiJ7+KuqZhW3S6NimTJP2jfm6iDKWSZqu/ZavA8twas6x6vsi6vsx08K2M5F1n+FhuXEqb\n" +
+            "MsuNq1wqY/RBML8+XBvPELRD3v5Y0r+T9BWSvsR0Bn5PbKGJPTsmT/ywpK9RsKLuHypYYceKOqRx\n" +
+            "dUgHJGxS73TE59gStpVhEduGuLC66k5Jb0lxLFcomCy9Z2FAyRYb5zqh6Duj4wb2ilb3MuHy8VCX\n" +
+            "k29dygM3mfo/ahVKmRPNcW5MuaLAa0p9Et5PIG328uz9IfWYEtSjtlbZuVbPl1HXu5IOlBE/yo2r\n" +
+            "yuwj0Q7RB0E0blzyEEE7FOmPJP0bSV+pIDDznQoCMx8iaWrlSUnvkfQTkr5V0utMnvhXkt4h6QmS\n" +
+            "CBYGvss6kHemGITZ3M6hrG1D4nbQrlC2OzRXncO9kl6sbNs03qogmH8T2bwSEwB1LxOuHg91Ofk2\n" +
+            "bx+IeSxvN/V+mLMq96aEOxXclOjSJBUTZtnLUB0k3erv6iVpmdfWmC7U80XX9a6kA/0RP8oNfXva\n" +
+            "IVfRBwEsImiHsjwk6ee1twXiN5hB+f2SHid5KuUpSe+X9AuS/oGkN5iffyLpv0n6IEkEi8K2hjm9\n" +
+            "ohMZNii2+Wy1qG1Dbs05TVxyQkHw7i1KH8Cbr77D3kqUMIdyzl+UieodD3U5+dYX16icCbATCoJ1\n" +
+            "N3AJvMKE8Z57Q/oLh0LS7dCSurjK9XyRdb1L6UA74365cV1ZfSTaIQCV8xySAA7YkfS/zM8PmIbs\n" +
+            "KyR9mYLtEj9f0vNJJq+u50MKnmP4h+bn/4pnGqIYYQPVVYOk02YgsX+werWyrQzb72Yt3wLnanPs\n" +
+            "d+aQJq4OwO81P/OB3TzwFHdAd5V57c01zu9XKN5zIm5aSG/XUCaYJKMuJ58k9aCCgFnaOu1OLQ/2\n" +
+            "HVL0qokbcrq2ttsF14Wlf1JhW0Nzp3+8tLtf5wcVrlqSrlenqIurUM8XVde7lA4Ha1pn+FRuXE2b\n" +
+            "svtIrqlrO0RQkmsDiwjawdWB+IOS7pJ0QFJT0ptM5+iw+ffLSSYnPC1pW0FQblPSn5gO34cVbH2B\n" +
+            "hB6963LpF0m6HAa+aVdlHTSfecLiMd4Qcjy3KpiAtL1qwJcO2ol9f96k1ROoLgejivB2xZ9guUPu\n" +
+            "beNGmWAQRV1OPkli/80eaZ2OaDeuMHXroZB6VEo+4Xg2Il/arpMPJvj+spzOud1+MOLaskXmuddh\n" +
+            "fz6/ekn5WrbFn40Jfh/q+SLqepfS4QqH8+q9lBvn06bMPpJrXGqH6IMg7NrQJ3IcQTu4blfBqq2H\n" +
+            "FGylKEkvkfRGSa9RMAH5ekmvFHcg5+1xBVtZPijpd8yf75X055I+RfJk9+hdl5MI2VyV02DT9gTA\n" +
+            "fMLxpiUdqVsV/iyALIODuB36OKvWrpD9LYiWObFvgBe2BeRNqmfQ7lYle27JfFXeNQ6eS13KRNXK\n" +
+            "KHU5dXmW+j3JJM7pAicWHjTji3tMXtzvDnONT1i4pocst19XiEkZReQt2+ntu7Ct/hYnlfPa4s+X\n" +
+            "ej7Pur7MdKA/4me58S2d8io3tEN2+pX0QerjINfGTwTt4KO/NgPp+Z07FyhYefd6BVtptszfP9v8\n" +
+            "XESSJfJJSR+R9IikLQWr57Yl/ZGCFXSfIYnsI2BnbYCahyvMoNpmp/aE7G8b8mDEhEDcwUWciY6r\n" +
+            "ShiA32wGu+8KOZ487hRc1fEtU9Rz7G42x3dTxPtOOFh+61AmqlxGbZYT6vLq5xNb23nl6S2mzVl2\n" +
+            "c8St5vjjTsKGra6wPWF2KGGeqqoHC2i7523saY/T935z7MvqrxMLf98vz60xXazn86rry0yHuvVH\n" +
+            "qlJufJNXuaEdStYO0QfBVVwbP11AEqACnlEQZPpNST9tOgBfLum1CoJ3HUn/WNJPSnqHpPdJ+qua\n" +
+            "p9mnFATi7pc0knSLSbe/LemLJH2xpK+U9A8l/YSk/y5pKgJ2uSBgZ0XYQ9xtsT3gPKtg25BlblW6\n" +
+            "u27v1/LA1SGVE2T6gILV0os/N2UcJN+ccJBwNmIyI2t+i/tdtkU9x+60GSDfHDFAu0lubn9UhzLh\n" +
+            "2vG4WE6oy93NJ3V0TUSevSPB9Q2rj6+yfLxXJ/z+qro3YfokdciU71sX+jp35Fx35eX0inS6ekle\n" +
+            "ypqffKvn86rry0wH2hn/yo2P8ig3tEPJ2yH6ICCg6ilW2qHKHpf0fvOz6CJJLzSdhM+V9DJJnyXp\n" +
+            "CxVss9mQtCbpRebHKbs6EPn7A9rdfeLC5z6yqwMzSTMFK+b+r6SHJT1q/v2Q+fvjZJNyEbDLfWB6\n" +
+            "OkVH8daQTqjtPehXbRuSdhB5fUj6uLC66lDG998ZkjZXRAwWlzmYwzkU1ekNe47dg/sGxjdo+crE\n" +
+            "g+YzvsTRAW7Vy4SLZdSlckJd7kddXhfzevXtGevS+bOM9peLqyzmx4MKn4Cr25aQZ0PSe75lXdYJ\n" +
+            "xKtCyuZZ+bea5vSSumu+1d9B5bPFn4/1fB51fdnpQDvjV7nxVR59JNqhZO0QfZB6O7iivYHDCNqh\n" +
+            "jp6U9DHz866QcnGJgsDeKxQE9l6pYAvONfP/LzA/DfPzIknPNe+90PxcsPATxzPmz6fN3582P09J\n" +
+            "+vQB7Z598oKL/uqAdtcUbAG61KVPferxI9v/vf3vX3fjg8994oknudzu8ihgd7327gY9tNDAX7Oi\n" +
+            "cxDWgc3rGJe5IcV3HtLyO8WuzmEQG7VtSJq0ujdiAH6nit1C8v4l55X1jr6kxx+1h39aVxSctxdF\n" +
+            "Pcdu/4qQ+crEW0PO/1bFex5J0apcJlw8HtfKCXW5u/mkrk6bNL8+JI/F3XL4dEiZuknhKxHS9NWW\n" +
+            "fe9Zz/p0tq7boZB0usFCWof1e3wTtdVfWN1U1z677bq+7HSgnfGr3PjMdh/Jp/6DK+2QK30QFO/q\n" +
+            "kGtzv1hp5zy2xwTO95SkxyT9paR3SvoVSQNJPyjpeyR9u6S/I+nrJL1J0uskvdr8vFbB1pKvVxBY\n" +
+            "e6NpHN8k6SuW/LxJ0pcquEv3jZLeoL1n8n2xpNdI+oID2v3Cx5/z/A1J7X/6x7f/cNTBH9jd3f2x\n" +
+            "d/3QjoLgJGCrod8fLFi1nUWREzxhD3FP20kM21//phyOPepB7mlWuYTtaX9FTscf5cGQc8qybVHS\n" +
+            "bTAfDPndVRnzW9zztZ3Po55jd3/IIPneiPx8yL3qptJlwsXjcamcUJe7nU/q7OaIvBt3i6+w/Hi9\n" +
+            "sm+XNb8RI873ut6ns1nXhqV3lrYvbIvps/J3Yv50SH2cxxZ/PtfzNut6F9KBdsafcuM7230kn/NI\n" +
+            "We2QK30QFOuKiGvDKjsPELQDsntC0o6C7SY/aDq/fyrpvZK2JL1bQfDv95f8vFPBar/7zWv/SNKf\n" +
+            "KNjO8iEFW1p+VNLHJT31mZ+/VF909r3PXXVAB3Z3n/OZn79Uj7D1orMqsC3mqgmeIrcQvNpyR+Re\n" +
+            "5RNwiurQ2+zQnojo4Ns4/kMJzivsONIO0K6PuGZK8Lu01zLq+SN5TtYdVPhz7O5X9N3kUXdsv93R\n" +
+            "wXJVy4Srx+NKOaEudz+f1FXUhKMi6uf9n3FnxPvTXo8rtHz7znkZuDfmZ7jSp7PlwYi6446UbV9U\n" +
+            "MMPnlUlhwYc8tvjzvZ63Vde7kg60M36Um6qkV90COC61Qy73QZDf/EHYWP+sCKh6gaAdUHEE7mCp\n" +
+            "w7msExB1V9ZVER1G252Rq0O+J8sg6c6Eg+ysou7iT3Ps90d0ym/KkNZvV/znD4TdWXqFpHtSDFSu\n" +
+            "CplAuH9FvgpLizQPQA8bYN2rfCfr7lD4HZXXxCi/N0QMtO5wtN6pYplw9XhcKCfU5X7kkzo7HZEX\n" +
+            "w9qnZfnjbMg1uUfJV7fO29OwMnrCsz6dbWEBiUNKftPKqr6Lz5NfcbfIyjr5WpV6Pmtd71I60M64\n" +
+            "X26qxGYfyRcutUMu9EFQjEPm2hyKuDZsW+oBgnaAJz5xKv1iCAJ3bvFwlV1Y5zpsxVTU5JXt7UHC\n" +
+            "9k/POnkSNTGXx12jq+7iT+qaiI7YrQpW+MadzJg/KPxjSj4BEjVQSXIM15uOZ5oByp0RA5R3xRyg\n" +
+            "zCcfbN8ZHcdNEd97Q8zBb9TdrVcr34ktyoQfx1N2OaEu9yOf1N0NK67HwRj544aI63OP4k9yXy/p\n" +
+            "A4qeLLvXsz6dbVEr0a9KUH6uNq8NS+sqTESfjpGWWa93Ver5rHW9a+lAO+N2uakS230kH7jUDrnQ\n" +
+            "B0F+5o/SuMfklUMR9RYBVU8QtAM88JG7XpH5MwjcIYOwDtf8Dp7r9w3U7ilw4JJXEOXBiPPOaxBq\n" +
+            "c9uQBxW9Amt+d9/HtDwoNN96Y/E1q479wZD/D7sW8+00PmA+/6qQjufHFL015Ko0OxvRMZ0PUO4J\n" +
+            "OcebYkw+3K/87rCPekbAiYT5PGowd4eSr6YqajKkamXC1eMpu5xQl/uRT+pu1XN57oiZP6ImLW+S\n" +
+            "tKvl29PFaRfn/babHe7T3WPO0dZPVL4+EZGn9/dDDi0pO+9S9GqIVVtU++J0xt/Xrc+epa53LR18\n" +
+            "aGeKrDNcKze+pk0RfSRfuNQOld0HWfSBkDyYRtZ8f5XjeegDMc5hHnS9akV9fwPdeX88hyQA3GYz\n" +
+            "2PbIXZfrsmsfJlGR1P2m83VVyEDuDsWbqLI9qXFIy+8gshUcPB1yztcrvy0FbjaDYRvPGbtX0lsU\n" +
+            "PuEm7U3KZXHDisHXDWbQcShisJLmGOJsDbmY966OOIarzM+tOR5DUvNVS2Fl8uaUx/quiO/6Egfr\n" +
+            "nyqWCVePp6xyQl3uVz6puzvNtV2Wp+Yrl0/HKGsHFT05Or+ed6TIL9d42KfLy9mF8nOF5X7I/eaz\n" +
+            "q9LXfzAijbIGH6pYz6ep611NB9oZN8tNVdnsI9EOJW+HyuyDoNz66hqxLaZXWGkHOCyP1XGsuCvX\n" +
+            "o/6m/w0ZG/jTOQxcrs95gHRa4dvF5XXnbtS2FWncqyAQk8fWLKclfZ7irXR7i+VjmH9mkjt1bR/D\n" +
+            "gymOIYmo1W9pB0NRwb5Dyv/uWsqE+8dTRjmhLvcvn9Rd1LWNs02mTF1se2LrhClvZ2Mcv2t9ujw9\n" +
+            "mEPddn/MtPbJ6YhzzdrXqWI9n6audzkdaGfcKzdVZbuPRDuUXJl9EBTvhKnfqZM8Q9AOcFSewTUC\n" +
+            "d8jQ0UzTCTudQ6cwavBpa0AY9UD463Me/NmcDLvfdNLiPv9slfnduNck+Lyz5hhutpQ+n5di0DM/\n" +
+            "hjstHUNeExtS9HPssj4750TEcd+q/J7/Qpnw43iKLifU5f7m27r3icLas/l2Vknas9MW8sZbErSx\n" +
+            "rvXpirpmXyI7KwRvNp9VtYnJeyOuOX327HW9D+lAO+NOuam60zVMI9faobL6ICjG/GbdF3Nt/MX2\n" +
+            "mICDigiqzb+D7TKRsOH/PAWTUXEmpO41g9CkHcHTivfg4hMhg1Wbkyh3xhhkptmqcJUbtHyi+8GM\n" +
+            "57K4rVeSSYwHF65l1oDRCe0FpQ4lfO9pZQ+U3aC9bQBvUrKtWe5MkD+zDupuTpDvk7pG8e88T3O+\n" +
+            "lAn/j6fIckJd7ne+TZOmRQU7wr7fxrlH1cVnE16Ta0x7mHT72ROmnN2bMm3y7tPlUabCvieum026\n" +
+            "XW9+4j7Pdf7czztzyL9hz0rM0t+5d0k+PxvjPTeH9APS9FnOOljPl13Xu5QOLrYzZdcZrpUbl9LG\n" +
+            "lz5SHvWpbS61Q2X1Qeb1jI22zVY6uJDXbJSzex3L78jgwO7uLqmQwWVv+zCJAKtiBOy+RdIvR/z+\n" +
+            "E5JeK+lDsfMxgbvCxNke07V6+cCBA2G/ukrhQZcTXG1v3LSiA5v3XZBR+UgqZnL5ekUHJfKYpANl\n" +
+            "wrfjoZyQb+HG9cyjrNW5T7eqH0KfFqCdAerUDhXdB0FJiAm5jaBdRgTtYFPMFXbWg3YSgbui+Bi0\n" +
+            "AwAAAAAAAADkj2faAY4o+zlzPOcOAAAAAAAAAIDyELQDHOBKwIzAHQAAAAAAAAAA5SBoB5TMtUAZ\n" +
+            "gTsAAAAAAAAAAIpH0A4okasBskfuupzgHQAAAAAAAAAABSJoB5TEh6AYgTsAAAAAAAAAAIpB0A4o\n" +
+            "gU/BMAJ3AAAAAAAAAADkj6AdUDAfg2AE7gAAAAAAAAAAyBdBO6BAPge/CNwBAAAAAAAAAJAfgnZA\n" +
+            "QQoMeh3I8xwI3gEAAAAAAAAAYB9BO6AAlgNdH1rx+8ckfdyj8wEAAAAAAAAAoPYI2gE5yyHA9T5J\n" +
+            "H474/f3KOWgHAAAAAAAAAADsImgH+Ofjkn4w5Hcfk/QjRRwEq+0AAAAAAAAAALDnOSQB4KVTki6R\n" +
+            "9P2SGub//lTSjZLeTfIAAAAAAAAAAOCXA7u7u6QCAAAAAAAAAAAAUCK2xwQAAAAAAAAAAABKRtAO\n" +
+            "AAAAAAAAAAAAKBlBOwAAAAAAAAAAAKBkBO0AAAAAAAAAAACAkhG0AwAAAAAAAAAAAEpG0A4AAAAA\n" +
+            "AAAAAAAoGUE7AAAAAAAAAAAAoGQE7QAAAAAAAAAAAICSEbQDAAAAAAAAAAAASkbQDgAAAAAAAAAA\n" +
+            "ACgZQTsAAAAAAAAAAACgZATtAAAAAAAAAAAAgJIRtAMAAAAAAAAAAABKRtAOAAAAAAAAAAAAKBlB\n" +
+            "OwAAAAAAAAAAAKBkBO0AAAAAAAAAAACAkhG0AwAAAAAAAAAAAEpG0A4AAAAAAAAAAAAoGUE7AAAA\n" +
+            "AAAAAAAAoGQE7QAAAAAAAAAAAICSEbQDAAAAAAAAAAAASkbQDgAAAAAAAAAAACgZQTsAAAAAAAAA\n" +
+            "AACgZATtAAAAAAAAAAAAgJIRtAMAAAAAAAAAAABKRtAOAAAAAAAAAAAAKBlBOwAAAAAAAAAAAKBk\n" +
+            "BO0AAAAAAAAAAACAkhG0AwAAAAAAAAAAAEpG0A4AAAAAAAAAAAAoGUE7AAAAAAAAAAAAoGQE7QAA\n" +
+            "AAAAAAAAAICSEbQDAAAAAAAAAAAASkbQDgAAAAAAAAAAACgZQTsAAAAAAAAAAACgZATtAAAAAAAA\n" +
+            "AAAAgJIRtAMAAAAAAAAAAABKRtAOAAAAAAAAAAAAKNn/fwBXG0aMYgYYIgAAAABJRU5ErkJggg==\n" +
+            ""),
+    /**
+     * 前缀
+     */
+    PREFIX("前缀", java.util.regex.Matcher.quoteReplacement("${repType}")),
+    /**
+     * 年份
+     */
+    YEAR("年份", java.util.regex.Matcher.quoteReplacement("${repYear}")),
+    /**
+     * 编码
+     */
+    CODING("编码", java.util.regex.Matcher.quoteReplacement("${repNum}")),
+    /**
+     * 网站地址
+     */
+    WEBSITE("网页地址", java.util.regex.Matcher.quoteReplacement("${querySite}")),
+    /**
+     * 编译提示语
+     */
+    TS("Evaluation Warning: The document was created with Spire.Doc for JAVA.", ""),
+    ;
+    private String code;
+
+    private String value;
+
+
+    FtlEnum(String code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public static String getCode(String code) {
+        FtlEnum[] ftlEnums = values();
+        for (FtlEnum ftlEnum : ftlEnums) {
+            if (ftlEnum.code().equals(code)) {
+                return ftlEnum.code();
+            }
+        }
+        return null;
+    }
+
+    public static String getValue(String code) {
+        FtlEnum[] ftlEnums = values();
+        for (FtlEnum ftlEnum : ftlEnums) {
+            if (ftlEnum.code().equals(code)) {
+                return ftlEnum.value();
+            }
+        }
+        return null;
+    }
+
+    public static List<String> toList() {
+        List<String> list = Lists.newArrayList();//Lists.newArrayList()其实和new ArrayList()几乎一模
+        //  一样, 唯一它帮你做的(其实是javac帮你做的), 就是自动推导(不是"倒")尖括号里的数据类型.
+
+        for (FtlEnum airlineTypeEnum : FtlEnum.values()) {
+            list.add(airlineTypeEnum.getCode());
+        }
+        return list;
+    }
+
+    public String code() {
+        return code;
+    }
+
+    public String value() {
+        return value;
+    }
+
+}

+ 207 - 0
src/main/java/com/jeeplus/common/utils/FtlUtils.java

@@ -0,0 +1,207 @@
+package com.jeeplus.common.utils;
+
+import com.spire.doc.Document;
+import com.spire.doc.FileFormat;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+
+public class FtlUtils {
+
+
+    /**
+     * 创建文件夹和文件 例如:C:/aaa/bbb/ccc.txt,若此路径存在则创建ccc.txt<br>
+     * 若此路径不存在则先创建文件夹再创建文件。<br>
+     * @param file
+     * @throws IOException
+     */
+    public static boolean createDirectoryAndFile(File file) throws IOException {
+        String path = file.getPath();
+        String name = file.getName();
+        if(name.indexOf(".") > -1){
+            String directoryStr = path.substring(0, path.length()-name.length());
+            File directory = new File(directoryStr);
+            if(!directory.exists()){
+                if(directory.mkdirs() && FtlUtils.createFile(file)){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 用来创建文件<br>
+     * 在文件的文件夹路径存在时使用,<br>
+     * 文件夹路径不存在时会抛异常<br>
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static boolean createFile(File file) throws IOException {
+        RandomAccessFile accessFile = null;
+        try {
+            if (!file.exists()) {
+                accessFile = new RandomAccessFile(file, "rw");
+                return true;
+            }else{
+                if(file.isDirectory()){
+                    throw new IOException(file.getPath()+" 已存在, 但是它是文件夹");
+                }else{
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            throw e;
+        } finally{
+            if(accessFile != null){
+                accessFile.close();
+            }
+        }
+    }
+
+
+
+    public static void createFMLFile(String filePath) throws Throwable {
+        String XMLPath=filePath.substring(0,filePath.lastIndexOf(".")+1)+"xml";
+        Document doc = new Document(filePath);
+        //将Word保存为XML格式
+        doc.saveToFile(XMLPath, FileFormat.Word_Xml);
+
+        //创建DOM4J解析器对象
+        SAXReader saxReader = new SAXReader();
+        List<String> nameStr=new ArrayList<>();
+        List<String> qrCodeStrList = new ArrayList<>();
+        File file = new File(XMLPath);
+        try {
+            //读取xml文件,并生成document对象 现可通过document来操作文档
+            org.dom4j.Document domDocument = saxReader.read(file);
+            //获取到文档的根节点
+            Element rootElement = domDocument.getRootElement();
+            //获取子节点列表
+            Iterator it = rootElement.elementIterator();
+            while (it.hasNext()) {
+                Element fistChild = (Element) it.next();
+
+                //确定name值为/word/_rels/document.xml.rels的节点
+                if("/word/_rels/document.xml.rels".equals(fistChild.attribute("name").getValue())){
+                    //找到其下边 xmlData的子节点 Relationships
+                    Element contactElem = fistChild.element("xmlData").element("Relationships");
+                    //获取所有 Relationships 的子节点信息
+                    List<Element> contactList = contactElem.elements();
+                    for (Element e:contactList){
+                        //判定 target的之中是否包含 .png
+                        boolean bool = e.attribute("Target").getValue().contains(".png");
+                        if(bool){
+                            //将包含 .png的target数据保存在临时list中
+                            nameStr.add(e.attribute("Target").getValue());
+                        }
+                    }
+                }
+            }
+            //重新遍历子节点列表
+            Iterator newIt = rootElement.elementIterator();
+            while (newIt.hasNext()) {
+                Element fistChild = (Element) newIt.next();
+                for (String name:nameStr) {
+                    if(fistChild.attribute("name").getValue().contains(name)){
+                        ////找到其下边 binaryData的节点
+                        Element contactElem = fistChild.element("binaryData");
+                        //获取binaryData节点中的text信息
+                        String result = contactElem.getText();
+                        //判定节点中的数据是否为兴光固定图片编码,如果不是则添加进list并进行替换
+                        if(!FtlEnum.getValue("PICSTR").equals(result)){
+                            qrCodeStrList.add(result);
+                            contactElem.setText(java.util.regex.Matcher.quoteReplacement("${qrcode}"));
+                        }
+                    }
+                }
+            }
+            //格式化为缩进格式
+            OutputFormat format = OutputFormat.createPrettyPrint();
+            //设置编码格式
+            format.setEncoding("UTF-8");
+            XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
+            //写入数据
+            writer.write(domDocument);
+            writer.close();
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+    public static void createFtl(String filePath) throws Throwable {
+        String XMLPath=filePath.substring(0,filePath.lastIndexOf(".")+1)+"xml";
+        String ftlPath=filePath.substring(0,filePath.lastIndexOf(".")+1)+"ftl";
+        // 读取xml文件,生成document对象
+        DocumentBuilder builderFtl = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        // 文件的位置在工作空间的根目录
+        org.w3c.dom.Document document = builderFtl.parse(new File(XMLPath));
+        String str = xmlToString(document);
+
+        List<String> list = FtlEnum.toList();
+        for (String ftlCode: list) {
+            if(!"PICSTR".equals(ftlCode)){
+                str = str.replaceAll(ftlCode,FtlEnum.getValue(ftlCode));
+            }
+        }
+
+        org.dom4j.Document documentDoc = DocumentHelper.parseText(str);
+        OutputXml(documentDoc,ftlPath);
+        //删除xml文档
+        File file = new File(XMLPath);
+        file.delete();
+    }
+
+
+    public static void OutputXml(org.dom4j.Document doc,String filename){
+        OutputFormat format = OutputFormat.createPrettyPrint();
+        /** 指定XML编码 */
+        format.setEncoding("utf-8");
+        /** 将document中的内容写入文件中 */
+        XMLWriter writer;
+        try {
+            writer = new XMLWriter(new FileWriter(new File(filename)), format);
+            writer.write(doc);
+            writer.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     *
+     * @param document
+     *   Document对象(读xml生成的)
+     * @return String字符串
+     * @throws Throwable
+     */
+    public static String xmlToString(org.w3c.dom.Document document) throws Throwable {
+        TransformerFactory ft = TransformerFactory.newInstance();
+        Transformer ff = ft.newTransformer();
+        ff.setOutputProperty("encoding", "UTF-8");
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ff.transform(new DOMSource(document), new StreamResult(bos));
+        return bos.toString("UTF-8");
+    }
+
+}

+ 21 - 0
src/main/java/com/jeeplus/modules/projectrecord/dao/ftlTemplate/FtlTemplateDao.java

@@ -0,0 +1,21 @@
+package com.jeeplus.modules.projectrecord.dao.ftlTemplate;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectrecord.entity.FtlTemplateInfo;
+
+/**
+ * 文档模板管理Dao
+ * @author 徐滕
+ * @version 2020-08-27
+ */
+@MyBatisDao
+public interface FtlTemplateDao extends CrudDao<FtlTemplateInfo> {
+
+    /**
+     * 根据附件url查询数据库是否已存在
+     * @param url
+     * @return
+     */
+    Integer getWorkattachmentCount(String url);
+}

+ 48 - 0
src/main/java/com/jeeplus/modules/projectrecord/entity/FtlTemplateInfo.java

@@ -0,0 +1,48 @@
+package com.jeeplus.modules.projectrecord.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.Workattachment;
+
+import java.util.List;
+
+public class FtlTemplateInfo extends DataEntity<FtlTemplateInfo> {
+    private static final long serialVersionUID = 1L;
+
+    private String ftlName;    //模板名称
+    private String loginUser;    //登陆人
+    private String createName;    //创建人
+    private List<Workattachment> workAttachments = Lists.newArrayList();
+
+    public String getFtlName() {
+        return ftlName;
+    }
+
+    public void setFtlName(String ftlName) {
+        this.ftlName = ftlName;
+    }
+
+    public String getLoginUser() {
+        return loginUser;
+    }
+
+    public void setLoginUser(String loginUser) {
+        this.loginUser = loginUser;
+    }
+
+    public String getCreateName() {
+        return createName;
+    }
+
+    public void setCreateName(String createName) {
+        this.createName = createName;
+    }
+
+    public List<Workattachment> getWorkAttachments() {
+        return workAttachments;
+    }
+
+    public void setWorkAttachments(List<Workattachment> workAttachments) {
+        this.workAttachments = workAttachments;
+    }
+}

+ 102 - 0
src/main/java/com/jeeplus/modules/projectrecord/service/ftlTemplate/FtlTemplateService.java

@@ -0,0 +1,102 @@
+package com.jeeplus.modules.projectrecord.service.ftlTemplate;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.projectrecord.dao.ftlTemplate.FtlTemplateDao;
+import com.jeeplus.modules.projectrecord.entity.FtlTemplateInfo;
+import com.jeeplus.modules.projectrecord.entity.MonthlyInfo;
+import com.jeeplus.modules.sys.dao.WorkattachmentDao;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 文档模板管理service
+ * @author 徐滕
+ * @version 2020-08-27
+ */
+@Service
+@Transactional(readOnly = true)
+public class FtlTemplateService  extends CrudService<FtlTemplateDao, FtlTemplateInfo> {
+
+    @Autowired
+    private WorkattachmentDao workattachmentDao;
+
+    public FtlTemplateInfo get(String id) {
+        return super.get(id);
+    }
+
+    public Page<FtlTemplateInfo> findPage(Page<FtlTemplateInfo> page, FtlTemplateInfo ftlTemplateInfo) {
+        //设置数据权限
+        if(!UserUtils.getUser().isAdmin()) {
+            String dataScopeSql = dataScopeFilterOR(ftlTemplateInfo.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_RECORDS.getValue());
+            ftlTemplateInfo.getSqlMap().put("dsf", dataScopeSql);
+        }
+        int count = dao.queryCount(ftlTemplateInfo);
+        page.setCount(count);
+        page.setCountFlag(false);
+        ftlTemplateInfo.setPage(page);
+        List<FtlTemplateInfo> ftlTemplateList = findList(ftlTemplateInfo);
+        //将登陆人信息添加进去
+        for (FtlTemplateInfo ftlTemplate: ftlTemplateList) {
+            ftlTemplate.setLoginUser(UserUtils.getUser().getId());
+        }
+        page.setList(ftlTemplateList);
+        return page;
+    }
+
+    @Transactional(readOnly = false)
+    public String saveData(FtlTemplateInfo ftlTemplateInfo) {
+        super.save(ftlTemplateInfo);
+
+        //获取附件信息
+        List<Workattachment> attachmentList = ftlTemplateInfo.getWorkAttachments();
+        //保存附件
+        if (attachmentList!=null && attachmentList.size()!=0) {
+            //附件信息
+            for (Workattachment workattachment : attachmentList) {
+                //根据附件url查询数据库是否已存在
+                Integer count = dao.getWorkattachmentCount(workattachment.getUrl());
+                if (workattachment.getId() == null || count>0) {
+                    continue;
+                }
+                if (workattachment.DEL_FLAG_NORMAL.equals(workattachment.getDelFlag())) {
+                    workattachment.setAttachmentId(ftlTemplateInfo.getId());
+                    workattachment.setAttachmentUser(UserUtils.getUser().getId());
+                    if (StringUtils.isBlank(workattachment.getId()) || "null".equals(workattachment.getId())) {
+                        workattachment.preInsert();
+                        workattachmentDao.insert(workattachment);
+                    } else {
+                        workattachment.preUpdate();
+                        workattachmentDao.update(workattachment);
+                    }
+                } else {
+                    workattachmentDao.delete(workattachment);
+                }
+            }
+        }
+        return "true";
+    }
+
+    /**
+     * 查询附件信息
+     * @param ftlTemplateInfo
+     * @return
+     */
+    public List<Workattachment> getWorkattachment(FtlTemplateInfo ftlTemplateInfo){
+        if (StringUtils.isNotBlank(ftlTemplateInfo.getId())){
+            Workattachment workattachment = new Workattachment();
+            workattachment.setAttachmentId(ftlTemplateInfo.getId());
+            List<Workattachment> list = workattachmentDao.findList(workattachment);
+            return list;
+        }
+        return null;
+    }
+
+}

+ 141 - 0
src/main/java/com/jeeplus/modules/projectrecord/web/ftlTemplate/FtlTemplateController.java

@@ -0,0 +1,141 @@
+package com.jeeplus.modules.projectrecord.web.ftlTemplate;
+
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.projectrecord.entity.FtlTemplateInfo;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
+import com.jeeplus.modules.projectrecord.service.ftlTemplate.FtlTemplateService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 文档模板管理
+ * @author 徐滕
+ * @version 2020-08-26
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/project/ftlTemplate")
+public class FtlTemplateController extends BaseController {
+    @Autowired
+    private FtlTemplateService service;
+
+    @ModelAttribute
+    public FtlTemplateInfo get(@RequestParam(required=false) String id) {
+        FtlTemplateInfo entity = null;
+        if (StringUtils.isNotBlank(id)){
+            entity = service.get(id);
+        }
+        if (entity == null){
+            entity = new FtlTemplateInfo();
+        }
+        return entity;
+    }
+
+    /**
+     * 查询ftl模板文件信息List
+     * @param ftlTemplateInfo
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequiresPermissions("project:ftlTemplate:list")
+    @RequestMapping(value = {"list", ""})
+    public String list(FtlTemplateInfo ftlTemplateInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+        if(UserUtils.isManager()){
+            model.addAttribute("flag","1");
+        }
+        Page<FtlTemplateInfo> page = service.findPage(new Page<FtlTemplateInfo>(request, response), ftlTemplateInfo);
+        model.addAttribute("page", page);
+        return "modules/projectrecord/ftlTemplate/ftlTemplateList";
+    }
+
+    /**
+     * 增加,编辑模板页面
+     * @param ftlTemplateInfo
+     * @param model
+     * @return
+     */
+    @RequiresPermissions(value={"project:ftlTemplate:add","project:ftlTemplate:edit"},logical= Logical.OR)
+    @RequestMapping(value = "form")
+    public String form(FtlTemplateInfo ftlTemplateInfo, Model model) {
+        if (ftlTemplateInfo!=null&&StringUtils.isNotBlank(ftlTemplateInfo.getId())) {
+            ftlTemplateInfo = service.get(ftlTemplateInfo.getId());
+            ftlTemplateInfo.setWorkAttachments(service.getWorkattachment(ftlTemplateInfo));
+        }else {
+            ftlTemplateInfo.setCreateBy(UserUtils.getUser());
+            ftlTemplateInfo.setCreateDate(new Date());
+        }
+        model.addAttribute("ftlTemplateInfo", ftlTemplateInfo);
+        return "modules/projectrecord/ftlTemplate/ftlTemplateForm";
+    }
+
+    /**
+     * 查看
+     * @param ftlTemplateInfo
+     * @param model
+     * @return
+     */
+    @RequiresPermissions(value={"project:ftlTemplate:view"})
+    @RequestMapping(value = "view")
+    public String view(FtlTemplateInfo ftlTemplateInfo, Model model) {
+        ftlTemplateInfo.setWorkAttachments(service.getWorkattachment(ftlTemplateInfo));
+        model.addAttribute("ftlTemplateInfo", ftlTemplateInfo);
+        return "modules/projectrecord/ftlTemplate/ftlTemplateView";
+    }
+
+    /**
+     * 编辑保存模板信息
+     * @param ftlTemplateInfo
+     * @param model
+     * @param redirectAttributes
+     * @return
+     */
+    @RequiresPermissions(value={"project:ftlTemplate:add","project:ftlTemplate:edit"},logical=Logical.OR)
+    @RequestMapping(value = "save")
+    public String save(FtlTemplateInfo ftlTemplateInfo, Model model, RedirectAttributes redirectAttributes) {
+        if (!beanValidator(model, ftlTemplateInfo)){
+            return form(ftlTemplateInfo, model);
+        }
+        try {
+            service.saveData(ftlTemplateInfo);//保存
+            addMessage(redirectAttributes, "保存模板成功");
+        }catch (Exception e){
+            logger.error("保存项目异常:",e);
+            addMessage(redirectAttributes, "保存模板异常:"+e.getMessage());
+        }
+        return "redirect:"+ Global.getAdminPath()+"/project/ftlTemplate/?repage";
+    }
+
+    /**
+     * 删除模板
+     * @param ftlTemplateInfo
+     * @param redirectAttributes
+     * @return
+     */
+    @RequiresPermissions("project:ftlTemplate:del")
+    @RequestMapping(value = "delete")
+    public String delete(FtlTemplateInfo ftlTemplateInfo, RedirectAttributes redirectAttributes) {
+        service.delete(ftlTemplateInfo);
+        addMessage(redirectAttributes, "删除模板成功");
+        return "redirect:"+Global.getAdminPath()+"/project/ftlTemplate/?repage";
+    }
+}

+ 8 - 0
src/main/java/com/jeeplus/modules/projectreportnum/web/ProjectReportNumController.java

@@ -198,6 +198,7 @@ public class ProjectReportNumController extends BaseController {
 
     @RequestMapping(value = "download")
     public String download(HttpServletRequest request,RedirectAttributes redirectAttributes,HttpServletResponse response){
+		//模板对象
 		Template template=null;
         try{
 			String num = request.getParameter("number");
@@ -212,16 +213,23 @@ public class ProjectReportNumController extends BaseController {
         	if(pa.contains("%20")){
         		pa = pa.replace("%20"," ");
 			}
+			//freemaker模板路径
 			File path = new File(pa+"/freemarker");
 			Configuration cfg = new Configuration();
 			cfg.setDirectoryForTemplateLoading(path);
 			cfg.setDefaultEncoding("UTF-8");
+
+			//前台传入的tempType即是对应ftl模板的文件名
 			template = cfg.getTemplate("current.ftl","UTF-8");
+
+			//freemarker参数值准备
 			Map<String,Object> data  = new HashMap<>();
 			data.put("repType",repType);
 			data.put("repYear",repYear);
 			data.put("repNum",repNum);
 			data.put("querySite","re.xgccpm.com/ccpm_query");
+
+			//生成二维码图片和doc文档 缓存文件的共用名称
 			String commonFileName = UUID.randomUUID().toString();
 			String tempPath = pa+"/temp/";
 			File temP = new File(tempPath);

+ 100 - 0
src/main/resources/mappings/modules/projectrecord/ftlTemplate/FtlTemplateDao.xml

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.projectrecord.dao.ftlTemplate.FtlTemplateDao">
+	<sql id="ftlTemplateColumns">
+		a.id AS "id",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag",
+		a.ftl_name AS "ftlName"
+	</sql>
+	
+    
+	<select id="get" resultType="com.jeeplus.modules.projectrecord.entity.FtlTemplateInfo" >
+		SELECT
+			<include refid="ftlTemplateColumns"/>
+        FROM ftl_template a
+		WHERE a.id = #{id}
+	</select>
+
+	<select id="findList" resultType="com.jeeplus.modules.projectrecord.entity.FtlTemplateInfo" >
+		SELECT
+		<include refid="ftlTemplateColumns"/>
+		,su.name as "createName"
+		FROM ftl_template a
+		left join sys_user su on su.id = a.create_by
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+
+			<if test="ftlName != null and ftlName != ''">
+				AND a.ftl_name like concat(concat('%',#{ftlName}),'%')
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+
+    <select id="queryCount" resultType="int" >
+        SELECT count(DISTINCT a.id)
+        FROM ftl_template a
+		<where>
+			a.del_flag = 0
+		</where>
+    </select>
+	
+	<insert id="insert">
+		INSERT INTO ftl_template(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			del_flag,
+			remarks,
+
+  			ftl_name
+		) VALUES (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{delFlag},
+			#{remarks},
+
+			#{ftlName}
+		)
+	</insert>
+	
+	<update id="update">
+		UPDATE ftl_template SET
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks},
+
+			ftl_name = #{ftlName}
+		WHERE id = #{id}
+	</update>
+	
+	<!--物理删除-->
+	<update id="delete">
+		UPDATE ftl_template SET
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+
+	<select id="getWorkattachmentCount" resultType="java.lang.Integer">
+		select count(1) as count from work_attachment
+			where url= #{url}
+	</select>
+
+</mapper>

+ 90 - 0
src/main/webapp/static/bos/bosupload.js

@@ -8,6 +8,12 @@ var returnUrl;
 var str;
 var buckName='newxgccpm'
 
+
+function ftlUploadWithSts(storeAs, file,attachmentId,attachmentFlag,uploadPath,divId,size, cpt) {
+    console.log("-----------------------start");
+    ftlMultitest(storeAs, file,attachmentId,attachmentFlag,uploadPath,divId,size, cpt);
+};
+
 function multipartUploadWithSts(storeAs, file,attachmentId,attachmentFlag,uploadPath,divId,size, cpt) {
     console.log("-----------------------start");
     // let BosClient = baidubce.sdk.BosClient
@@ -289,6 +295,90 @@ function multitest (storeAs, file,attachmentId,attachmentFlag,uploadPath,divId,
     // });
 };
 
+function ftlMultitest (storeAs, file,attachmentId,attachmentFlag,uploadPath,divId, size,cpt) {
+    var formdata = new FormData();
+    formdata.append("storeAs",storeAs);
+    formdata.append("file",file);
+    var names =  storeAs.split("/");
+    var name = names[names.length-1];
+    $.ajax({
+        type:'post',
+        url:realPath+"/bos/uploadFtl",
+        data:formdata,
+        contentType: false,
+        processData: false,
+        success:function (data1) {
+            if(data1.code==='1'){
+                returnUrl = realPath+"/sys/workattachment/saveAttachment";
+                var p = Math.floor(1*100);
+                $("#jindutiao"+divId).attr("style","width: "+p+"%");
+                $("#jindutiao"+divId).attr("aria-valuenow",p+"%");
+                $("#baifenbi"+divId).html(p+"%");
+                $("#fileName"+divId).html(name);
+
+
+                $.ajax({
+                    type:'post',
+                    url:returnUrl,
+                    data:{
+                        "attachmentName":data1.name,
+                        "attachmentId":attachmentId,
+                        "attachmentFlag":attachmentFlag,
+                        "url":data1.url,
+                        "divIdType":divId
+                    },
+                    success:function(data){
+                        console.log('url : ' + data.url);
+                        if(data.status=="Success"){
+                            parent.layer.msg("上传成功!",{icon:1});
+                            var lenght =$(".trIdAdds").length;
+                            if (size != 0){
+                                lenght += size;
+                            }
+                            var addFile = "addFile"+divId;
+                            var str = '<tr class="trIdAdds">'+
+                                '<td class="text-center">' ;
+                            if (isContains("jpg,png,gif,bmp,jpeg",data.type)){
+                                str = str +'<img src="'+data1.url+'" width="50" height="50" onclick="openDialogView(\'预览\',\''+realPath+ '/a/sys/picturepreview/picturePreview?url=' +data1.url+ '\',\'90%\',\'90%\')" alt="'+data1.name+'"/>';
+                            }else if(isContains("pdf",data.type)){
+                                str = str + '<a class="attention-info" href="javascript:void(0)" onclick="preview(\'预览\',\''+data1.url+'\',\'90%\',\'90%\',\'1\')">'+data1.name+'</a>';
+                            }else {
+                                str = str + '<a class="attention-info" href="javascript:void(0)" onclick="preview(\'预览\',\''+data1.url+'\',\'90%\',\'90%\')">'+data1.name+'</a>';
+                            }
+                            str = str +'</td>'+
+                                '<td >'+data.createByName+'</td>'+
+                                '<td >'+data.createDate+
+                                '<input name="workAttachments['+lenght+'].id" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value=""/>'+
+                                '<input name="workAttachments['+lenght+'].attachmentId" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data.attachmentId+'"/>'+
+                                '<input name="workAttachments['+lenght+'].url" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data1.url+'"/>'+
+                                '<input name="workAttachments['+lenght+'].attachmentName" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data1.name+'"/>'+
+                                '<input name="workAttachments['+lenght+'].createBy.id" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data.createBy+'"/>'+
+                                '<input name="workAttachments['+lenght+'].type" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data.type+'"/>'+
+                                '<input name="workAttachments['+lenght+'].attachmentFlag" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data.attachmentFlag+'"/>'+
+                                '<input name="workAttachments['+lenght+'].divIdType" type="hidden" readonly="readonly" maxlength="20" style="width:140px;" class="form-control" value="'+data.divIdType+'"/>'+
+                                '</td>'+
+                                '<td class="op-td">'+
+                                '<div class="op-btn-box">' +
+                                '<a href="'+data1.url+'" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>'+
+                                '<a href="javascript:void(0)" onclick="deleteFileFromAliyun(this,\''+realPath+'/sys/workattachment/deleteFileFromAliyun?url='+data.url+'&id='+data.id+'&type=2\',\''+addFile+'\',\''+divId+'\')" class="op-btn op-btn-delete" ><i class="fa fa-trash"></i>&nbsp;删除</a>'+
+                                '</div>' +
+                                '</td>'+
+                                '</tr>';
+                            console.log("file:"+divId);
+                            console.log("str="+str);
+                            $("#file"+divId).append(str);
+                        }else {
+                            parent.layer.msg("上传失败!",{icon:2});
+                        }
+                    }
+                })
+            }else {
+                parent.layer.msg("上传失败!",{icon:2});
+            }
+        }
+    })
+};
+
 function isContains(str, substr) {
     return str.indexOf(substr) >= 0;
 }

+ 195 - 0
src/main/webapp/webpage/modules/projectrecord/ftlTemplate/ftlTemplateForm.jsp

@@ -0,0 +1,195 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+
+<html>
+<head>
+    <title>模板管理</title>
+    <meta name="decorator" content="default"/>
+    <script type="text/javascript" src="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/iCheck/icheck.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
+
+    <link rel='stylesheet' type="text/css" href="${ctxStatic}/helloweba_editable-select/jquery.editable-select.min.css"/>
+    <link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
+
+    <style>
+        #projectDesc-error{
+            left:0;
+            top:82px;
+        }
+        .layui-layer-dialog{
+            background: #ff0000;
+        }
+        td input{
+            margin-left:-10px !important;
+            height: 42px !important;
+        }
+    </style>
+    <script type="text/javascript">
+        var validateForm;
+        var isMasterClient = true;//是否是主委托方
+        var clientCount = 0;
+        function doSubmit(i){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+            if(validateForm.form()){
+                /*if(i==2){
+                    $("#inputForm").attr("action","${ctx}/project/projectRecords/tstore");
+                }*/
+                $("#inputForm").submit();
+                return true;
+            }
+
+            return false;
+        }
+        $(document).ready(function() {
+
+            if($("#createDate").val()==null || $("#createDate").val()==''){
+                $("#createDate").val(getNowFormatDate());
+            }
+
+            var radioVal ;
+            validateForm = $("#inputForm").validate({
+                submitHandler: function(form){
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function(error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+
+
+            $("#attachment_btn").click(function () {
+                $("#attachment_file").click();
+            });
+        });
+
+        function insertTitle(tValue){
+            var files = $("#attachment_file")[0].files;            for(var i = 0;i<files.length;i++) {                var file = files[i];
+                var attachmentId = $("#id").val();
+                var attachmentFlag = "82";
+                var timestamp=new Date().getTime();
+
+                var storeAs = "attachment-file/projectRecords/"+timestamp+"/"+file['name'];
+                var uploadPath="http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/"+storeAs;/*将这段字符串存到数据库即可*/
+                var divId = "_attachment";
+                $("#addFile"+divId).show();
+                ftlUploadWithSts(storeAs, file,attachmentId,attachmentFlag,uploadPath,divId,0);}
+        }
+
+
+        function getNowFormatDate() {
+            var date = new Date();
+            var seperator1 = "-";
+            var month = date.getMonth() + 1;
+            var strDate = date.getDate();
+            month = (month < 10)?"0"+month:month;
+            strDate = (strDate < 10)?"0"+strDate:strDate;
+            var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate;
+            return currentdate;
+        }
+    </script>
+</head>
+<body>
+<div class="single-form">
+    <div class="container">
+        <sys:message content="${message}"/>
+        <form:form id="inputForm" modelAttribute="ftlTemplateInfo" action="${ctx}/project/ftlTemplate/save" method="post" class="form-horizontal">
+            <form:hidden path="id"/>
+            <div class="form-group layui-row first">
+
+                <div class="form-group-label"><h2>基本信息</h2></div>
+                       <div class="layui-item layui-col-sm6 lw7">
+                           <label class="layui-form-label"><span class="require-item">*</span>模板名称:</label>
+                           <div class="layui-input-block">
+                               <input  htmlEscape="false" id="ftlName" name="ftlName"  class="form-control layui-input required" value="${ftlTemplateInfo.ftlName}"/>
+                           </div>
+                       </div>
+
+                       <div class="layui-item layui-col-sm6">
+                           <label class="layui-form-label"><span class="require-item">*</span>创建日期:</label>
+                           <div class="layui-input-block">
+                               <input id="createDate" name="createDate" type="text" readonly="true" maxlength="20" class="form-control layui-input required"
+                                      value="<fmt:formatDate value="${createDate}" pattern="yyyy-MM-dd"/>"/>
+                           </div>
+                       </div>
+               </div>
+        <div class="form-group layui-row">
+            <div class="form-group-label"><h2>附件信息</h2></div>
+            <div class="layui-item nav-btns">
+                <a id="attachment_btn" class="nav-btn nav-btn-add" title="添加附件"><i class="fa fa-plus"></i>&nbsp;添加附件</a>
+            </div>
+            <div id="addFile_attachment" style="display: none" class="upload-progress">
+                <span id="fileName_attachment" ></span>
+                <b><span id="baifenbi_attachment" ></span></b>
+                <div class="progress">
+                    <div id="jindutiao_attachment" class="progress-bar" style="width: 0%" aria-valuenow="0">
+                    </div>
+                </div>
+            </div>
+            <input id="attachment_file" type="file" name="attachment_file" multiple="multiple" style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+            <span id="attachment_title"></span>
+            <div class="layui-item layui-col-xs12" style="padding:0 16px;">
+                <table id="upTable" class="table table-bordered table-condensed details">
+                    <thead>
+                    <tr>
+                        <th>文件名称</th>
+                        <th>上传人</th>
+                        <th>上传时间</th>
+                        <th width="150px">操作</th>
+                    </tr>
+                    </thead>
+                    <tbody id="file_attachment">
+                    <c:forEach items="${ftlTemplateInfo.workAttachments}" var = "workAttachment" varStatus="status">
+                        <c:if test="${workAttachment.divIdType =='_attachment'}">
+                            <tr>
+                                <c:choose>
+                                    <c:when test="${fn:containsIgnoreCase(workAttachment.attachmentName,'jpg')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'png')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'gif')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'bmp')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'jpeg')}">
+                                        <td><img src="${workAttachment.url}" width="50" height="50" alt="${workAttachment.attachmentName}"/></td>
+                                    </c:when>
+                                    <c:otherwise>
+                                        <c:choose>
+                                            <c:when test="${fn:containsIgnoreCase(workAttachment.attachmentName,'pdf')}">
+                                                <td><a href="javascript:void(0)" onclick="preview('预览','${workAttachment.url}','90%','90%','1')">${workAttachment.attachmentName}</a></td>
+                                            </c:when>
+                                            <c:otherwise>
+                                                <td><a href="javascript:void(0)" onclick="preview('预览','${workAttachment.url}','90%','90%')">${workAttachment.attachmentName}</a></td>
+                                            </c:otherwise>
+                                        </c:choose>
+                                    </c:otherwise>
+                                </c:choose>
+                                <td>${workAttachment.createBy.name}</td>
+                                <td><fmt:formatDate value="${workAttachment.createDate}" type="both"/></td>
+                                <td class="op-td">
+                                    <div class="op-btn-box" >
+                                        <a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+
+                                        <c:if test="${workAttachment.createBy.id eq fns:getUser().id}">
+                                            <a href="javascript:void(0)" onclick="deleteFileFromAliyun(this,'${ctx}/sys/workattachment/deleteFileFromAliyun?url=${workAttachment.url}&id=${workAttachment.id}&type=2','addFile')" class="op-btn op-btn-delete" ><i class="fa fa-trash"></i> 删除</a>
+                                        </c:if>
+                                    </div>
+                                </td>
+                            </tr>
+                        </c:if>
+                    </c:forEach>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+            </div>
+
+            <div class="form-group layui-row page-end"></div>
+        </form:form>
+    </div>
+</div>
+</body>
+</html>

+ 320 - 0
src/main/webapp/webpage/modules/projectrecord/ftlTemplate/ftlTemplateList.jsp

@@ -0,0 +1,320 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>模板登记</title>
+	<meta name="decorator" content="default"/>
+    <link href="${ctxStatic}/layer-v2.3/layui/tableTree/treetable.css" rel="stylesheet" />
+    <style>
+        .layui-table th{
+            font-size: 14px;
+            /*表头内容居中显示*/
+            text-align: center;
+        }
+		.pid{
+			font-size:14px;
+			font-weight:400;
+		}
+    </style>
+	<script type="text/javascript">
+        $(document).ready(function() {
+
+            //搜索框收放
+            $('#moresee').click(function(){
+                if($('#moresees').is(':visible'))
+                {
+                    $('#moresees').slideUp(0,resizeListWindow2);
+                    $('#moresee i').removeClass("glyphicon glyphicon-menu-up").addClass("glyphicon glyphicon-menu-down");
+                }else{
+                    $('#moresees').slideDown(0,resizeListWindow2);
+                    $('#moresee i').removeClass("glyphicon glyphicon-menu-down").addClass("glyphicon glyphicon-menu-up");
+                }
+            });
+            laydate.render({
+                elem: '#beginDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
+                event: 'focus', //响应事件。如果没有传入event,则按照默认的click
+                type : 'date'
+            });
+            laydate.render({
+                elem: '#endDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
+                event: 'focus', //响应事件。如果没有传入event,则按照默认的click
+                type : 'date'
+            });
+        });
+
+        function reset() {
+            $("#searchForm").resetForm();
+        }
+
+        function openDialog(title,url,width,height,target) {
+
+            if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端,就使用自适应大小弹窗
+                width = 'auto';
+                height = 'auto';
+            } else {//如果是PC端,根据用户设置的width和height显示。
+
+            }
+
+            top.layer.open({
+                type: 2,
+                area: [width, height],
+                title: title,
+                maxmin: true, //开启最大化最小化按钮
+                content: url,
+                skin: 'three-btns',
+                btn: ['提交', '关闭'],
+                btn1: function(index, layero){
+                    var body = top.layer.getChildFrame('body', index);
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    var inputForm = body.find('#inputForm');
+                    var top_iframe;
+                    if(target){
+                        top_iframe = target;//如果指定了iframe,则在改frame中跳转
+                    }else{
+                        top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+                    }
+                    inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+                    if(iframeWin.contentWindow.doSubmit(1) ){
+                        // top.layer.close(index);//关闭对话框。
+                        setTimeout(function(){top.layer.close(index)}, 100);//延时0.1秒,对应360 7.1版本bug
+                    }
+                },
+                btn2: function (index) {
+                }
+            });
+        }
+
+        function openDialogre(title,url,width,height,target,buttons) {
+
+            if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端,就使用自适应大小弹窗
+                width = 'auto';
+                height = 'auto';
+            } else {//如果是PC端,根据用户设置的width和height显示。
+
+            }
+            var split = buttons.split(",");
+            top.layer.open({
+                type: 2,
+                area: [width, height],
+                title: title,
+                maxmin: true, //开启最大化最小化按钮
+                skin: 'three-btns',
+                content: url,
+                btn: split,
+                btn1: function(index, layero){
+                    var body = top.layer.getChildFrame('body', index);
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    var inputForm = body.find('#inputForm');
+                    var top_iframe;
+                    if(target){
+                        top_iframe = target;//如果指定了iframe,则在改frame中跳转
+                    }else{
+                        top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+                    }
+                    inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+                    if(iframeWin.contentWindow.doSubmit(1) ){
+                        // top.layer.close(index);//关闭对话框。
+                        setTimeout(function(){top.layer.close(index)}, 100);//延时0.1秒,对应360 7.1版本bug
+                    }
+                },
+                btn2:function(index,layero){
+                    if(split.length==2){return}
+                    var body = top.layer.getChildFrame('body', index);
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    var inputForm = body.find('#inputForm');
+                    var top_iframe;
+                    if(target){
+                        top_iframe = target;//如果指定了iframe,则在改frame中跳转
+                    }else{
+                        top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+                    }
+                    inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+                    if(iframeWin.contentWindow.doSubmit(2) ){
+                        // top.layer.close(index);//关闭对话框。
+                        setTimeout(function(){top.layer.close(index)}, 100);//延时0.1秒,对应360 7.1版本bug
+                    }else {
+                        return false;
+                    }
+                },
+                btn3: function (index) {
+                }
+            });
+        }
+	</script>
+	<style>
+		body{
+			background-color:transparent;
+			filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#26FFFFFF, endColorstr=#26FFFFFF);
+			color:#ffffff;
+			background-color:rgba(255,255,255,0);
+			height:100%;
+		}
+	</style>
+</head>
+<body>
+<div class="wrapper wrapper-content">
+	<sys:message content="${message}"/>
+	<div class="layui-row">
+		<div class="full-width fl">
+		</div>
+		<div class="full-width fl">
+			<div class="layui-row contentShadow shadowLR" id="queryDiv">
+				<form:form id="searchForm" modelAttribute="ftlTemplateInfo" action="${ctx}/project/ftlTemplate/" method="post" class="form-inline">
+					<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+					<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+					<table:sortColumn id="orderBy" name="orderBy" value="${page.orderBy}" callback="sortOrRefresh();"/><!-- 支持排序 -->
+					<div class="commonQuery lw6">
+						<div class="layui-item query athird">
+							<label class="layui-form-label">模板名称:</label>
+							<div class="layui-input-block">
+								<form:input path="ftlName" htmlEscape="false" maxlength="64"  class=" form-control  layui-input"/>
+							</div>
+						</div>
+						<div class="layui-item athird">
+							<div class="input-group">
+								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>
+								<button id="searchReset" class="fixed-btn searchReset fr" onclick="resetSearch()">重置</button>
+								<button id="searchQuery" class="fixed-btn searchQuery fr" onclick="search()">查询</button>
+							</div>
+						</div>
+						<div style="    clear:both;"></div>
+					</div>
+					<div id="moresees" style="clear:both;display:none;" class="lw6">
+						<%--<div class="layui-item query athird ">
+							<label class="layui-form-label">创建时间:</label>
+							<div class="layui-input-block">
+								<input id="beginDate" name="beginDate" placeholder="开始时间" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"
+									   value="<fmt:formatDate value="${projectRecords.beginDate}" pattern="yyyy-MM-dd"/>"/>
+								</input>
+                                <span class="group-sep">-</span>
+                                <input id="endDate" name="endDate" placeholder="结束时间" type="text" readonly="readonly" maxlength="20" class="laydate-icondate form-control layer-date layui-input laydate-icon query-group"
+                                       value="<fmt:formatDate value="${projectRecords.endDate}" pattern="yyyy-MM-dd"/>"/>
+                                </input>
+							</div>
+						</div>--%>
+						<div style="clear:both;"></div>
+					</div>
+				</form:form>
+			</div>
+		</div>
+		<div class="full-width fl">
+			<div class="layui-form contentDetails contentShadow shadowLBR">
+				<div class="nav-btns">
+					<shiro:hasPermission name="project:ftlTemplate:add">
+						<table:addRow url="${ctx}/project/ftlTemplate/form" title="模板"></table:addRow><!-- 增加按钮 -->
+					</shiro:hasPermission>
+					<button class="nav-btn nav-btn-refresh" data-toggle="tooltip" data-placement="left" onclick="sortOrRefresh()" title="刷新"><i class="glyphicon glyphicon-repeat"></i>&nbsp;刷新</button>
+
+                    <div style="clear: both;"></div>
+				</div>
+				<table class="oa-table layui-table" id="contentTable1"></table>
+				<!-- 分页代码 -->
+				<table:page page="${page}"></table:page>
+				<div style="clear: both;"></div>
+			</div>
+		</div>
+	</div>
+	<div id="changewidth"></div>
+</div>
+
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script>
+
+    layui.use('table', function(){
+        layui.table.render({
+            limit:${ page.pageSize }
+            ,elem: '#contentTable1'
+            ,page: false
+            ,cols: [[
+                // {checkbox: true, fixed: true},
+                {field:'index',align:'center', title: '序号',width:40}
+                ,{field:'ftlName',align:'center', title: '模板名称',minWidth:200,templet:function(d){
+                        return "<a class=\"attention-info\" title=\"" + d.ftlName + "\" href=\"javascript:void(0);\" onclick=\"openDialogView('查看模板信息', '${ctx}/project/ftlTemplate/view?id=" + d.id +"','95%', '95%')\">" + d.ftlName + "</a>";
+                    }}
+                ,{field:'createName',align:'center', title: '创建人',width:200}
+                ,{field:'createDate',align:'center', title: '创建日期',width:200}
+                ,{field:'op',align:'center',title:"操作",width:200,templet:function(d){
+                        ////对操作进行初始化
+                        var xml="";
+                        if(d.loginUser == d.createId)
+                        {
+							xml+='<a href="javascript:void(0)" onclick="openDialogreAudit(\'修改模板内容\', \'${ctx}/project/ftlTemplate/form?id='+d.id+'\',\'95%\',\'95%\')" class="op-btn op-btn-edit" ><i class="fa fa-edit"></i> 编辑</a>';
+							xml+='<a href="${ctx}/project/ftlTemplate/delete?id='+d.id+'" onclick="return confirmx(\'确认要删除该模板信息吗?\', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>';
+						}
+                        return xml;
+
+                    }}
+            ]]
+            ,data: [
+                <c:if test="${ not empty page.list}">
+                <c:forEach items="${page.list}" var="ftlTemplate" varStatus="index">
+                <c:if test="${index.index != 0}">,</c:if>
+                {
+                    "index":"${index.index+1}"
+                    ,"id":"${ftlTemplate.id}"
+                    ,"ftlName":"${ftlTemplate.ftlName}"
+                    ,"createName":"${ftlTemplate.createName}"
+                    ,"loginUser":"${ftlTemplate.loginUser}"
+                    ,"createId":"${ftlTemplate.createBy.id}"
+                    ,"createName":"${ftlTemplate.createName}"
+                    ,"createDate":"<fmt:formatDate value="${ftlTemplate.createDate}" pattern="yyyy-MM-dd"/>"
+
+                }
+                </c:forEach>
+                </c:if>
+            ]
+            // ,even: true
+            // ,height: 315
+        });
+    })
+	function openDialogreAudit(title,url,width,height,target){
+
+		if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端,就使用自适应大小弹窗
+			width='auto';
+			height='auto';
+		}else{//如果是PC端,根据用户设置的width和height显示。
+
+		}
+		top.layer.open({
+			type: 2,
+			area: [width, height],
+			title: title,
+			skin: 'three-btns',
+			maxmin: true, //开启最大化最小化按钮
+			content: url ,
+			btn: ['提交','关闭'],
+			btn1: function(index, layero){
+				var body = top.layer.getChildFrame('body', index);
+				var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+				var inputForm = body.find('#inputForm');
+				var top_iframe;
+				if(target){
+					top_iframe = target;//如果指定了iframe,则在改frame中跳转
+				}else{
+					top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+				}
+				inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+				if(iframeWin.contentWindow.doSubmit(1) ){
+					top.layer.close(index);//关闭对话框。
+					setTimeout(function(){top.layer.close(index)}, 100);//延时0.1秒,对应360 7.1版本bug
+				}
+
+			},
+			btn2: function(index){
+			}
+		});
+	}
+
+    resizeListTable();
+    $("a").on("click",addLinkVisied);
+</script>
+<script>
+    resizeListWindow2();
+    $(window).resize(function(){
+        resizeListWindow2();
+    });
+</script>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script src="${ctxStatic}/layer-v2.3/layui/tableTree/treetable.js" charset="utf-8"></script>
+</body>
+</html>

+ 190 - 0
src/main/webapp/webpage/modules/projectrecord/ftlTemplate/ftlTemplateView.jsp

@@ -0,0 +1,190 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>工作内容详情管理</title>
+	<meta name="decorator" content="default"/>
+	<script src="${ctxStatic}/layer-v2.3/layui/xmSelect.js" charset="utf-8"></script>
+	<style>
+		#projectContentDataType-error{
+			left:0;
+			top:40px;
+		}
+	</style>
+	<script type="text/javascript">
+		$.fn.serializeJson=function(){
+			var serializeObj={};
+			var array=this.serializeArray();
+			var str=this.serialize();
+			$(array).each(function(){
+				if(serializeObj[this.name]){
+					if($.isArray(serializeObj[this.name])){
+						serializeObj[this.name].push(this.value);
+					}else{
+						serializeObj[this.name]=[serializeObj[this.name],this.value];
+					}
+				}else{
+					serializeObj[this.name]=this.value;
+				}
+			});
+			return serializeObj;
+		};
+
+		var validateForm;
+		var detailFlag =0;
+		function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
+			if(validateForm.form()){
+
+				var length = document.getElementById("file_monthly");
+				var rows = length.rows.length;
+				if(rows<=0){
+					layer.msg('请上传月报信息', {icon: 5});
+					return false;
+				}
+
+				beforeSubmit();
+				$("#inputForm").submit();
+				return true;
+			}
+
+			return false;
+		}
+
+		$(function() {
+			var editVal = '${projectcontentinfo.edit}';
+
+			if($("#createDate").val()==null || $("#createDate").val()==''){
+				$("#createDate").val(getNowFormatDate());
+			}
+			validateForm = $("#inputForm").validate({
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$("#messageBox").text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+			var tp = "${projectcontentinfo.dictType}";
+			var tp2 = "${projectcontentinfo.projectContentData.id}"
+			if((tp!=null && tp!='')||(tp2!=null && tp2!='')){
+				$(document.getElementById("projectContentDataType")).attr("disabled","disabled");
+			}
+			initControlData("1");
+			$("#attachment_btn").click(function () {
+				$("#attachment_file").click();
+			});
+			$("#monthly_btn").click(function () {
+				$("#monthly_file").click();
+			});
+		});
+
+		function getNowFormatDate() {
+			var date = new Date();
+			var seperator1 = "-";
+			var month = date.getMonth() + 1;
+			var strDate = date.getDate();
+			month = (month < 10)?"0"+month:month;
+			strDate = (strDate < 10)?"0"+strDate:strDate;
+			var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate;
+			return currentdate;
+		}
+	</script>
+</head>
+<body>
+<div class="single-form">
+	<div class="container${container}">
+		<form:form id="inputForm" modelAttribute="ftlTemplateInfo" action="#" method="post" class="form-horizontal">
+			<form:hidden path="id"/>
+			<sys:message content="${message}"/>
+			<div class="form-group layui-row first lw12">
+				<div class="form-group-label"><h2>基本信息</h2></div>
+				<div class="layui-item layui-col-sm6">
+					<label class="layui-form-label"><span class="require-item">*</span>模板名称:</label>
+					<div class="layui-input-block">
+						<form:input path="ftlName" readonly="true" htmlEscape="false" class="form-control required layui-input"/>
+					</div>
+				</div>
+				<div class="layui-item layui-col-sm6">
+					<label class="layui-form-label"><span class="require-item">*</span>创建日期:</label>
+					<div class="layui-input-block">
+						<input id="createDate" name="createDate" type="text" readonly="true" maxlength="20" class="form-control layui-input required"
+							   value="<fmt:formatDate value="${createDate}" pattern="yyyy-MM-dd"/>"/>
+					</div>
+				</div>
+			</div>
+
+			<div class="form-group layui-row">
+				<div class="form-group-label"><h2>附件信息</h2></div>
+				<div id="addFile_attachment" style="display: none" class="upload-progress">
+					<span id="fileName_attachment" ></span>
+					<b><span id="baifenbi_attachment" ></span></b>
+					<div class="progress">
+						<div id="jindutiao_attachment" class="progress-bar" style="width: 0%" aria-valuenow="0">
+						</div>
+					</div>
+				</div>
+				<input id="attachment_file" type="file" name="attachment_file" multiple="multiple" style="display: none;" onChange="if(this.value)insertTitle(this.value);"/>
+				<span id="attachment_title"></span>
+				<div class="layui-item layui-col-xs12" style="padding:0 16px;">
+					<table id="upTable" class="table table-bordered table-condensed details">
+						<thead>
+						<tr>
+							<th>文件名称</th>
+							<th>上传人</th>
+							<th>上传时间</th>
+							<th width="150px">操作</th>
+						</tr>
+						</thead>
+						<tbody id="file_attachment">
+						<c:forEach items="${ftlTemplateInfo.workAttachments}" var = "workAttachment" varStatus="status">
+								<tr>
+									<c:choose>
+										<c:when test="${fn:containsIgnoreCase(workAttachment.attachmentName,'jpg')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'png')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'gif')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'bmp')
+                                                                               or fn:containsIgnoreCase(workAttachment.attachmentName,'jpeg')}">
+											<td><img src="${workAttachment.url}" width="50" height="50" alt="${workAttachment.attachmentName}"/></td>
+										</c:when>
+										<c:otherwise>
+											<c:choose>
+												<c:when test="${fn:containsIgnoreCase(workAttachment.attachmentName,'pdf')}">
+													<td><a href="javascript:void(0)" onclick="preview('预览','${workAttachment.url}','90%','90%','1')">${workAttachment.attachmentName}</a></td>
+												</c:when>
+												<c:otherwise>
+													<td><a href="javascript:void(0)" onclick="preview('预览','${workAttachment.url}','90%','90%')">${workAttachment.attachmentName}</a></td>
+												</c:otherwise>
+											</c:choose>
+										</c:otherwise>
+									</c:choose>
+									<td>${workAttachment.createBy.name}</td>
+									<td><fmt:formatDate value="${workAttachment.createDate}" type="both"/></td>
+									<td class="op-td">
+										<div class="op-btn-box" >
+											<a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
+										</div>
+									</td>
+								</tr>
+						</c:forEach>
+						</tbody>
+					</table>
+				</div>
+			</div>
+			<div class="form-group layui-row page-end">
+				<br>
+				<br>
+				<br>
+			</div>
+		</form:form>
+	</div>
+</div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+</body>
+</html>