浏览代码

大数据衍射全部由数据库转文件读取方式
修改检验检查从知识图谱获取

louhr 6 年之前
父节点
当前提交
e0a129418e

+ 13 - 3
bigdata-web/pom.xml

@@ -96,9 +96,19 @@
 
 	<build>
 		<plugins>
+			<!--<plugin>-->
+				<!--<groupId>org.springframework.boot</groupId>-->
+				<!--<artifactId>spring-boot-maven-plugin</artifactId>-->
+			<!--</plugin>-->
 			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.8.0</version>
+				<configuration>
+					<compilerVersion>1.8</compilerVersion>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
 			</plugin>
 		</plugins>
 
@@ -115,7 +125,7 @@
 			<resource>
 				<directory>src/main/resources</directory>
 				<includes>
-					<include>**/*.yml</include>
+					<include>**/*.*</include>
 				</includes>
 			</resource>
 		</resources>

+ 76 - 68
bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java

@@ -1,94 +1,102 @@
 package org.diagbot.bigdata.common;
 
+import org.diagbot.bigdata.dao.model.ResultMappingFilter;
 import org.diagbot.bigdata.util.BigDataConstants;
+import org.diagbot.nlp.participle.cfg.Configuration;
+import org.diagbot.nlp.participle.cfg.DefaultConfig;
 import org.diagbot.nlp.util.NlpCache;
+import org.diagbot.pub.utils.security.EncrypDES;
 
 import javax.servlet.ServletContext;
 import java.util.*;
 
 public class ApplicationCacheUtil {
 
-    public void putStandardInfoContext(ServletContext servletContext) {
-        Map<String, Object> map = new HashMap<>(10, 0.8f);
-        //同义词缓存
-        servletContext.setAttribute(BigDataConstants.standard_info_synonym_cache, NlpCache.getStandard_info_synonym_map());
-        //分类关系
-        servletContext.setAttribute(BigDataConstants.standard_info_type_cache, NlpCache.getStandard_info_classify_map());
-        //分类关系树形结构存储    暂时只支持三级结构
-        Map<String, String> standardInfoTypeMap = (Map<String, String>) servletContext.getAttribute(BigDataConstants.standard_info_type_cache);
-
-        Map<String, Node> nodeMap = new HashMap<>();
-        for (Map.Entry<String, String> entry : standardInfoTypeMap.entrySet()) {
-            Node parent_node = nodeMap.get(entry.getValue());
-            if (parent_node == null) {
-                parent_node = new Node();
-                parent_node.setName(entry.getValue());
-            }
-            Node child_node = nodeMap.get(entry.getKey());
-            if (child_node == null) {
-                child_node = new Node();
-                child_node.setName(entry.getKey());
-            }
-            parent_node.add(parent_node, child_node);
-            nodeMap.put(entry.getValue(), parent_node);
-            nodeMap.put(entry.getKey(), child_node);
+    //词库同义词定义
+    public static Map<String, String> standard_info_synonym_map = null;
+    //词库大小类定义
+    public static Map<String, String> standard_info_classify_map = null;
+    //树形结构存储大小类
+    public static Map<String, NlpCache.Node> standard_info_type_tree_map = null;
+    //体征衍射
+    public static Map<String, String> doc_result_mapping_vital_map = null;
+    //诊断科室衍射
+    public static Map<String, String> doc_result_mapping_diag_map = null;
+    //特征性别 年龄过滤等
+    public static Map<String, Map<String, ResultMappingFilter>> doc_result_mapping_filter_map = null;
+
+    public static Map<String, String> getStandard_info_synonym_map() {
+        if (standard_info_synonym_map == null) {
+            standard_info_synonym_map = NlpCache.getStandard_info_synonym_map();
         }
-        servletContext.setAttribute(BigDataConstants.standard_info_type_tree_cache, nodeMap);
-
+        return standard_info_synonym_map;
     }
 
-    private void addChilds(Node root, Map<String, String> standardInfoTypeMap, List<String> hasAddList) {
-        for (Node node : root.getChilds()) {
-            for (Map.Entry<String, String> entry : standardInfoTypeMap.entrySet()) {
-                if (node.getName().equals(entry.getValue())) {
-                    node.add(node, entry.getKey());
-                    hasAddList.add(entry.getKey());
-                }
-            }
+    public static Map<String, String> getStandard_info_classify_map() {
+        if (standard_info_classify_map == null) {
+            standard_info_classify_map = NlpCache.getStandard_info_classify_map();
         }
+        return standard_info_classify_map;
     }
 
-    public class Node {
-        private String name;
-        private Node parent;
-        private Set<Node> childs = new HashSet<>();
-
-        public Node add(Node parent, String name) {
-            Node node = new Node();
-            node.setName(name);
-            node.setParent(parent);
-            parent.getChilds().add(node);
-            return parent;
-        }
-
-        public Node add(Node parent, Node node) {
-            node.setParent(parent);
-            parent.getChilds().add(node);
-            return parent;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
+    public static Map<String, NlpCache.Node> getStandard_info_type_tree_map() {
+        if (standard_info_type_tree_map == null) {
+            standard_info_type_tree_map = NlpCache.getStandard_info_type_tree_map();
         }
+        return standard_info_type_tree_map;
+    }
 
-        public Set<Node> getChilds() {
-            return childs;
+    public static Map<String, String> getDoc_result_mapping_vital_map() {
+        if (doc_result_mapping_vital_map == null) {
+            Configuration configuration = new DefaultConfig();
+            doc_result_mapping_vital_map = configuration.loadMapDict("doc_result_mapping_vital.dict");
         }
+        return doc_result_mapping_vital_map;
+    }
 
-        public void setChilds(Set<Node> childs) {
-            this.childs = childs;
+    public static Map<String, String> getDoc_result_mapping_diag_map() {
+        if (doc_result_mapping_diag_map == null) {
+            Configuration configuration = new DefaultConfig();
+            doc_result_mapping_diag_map = configuration.loadMapDict("doc_result_mapping_diag.dict");
         }
+        return doc_result_mapping_diag_map;
+    }
 
-        public Node getParent() {
-            return parent;
-        }
+    public static Map<String, Map<String, ResultMappingFilter>> getDoc_result_mapping_filter_map() {
+        Configuration configuration = new DefaultConfig();
+        if (doc_result_mapping_filter_map == null) {
+            List<String> fileContents = configuration.readFileContents("doc_result_mapping_filter.dict");
+            String[] line_string;
+            List<ResultMappingFilter> resultMappingFilters = new ArrayList<>();
+            try {
+                EncrypDES encrypDES = new EncrypDES();
+                for (int i = 0; i < fileContents.size(); i++) {
+                    line_string = org.apache.commons.lang3.StringUtils.split(new String(encrypDES.decryptor(fileContents.get(i))), "\\|");
+                    if (line_string.length == 5) {
+                        ResultMappingFilter resultMappingFilter = new ResultMappingFilter();
+                        resultMappingFilter.setFeatureName(line_string[0]);
+                        resultMappingFilter.setFeatureType(line_string[1]);
+                        resultMappingFilter.setSex(line_string[2]);
+                        resultMappingFilter.setAgeStart(Integer.parseInt(line_string[3]));
+                        resultMappingFilter.setAgeEnd(Integer.parseInt(line_string[4]));
+                        resultMappingFilters.add(resultMappingFilter);
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
 
-        public void setParent(Node parent) {
-            this.parent = parent;
+            doc_result_mapping_filter_map = new HashMap<>();
+            Map<String, ResultMappingFilter> filterMap = null;
+            for (ResultMappingFilter resultMappingFilter : resultMappingFilters) {
+                filterMap = doc_result_mapping_filter_map.get(resultMappingFilter.getFeatureType());
+                if (filterMap == null) {
+                    filterMap = new HashMap<>();
+                }
+                filterMap.put(resultMappingFilter.getFeatureName(), resultMappingFilter);
+                doc_result_mapping_filter_map.put(resultMappingFilter.getFeatureType(), filterMap);
+            }
         }
+        return doc_result_mapping_filter_map;
     }
 }

+ 46 - 42
bigdata-web/src/main/java/org/diagbot/bigdata/common/InitListener.java

@@ -8,6 +8,8 @@ import org.diagbot.bigdata.service.ResultMappingDiagService;
 import org.diagbot.bigdata.service.ResultMappingFilterService;
 import org.diagbot.bigdata.service.ResultMappingVitalService;
 import org.diagbot.bigdata.util.BigDataConstants;
+import org.diagbot.nlp.participle.cfg.Configuration;
+import org.diagbot.nlp.participle.cfg.DefaultConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import javax.servlet.ServletContextEvent;
@@ -34,51 +36,53 @@ public class InitListener implements ServletContextListener {
      * @return
      */
     public void contextInitialized(ServletContextEvent event) {
-        contextStandardLibraryInitialized(event);
-        contextFeatureMappingInitialized(event);
-        contextResultMappingDiagInitialized(event);
-        contextResultMappingFilterInitialized(event);
+//        contextStandardLibraryInitialized(event);
+//        contextFeatureMappingInitialized(event);
+//        contextResultMappingDiagInitialized(event);
+//        contextResultMappingFilterInitialized(event);
     }
 
-    public void contextStandardLibraryInitialized(ServletContextEvent event) {
-        ApplicationCacheUtil applicationCacheUtil = new ApplicationCacheUtil();
-        applicationCacheUtil.putStandardInfoContext(event.getServletContext());
-    }
-
-    public void contextFeatureMappingInitialized(ServletContextEvent event) {
-        List<ResultMappingVital> resultMappingVitals = resultMappingVitalService.selectList(new HashMap<>());
-        Map<String, String> mapping = new HashMap<>();
-        for (ResultMappingVital resultMappingVital : resultMappingVitals) {
-            mapping.put(resultMappingVital.getName(), resultMappingVital.getNameMapping());
-        }
-        event.getServletContext().setAttribute(BigDataConstants.result_mapping_vital, mapping);
-    }
-
-    public void contextResultMappingDiagInitialized(ServletContextEvent event) {
-        List<ResultMappingDiag> resultMappingDiags = resultMappingDiagService.selectList(new HashMap<>());
-
-        Map<String, String> mapping = new HashMap<>();
-        for (ResultMappingDiag resultMappingDiag : resultMappingDiags) {
-            mapping.put(resultMappingDiag.getDiagName(), resultMappingDiag.getDeptName());
-        }
-        event.getServletContext().setAttribute(BigDataConstants.result_mapping_diag, mapping);
-    }
-
-    public void contextResultMappingFilterInitialized(ServletContextEvent event) {
-        List<ResultMappingFilter> resultMappingFilters = resultMappingFilterService.selectList(new HashMap<>());
+//    public void contextStandardLibraryInitialized(ServletContextEvent event) {
+//        ApplicationCacheUtil applicationCacheUtil = new ApplicationCacheUtil();
+//        applicationCacheUtil.putStandardInfoContext(event.getServletContext());
+//    }
 
-        Map<String, Map<String, ResultMappingFilter>> mapping = new HashMap<>();
-        Map<String, ResultMappingFilter> filterMap = null;
-        for (ResultMappingFilter resultMappingFilter : resultMappingFilters) {
-            filterMap = mapping.get(resultMappingFilter.getFeatureType());
-            if (filterMap == null) {
-                filterMap = new HashMap<>();
-            }
-            filterMap.put(resultMappingFilter.getFeatureName(), resultMappingFilter);
-            mapping.put(resultMappingFilter.getFeatureType(), filterMap);
-        }
-        event.getServletContext().setAttribute(BigDataConstants.result_mapping_filter, mapping);
-    }
+//    public void contextFeatureMappingInitialized(ServletContextEvent event) {
+//        Configuration configuration = new DefaultConfig();
+//        Map<String, String> resultMappingVitals = configuration.loadMapDict("tc.dict");
+////        List<ResultMappingVital> resultMappingVitals = resultMappingVitalService.selectList(new HashMap<>());
+//        Map<String, String> mapping = new HashMap<>();
+//        for (ResultMappingVital resultMappingVital : resultMappingVitals) {
+//            mapping.put(resultMappingVital.getName(), resultMappingVital.getNameMapping());
+//        }
+//        event.getServletContext().setAttribute(BigDataConstants.result_mapping_vital, mapping);
+//    }
+//
+//    public void contextResultMappingDiagInitialized(ServletContextEvent event) {
+//        List<ResultMappingDiag> resultMappingDiags = resultMappingDiagService.selectList(new HashMap<>());
+//
+//        Map<String, String> mapping = new HashMap<>();
+//        for (ResultMappingDiag resultMappingDiag : resultMappingDiags) {
+//            mapping.put(resultMappingDiag.getDiagName(), resultMappingDiag.getDeptName());
+//        }
+//        event.getServletContext().setAttribute(BigDataConstants.result_mapping_diag, mapping);
+//    }
+//
+//    public void contextResultMappingFilterInitialized(ServletContextEvent event) {
+//        List<ResultMappingFilter> resultMappingFilters = resultMappingFilterService.selectList(new HashMap<>());
+//
+//        Map<String, Map<String, ResultMappingFilter>> mapping = new HashMap<>();
+//        Map<String, ResultMappingFilter> filterMap = null;
+//        for (ResultMappingFilter resultMappingFilter : resultMappingFilters) {
+//            filterMap = mapping.get(resultMappingFilter.getFeatureType());
+//            if (filterMap == null) {
+//                filterMap = new HashMap<>();
+//            }
+//            filterMap.put(resultMappingFilter.getFeatureName(), resultMappingFilter);
+//            mapping.put(resultMappingFilter.getFeatureType(), filterMap);
+//        }
+//        event.getServletContext().setAttribute(BigDataConstants.result_mapping_filter, mapping);
+//    }
 
     private void put(Map<String, List<String>> map, String key, List<String> value, String ele) {
         if (value == null) {

+ 11 - 11
bigdata-web/src/main/java/org/diagbot/bigdata/work/ResultDataProxy.java

@@ -28,9 +28,9 @@ public class ResultDataProxy {
         DecimalFormat df = new DecimalFormat("0.####");
         List<FeatureRate> featureList = new ArrayList<>(10);
 
-        Map<String, String> resultMappingVitalMap = (Map<String, String>) request.getServletContext().getAttribute(BigDataConstants.result_mapping_vital);
-        Map<String, String> resultMappingDiagMap = (Map<String, String>) request.getServletContext().getAttribute(BigDataConstants.result_mapping_diag);
-        Map<String, Map<String, ResultMappingFilter>> resultMappingFilterMap = (Map<String, Map<String, ResultMappingFilter>>) request.getServletContext().getAttribute(BigDataConstants.result_mapping_filter);
+        Map<String, String> resultMappingVitalMap = ApplicationCacheUtil.getDoc_result_mapping_vital_map();
+        Map<String, String> resultMappingDiagMap = ApplicationCacheUtil.getDoc_result_mapping_diag_map();
+        Map<String, Map<String, ResultMappingFilter>> resultMappingFilterMap = ApplicationCacheUtil.getDoc_result_mapping_filter_map();
         for (Map.Entry<String, Float> entry : featuresOrderList) {
             //过滤特征数据, 过滤低于阈值的数据
             if (!resultFilter(request, searchData, featureType, entry.getKey(), entry.getValue())) {
@@ -122,7 +122,7 @@ public class ResultDataProxy {
      * @param map
      */
     public Map<String, Float> resultMerge(HttpServletRequest request, Map<String, Float> map) {
-        Map<String, ApplicationCacheUtil.Node> nodesMap = (Map<String, ApplicationCacheUtil.Node>) request.getServletContext().getAttribute(BigDataConstants.standard_info_type_tree_cache);
+        Map<String, NlpCache.Node> nodesMap = NlpCache.getStandard_info_type_tree_map();
         Map<String, Float> resultMap = new HashMap<>();
         //设定阀值
         float threshold = 0.001f;
@@ -133,7 +133,7 @@ public class ResultDataProxy {
             }
         }
 
-        ApplicationCacheUtil.Node node = null;
+        NlpCache.Node node = null;
         List<String> delList = new ArrayList<>();
         for (Map.Entry<String, Float> entry : thresholdMap.entrySet()) {
             if (delList.contains(entry.getKey())) continue;
@@ -141,7 +141,7 @@ public class ResultDataProxy {
             node = nodesMap.get(entry.getKey());
             if (node != null) {
                 String topName = node.getName();
-                ApplicationCacheUtil.Node p = node.getParent();
+                NlpCache.Node p = node.getParent();
                 if (p != null && nodesMap.get(p.getName()) != null) {
                     topName = p.getName();
                 }
@@ -158,7 +158,7 @@ public class ResultDataProxy {
                     resultMap.put(topName, thresholdMap.get(topName));
                     delList.add(topName);
                 }
-                ApplicationCacheUtil.Node topNode = nodesMap.get(topName);
+                NlpCache.Node topNode = nodesMap.get(topName);
                 lookChildsAndCal(resultMap, thresholdMap, topNode, delList, topNode.getName());
                 delList.add(topName);
             } else {
@@ -168,8 +168,8 @@ public class ResultDataProxy {
         return resultMap;
     }
 
-    private void lookChilds(String own, ApplicationCacheUtil.Node p, Map<String, Float> thresholdMap, List<String> nodeNamesList) {
-        for (ApplicationCacheUtil.Node n : p.getChilds()) {
+    private void lookChilds(String own, NlpCache.Node p, Map<String, Float> thresholdMap, List<String> nodeNamesList) {
+        for (NlpCache.Node n : p.getChilds()) {
             if (own.equals(n.getName())) {
                 continue;
             } else {
@@ -183,8 +183,8 @@ public class ResultDataProxy {
         }
     }
 
-    private void lookChildsAndCal(Map<String, Float> resultMap, Map<String, Float> thresholdMap, ApplicationCacheUtil.Node node, List<String> delList, String topName) {
-        for (ApplicationCacheUtil.Node n : node.getChilds()) {
+    private void lookChildsAndCal(Map<String, Float> resultMap, Map<String, Float> thresholdMap, NlpCache.Node node, List<String> delList, String topName) {
+        for (NlpCache.Node n : node.getChilds()) {
             if (thresholdMap.get(n.getName()) != null) {
                 if (resultMap.get(topName) == null) {
                     resultMap.put(topName, thresholdMap.get(n.getName()));

文件差异内容过多而无法显示
+ 1154 - 0
bigdata-web/src/main/resources/doc_result_mapping_diag.dict


文件差异内容过多而无法显示
+ 1376 - 0
bigdata-web/src/main/resources/doc_result_mapping_filter.dict


+ 921 - 0
bigdata-web/src/main/resources/doc_result_mapping_vital.dict

@@ -0,0 +1,921 @@
+UAhzARPR0Qf10Met8kIgVw==
++A8u/ahQbqKnd4baFu155g==
+0UKoe8zCXefPulK2WolA3Va5do4bdCEifkRC94tU/To=
+8Tp+XthtGfGQJKtG6RTzExokdeqhF+go
+XktB/ud1IdrPgmIN6ApKBPWxb34fTDWG
+K/Brn7Ib8sRcPaf9LJ+DBQ==
+i7JwU1nco+SBcqYOn/p3qQeOdfp1kXgT
+fg3VEZ4eXv3+GMRwzHLVqvWEPETOYDom
+olBfBBlxWjyM96I3Xs6a7SHud7S4gPqZ
+UkldRKmIA6XTeO8h3KzbE1JJXUSpiAOlSGn9O0wylo0=
+98tZS+rEmlkcMOLS8JGPFnduRH/K+w4XryKysOD+KUY=
+aEFLrAB9hgtXGbeq1ZPeL2hBS6wAfYYLS2Pp6MTDBxE=
+aEFLrAB9hgs/AeD9UyuBxGhBS6wAfYYLrRQRI1ydLs8=
+PyqpOhFEBAIbikqc3Pog+DvfIILEoAZjZbG8KUhskwQ=
+4bf/szkP4tz4Y5lplGxRjiFAweb+TtuRmLHSnXSr1tGD5T4kUWam5Q==
+xhWftWtq9ZvsvE6g9Yp2r8YVn7VravWbLVdWfmPb2YI=
+vxbYaB+VKJBsS5LUKBN7hzX/KtP/8Y1rwcxRug42nho=
+dbb/nqpHFMqECyPJL1H7IcshUneIso8BNOeVZhn/Ac8=
+Pwacc4yn9IubHghofvZJSjX/KtP/8Y1rwcxRug42nho=
+IO1oQEFa/v130m3TyYKftXdbFU4uJZSuBASzRD8CLbY=
+oBu5zVSHPPL8TDhhEAofO5Rsg7fqcFtnc1Zb0Iz+B67MMzixc8eC8A==
+oBu5zVSHPPL8TDhhEAofO6Nl1S8YsDl80Gfgyi0jxbvNSZ28Fqx0gUpgEZ36UZf7
+oBu5zVSHPPK8l8TifqYoZcgiOVobKoiYc1Zb0Iz+B65hBX9kydshYg==
+fOrTNgGFmiYaubfPs72f8quOEBdMUBdd011whlSYrjw=
+fOrTNgGFmiYplc2ZybWmWquOEBdMUBdd011whlSYrjw=
+qoGjKQFnt7YBK2PIIM9+Cwx/w4/vTBWbrTLV+AcRYgGBbwIGZjiRfhVMwnleooJT
+uvaBJAcZFNds2zB4pUp/NLr2gSQHGRTXuhV5lrnssFU=
+cc2O2ErPHjaW9lRUGVrS9EYaw/JfO4JTPEjsemsNdiY=
+Fm6FhlKr8CPYHkRoOFT4ixZuhYZSq/Ajy6dyqOg/k3E=
+ZEPi+GPAF+jugkF1qqDd+WRD4vhjwBfoSNL7p2JKYZg=
+oRqu1B35G5rbxfAeY2EVMK04iybxhohrBpdWO4Fg8Pr3QhuGSiXXyw==
+fuam+naSn9KgX+GpHsWCrg==
+J/ywEOrmnqvShTNi7+4gEK8nK0CULuGtskF4kESh+LM=
+yfAIL5bW83d7CgdhAuXHiUjCWF2zvkE1atKSiOnQI0Y=
+enu6avlk5YpYqoBsat2YbzXZgSUyF/GdvgJU7rpjpfE=
+7+jGLvyUa5/Yh0tep9xrO9DE8mLUkOBnOq4FtKDlq5o=
+6wlgpJFzcf7VbitxfgpQhtwMPiv1ajnLvgJU7rpjpfE=
+Yy+RisEA3WeacctNq0KkK/BTamT/jgXXGjFhHUGm/IA=
+Yy+RisEA3WfFKhCR9/Q+JPBTamT/jgXXGjFhHUGm/IA=
+EDe0NFCJQvZa3IGJc7gruP2/W1+HYjdDBiNf+1YVhVY=
+E4hT7N3ytDvTeO8h3KzbExOIU+zd8rQ7SGn9O0wylo0=
+E4hT7N3ytDvtn/U1rdYHwxOIU+zd8rQ7XVLw9eJaiys=
+E4hT7N3ytDuRMvbsctv8GROIU+zd8rQ7fSzrHtCtCfA=
+0gJJ4eT+QkquUkyijQrbhjwR40iYrlSn
+fFPdqoc78PPpKHShXNtYAEpgEZ36UZf7
+2VnBmYRg5zvda1Ywa4fZE7O+fe4P+8qM
+tFWoa+Fa+E0yY+Up6+gBRL58J9w2rdLWRPSDQg6jxMY=
++l0W0xn2JisHaKGhyASQJYHYRN+xXxTBvmys7d6QFJk=
+wyAhnI9iC+uMnf5E827xCmBPDGFC9wgfBASzRD8CLbY=
+wyAhnI9iC+s0DUaFzexLGmBPDGFC9wgfBASzRD8CLbY=
+wyAhnI9iC+uELqeRheZkvGBPDGFC9wgfBASzRD8CLbY=
+j1guSEHHCuR4abTVpuzkqxioYo8K988BBiNf+1YVhVY=
+080IZsc81Fk4sUfChItYiA==
+TKNSNdqos1P0w8pIRafPiQ==
+8VitcNoBXAtX23Y1G5a6cQptsZ2H6OWn
+xPUAqLbOBlzRDNKxpCQAA8T1AKi2zgZc9YfRIjL5Ktc=
+QoDu3HV1C6oJz39Bb0uwVTdyV/Mx6XpSbENZYM316MM=
+SObVEgiERlXTQZdx1iZp3UGphsMK03t8
+YUxF9R1PnhFegbyH7wSWLG8pqmcRFp34J9+B79Ksa2kzBXeQmxljDw==
+dFBNHJ7NONdhGDlCTb1US8IDrOT9t+vX
+E15h7WxtCFc2CX7dMYQEh81QHv0WTE4JvgJU7rpjpfE=
+udYnRmH717aOlKx4CS8Z8TSfNvu6TNjQBASzRD8CLbY=
+zymIfQvgoOwD2nyIzKs+lU77OSqWg/c/3VSrUIlGaYE=
+6aKrGF9UZz9KFYkTTsqeykPwVzRAzwRPbHtWBq+Dwak=
+flRnb2S3MMdrSNrsd9xvuA==
+d6/WlpxTwSscJDcSrwbauKVaVePy5OzR7NLBEkDmDJE=
+tIEhYj+TusJEqHLqoaGmFMYLGNp/VSkVWRaTFzIkLGM=
+xtCriKwKEaXzEcoAZ2UDHrMZg+Ol+NGYF8GIy1NJkdE=
+Ct+/ZMeI82X673nxNvyJiu9GLm7YBOP0SJAqyeGLlGQ=
+YKH3VLPNTeyWdV5caABAiNhmyYhFEPDLXiguQ/MHYD0=
+MIqhjxJmusPrfgC7wGdnmKCUMFUcmUqK
+ZQ2LRXszz8kSAbY1DsWadOh//o7r6XxK
+/K+ThajQ/dfvcc6O29A2f4lqS/Mj6xYPn777VwNyqoE=
+wICtK1IUPa6W0zF49pWNSUeYGAroSv6dSJAqyeGLlGQ=
+nW8CI9k62L02mD1TDX+LS51vAiPZOti9DoBDkkMJqoI=
+nW8CI9k62L00aMbD7d8dz17IWQydvrHXW7k4wPhAGm++Peof7PeC6Q==
+DdYJ41tkonZ5XOpeZn4QidIUlWmOeVgv8HwQ4K/4B5ttY1CEpVlMHg==
+Gk8oLdRS3gxpKTjNikKsfLs9F4LyYomyQsjDFyh0etI=
+PFrAddEL4pzX0RbKyJvnpy9SVZGkU2DK+eba7duZR1lioLrTn8ZW2A==
+j23xQ58QAELVzHyFm3niykGyx5t7pL84Oq4FtKDlq5o=
+j23xQ58QAEJ8mBRbsBkfs3wcWqo7FXn4hNYv1+T6BN0=
+cn9SelEe5Hv+ubbNNz+FZtbskd2Q9Eo5Z5WjJulMlEE=
+/j0M5sfgPzLOk52if20mxw==
+fjMCoG0jWP70D9MCaB06J2uHsBqKgYJy
+0gGUhVPoq4G6hnX53NjgLrYC32YgTV1X3uOrqlqKCX0=
+BsWMI/N9HfOzbDHIoU2htbskWOWaLi4uZbG8KUhskwQ=
+KgmO1PFbNMavVNXf3J8ZWGqBMJ+Pk0DbXnwIH8A1QSQ0NfV+EiaCXzgDx8qs11DG
+MuMDNZcg7nZO0EmI9a+k5ncPD33t0ml2syt8HrP/pcSzXBgsQFYzuw==
+Pi3wT64utZrDnUvXZYRoA/Kj9HvbuC+X7NLBEkDmDJE=
+Xpd8xjvI4CCkbrgqDpZu05fAkIv2a/rRSJAqyeGLlGQ=
+AX3Duro2QJ+E/pbB/Jm1/604TgZpNwc1kHp6lXvE8SqxDWcnRW1BHEpgEZ36UZf7
+Z5YtqmbJBKHMbyjLTchoHtBGyCYVBnZyVbBCO8cUTWk=
+PMikm6ZOGyJ1m1inn08K6LbqHMzYOiYtFMZpp0RTvZI=
+PMikm6ZOGyIKsqVBON1zjKHT8+SKZwoVC8at4D0TvJ8Q/Sq4QLi9FQ==
+PMikm6ZOGyJ5h6BaDEZBhqHT8+SKZwoVC8at4D0TvJ8Q/Sq4QLi9FQ==
+8c9eljjNpb61eo7t6oDXmx1uXWlpRJO0fZ1wgfbo+vIkFStuDxoGnffigd5WxBh+
+NhZObOtoJl8pAeTv2wlQLgyGawPO7JWaryKysOD+KUY=
+kjhHUdlPTadHGAO3beL1pDyvysLaX7DZ
+1jVmhx/d4tH6DJeaEF8xKUEPKQo6lUkBZbG8KUhskwQ=
+TtKmAkYb6HnxjtxHyZnIw0EPKQo6lUkBZbG8KUhskwQ=
+3hheyJz3V/34SP0dcD7s71/4tQ0bMmAd+Ej9HXA+7O8I6vTWnQXQRw==
+Lib0vPfLPtxEpmEtu+VPzxksyOBEscR3iy48LWiKVlE=
+ZrU0s36NPVIPX8N7xPjKkL7qvKIC0DC8O8B+JsbxdH8=
+YQQzAAyWvKh2w8q8JxH30SFqPT+S5rzfFWN3xRThYNo=
+qFhKC4xvDKwL5mGLILBHXUiXRFo9Aa23AGxaLY4tP2M=
+joB4IcA83AWNSvebcO4BiL8LeKWpgSGtXSbGJs3iiXG+Peof7PeC6Q==
+1cg7mRlV5xONSvebcO4BiL8LeKWpgSGtSKqx8eVEK7m+Peof7PeC6Q==
+C6UiFAmco8y1FUfOYTyArARi+kgSSDQkhSFrjI+fSRY=
+tFjZ6z0VdLlYqoBsat2YbzXZgSUyF/GdvgJU7rpjpfE=
+JtlQTh+8G26zbDHIoU2htbskWOWaLi4uZbG8KUhskwQ=
+JtlQTh+8G24c6kU7pH5cVbskWOWaLi4uZbG8KUhskwQ=
+MgUw+6QtiyqeKpuD11H1CgRi+kgSSDQkhSFrjI+fSRY=
+b1iz9138JyavVNXf3J8ZWGqBMJ+Pk0DbmhY4VLvdi4U0NfV+EiaCXzgDx8qs11DG
+nY40Ut+RIFoc9nsNL+OXjJ2ONFLfkSBaYl1GqHN1GQA=
+pyxGPw41ncvMbyjLTchoHtBGyCYVBnZyVbBCO8cUTWk=
+DMpn0HNqQvEKsqVBON1zjKHT8+SKZwoVC8at4D0TvJ8Q/Sq4QLi9FQ==
+DMpn0HNqQvF5h6BaDEZBhqHT8+SKZwoVC8at4D0TvJ8Q/Sq4QLi9FQ==
+d1AxPOpo2Cv93JNqsUycwwSLEezwDmWg/drEPLBEyQw=
+A9EjgvwkmHo+03JbZpPE8Hfn1DKk1F/4Dn+yn06ez/M=
+BhsjQLQoO71W2IqCAxB59IlqS/Mj6xYPn777VwNyqoE=
+BYKkcMrlbA8rs5eHoCDZFp3Pvk80g3i5yzLSqBF4Qps=
+C82vb02Df1JjaLTyEAOGq4L7OSgM5NFk
+/UXMNRAbEKsNb1xbo65ynxMlWU6alBDjO8B+JsbxdH8=
+rc1zi+a6JBrTo+B+vTsKY6ZyCMGQDyCDwQCJH/19Ln8=
+iF/Iy08qg25R6LM7+ZWh3vAhhfcEVqY+BASzRD8CLbY=
+OLDqQX03hXI0XKLw+5TFRUwNGO5Ogn8OZqxkL7I2NVI=
+itxCkCgM3e/HR/yXsgqARTWy3QE3h5UCAGxaLY4tP2M=
+LesXilJbw1zU1HHtteHSSaq9hvWLhhkTA1p8C3jFxs8=
+LesXilJbw1xs40O3vb/386q9hvWLhhkTA1p8C3jFxs8=
+8hOYBSoW2rw357iKkbbJNKvmAiJ1O7EFwjQM4EcB0Tlw2tKUH/Mr1g==
+a2qaEgH2uitUKTzJfTzWAak222GTl6gFUiIv/D5WOos=
+krrruYgapLXZllAv/2HVX9L7+fEKZv0KJAzhCMCR95WpdbcStATXpA==
+yj08ZqkH6UHP1nDhegL2lso9PGapB+lBIh9npNstG2I=
+xxZWOqQuI9XdlcvkMNg5KscWVjqkLiPVPA+yLHt86QQ=
+N87pCW+PJ61zb3nyqhq4LeRQWMhHBjWpB451+nWReBM=
+mo9+1qJ1Bj+lczdM8fSw3A==
+YwhAwisuJxnqwH9CZg8yZwTmQu6VtReBZ5WjJulMlEE=
+p8rSijy4S/z9jIKrcZHCAg==
+pq+h4zIgi8NXOVOSA1ZI6p4v2SAHQkIu
+XcJy0D6ZIbnmSSZLxUCJkp4v2SAHQkIu
+8adGIwlWWpyadbJk4GAiXikAN/sCm2Ft0q/AY+ii4C0=
+/hyoJ0OpfoWC/LNm9Hp9WGar/ECPvFUaF+ILpw1ycyXIzRRf893Duw==
+/hyoJ0OpfoVnEHJZIsQM9fdiYTQ1i6WuF+ILpw1ycyVBl8n3844wlw==
+GSlPybW1zPDmSSZLxUCJkp4v2SAHQkIu
+8TGR1QwfnTBpotEfz8I+YLKXV//u3jtcZ5WjJulMlEE=
+SpF2P7OBV2wegz8zIdldwUqRdj+zgVdsNJGmuEyjS8s=
+ZvZZTZ7pziyNqUSxxCASkHzEZm9ZPC4O7NLBEkDmDJE=
+/xXph/WD+DB58snWo/4AUHEVx3SMYWgo+E2a+WrAOSSoUdn6Tyi38Q==
+/xXph/WD+DC+1a2XxvflnXEVx3SMYWgoGPBJmx8X1uqoUdn6Tyi38Q==
+cRXHdIxhaCiPVM7ZLMk1VYRdNR24d3uPFq3wx9naQvdSzlBthODeKA==
+UrlPSgtiaPLJkWf9fy2Raw==
+gPP0pn4Vnj8nXqmtlcEY1T1bJ4IjKcyniy48LWiKVlE=
+9ATztfXQ4YIsHnge8Xnl74nl/1XwI7OU9+KB3lbEGH4=
+4tpRm69RvqsKmD/nTTHWgDnpkgGKkmzg/FRS7OcKkCw=
+RMvBGSygzAh9w+Rjqt54okTLwRksoMwINA4hp0V8TNo=
+kSAhO9CzcUTmrrPnrDrHqx973JVNVnZuy4x6AQXguls=
+ecRd3YmlGXsYMJDHu5JraQ==
+u1c81U2XanhA7GBUVpOV/rIrbOqvt3WS0Zi/2VsQQhM=
+/FLxB86zFvBgoVKxRjTUev2/W1+HYjdDBiNf+1YVhVY=
++f2HbkfmqV4iJ/UW1nvPJjFb/LPZrxpW/FRS7OcKkCw=
+T5kzYYlVa6JpWOS3AlvTLOkL/m2R6SzxEwsL/uWWMxOlFI1nAKhgow==
+EOBt6VwRTEb4Jqp6Jt1+/Cnc4TyMqf+x
+HcoRQvqpZkoOfkFfjiFYBB3KEUL6qWZKghXYDLDGUjU=
+dPtc1NlBhWCrAYN/GMqzxZ4v2SAHQkIu
+2e7uYOPTI79eqnfOaRKA0g==
+UaSY6fDNqjhveVf/77+GhA==
+TG0ZzSWO3qWlhLmaXm8CGkpgEZ36UZf7
+Nyf0K+tj7F+up+L02Mfh87j+/5/peP/7
+bPRFWaAJ/eQcy9OKY5JeFrsfZbE2TFcHZbG8KUhskwQ=
+hlNWSTif4T6+E+KSh/Q3h/h1FFqRmzitav3bY6gAyDY=
+nrF6JY01jhDbETTC+K3nXQ==
+MRVT8OqakW5fniN8e8zu9WtAsj+g+txU
+CriSCwqltGpIwEzRSy6SDDrAEiAbHvMM
+IQI8TdWPqkb4gXCux2R5Aw1Jk8rT54ZbGjFhHUGm/IA=
+zv2LU12YL5Y7KPGqDyepes79i1NdmC+WVbBCO8cUTWk=
+zv2LU12YL5bb2INQ3k2Ym879i1NdmC+WHJcF65EK1c4=
+JYCkkl3fmOaP+TmIjhZGL4lRyZKaVKmgImsQu9NuQ59w2tKUH/Mr1g==
+nwBxkxtVkmhO2KMxulPDWhMn31WcshlN
+gJ0jLgvDLuR9tEYyqaMIGEyVFcKaJldi
+aS2TcLa0weJe02tnodIhaA==
+koyqxJA/Nmqz3H0lWP6JIv2/W1+HYjdDBiNf+1YVhVY=
+MWb0E7WsWMYwFyi1IaZpA4szgo77Q3CVZbG8KUhskwQ=
+s0UcSmE9+e9YiwxTuBnVjm7shZQ9NQdrIsY3y+RgJaU=
+AikMxc6U6Lq8UGbFh3xJZQ==
+nje2JJx5AaZX6+jq++Ubz87/tACVFJMR/FRS7OcKkCw=
+FIE0JiVOEyCplffU+3Mc1xSBNCYlThMgCs2+9Axdk2g=
+FIE0JiVOEyDXmH31BbEr+BSBNCYlThMgjfksl5blglA=
+FIE0JiVOEyDsK+w2tHRuPBSBNCYlThMgVIz7qr8YKm0=
+FIE0JiVOEyCTrA8NkwfiOBSBNCYlThMgVIz7qr8YKm0=
+FIE0JiVOEyAjGqVvnw0T8xSBNCYlThMgWLZOJ4VLhx8=
+FIE0JiVOEyDO+uyfk2ixBtPkHk6/MjDxcfrBxkpmJ6QrkFqkuiJw6sm32hUS/XIh
+FIE0JiVOEyBzVlvQjP4HrmpILQwZyM3Qp0H5SWh9xSdOLOOxcTbilgxH7TvUCTrr
+1j52Uc5xWCuL6BW7WgsRB2zyzv2IehJ8ZbG8KUhskwQ=
+O2VvNVqML1KvVNXf3J8ZWFLkXbaSuuEWPYlD18L0k/c0NfV+EiaCXzgDx8qs11DG
+14XA9bJFfcVj1OzUC2h7tzvtKcbFvrVzCTLN0w4X8fKCYhVsX1ug1Q==
+p2VzEvdv8akUV6g7W25sghn1AyZOJwhjgW9Ccc2cMbpPDu6bhIEPcA==
+7JE1nvqVpkpBJGQEgM2n1eyRNZ76laZKfds87HbRifg=
+7JE1nvqVpkoc9nsNL+OXjOyRNZ76laZKYl1GqHN1GQA=
+STcJ8c/FcFsa1Psz+IIZS0k3CfHPxXBbbQNtrV52HVQ=
+g99MO8FN1D5MfME/tSkjjpf9MN8+DZPb7KAVG2lPb+RQMMXI0pTedvwLQyzdi7io
+g99MO8FN1D7q5VENJBaBvyNk4TwrzSIw7KAVG2lPb+R1zc4x08XR3/wLQyzdi7io
+g99MO8FN1D56Fddr7hlr8tML2v8oYEmn3VDoV3QsKv7AJN20uiDrtUpgEZ36UZf7
+g99MO8FN1D6gaXRRrB2In9ML2v8oYEmn3VDoV3QsKv7AJN20uiDrtUpgEZ36UZf7
+qMPQaIGrpezlqOQPaBru2Jq53E8FSxJDiKbyU7+plsSzADtSbtsJDRHrOQg9htYx
+qMPQaIGrpezlqOQPaBru2C4J8p2ueG8MiKbyU7+plsR4ezu3JUMN+xHrOQg9htYx
+Y9A+gg9R2s2fQim4e0rjPWPQPoIPUdrN8oScOsjcRZs=
+Y9A+gg9R2s1ushPSH9+/SGPQPoIPUdrNfvqbuOSwODA=
+vryxtT6ncK/qaRWtQGLbON/oJMCdPMlZda0GsrQ3i+bfRvLZZgm1nQ==
+vryxtT6ncK9QXe1IsSYqxV5ZoSCq56ESda0GsrQ3i+bfRvLZZgm1nQ==
+vryxtT6ncK/yfQNxklPMxm6W4E4Zzonz+912MVnBN13vsQP2pokabA==
+vryxtT6ncK/8wmSqbN3Wsi7sSIe/MzKWxKb8XsulpWDOD2fB9G081eecLLWV6SJq
+vryxtT6ncK/8wmSqbN3WsjOesBgPJHVOxKb8XsulpWDOD2fB9G081eecLLWV6SJq
+vryxtT6ncK8lSA0fG714oDI5Q7lS67Aju7QdzsZvwuvsygA4/cwtRg==
+GRzyUl5G+x91m1inn08K6LbqHMzYOiYtCrKlQTjdc4waSQ0ihkOTZA==
+GRzyUl5G+x95h6BaDEZBhqHT8+SKZwoVC8at4D0TvJ8Q/Sq4QLi9FQ==
+DtDdl2Yw9CqGaz4t6B+0hOpDNvv44seC
+CHLNhe40sNobyMLVywzPnWw2ZqTGDA+b
+UueKL3akmJcxYSIr3rZ5HV4bTV5MNJvEZMTIRQftDaD2x6JFBPAbcA==
+UueKL3akmJd58snWo/4AULa/FS+XVNbVHqWQ/oVLEK8=
+UueKL3akmJe+1a2Xxvflnba/FS+XVNbVf2HWawEOSko=
+m7o3vEdJZMRRwKK9rzYzmde5k+9MeidX83dXIoHx4+e8Zr+1ZzgxAUpgEZ36UZf7
+tr8VL5dU1tVUXQGuec+kBLa/FS+XVNbVMWEiK962eR22kqt+Iq8ONg==
+tr8VL5dU1tUxYSIr3rZ5HV4bTV5MNJvEZMTIRQftDaD2x6JFBPAbcA==
+tr8VL5dU1tV58snWo/4AULa/FS+XVNbVHqWQ/oVLEK8=
+tr8VL5dU1tW+1a2Xxvflnba/FS+XVNbVf2HWawEOSko=
+FuGDanOqERWtktBprG3sQznybeZeC7bgZ5WjJulMlEE=
+0u+yQewY64yZkH6M7ZzjRw==
+prfJfRawKQUqCU/+qEBgqLgI5EXUXdvIydVsDztYBYtcy56AEq1wSahR2fpPKLfx
+B++XjWNiwxp2xkUZqwhVVp4v2SAHQkIu
+vXieyS6VHlhCN0YDeNBBtmFhI5ctmLmD
+vXieyS6VHlh/MyisL1m732FhI5ctmLmD
+a2zCNODpNjJHVSyomC3RNp4v2SAHQkIu
+VnrAleiz9BcvlTeGYr4z0GGIHzfa5yuM/FRS7OcKkCw=
+aLicfrOGw4vp1+B3EtTTEWpu4I82OBoR
+PA6vPm9kiUYaHZ7J0lO1gTwOrz5vZIlGAgEpDB+I1Vw=
+PA6vPm9kiUYqqtObA+jC6TwOrz5vZIlGAgEpDB+I1Vw=
+a//0Cgxjos/jQh3nVG2RciXBPH2DKdJv
+bBAbveiPWmKJ/PHXGtzvi4odSpEvESgm
+WmuWJuTwCRsYb+zNYf8YoEpgEZ36UZf7
+Bk/nP68MuaWLcOureSEh6wZP5z+vDLmlg7Q9YeM+5Os=
+v4S90bmdTGGB6Mv+r3oUPb+EvdG5nUxhiGlTuYvwdd0=
+v4S90bmdTGEqqFf1kGpzN7+EvdG5nUxh75dIY3QhG4A=
+uEm+zGdzejuZnF6DuRckiW27nvnjqQYwyzLSqBF4Qps=
+RjlHunEZKP0T7ne662LsTqsq5P4L6Ap+/FRS7OcKkCw=
+YSKAoBxxX2YjAs+T2gxrss9LDbQ33mH7
+w0FcE22waepb0FRV5yj+tWApXEYMyMBPszksQO0S2Jk=
++AD/rZpYED9L58cEADwJHq8VNz24YO2L
+Q0J/+EnHM3rprHaPoFnSBc9LDbQ33mH7
+GBoXxXTOiUUOLL9kDKY3ChgaF8V0zolF4PUbFHPSm24=
+GBoXxXTOiUWb6DKgZ13YZBgaF8V0zolF4PUbFHPSm24=
+IMHDeNUnTX3QHYMe2/qu5fccs0BDbFoqV2Le1m4XGVw=
+XBz/0WesuX+W5RytCgvxs1jKwedLHULy0FLeKWatmmsM+3+ZxP8wKA==
+IcfqYrsxHcsRR9DGg7KxUt9zwNItyBWhAGxaLY4tP2M=
+oPhDFaqTtcfAvh3kNk3SJC1t13qMSy/k/FRS7OcKkCw=
+t+fc8F7KGD3YP+5g12Xd/TckQ1lM60MxbIFXurBxXlF7arQIk4twhA==
++9YAgXKwnnDeVrqfQty5mKp1S+3tbEMyXnxmhPdKEuw=
+ZVKesIbC5UDPJ23f127MIBfmfkKXu19EBASzRD8CLbY=
+P1EPh/GVwXTPJ23f127MIBfmfkKXu19EBASzRD8CLbY=
+RV12FyWi2m9NGaQLxDyRVy9Jtri7jcCu
+iUchhe2/rwmo9N+4b9O4Kj7Nn+r5o8/wBiNf+1YVhVY=
+puGqUHg2pdbCcVOxsHJ0vT7Nn+r5o8/wBiNf+1YVhVY=
+Z9ulCaAnj1wqVsD26zR7QY2A+dCHYsY+QsjDFyh0etI=
+V/cwxO1va3QNG8dYx1SrqimeJNcxLvwdfkRC94tU/To=
+tEGfN05J62p7+mtEP+W2zmofQiDAQV1+YEg4WqLcrb0=
+caueP01nutnAYhfhdZc0DIddWEMbjnMV0Zi/2VsQQhM=
+VynNxYGlkQBi1DM1j79KO+Iiw5mWoSM+bkJ8I2Mw5U8=
+BT3BDz5UVQtCIBzPA0Hzjw==
+GxLyab77WIVNVxv1Q9UBH1GAC9Z34mk5RPSDQg6jxMY=
+UtCC9SEz4uw7KPGqDyepelLQgvUhM+LsWDm5Lq8Ayo8=
+UtCC9SEz4uwuhTHXw3/53lLQgvUhM+LsWDm5Lq8Ayo8=
+EQ0++UQ15V6yYb3mwQVJHhENPvlENeVerOW0a497QYM=
+hLQNb8ee7VmTlTng6OND3TuNbdkE2wQkfkRC94tU/To=
+yvOBbTrbEUqK3KXUbQsrtMrzgW062xFKFpcGMsPOjPg=
+L4fv7s2vspT93JNqsUycwy+H7+7Nr7KUpZwvaxMxA0Q=
+vlwcdwZ8FBSYPUdk0/IdWYfMR9GClb5O
+eFhYVPfX+7dw0mETqn25yV53qiy/ifzJOTp3rprBbf0=
+XneqLL+J/MmTlTng6OND3TuNbdkE2wQkfkRC94tU/To=
+Dm0OWrp7Uv2TlTng6OND3TuNbdkE2wQkfkRC94tU/To=
+3vSAWdieYDMI3qYrJnE6eQ==
++JxKobHWjnEqmP86D2wswNhmyYhFEPDLXiguQ/MHYD0=
+TIsVL5DUBcEqmP86D2wswNhmyYhFEPDLXiguQ/MHYD0=
+TtKrGpFJaX/rxj9pcc7diJ4v2SAHQkIu
+jlWMwTmo4B8Fo94fcHp1+45VjME5qOAfHRufi7Dz8+U=
+B7IoxD+rD6TVlLrDUTFPoAeyKMQ/qw+kv1mdfqrePJM=
+UyDbWxQXOCFyWkMtzNxKjZ4v2SAHQkIu
+mY0AC8tbAB4iVnQcMMKOVtvdiJSj1vI8/FRS7OcKkCw=
+ttuFIQiBSmBR5rYLL1hCP7bbhSEIgUpgkDtcX5PjG7c=
+5pjjlw/5pTHPgzhy5V6T3E7T/M1lPh+AXiguQ/MHYD0=
+gftjwjXII3Ov0CQnXM3WW3jmC05lUniT
+daOC776d72/lK4VJ8PG6El3CctA+mSG57NLBEkDmDJE=
+Qj/P9cC8CL7rmNwu0Gjmqg==
+ZldvwrHIQlaK3KXUbQsrtGZXb8KxyEJWWajxrUJ/4cCUhW8p4wsnQg==
+qKiu4WzYyu4l28Z/OBqUDQjmhlLYngZHYTDxNHZVHIA=
+lTjIckuiCeo/trxkeqgXE5U4yHJLognqmyNEplv0gDs=
+msQg8I9ogkdZtqiGCIo1LZrEIPCPaIJH4Ogsn3YzA8w=
+msQg8I9ogkdRPUvVLndWi3oADwE6jljqUXu0DMuigJjeGliRkMko3A==
+msQg8I9ogkdJ03CaLUlm65rEIPCPaIJHc0JpvX+sz/4=
+PFzyvB8tBgl6AMdku3vLEzxc8rwfLQYJwN+gCQYkCxQ=
+bNUypw8nkn1/lXqO/WRoyX2oh/4BEJQQZbG8KUhskwQ=
+7cZk1APtn1no1TJapS3LWTo0sQbkHpz0XiguQ/MHYD0=
+g2+7gMKiX11kcZfZMtGIzQ==
+MwF+ApR9qK1ueHha3XlU9iOCFug3Kgau
+dJpTex86WAMwlq7FCRR3cHSaU3sfOlgDWBTa+1hjixc=
+KVqkkJ5fXY5iHpImQyttJilapJCeX12OnU/X3u2ChHg=
+GwsdThjKocGlBZ6ez5tswRsLHU4YyqHBnd+j/hoWgPw=
+mvxKCEHginqtqkbLwKwK2WWwW4Oqjd4b
+J6OVmsxN7uhdUU2EqomYE6PFx/R767viv1mdfqrePJM=
+gouVrQMvdA4QnRCbG8EiZIKLla0DL3QO4uW9uAuG3rY=
+JYTCz8oz7zDGhUu07Atsbl50ZywX4LKbpPa7GqMmqRE=
+wnBrmsLm/mpGqTcZNjIJwT2mIYrdhLxA+wj8SNfzdio=
+xXzCHN1kDmvVO6ScbP8HHHoLdSKNitjSyzLSqBF4Qps=
+wCdkMHwxmXmWx18mJMS+bAhiIOXw/dSaFWN3xRThYNo=
+RtVIoGlZdw1iOnxrdZMC1whiIOXw/dSaFWN3xRThYNo=
+aX5xZ6VBA+eYC19sDmZUtT9/g++8U2v1/FRS7OcKkCw=
+7ABKXB9DxjyYC19sDmZUtT9/g++8U2v1/FRS7OcKkCw=
+1P96bReUID3AlU/9MRyvVdLxIpT5xV7I
+wN3A6tAeZF5+VBc1ocwqSpapJhMHdXdQOq4FtKDlq5o=
+pgFI7yYDU1GNg9YQPybpwZ0dczEE04sfloEotSOE/UG9bc1pwK0HZvfigd5WxBh+
+aSU0Z5dz/yw7tq7Zt87ggOaB2/MlSFOr7eP0VGZphgp6QxYuwwH6NA==
+wyPiA7heMwnLm4U9qLQID8Mj4gO4XjMJmyNCWr9DFf8=
+ijDltQ2o6KeBRbqtqzJITR7oHj6ARY4X7eP0VGZphgp6QxYuwwH6NA==
+wINucbldLHd2SQMMSiAfccCDbnG5XSx3O3kAeP3eRNU=
+8G1JVfLQ6HzTDmnqIYP0ncDdwOrQHmReRUHLl/7+aGs=
+8G1JVfLQ6HwRuo+k93q3SPwiM7mwmzc8s4swgMue9cM=
+iVo7nF2TcX9GqTcZNjIJwaTFXWHUVGkFzECi/beW+c2jlnFqmomQFQ==
+/CIzubCbNzzTDmnqIYP0nfwiM7mwmzc8DlOIbaCM4Mg=
+/CIzubCbNzzdspKklvEj0YHAG2SAG1n5loEotSOE/UG9bc1pwK0HZvfigd5WxBh+
+/CIzubCbNzzkzFf+CBlT68dC5MDxoo8i31KXSW07L4ygABg+qYtpiw==
+IQoKziC4bVPIw8jqT7fOToNqLkNStzNN
+iuw4tnsoxt8ttku5wjNpxNWzYFFI7AYP
+DlfA419wTmEI1IvF1HAZjlSLGtVzu3Za
+PmUjDqGidjpGCRFgfNcPC0pgEZ36UZf7
+TyZCs03OO63lSWJyA+jnwZ4v2SAHQkIu
+aghYWkm63ABgJuQ6Kx8gJH6zISq+2dfp
+RODIkd4+490odhzhWNrlBEJVtM7/jdB3
+KWkJUMmP3HYodhzhWNrlBEJVtM7/jdB3
+WAnIapHmV3mB4HQmOR7LsSHud7S4gPqZ
+trHRY+xCSogXYnyZ6ZJKJQ==
+Mbmi/A90nyXsLhhGFT5yEwI5Pku1psKZWGgkX+sK4nA=
+AYZg4FtyP4GtN7b+a7LftuovjntMc3SiOS7F4oME4tTXOtisNdGIdSHud7S4gPqZ
+IXkPFPlOVIclB9lZ/ubIXYMYaUjdQ0MUfkRC94tU/To=
+4e57L86Ihfymsz6ZSPerfTwR40iYrlSn
+OjSxBuQenPSl3Rk1R0TSjxaT5VpKFjCU
+eQHRBFxMDWA7WMf2BIknx+1UK4der6Bh
+qlgeYnp6Gd/HWhpttKQ/A6pYHmJ6ehnf4oWMbMfUFIM=
+s5dYBjMytR65X7ZXj0Uv0rOXWAYzMrUenMquyOOoj8TYzz3r3x3S/g==
+s5dYBjMytR6cyq7I46iPxKGKwqAqdV3aFEW+IMKyBD6qXe+ntv8tgNlUX7DmUMWM
+s5dYBjMytR609CNTmM0EPbOXWAYzMrUe9VqK0pdvuTA=
+OlZQA72ZDZrkbekNMKZ/hBs3GT70ciCU/FRS7OcKkCw=
+sznBlA3nS+ZogDNqJr8XssnxHmZ0xlqrCwE1z6B/Blc=
+sznBlA3nS+ZPW0jcwUQqeZhxXvfDVJr3PK1eq1q1hqg=
+sznBlA3nS+ZCyqr21G8fPphxXvfDVJr3PK1eq1q1hqg=
+ahdHwChX8/YwWU6jaieZ+BSvcdPQaTCEeDLAwfuEhcxSzlBthODeKA==
+ahdHwChX8/YIayJ99X/P3xSvcdPQaTCEeDLAwfuEhcxSzlBthODeKA==
+1yw5jiqncGQgfDHj4VDjengywMH7hIXMUs5QbYTg3ig=
+S40MCyYJDO7z+iX0vzx92S9Jtri7jcCu
+ZUV41LY+hoSZdtCZ3hKGwYKHQrLAKeg6Qo+b5Q3VZwY=
+LAphuzvX0+0+flCDOeksxew9uXjHghAXtHIsU9VS3ZbTdl0SvvSiXQ==
+LAphuzvX0+2k0cJZEj9B9ywKYbs719PtTg0uaio5pVI=
+261M969mfldVSyhHkFpyGOrn2pInliil
+uzrG7v+xI+Q2toyDMjukNoBPclwdJCClQ4kUfjALs6VPRD42R84sWkpgEZ36UZf7
+wxSr1LqU3fHHWhpttKQ/A8MUq9S6lN3x4oWMbMfUFIM=
+3RlDgHP4umsLZexAxlGQQPoE1ewuutCx/FRS7OcKkCw=
+sLtOhy76moLqLN3zrEQ3Gh/bZ5h2VMbzsYXDsix/naKttPD/zSXCrw==
+49KBr5px2JYLZexAxlGQQA/xjwmODKT1/FRS7OcKkCw=
+MEV2TdfjfmzX0RbKyJvnpy9SVZGkU2DK+eba7duZR1lioLrTn8ZW2A==
+POvGieO6dP841qXLnQ314EpgEZ36UZf7
+2NTocBcJ8he8kWtUJg+fl/M7DZlS4NTJkIWqd33DqIQ=
+bQJtjBvartf659mJclaWbZ4v2SAHQkIu
+aDxpJoN/PwrKvVIER3PSH54v2SAHQkIu
+aDxpJoN/PwoVCwQVXbbfVmFhI5ctmLmD
+tGdCVg+4dFz659mJclaWbZ4v2SAHQkIu
+7xlDlQOfCyqCx6R/+34bDA==
+wuAmLXM9TGuieOyycJPd7zVJ7JvToHql
+mChduLRUinAZykcSFRuKfaSYfF1gjMHD/FRS7OcKkCw=
+p04arrU2thNrOBeZqipgpU39yjFwiKfg
+FeoDIuhlezZZmeRVdBNeeO7fWLQO2vAClGL2bvCVjbapdbcStATXpA==
+8uf7LyAYqw2Dy30ukFEkoEJVtM7/jdB3
+mv2uQ4EChG8mfUIF63yPPTJGfdvFIM7qyzLSqBF4Qps=
+uh5/ZXF8ZmlYvrUEe65mMBokdeqhF+go
+AatyJrYwLG6o7Kqva54ZpEjNHMkQfY/4ryKysOD+KUY=
+o3VwBTezHdeW2Bttl0aNLSXBPH2DKdJv
+ukG5s4B4LnwgTj12gis6/liiRIPsjsUx
+Be1T87t+ge6tc5EZVJ1itAXtU/O7foHuHHIaGk0U9zw=
+xrfSbDQIiw6BVtlZvm7IEvu1v7COj+SP
+q3wgm/88Ra/5FA/QNzKqWCHXZvfEP0LOITMjyrs2LzEVvJK+I7rN4EpgEZ36UZf7
+JOdzNgAMU759VZlINNf8oPo5mwMGKOCoXnxmhPdKEuw=
+TW6J2NnKomjRjda4eHSttddwjnWQoZ6JXnxmhPdKEuw=
+UCea6V2V99m8kWtUJg+fl8VQQlmc8cfJ9+KB3lbEGH4=
+ti7QyiW+DvQDnJXyavsBY1pYjy7n4cBmXnxmhPdKEuw=
+neBA0Hg47enJ3jcgMLZ9eVnFrddFwuGJ0Zi/2VsQQhM=
+KuqimFrtBRw9p4AbeKY1QCrqopha7QUcHniTH44xu20=
+KuqimFrtBRwh0Lh+SGRenSrqopha7QUcHniTH44xu20=
+1kYYzeJGLPv9rV/eju6liYCLXzVQoD8/e449tdYe94rKkA4tvo+sye/wnylh3Khh
+1kYYzeJGLPthx5yON3PYAizlA128LJ/Ve449tdYe94rKkA4tvo+sye/wnylh3Khh
+2auQrCxhHIsXxJ/Vgc4ukCDdRMaMynFBZbG8KUhskwQ=
+HLbONjPzahBoL9YvcamSHRy2zjYz82oQgsNZzcOOA/s=
+1AZ/RVvycEl14yxy81WxOgP5E7pSsB8CPH8zC+3Mpsg=
+sEf/UWY8VGJ9pUw7y+s7ng==
+CsgKSGU0iuEJONZCYhlqXJZCaZNUo4ux
+5ZoSjErEXv5q3gx+pOPZFIBxX7BKuFe7X+jl4WO0JoA=
+5ZoSjErEXv7Iu82pc8TOLinOGmZl+yPRF5IjhLtUo+tSzlBthODeKA==
+NJOpP+ZmbbXzovLhx0nRBeihRHJ/6xdnv1mdfqrePJM=
+uFg/Yxg9PLIs1IocUs/TPaITt1ZHvAIZshY2WQ4j1rF8+IQk0DRVeRokdeqhF+go
+uFg/Yxg9PLLAzQwt3CVOC3irTJL/yqb1shY2WQ4j1rFNZLf4EJk1SjfLJpt8Vovi
+uFg/Yxg9PLLKhZHCTwCZCsPS1iEu/AlBshY2WQ4j1rE92OQO7YC795UUf2qRojva
+uFg/Yxg9PLLKhZHCTwCZCkNKL3gSmEdEshY2WQ4j1rE92OQO7YC795UUf2qRojva
+uFg/Yxg9PLLKhZHCTwCZCjNkLr6v/eyYshY2WQ4j1rE92OQO7YC795UUf2qRojva
+uFg/Yxg9PLKQO5aORBE8r6///N9btsABrOI77LvpHbGXjb3OHxwMOA==
+uFg/Yxg9PLIeFZSOHSSEJzzmU+FOUsy47iAp+OLPslE+HhQneOFfyA==
+uFg/Yxg9PLIqAOoyJRKzNNfmCM69+1qR7iAp+OLPslE+HhQneOFfyA==
+StcYgkZmEOHWY8Wkr6uM1krXGIJGZhDhoOkqcB9V0N8S5v0ru/ArLg==
+dn2Qsy3GvOjCG0apwlqyg3L6sTmLiNI/Z5WjJulMlEE=
+UlIz4dzbI0k+Cust/Q8kQUtCzDBB5yC9y4x6AQXguls=
+UlIz4dzbI0nulS3QAH/ZTsoeCQUFs6ThXnxmhPdKEuw=
+UlIz4dzbI0md+6Clu3ULALcXx896jE8quuw0Cza4wiNSNf5GnzWF/A==
+GdeJyUu69/xtN63c6HS/sb0JfccvndSv9YQ8RM5gOiY=
+FpNKk6eB+A4qm2jz9uA02NdHgJZGvhHUv1mdfqrePJM=
+FpNKk6eB+A5YMT49lLPDttdHgJZGvhHUv1mdfqrePJM=
+FpNKk6eB+A4HQ8KBWkE2XddHgJZGvhHUv1mdfqrePJM=
+FpNKk6eB+A5tN63c6HS/sddHgJZGvhHUv1mdfqrePJM=
+3BvyzjY734YXxJ/Vgc4ukCDdRMaMynFBZbG8KUhskwQ=
+mHMaFW+3mXv3Jlr4aUyUxDOG0g8aruds0q/AY+ii4C0=
+6F5GQVOYgys9IXdVF011y04DNDqPz7AJfxeqLNxDZYHQ4oSphgWeJUY7J5N0BR7d
+6F5GQVOYgyu9K39z0IbIS8PS1iEu/AlBfxeqLNxDZYE92OQO7YC795UUf2qRojva
+6F5GQVOYgysA8NoV9br4oa///N9btsABi6os1lwE5oiXjb3OHxwMOA==
+6F5GQVOYgysMsGpX1Cg1tDzmU+FOUsy44U6STSG2x4A+HhQneOFfyA==
+6F5GQVOYgytBVVAuo62O/v+qGUjdpOwqy4x6AQXguls=
+fBxaqjsVefhhS+omi+D74kGyx5t7pL84Oq4FtKDlq5o=
+FnfxNLEkTXjY5SqWtF0fFEGyx5t7pL84Oq4FtKDlq5o=
+ACGQHmpxH3CcWAeClDsRsgAhkB5qcR9wIhDf5xWMPgU=
+5rBML9eUHrTlW7CZ5piJke5H7cZvP3SFFWN3xRThYNo=
+GBtb3Taaxg9+pwopOR2fnswgP7id3TZM9+KB3lbEGH4=
++PHN7dej9TzoVovvOkpQXRokdeqhF+go
+ab7S4LKSKOlvSJ8UQFpsYA==
+NSl9QaY7V9I54BJ6hAksJIJaywY2UE6j
+F3Ktohq9lLdLfqM7lPsEW7uJAxZ+VzmFPH8zC+3Mpsg=
+GszjdweBRUV8TFxTbDGFTbuJAxZ+VzmFPH8zC+3Mpsg=
+cVfxhpHQZ8tug8Vncn07h89BZ991h47P
+hV16UBMsD0c0XKLw+5TFRTSwX2RDWdyI8ZzcfVB2VOHsptuiVsjlCQ==
+lGlvQ66dwCRsgjKRmXfbNgyliFByaV69oGl0UawdiJ++0EUxnQ9bjA==
+lGlvQ66dwCRJN34P0riyJgyliFByaV69oGl0UawdiJ++0EUxnQ9bjA==
+lGlvQ66dwCS+RwVcBOPepN4vOsaC5jpSx+yHip4tDCs=
+lGlvQ66dwCRCtbgxFokxWd4vOsaC5jpSx+yHip4tDCs=
+lGlvQ66dwCRHXYr3weuURN4vOsaC5jpSx+yHip4tDCs=
+Uxtw2lOJvUUSpsmE+pXSc3Pwy+KsZWIvCboInA27MOu+0EUxnQ9bjA==
+Uxtw2lOJvUUJugicDbsw63Pwy+KsZWIvCboInA27MOu+0EUxnQ9bjA==
+gsvstpxi5j0QeShVOAXsvIEySI459logatKSiOnQI0Y=
+rV08K/rlRWI+03JbZpPE8MoJIGVKasSYuT+g8CF8h5Mv/eVMdVBn/w==
+rV08K/rlRWKfKF+Jhxy5qZhUgnPSviS2QyMd9MNOFhR7arQIk4twhA==
+Xk2LnaFuq2wSJd/f9ZcYADwWXQGY802sSGhygijEmtw=
+4cJtfDTTyElxMzOPB+U8kfOkdlP6PdPdQo+b5Q3VZwY=
+iWZ1+FV1HJJLQRh5YHMuqamZj6my88+nOq4FtKDlq5o=
+hADTwUgIJkT+hOdowE3gQFCWBdGzkfUKOq4FtKDlq5o=
+bO8/SYGWpEhLQRh5YHMuqXp7TuJXo8E7Oq4FtKDlq5o=
+BYPGG+Rke8Y+jIg2vQkoa7AX+eZ3fchDfoknQKAIiqnAllg7+xuCFA==
+Tjxwl195oKsLNefE5aMc4G8mJus6OHtX9+KB3lbEGH4=
+Tjxwl195oKtyQBs4SzkJV1PusJTGcGD01qdb7JDNTneCIzaoG4uSRQ==
+r+MTn2zwgu694y/edwdpYQ==
+ADiRENPsNOo4GvvuG561CfRmfvLAgGBfXnxmhPdKEuw=
+SViNX60fSwbS/Zps/UDMbB4fppeTx8qZ
+O/CWAYqui6Q7KPGqDyepemhh+tTCSjEuwQCJH/19Ln8=
+L9IhEb/cxy11U7fe1tcmGcu36tEpZhZKm2WO/tHZ0jU=
+YkMU4MC4qUuCLbAllbnuGTDAbyuRDAJIFWN3xRThYNo=
+cBJGt2Ntde+CGu5KOktSlvOkdlP6PdPdQo+b5Q3VZwY=
+2Dh9os6pnRNv5IWfa1X155UUf2qRojva
+0OS8yIohSYDPwBECuQH+rd1nfj3QO9QOYTDxNHZVHIA=
+QRCGdQzPmuxHe+PN03uUuwlmC0ceo5xAavxCoFAqPTd9YdnNB0zCd8u6GxFjbkZxipg4n+amT9IUEksYV8b9Bw==
+kaef1hEpFMR0W/ESpQ1sGu0liRe9U4t8
+TX4x7/JdLccihNfD2ACjawerjyqMAg4J
+Aunviy27Tn8s34SjTRKw966AlIFDzvWhGjFhHUGm/IA=
+iO/G5G1J0KSYcs6LIWNqJO/wnylh3Khh
+Fki5XfvlXJzI9y4pfZiyVPIwcwZJlSAS
+Fki5XfvlXJwYYaRc04ct3X8oNwlAHdKQI9MUVCsia+g=
+/QKA3OLaLvA66F6w8up5WYJ2UD35rrQ0Hg0DaMjCGjA=
+/QKA3OLaLvAgtwYCMtpiXoJ2UD35rrQ0Hg0DaMjCGjA=
+/QKA3OLaLvCcA+LqIQuHAMH6Jk3uyles/LABUXlMXu7hbA8mI06pOg==
+fd/6VRnBV+5P+943EeLXROh//o7r6XxK
+lGxgn5LNNN6D+9QS14gqUZ4v2SAHQkIu
+6Z+yTtFW+7Y41qXLnQ314EpgEZ36UZf7
+o3Yp2kkX1LRQOBhU6CoF/1SLGtVzu3Za
+SNzpJ5V8DIFG9wHLavry5FSLGtVzu3Za
+KBoYoWgOW3gLTpl2c6Njyf7jzj4LMMy/O8B+JsbxdH8=
+tIZAvd1sO1TqBSJFbDuEHlSLGtVzu3Za
+tIZAvd1sO1RCU0xtliYc13j9Dfoa+sK0
+tIZAvd1sO1TcL4XcAOq/hHj9Dfoa+sK0
+tIZAvd1sO1SCjLq21t0Vinj9Dfoa+sK0
+PnUtuWrPMZTlW8BV6KpRW8txnDCodPaa
+7RcWrS+7MYzqBSJFbDuEHlSLGtVzu3Za
+7RcWrS+7MYzcL4XcAOq/hHj9Dfoa+sK0
+7RcWrS+7MYyCjLq21t0Vinj9Dfoa+sK0
+jzfGdSVd6Ps41qXLnQ314EpgEZ36UZf7
+/pn8ayRLGgWf+yQM5BR4lOrkLE8qtcy1QsjDFyh0etI=
+plXHn+PONu9gJU3sChLRJKZVx5/jzjbv7N7/2xV+d08=
+pK/ZV/hg2KdulJBr0GmnqRQSRUXh+2TiIsgVq7rVe/ettPD/zSXCrw==
+jQy6B/fSamartelAkCcLxA==
+UNMVVx+jvGOfmVgrAcnbJFDTFVcfo7xjUyZYksNCWbQ=
+UNMVVx+jvGOFOjcqTu37Ff3eSYk2t1EJXSGdquqQozd+MqbEi+b81fwxXbdPc+bf
+ZC16KGZJuzrZtWfwNJeczo6tKGCLLGlRlVTUu8mgFVw=
+Kb8f3stgLWahvBUtkklw+p4v2SAHQkIu
+Nt6VZaeWqZwlU0sSjtAowWEigKAccV9myzLSqBF4Qps=
+y7IJJKVJ5ODjqYT/AZOwkAj/Jbi050YD
+GZjTIHM0jyFhWorWBbaXMb1BiGWHESwJ/FRS7OcKkCw=
+zjzDFaug1aRRJHh4WyRzb848wxWroNWkwQCJH/19Ln8=
+2s+Nci9wvweK3KXUbQsrtNrPjXIvcL8HWajxrUJ/4cCUhW8p4wsnQg==
+f6t9+C9rN/Jbhi2zmm4G1P5N2YG78Dzu
+rf8snXs8QLDnIgbx9PDDNv5N2YG78Dzu
+R2BhqNY8vQsQATZmRblq46N2KdpJF9S0bENZYM316MM=
+XvDAGI3qDZgwjpEfeNUqgD51LblqzzGUV2Le1m4XGVw=
+HCpZai6l9vJzRPNH7lCRyVSLGtVzu3Za
+txN9SZIKbnuSP4SkVgrDKA==
+LZCADMve1wnxrKHitzOWUoHEsAgomIvukA0gc+vlasU=
+LZCADMve1wlTMqTky/PfJurn2pInliil
+LuVm1fSiDVKdsi7Kzdbo3kpgEZ36UZf7
+WWBFaR0HCBnxrKHitzOWUrTUCuqqqRxxXnxmhPdKEuw=
+WWBFaR0HCBl2OlpdyfCl5liiRIPsjsUx
+viVyinHFitKoVI6WKOWvAoHEsAgomIvuXnxmhPdKEuw=
+viVyinHFitJulkN3J4gwoO/wnylh3Khh
+viVyinHFitIL473qOWrZr1iiRIPsjsUx
+viVyinHFitKAmOFSgHo5YliiRIPsjsUx
+viVyinHFitItxImQxx/DDhKXMTR8xPFxLcSJkMcfww544XjV9hm48Q==
+viVyinHFitItxImQxx/DDjJBseYwGCzpLcSJkMcfww5oNJgLqFqd8A==
+viVyinHFitItxImQxx/DDlhUYiCeB6SULcSJkMcfww6L+9785HsDFg==
+viVyinHFitJTQmWRp4fFrMuJ7sAC0UnR16uNWBjA2f8m9xnOFMukZEpgEZ36UZf7
+LShMZBiFgO4DoAhOOP9x2X5UQ5D/IggLNhbUrID5RUk=
+LShMZBiFgO4DoAhOOP9x2XMPG6TR4glKMpNUntF50Jc=
+uFfIsYZDMoYnX3gwhfqBg9ADT7Zo0hIo
+uzaS/w33qmX29x8disyYmGw2Mcq+QlR6Z5WjJulMlEE=
+u+9GWDpvSUou9vVat8fw+8I0LatYOcXivgJU7rpjpfE=
+sQHe+4cHTbgvn9s92Np4Whu8hdYQdIzjdEEwOohE3nc=
+sOt8Hu+fh1do/VvBBU1qybDrfB7vn4dXkSlT2wHlmBI=
+AJyLc7CET6WOD9dWJ6lSc8etsWnN4VwrZ5WjJulMlEE=
+xZglahXE7MEj78DHJA8NosWYJWoVxOzBZ+y/kv4gCvw=
+xZglahXE7MEZWyq2c/MNsiDIcifM8jM1r0IjXeAfgSb2Is59vHXXSoJaywY2UE6j
+xZglahXE7MEo0jrmQ2bxBMWYJWoVxOzB/C2HdvCkOhQ=
+xZglahXE7MHgSMmLjNI3OsWYJWoVxOzB2xPLPHYAdSM=
+xZglahXE7MEKDuc5bnfpw8WYJWoVxOzBNZprEBoBffA=
+6TPnQbtsLB0dY1B2zQ9xuzLObi+zuDyKfkRC94tU/To=
+Oh2o+4fC+FRVsimE0viIhClytftXzCQxZ5WjJulMlEE=
+iKlzB7VL8RS+lTv6h3jYsK2mHY/qYUNHBiNf+1YVhVY=
+6bnNkKG2YAn5NikgNpe4xmSpT1nqbbkJWSSzi4J6D51E387U0mxTku1UrnXbzCzm
+kueTl4vefEj+rRwJYBToYzhYKtcRsKoTOq4FtKDlq5o=
+TWtbGlY8ZG5u3+SHfMJnwq2RNSvzaok7w29zoqutRRY=
+2qQe38JO//xN7kkFFiHwMUXGEwP/iKtFiy48LWiKVlE=
+bBiO127E15he2HoLv/fYZkpgEZ36UZf7
+XDMJzJ+/UuTMfJGYtgmYK8AXvdldNno8
+2VcLrr+4sTebvmg+Q7/qkcI503QdVi5x
+tuoczNg6Ji0KsqVBON1zjKHT8+SKZwoVC8at4D0TvJ8Q/Sq4QLi9FQ==
+IMEemaM1RvCxJaevPQ3KpujHg4EvTVdzxBzbmvsqN8Jsz/XXlsvu0l83gGzFswkg
+IMEemaM1RvB/wd8Okz/znCDBHpmjNUbwJUGj/gHakSQ=
+Z2bitlw0AMa77Ch6/6yyXL+Lk22k7QQG1N8++L0lHAeAwJ0TUDtkVg==
+Mq0bej2JQ6QYxKlkyczqOghiIOXw/dSaFWN3xRThYNo=
+0NB8czuJbawSxbtaceWJ2QhiIOXw/dSaFWN3xRThYNo=
+0NB8czuJbazhS4Udh5P1VQhiIOXw/dSaFWN3xRThYNo=
+0NB8czuJbaztX2SY+nEstwhiIOXw/dSaFWN3xRThYNo=
+TD24z/PUVjOVgcDRshyn5z9/g++8U2v12UrAFkC7Nv2ppG3uOtOdztIBlIVT6KuB51PhmDmHKCY=
+W2oPA9uGqEXziB4rgd6C/CpcvK8fV34A
+ELM2T7Q2Mrcshx0ihPuyKCpcvK8fV34A
+Xn4HnNubANHFZ5D2h4QJfV5+B5zbmwDRn24FiGAmFiI=
+pvOWHs5I2yYTFDGbPOkzAhQz3x5aewl+iy48LWiKVlE=
+4kz1tOHrKCgihFmgZccXS2jmiJmNa7uO
+z9DQgyHTRF3opiWFprmM5rxAiuGz95sSPH8zC+3Mpsg=
+4qHCQsr7lrJbGOfgQgxaYwv2pMwkjIRu
+bDM5FoY6g/Sp4zF9ZeBsnqm+ZG7TsLmCPVW13/ZITYA=
+ePq3GVRQizaYcs6LIWNqJO/wnylh3Khh
+048X8sVpSrAKo/UK9NDHew==
+s9fvPkvw+eMciqQMcQY8JQ==
++NKyMbGOgywt3sV9KmqDlfjSsjGxjoMsujul2F+yEk8=
+OCmTnwX57zZdxrRugxgho57Ml2laybKnUyFeDwonN69TLScZwx8sEEHIfKsfMVU7
+mq3XPGPu/Ok3Y4XD3zOr/1iiRIPsjsUx
+tuX4CT0GT8uFsFQKjAAlO7Dx3DSRpvmsf4WOYzogwJqaY3XbryMItg==
+oOpib5u9j6oc1dnc6uyT5zJCH6foy6/q
+t2qVur0ado3+X0tAZBhFVQ==
+LBoZcWkncSeev8/fiYiPKnSUq7geItud2Pn74KzoK7PhiZPxIE5Zeg==
+BGd8d09G2S/XKnC5Y43Q0eWb8dISoqFKIOF7cx9ohLI=
+9euU9L7S53HqXwxhu1zSHXZgmXrZ3pEJGjFhHUGm/IA=
+TO0JBQ8mr8RtOGpeBxU3CwadXEd7JuxlXnxmhPdKEuw=
+W9HH6C1O86+fKF+Jhxy5qQ49t5MU+2hM4c0QH3OjMax7arQIk4twhA==
+wZ5h+HPyyDMq2cWjJKyC41eWISsQnjrzGjFhHUGm/IA=
+utpp6b8KHN0aBUOmZY0YYQ==
+qQUPRuAFBRSJrMU2cmkW7I2DE5p7RGOMFWN3xRThYNo=
+UvA2FcpOj2iRUZkq8czGf9gJr2+iOHjL
+IxosIUcZdeOEyx5AvYpxfCMaLCFHGXXjOYYji+pq/ME=
+IxosIUcZdeO+AVOQd4583yMaLCFHGXXjOYYji+pq/ME=
+IxosIUcZdeMqqtObA+jC6SMaLCFHGXXjOYYji+pq/ME=
+7ddpONXhUU7bxfAeY2EVMGTKX8LJ/VRV7NLBEkDmDJE=
+dHiJrsr8DsryiH2sVtn1unR4ia7K/A7Kc89slo2hvmU=
+dHiJrsr8DsrHQpqlKMOY8R6YC2wn3ucaT2qcmGybiCY=
+/fXHRUZqZnQ7YtGuSolXCP31x0VGamZ0mDk7u/hTKrU=
+/fXHRUZqZnQUMF2hv/qTTB1uXWlpRJO0Bky0okqdmowDtX49A/m9tw==
+/fXHRUZqZnQmN2MJv+UzDECh7CVCkSWCBiNf+1YVhVY=
+hszhg2d0j1Nhx5yON3PYAoI2qars2fOxaHj+8CjlyFJZVprAem6Wt+/wnylh3Khh
+9obp3ii+9gVZoeLYrnJWpj/RhrsZrWTYmUyE5cmCTkA=
+Eo6PIRPavzTliNZcRugWYg==
+vBv0+XanS1xL67gEFem8cNYIZ3rZ9S0pB451+nWReBM=
+3Us4hTxwFHWrSdhaNrJdZe0liRe9U4t8
+bwSldk07Wi8TE1XlgZYZ8QerjyqMAg4J
+CUj7FbbVsoEH3C9N7oX5VZ1gRkHPSYy1
+wvcPgLQTFB0pax+G35NMk0na+GXbcIR8
+N5f8jX4xARnE8WR3NGqPdYsYrFYam1UV7NLBEkDmDJE=
+BZ+lrLVxH9eUZPIjJV+ACl2ECUP25wKz
+G/M0W5F4OF9sQWI5Vcg9mr7IR3wDLgEE/FRS7OcKkCw=
++ZUN1DorLMWYcs6LIWNqJO/wnylh3Khh
+/dPMLQuqprYGU+RHTFl2ZQsfqELUS06K/FRS7OcKkCw=
+OskzQPHGH4k85vKUXEi4KDrJM0Dxxh+JrgMf5hQQvD5KYBGd+lGX+w==
+MHjASV8ic+zC4jrMgbhSiaBUuwPmO47c8rxZHbJEGwE=
+NUJV/LbdsKzHHa6afUtOodaRh58nZRsKfkRC94tU/To=
+c2D1nM8E5uwuYR3T/sMSWnNg9ZzPBObsM3AJne+dIeU=
+isJ5BIeZcFc7YtGuSolXCIrCeQSHmXBXmDk7u/hTKrU=
+isJ5BIeZcFcIAQUSRiFGR/kmzwALSom5u4W15gd/Kz2jd2fK5ZsrQJfZCNVlPAHp
+isJ5BIeZcFdMxZnKSK/BF4rCeQSHmXBX6vb1Z4xOWGM=
+isJ5BIeZcFfC0I1fazT+cYrCeQSHmXBXfGhZIkcmT4o=
+isJ5BIeZcFcnOXeVeAqQQorCeQSHmXBXSaFepBIs6WM=
+dGLjh0lStMEQ+HSz/izK2/orPWkHqNe5js9pUTat+Omi+m7K+KSxhg==
+Zh/FB6c5Xm+B6Mv+r3oUPWYfxQenOV5viGlTuYvwdd0=
+Zh/FB6c5Xm8qqFf1kGpzN2YfxQenOV5v75dIY3QhG4A=
+k/iIJEppkpOQY1i8lHPFkFbwZWJ0MgHsV2Le1m4XGVw=
+EewTKaQ167YgRw9+yNCtjxHsEymkNeu2E0olbfJ1dAM=
+k2GyZh1pFSolsv6n6uho3ctkriYylHczpHp904IlTO0=
+O6Zqq9szOgSq0culTF3KCgY1yLDiPcgwXnxmhPdKEuw=
+kAYShmyNB8o2toyDMjukNo2+4oA2lbORjmo1+hfLt7o=
+ptlalxjKqk41Xk8fp0jcVUWAkKC6Kk69n2eIVN7KHKYmQuY3MTqpqQ==
+lao0n8VzVLocNPUfXQlcmT6TyzO8VbjyP9+JFq5HfFc=
+1Bbx/h9FUeoKGCS7OlZYlm27nvnjqQYwyzLSqBF4Qps=
+dMBKQ3aABJ3kPycQfDWNSsXJIwVBKZD7
+eGz28sziaVnY0lBNz2HA+CWOy9rh9VpD
+REr0NlrDRI6jRaupwwo/oL+bwu15xQJy
+O3Vypet3iOc5HHRmPAOPzTgDx8qs11DG
+3NkxiJb2q0zVkkvyQ7wisDJCH6foy6/q
+iK0sL22sxIk7YtGuSolXCIitLC9trMSJmDk7u/hTKrU=
+iK0sL22sxIkUMF2hv/qTTE+VRhze+UHyEMp9nYeAoRwDtX49A/m9tw==
+iK0sL22sxInaYy8k8DDmO4itLC9trMSJFDBdob/6k0y+Peof7PeC6Q==
+iK0sL22sxIlMxZnKSK/BF4itLC9trMSJ6vb1Z4xOWGM=
+l1y7aaZ0695dc+ot0u5SjIQboUKx3Kuf
+lvXpc+7yoODjKixbmNsx3tlZxLMPZCO0
+5V5dw3VKeFIy62vz76MTA1h07UKwyj31
+rgJD619A79ZO/zVdlBb0acIDrOT9t+vX
+RO8haUpxV+G8gz8z211NiETvIWlKcVfh04W+qQIwtO4=
+T+uUWVe5qsUR0J/koz9KZgY1yLDiPcgwXnxmhPdKEuw=
+9FuIGlHegUkpLBlfM+VVqmUi5ghnqHjxy4x6AQXguls=
+ag2ellMneJGuJDbDkUxjoCdmGp113JI7VfMcTbyjbvU=
+NsvUxkdzWduM+o3iuJvRlOjp9ja+d3H5k+JdVCtLdmKEt9y4GnTMRepDNvv44seC
+Hv9682Y6BdDQy+yL3lHwiOpDNvv44seC
+cltuHzH3MZDEYh6827F4SvATMLR29vCf
+7JwKle4goSNxux++Z8sw50j4/j5lX/Rr/UEVU0CSNh3Tdl0SvvSiXQ==
+7JwKle4goSNPtCxM7FrOp6Psp+AE7zCc/UEVU0CSNh3Tdl0SvvSiXQ==
+srXjQvuhQDKcTk1Q0IYtzCDdRMaMynFBZbG8KUhskwQ=
+g6MkC3Xh8rsIIIZuRQduFwJ+Lzr29efsZ5WjJulMlEE=
+gzO8Cbg97CaA6VtQMrqmLIMzvAm4Pewm/LODAedI9pI=
+vjcgpLlCeU97OTs6DxmTm/ATMLR29vCf
+Cxid6c+FfAgUV6g7W25sgmzdrQi2IgaWV5a8pr5h3LbOGOlfDyLnXQ==
+Cxid6c+FfAh6r+snkWLpdw7b5hv2IWQtV5a8pr5h3LbOGOlfDyLnXQ==
+/aUJ40q0OGGeKpuD11H1Cn5BmYV/xJeEhSFrjI+fSRY=
+fkGZhX/El4Tp3WfLw+xGhbskWOWaLi4uZbG8KUhskwQ=
+IZ8qkaFH5cN2pmZc9dTe6A+TRU4vbE/A0q/AY+ii4C0=
+pETewWDLfxh89EofgPHJVqRE3sFgy38Yc8Q/wD2s+Kc=
+pETewWDLfxiYcs6LIWNqJO/wnylh3Khh
+OW2PVrqNbgtIkRc7oSI9syjDfW57z7HJTZAXpjLML4g=
+B7gyORehHi6JQdonxQKArUyVFcKaJldi
+N3JX8zHpelJjFUiOhYZQMkyVFcKaJldi
+5i4S6xm9ScoXjMlS0JHBf6SYfF1gjMHD/FRS7OcKkCw=
+pb21QUVW5XEa8NC1qmD4gK7tXZiwuBvF
+kwzSjpp0+Rrc3fVvg2+fYMcB1beekSgM
+t4IT8jVQBw/uYWa5czMdKccB1beekSgM
+dhcYKLqt4OQGnZgNruk5KkpgEZ36UZf7
+b8GEeLzwuUqqtlk8nbR2qK7tXZiwuBvF
+b8GEeLzwuUrV97Yfl/d/Vq7tXZiwuBvF
+b8GEeLzwuUotEBmAGZfup67tXZiwuBvF
+eeNtJL9hcqs8xmBeKeZ1l0GphsMK03t8
+B20iTPe8N0VtWzSnJmqc96BRnfTBEUMjOq4FtKDlq5o=
+B20iTPe8N0VNk1rUuCmgA6BRnfTBEUMjOq4FtKDlq5o=
+B20iTPe8N0WflloDZF1DAuaMBXbLV5H/UPeIrhzocK8=
+s3SdyOvWYn6WfboBgIwji8cB1beekSgM
+eL5Nf4Ql6yzaoMNj1/kGvni+TX+EJesscXjWCiUqpSM=
+pGuY+qbSImd/RPmIXExYfbyS0r7ZfWtN
+XXIUiO8imQc/trxkeqgXE11yFIjvIpkHmyNEplv0gDs=
+R4/KpCfRo5sbEf9EZLuYRw==
+QF8oKuglyQyvcM5Bj961HnbA2IbOkarlWRaTFzIkLGM=
++sW+WE1wWAjgwad/N0MDpUrMh035Nt0sZbG8KUhskwQ=
+LmQx9rHQGTyXOKThZpPw9Bf/v+hc5txNZ5WjJulMlEE=
+SzoBj/z2A1CDYaHRak3xtUs6AY/89gNQxu0J/zeopcE=
+9EYe34NUtGOHLQnydCQ1HBhG1hsoW3XR
+G6D4ijHWBfzq5Tc7UVGvv84Z1G3kVlYw
+E25PowytIsnGM1+JgQ+uoosqN66+ar7W
+M0McykSEBYVrbo2q0+CU75fTBCA1f2zm
+Ty9M3Wc+IH4OfjobXHv2paYIEBHIXkc/
+xPPmcjBj9sP3C0umxFl3mHRxV+8FuY9ukG57ceWMY4U=
+QGYEYgKwm+cApN1lAmxX+ghk3XG7mSDP
+YvewDT/XqBHZCHvUM1kJ5zfLJpt8Vovi
+C/Pm1aFRDLYVUxW22cZ47G1JlWMFiZTK
+76wIiq0Vkxlyt/PYnKvOcud1KEyAJyMj
+lRpFR4STd/5eEbDoOB+ztYNqLkNStzNN
+8wvQmz5NC5vIeyKlqd8H7A==
+vjhE1Tz40ysxHaFFsSYvx4mqP+0M3CRz
+9eeSihWwS75AONSWzrLlzGRo8t+uKG8M7+nagmDiHZbT1An2OOoSsQ==
+N26aGYp7sjBYbyPB0wRZgw==
+9Y5r9+8kA0Pmh9xPRO3hj0pgEZ36UZf7
+hooQo1fvONtqpcDhJXZmqTqCEnMuhs6Q
+k0y9N6jYrm0avSYeDaNtB+GbtcGcH52pBASzRD8CLbY=
+FZcZMCqNgSopLBlfM+VVqnqJappFK0F1eREs/zJbaak=
+w+Cwf4MK0rVqrxiohJdzBcPgsH+DCtK1I9MUVCsia+g=
+wu4NEuCivVTZ1Wk1MmUbX9sKgB0a2Fz1RPSDQg6jxMY=
+wu4NEuCivVSI8Z8uKyCWGZMVV2WEMeGIPH8zC+3Mpsg=
+mHFe98NUmvf1rMlYntta77uJAxZ+VzmFPH8zC+3Mpsg=
+woivEWJHd5scJDcSrwbauKVaVePy5OzR7NLBEkDmDJE=
+VrHhM/eXUB3AGwkh9PwSWXhF+h+HWcPT3o/RqxfFGiQ=
+aMHmdd1v3CFC7AxSOiW44njxR9mVnoQqO8B+JsbxdH8=
+PTCos0DGivBqMNyA0Nk7RpQg/0wqg9ud/FRS7OcKkCw=
+oah/P5G7Vcg78bCbiC4sD0rQ+yAITFwdiy48LWiKVlE=
+nUo1zw2Dbrp/zhKOVw7+YmKSM2ya9iI/Oq4FtKDlq5o=
+D1eDYe7RqTKZriXLtABITWKSM2ya9iI/Oq4FtKDlq5o=
+D1eDYe7RqTI1Y0eFfBedp51KNc8Ng266OJk/rqQgIEs=
+D1eDYe7RqTKs9eVsmkrHJWKSM2ya9iI/Oq4FtKDlq5o=
+9gJL3CBEKfGcWsG4QxQGsDzEUeASewd2d0qc91dUHes=
+NEywGN3DjQFOEQPZwvsQ1ABQUb+Bgor/QsjDFyh0etI=
+0GIGQBI1htx2OlpdyfCl5liiRIPsjsUx
+7Y6DZNY2xGWAmOFSgHo5YliiRIPsjsUx
+P82MQmGg+aeI6yb631mnTz/NjEJhoPmnBJ8cmcL0nAA=
+GTDeQrdjnpqAldj8xWqqDwhiIOXw/dSaFWN3xRThYNo=
+GTDeQrdjnpqD20MKJeWHMQhiIOXw/dSaFWN3xRThYNo=
+0ovWd66vjdVPcyNoKfhVZnxamTrfW29lQsjDFyh0etI=
+S5bx2VAn5nz+SgemEk7wj1pFs/B64BfS7NLBEkDmDJE=
+4Qvrbb1JTp+DokAwFmKECDJisxJklz+7kG57ceWMY4U=
+x22xvkilTFH+SgemEk7wj2rjy25Aijbo7NLBEkDmDJE=
+Vc9imXWIb09bwwyH078vGnEWSnq2x5KjBiNf+1YVhVY=
+O3P6K+AfRNz4uGxH9DBEAhzPmtBWPAmEpHp904IlTO0=
+xRMzRE7B30im8sAY5Loq51In2oc4nlEEYTDxNHZVHIA=
+QI3BKCa5CS2/Qya9rg8cD7ajLddQHsdKOxgqIHpj3G0=
+VibK7zkhwxswfbz/NSCyQThYKtcRsKoTOq4FtKDlq5o=
+HXcKGk7fgWLSKiTeuE4H4KTniY1uzUoc/FRS7OcKkCw=
+UWayH/xluR0utkxKsPQAtL7ECNRmYRRbQo+b5Q3VZwY=
+Cja1N2r7aqyA7UtHcCm9Tgo2tTdq+2qseEU//+lhXY0=
+2bg5JuTZYIZQBmzJ8tu4RG396D8gjF3QgSzpIj+8oBAoZ4KbCDbYK0pgEZ36UZf7
+N+h4/d3ORJyaVvGyytsEaC9Jtri7jcCu
+L5pW2W5e5QP8xoQ3ak3LT+vmIzppKyg+iy48LWiKVlE=
+4j8xGfGBQHU9IdMdHnWhjipcvK8fV34A
+T6Y7lZRwt1YT+IbQu+uxRSpcvK8fV34A
+lTFz8Of++gzSOKoafpm4sLhU4nVuO2EX
+FzAE8+xHpx/yHKYEQ1q4w+d1KEyAJyMj
+FeDKLbBcDlgX4rfunxcKgfr3MA3I8mLHRgiTfkBFZ8IDrXmRmHb6vfwxXbdPc+bf
+XzE3hg5nBlZcAI17ndbKxeh//o7r6XxK
+fwrs39e2sE4Y2Ku7TsnJl7yS0r7ZfWtN
+su18MMk2rGoogb2mTwdheeh//o7r6XxK
+IHGgxsnOnj74cFOldJX9vQ==
+m69a4x/0L74hGqmV/bsQkQ==
+RDxMnTnhMZ8oLcKBJ602oRLKT8eFdzGhwexVzLebpLU=
+RDxMnTnhMZ8YU7xbNSSDfX4AS0mk96sNnw1/iLmAL28=
+yBW5KwCa3QJ6otuBbzxJOamAVvyPHubjhZln3/ysGCz3QhuGSiXXyw==
+zDr9psujcMy2wsyG/qmxMw==
+5sahv3Hloii2wsyG/qmxMw==
+BgAEXxkJI7OsPgVVaeF78yHud7S4gPqZ
+u5kffeqLBwNBjbs1EA0prDCyeMyaTN9t
+7t3O9O9TCuxXuLGhFwb6si9Jtri7jcCu
+y40FjkV6sF55iS/iPkN3imtAsj+g+txU
+W+Y0SwEFQHg1Xk8fp0jcVXRekVIxM5tbn2eIVN7KHKYmQuY3MTqpqQ==
+p5aCK46PH5VMEoJHcGi8tCXBPH2DKdJv
++QcUSjkdonh/HeogIEXyxwZH0LrR6LVWGjFhHUGm/IA=
+gHsoP2gDJg6nX0VTNq08ZOLSzhaE/nJD/FRS7OcKkCw=
+aFFZlOb6t3rM6RCpC6CG2cCOsDRlr4swgM7iwnSZ3R8=
+r9wYD2Vr4lUZndUdLmj5xjS9CwvPbEfZ
+xEHYC5PyimOe8oZ3Nggmgq6lGFOOAKSXkdvMt65r33jKKPZ9pFrEuNlZxLMPZCO0
+btCstnrCzv2Ycs6LIWNqJO/wnylh3Khh
+d0o0k+rKjZwXIwEO9+g59veux+wDEn+MpHp904IlTO0=
+3vj0d5eXXoTpXqBX+hIoGQ==
+nB5xS01II5FO8U85Gj4LOwkzhrBsqvscH5LkeyCDeABSzlBthODeKA==
+wm6ORELi8z28ZB07nCjE2yXBPH2DKdJv
+zK3IJj4OCNLmDlpRHXRri8ytyCY+DgjSut1rfaYvqA8=
++lTEQBikGJc8NHGBPM0w3I7FvPCycJGgFWN3xRThYNo=
+vFYVsMh2w7iZGYPZxX4RY40Z5yFJVnbw/FRS7OcKkCw=
+CncrVpe/1q98tYIJXh/PBZRmR5Qp5PuUQsjDFyh0etI=
+ypYq0llNvxtpKTjNikKsfLs9F4LyYomyQsjDFyh0etI=
+yIa+hslafBUcJDcSrwbauKVaVePy5OzR7NLBEkDmDJE=
+sVYW4FT2Yo41Jxddg7LADHhs9vLM4mlZoITwRCmCjgk=
+kPZomRw9tAC3c2kz3Bc5L03NQibaeph3vgJU7rpjpfE=
+Si3i0N+haNhPXflsFsvr6iKdg5VRj7TbgSNeyMS56rD3QhuGSiXXyw==
+xPhLahM0n3/qQFELmxnh1jVJ7JvToHql
+EgDx6oQPndD5t3x6aCFG0ImqP+0M3CRz
+KmLTIUfMRcp1w2u8ylDE22VnWtVEUaGQ
+2dplvxJbc3ij6Ve8sY3ZKhl7hKbqZ5yoZbG8KUhskwQ=
+HJH2CTxTjyKpYj5/A+CA916zwkV6JkCPI9MUVCsia+g=
+0uUyu0EpSXhL3sXFrmYMBP0YtuuI9KIBw29zoqutRRY=
+9w1pqrvigcfwzhuyXPgpTfcNaaq74oHH2pls4MeHQwU=
+SYmOLTsdfpUj8oWCTU7iEJ7c3lp3jhH9y4x6AQXguls=
+SYmOLTsdfpWZbRfC5irvTR20GDvIkJIutAjZncZBtw8dquGb79CGYA==
+SYmOLTsdfpWsD4nFbHYIbwJ+Lzr29efsZ5WjJulMlEE=
+SYmOLTsdfpXXePlE/3BKzqyiN/jR7TPMmY/LFPKvcPE=
+SYmOLTsdfpX3XOFIbBxqj7oV44iLs/DRJxi/WywRaen7t4gfkUmAbQ==
+SYmOLTsdfpX3XOFIbBxqjx20GDvIkJIu9rmwvwUkGBA=
+SYmOLTsdfpU3HXG6RsZlQnYt+Gr3yymHi0LGduDJbfD0AdrdTA5Jww==
+SYmOLTsdfpX58CJptFaKrRUL2pL6I35EEemd6QV5FrU=
+SYmOLTsdfpVHtGiSAgCMlIV48KJ7DccpEemd6QV5FrU=
+SYmOLTsdfpVHtGiSAgCMlFq/HluUNOr1qy5BpyHFcPI=
+bdQZAKU7mrWvw0XTTXtLYhf/v+hc5txNZ5WjJulMlEE=
+AKdEPSBAqhZuTwoK2mH2a1ga+wv/ApQBXnxmhPdKEuw=
+AKdEPSBAqhbAXdPqIko4qx20GDvIkJIu9rmwvwUkGBA=
+AKdEPSBAqhY2toyDMjukNh20GDvIkJIujmo1+hfLt7o=
+BL9NabCnLLqs0nUFBiBjzF2+o2HvHM53y4x6AQXguls=
+4VOzkz9d1ocfTsj2NQbOyehDNLyCNkpkFWN3xRThYNo=
+xFotwv9QCRcOw4yCqX+MJo6EXLgqYvQGV/vUcFFbXo0=
+xFotwv9QCReuJDbDkUxjoMRaLcL/UAkXOxObTyoMKMU=
+xFotwv9QCRdJ03CaLUlm60mJji07HX6VQMYaBnUZrGI=
+xFotwv9QCReeVqIrAdHu+UmJji07HX6V7BTGaIDrp1A=
+DorPguHF9SK1sKJY4w7NX0JVtM7/jdB3
+3p2dj/WUOxtuoBPSZcUkedSWAlQ61gcvZbG8KUhskwQ=
+XsRueZvhAyrWPUA/f8pcgkaN+4aje31E/Bd7i9pCsgJRJIM98GFYu0pgEZ36UZf7
+ueWzwnpHs3ZN9oF7QXV6rPXQJBkouwCz
+ueWzwnpHs3Ysu9VBkLGKtrnls8J6R7N2cFgsszCTAdlKYBGd+lGX+w==
+ueWzwnpHs3ZER7UsowxLiLnls8J6R7N2Csf7VCRrjQJKYBGd+lGX+w==
+yZRpnP+yLjMBc5pOGLp2hw+TRU4vbE/A0q/AY+ii4C0=
+sGclmiZTHKquJDbDkUxjoLBnJZomUxyqOxObTyoMKMU=
+HElPoHkVj76nHplQBbmy2Q==
+FF1vgOU3uYh8q0nZ+MFJyYRJkskAlH5TbENZYM316MM=
+g1jovPf6F1GfKF+Jhxy5qd9UZKK1wa658J71EEn0hjZ7arQIk4twhA==
+qgKo9TnGwm/yzpOzI09r6/b0h4fpZkUmVfMcTbyjbvU=
+qgKo9TnGwm//hMZW754VmKgZn5hKffbZhuqtrnbrsTodquGb79CGYA==
+qgKo9TnGwm9Swug693Oom6gZn5hKffbZhuqtrnbrsTodquGb79CGYA==
+cc5DUa/vIO1f+ZS5hoH2XAY1yLDiPcgwXnxmhPdKEuw=
+cc5DUa/vIO0ym7O+IXIF9t/g+0cktkWSutgQPaT1sQF44XjV9hm48Q==
+cc5DUa/vIO1c7YcDoqIb9e52uFEEx0ou2p3BehHo8nt3OsyeEuipIA==
+cc5DUa/vIO1c7YcDoqIb9XkxXH0Wa3sq2p3BehHo8nt3OsyeEuipIA==
+9vSHh+lmRSa3gVxzeLve8p7c3lp3jhH9y4x6AQXguls=
+9vSHh+lmRSaZbRfC5irvTd7y1AT9VfuktAjZncZBtw8dquGb79CGYA==
+9vSHh+lmRSadw6D02NP08AJ+Lzr29efsZ5WjJulMlEE=
+9vSHh+lmRSb3XOFIbBxqj/Rj12kLWl2dIu0QFU8JDOz7t4gfkUmAbQ==
+9vSHh+lmRSb3XOFIbBxqj97y1AT9Vfuk9rmwvwUkGBA=
+9vSHh+lmRSY3HXG6RsZlQiH2VcNW99XZ2dZjipKP9nf0AdrdTA5Jww==
+9vSHh+lmRSb58CJptFaKrVGqmYkQwrq4Eemd6QV5FrU=
+9vSHh+lmRSZHtGiSAgCMlIsxYZAlX2HLEemd6QV5FrU=
+9vSHh+lmRSZHtGiSAgCMlN7y1AT9Vfukjmo1+hfLt7o=
+vVsbjXwCHtIKYy+Di8EoBaFRBjWThVlFGjFhHUGm/IA=
+HL8rmewPyn/AXdPqIko4q97y1AT9Vfuk9rmwvwUkGBA=
+HL8rmewPyn9s4bvV+I+PQiH2VcNW99XZ2dZjipKP9nf0AdrdTA5Jww==
+HL8rmewPyn82toyDMjukNt7y1AT9Vfukjmo1+hfLt7o=
+SJa+FiJCadBiDdrE2/WSu0iWvhYiQmnQ0l+eOlaueF0=
+SJa+FiJCadBkqxPNk6+V1gp3K1aXv9avecBAl6wmOEY=
+ZSLmCGeoePGoVI6WKOWvApdqWdeVFb0gmW0XwuYq700dquGb79CGYA==
+YhAatOuUXEsERM36DqXPrpdqWdeVFb0g+fAiabRWiq16QxYuwwH6NA==
+C2vJTOY7dZnDZtxspjvHCgY1yLDiPcgwXnxmhPdKEuw=
+l2pZ15UVvSDM5uuhHQNsfZ7c3lp3jhH9y4x6AQXguls=
+l2pZ15UVvSBRJBcBVI9Z8QJ+Lzr29efsZ5WjJulMlEE=
+bqCB8DyBJ44G/lIq/sjpF0rMh035Nt0sZbG8KUhskwQ=
+WeTkv/3IWfI2toyDMjukNt+k12A5nWgAjmo1+hfLt7o=
+mjpPHyZldWWYcs6LIWNqJO/wnylh3Khh
+TCtCfBfidQM7CHoZvwulqB4LEyifMejwnqkOgSHWovOZAzJcI48FiQ==
+RnkjKy7bTuYOw4yCqX+MJo6EXLgqYvQGV/vUcFFbXo0=
+RnkjKy7bTuauJDbDkUxjoEmJji07HX6VVfMcTbyjbvU=
+RnkjKy7bTuZJ03CaLUlm60mJji07HX6VQMYaBnUZrGI=
+RnkjKy7bTubGVWNxVhT6JXYt+Gr3yymHaOu00tCHy/GlY23IbYlIWkpgEZ36UZf7
+RnkjKy7bTuZDsWjNNYM53QqkGfhh8Y5lkwY1q7cPcwodquGb79CGYA==
+RnkjKy7bTubv58U4p6buBAqkGfhh8Y5lkwY1q7cPcwodquGb79CGYA==
+4DIqUKiEs1Luxn+1KvIdVC0HxeN/KSMOQo+b5Q3VZwY=
+/0BAESVH7V1blGnd3NQxHgGRNX35u9t0fkRC94tU/To=
+oov0b3Lhw82OZ16IhTvg5emoofYVr0mL9YQ8RM5gOiY=
+tfsr8XjYgRRwa3pNpPwn9IzBLx1QLwLQryKysOD+KUY=
+tfsr8XjYgRQm8RYMzdJEFwLDs1c1tC4QB451+nWReBM=
+r7X7GnD5BU3WMpFA8dOBpYX6u1JMMNpHZbXb/d9RO60=
+r7X7GnD5BU21j71vs4mKp4X6u1JMMNpHZbXb/d9RO60=
+I0JXTOTz+fGjHzm9DjskOFiiRIPsjsUx
+FxJ0Oakicwj+wFbg6/XQzr6n+6hwVDTG
+FxJ0Oakicwj3XOFIbBxqj5gfUQLcbAt7dEEwOohE3nc=
+lv3LZULpEhezUF//oM+h1J4XDqYBRf1xGjFhHUGm/IA=
+CSnacheNuHCYcs6LIWNqJO/wnylh3Khh
+cV6+Fjiihhu/YQalCQQXpMIDrOT9t+vX
+QQODTbNfOrMg+6JBq+16TC0HxeN/KSMOQo+b5Q3VZwY=
+Xllk80eUBngKjOLsGJCf+J7c3lp3jhH9y4x6AQXguls=
+rOhmvGJJ8u3hovOIbwI2ehf/v+hc5txNZ5WjJulMlEE=
+yW3ljc/B8to2toyDMjukNks/BOP9VEd27+fFOKem7gQmUGMXnyjHjQ==
+PMpKtrNubIRtVusGoLHeVZ7c3lp3jhH9y4x6AQXguls=
+PMpKtrNubIRHtGiSAgCMlFuJybOqVWewjmo1+hfLt7o=
+PMpKtrNubIRHtGiSAgCMlAAMTEK/7VZqjmo1+hfLt7o=
+h9ZGx7VBqWA2toyDMjukNrXb9of22ifVo9kTCBN8xEM=
+h9ZGx7VBqWA2toyDMjukNluJybOqVWewjmo1+hfLt7o=
+h9ZGx7VBqWA2toyDMjukNgAMTEK/7VZqjmo1+hfLt7o=
+ecNXK5cRRiQTedVcW+1ACv5N2YG78Dzu
+wYXj29HL0odUB4CCS3cFFwerjyqMAg4J
+lHzFFybhC1EWW93c5KZ9w4MQSCN50TpDkG57ceWMY4U=
+b0BomW46y9MdlVd++cSv+BlCJACoyHBoyzLSqBF4Qps=
+4C8KZY34/kswWU6jaieZ+JVowK2tONarh3IYrJiu9UE=
+4C8KZY34/ksIayJ99X/P35VowK2tONarh3IYrJiu9UE=
+CMWGTs0XA9l34x2EPsL7JYodSpEvESgm
+Rxg+21wscO8AP3US4S7kQUcYPttcLHDv1HZRdJVS8lM=
+IstZUls4S9AB7eURvyaaxw==
+i/NMkchEuH7/i6rckSvgQp4v2SAHQkIu
+Be6thebZitVDxzjBAaam+g==
+jMVMcG9dB3JvcexlVWyehozFTHBvXQdyntVuU/h7nOk=
+huML/c8cqstc7YcDoqIb9fDrN1sUcSEqR4khd3pw1IM=
+huML/c8cqstc7YcDoqIb9fZbAaI5jCtsR4khd3pw1IM=
+0NnCpHilrJP+wFbg6/XQzhokdeqhF+go
+uX2LMexjtC+DDXqTwV+vs7yS0r7ZfWtN
+tONtmLyh0yQ09jAoo+UY/g==
+QgD8FjDufS1ja1UTEsHAMw==
+OZZwJs35ml5lTbQuD/rI9COCFug3Kgau
+OH1RRKiiSYROOZ4G3K4YYU/+OJPAB/QyGjFhHUGm/IA=
+Vls5PUREgM3IX3iae1RYqkGelkT9y18qZ5WjJulMlEE=
+DYkPG+bCAJ+c3bZSsmP2l5kmUx2ewZUNBASzRD8CLbY=
+DYkPG+bCAJ8OHka04C7s9ZkmUx2ewZUNBASzRD8CLbY=
+DYkPG+bCAJ/ekahJ945tbpkmUx2ewZUNBASzRD8CLbY=
+ZMIu0vQwdoB+AjK4SSMLQuheRkFTmIMrwOJ2qKmDrDPrilGZfSe60Q==
+ZMIu0vQwdoDgSMmLjNI3OuheRkFTmIMrRuyrDs9fNauXjb3OHxwMOA==
+ZMIu0vQwdoAKDuc5bnfpw+heRkFTmIMrvSt/c9CGyEs+HhQneOFfyA==
+B+a0hQZFsZlbmQ6XCbZXzg==
+jE6GI85puZxZxYV+LBmV4Jxow4nWiIDU
+BVsqqvlJD8d2OlpdyfCl5liiRIPsjsUx
+Xl0zOoAehnqoVI6WKOWvAoHEsAgomIvuXnxmhPdKEuw=
+Xl0zOoAehnpulkN3J4gwoO/wnylh3Khh
+Xl0zOoAehnofE6cl3yBuiQHPtLhZsozr
+Xl0zOoAehnoL473qOWrZr1iiRIPsjsUx
+Xl0zOoAehnqAmOFSgHo5YliiRIPsjsUx
+0IZmYHFR3bA20ON2zdVCZNCGZmBxUd2wfMMtSzFRPVw=
+0IZmYHFR3bDYdbULQfpTftCGZmBxUd2wfMMtSzFRPVw=
+Ny3IKPJiJQ7GkmJFm1LJzk/vyjoO9e9+FWN3xRThYNo=
+LYpQ+vNUOQuVBDXfW1knGy2KUPrzVDkLdNLat5Yda+Y=
+LYpQ+vNUOQtYXGQlXLsacC2KUPrzVDkLw13STXW65x0=
+D9UfgAqjRajZA4GTEoiPhg==
+OlPuNjWpEbOKNzISZuy+EjpT7jY1qRGz396jclCk5qI=
+y52OJQbS71yZ2P5KIyjhrPX8LA/dnPjyGjFhHUGm/IA=
+vzvpZekKhuMKlwFXotd07oVRdAqAyKfiOq4FtKDlq5o=
+xCEoOyRVep4MTQiYXM8lr11f6lSbu1qpryKysOD+KUY=
+5LdbDpeR1jsFdKJcEKaDoZ0kB1qH5zU+vgJU7rpjpfE=
+D4mYPp9JKbFyKmguwA/NStXqqaBrqdOOxnOD8nTXLaRSNJgxVvK0/UpgEZ36UZf7
+Fg0mXFNHBeistqXVm6ybrA==

+ 115 - 0
bigdata-web/src/test/java/org/diagbot/CacheFileManagerTest.java

@@ -0,0 +1,115 @@
+package org.diagbot;
+
+import org.diagbot.pub.jdbc.MysqlJdbc;
+import org.diagbot.pub.utils.security.EncrypDES;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.*;
+
+/**
+ * @ClassName org.diagbot.CacheFileManagerTest
+ * @Description TODO
+ * @Author fyeman
+ * @Date 2019/3/8/008 14:05
+ * @Version 1.0
+ **/
+public class CacheFileManagerTest {
+
+    public static void main(String[] args) {
+        CacheFileManagerTest test = new CacheFileManagerTest();
+        test.contextMappingInitialized();
+    }
+
+    public void contextMappingInitialized() {
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/bigdata-web?useUnicode=true&characterEncoding=UTF-8");
+        Connection conn = nlpJdbc.connect();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            EncrypDES encrypDES = new EncrypDES();
+
+            String path = this.getClass().getClassLoader().getResource("").getPath();
+            path = path.substring(0, path.indexOf("target"));
+            //体征衍射
+            String sql = "select distinct name, name_mapping from doc_result_mapping_vital order by name";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            List<Map.Entry<String, String>> libraryList = rsToMap(rs, true);
+
+            FileWriter fw = new FileWriter(path + "src/main/resources/doc_result_mapping_vital.dict");
+            for (Map.Entry<String, String> entry : libraryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+            //疾病科室
+            sql = "select distinct diag_name, dept_name from doc_result_mapping_diag order by diag_name";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            libraryList = rsToMap(rs, true);
+
+            fw = new FileWriter(path + "src/main/resources/doc_result_mapping_diag.dict");
+            for (Map.Entry<String, String> entry : libraryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+            //性别年龄
+            sql = "select feature_name, feature_type, sex, age_start, age_end from doc_result_mapping_filter";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "src/main/resources/doc_result_mapping_filter.dict");
+
+            String r1, r2, r3, r4, r5;
+            while (rs.next()) {
+                r1 = rs.getString(1);
+                r2 = rs.getString(2);
+                r3 = rs.getString(3);
+                r4 = rs.getString(4);
+                r5 = rs.getString(5);
+
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3 + "|" + r4 + "|" + r5));
+                fw.write("\n");
+            }
+            fw.close();
+
+        } catch (IOException ioe) {
+            ioe.printStackTrace();
+        } catch (SQLException sqle) {
+            sqle.printStackTrace();
+        }  catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
+    }
+
+    private List<Map.Entry<String, String>> rsToMap(ResultSet rs, boolean isJoin) throws SQLException{
+        String r1 = "";
+        String r2 = "";
+        Map<String, String> libraryMap = new HashMap<>(10);
+        while (rs.next()) {
+            r1 = rs.getString(1);
+            r2 = rs.getString(2);
+            if (libraryMap.get(r1) == null) {
+                libraryMap.put(r1, r2);
+            } else if (isJoin && libraryMap.get(r1) != null) {
+                libraryMap.put(r1, libraryMap.get(r1) + "," + r2);
+            }
+        }
+
+        List<Map.Entry<String, String>> libraryList = new ArrayList<Map.Entry<String, String>>(libraryMap.entrySet());
+        Collections.sort(libraryList, new Comparator<Map.Entry<String, String>>() {
+            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
+                return o1.getKey().compareTo(o2.getKey());
+            }
+        });
+
+        return libraryList;
+    }
+}

+ 12 - 2
graph-web/pom.xml

@@ -69,9 +69,19 @@
 
 	<build>
 		<plugins>
+			<!--<plugin>-->
+				<!--<groupId>org.springframework.boot</groupId>-->
+				<!--<artifactId>spring-boot-maven-plugin</artifactId>-->
+			<!--</plugin>-->
 			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.8.0</version>
+				<configuration>
+					<compilerVersion>1.8</compilerVersion>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
 			</plugin>
 		</plugins>
 

+ 1 - 1
nlp/src/main/java/org/diagbot/nlp/util/Constants.java

@@ -30,7 +30,7 @@ public class Constants {
     public static NegativeEnum[] cause_type = new NegativeEnum[]{NegativeEnum.CAUSE};
     public static NegativeEnum[] negative_type = new NegativeEnum[]{NegativeEnum.FEMININE};
 
-    public static String[] negative_words = new String[]{"无", "未", "未及", "无殊", "否认", "未见", "不", "未闻", "未闻及", "欠"};
+    public static String[] negative_words = new String[]{"无", "未", "未及", "无殊", "否认", "未见", "不", "未闻", "未闻及", "欠", "非"};
 
     public final static String word_property_time = "2";
     public final static String word_property_unit = "9";

+ 86 - 2
nlp/src/main/java/org/diagbot/nlp/util/NlpCache.java

@@ -4,7 +4,7 @@ import org.diagbot.nlp.participle.cfg.Configuration;
 import org.diagbot.nlp.participle.cfg.DefaultConfig;
 import org.diagbot.nlp.participle.word.Segment;
 
-import java.util.Map;
+import java.util.*;
 
 /**
  * @ClassName org.diagbot.nlp.util.NlpCache
@@ -21,7 +21,9 @@ public class NlpCache {
     //词库同义词定义
     public static Map<String, String> standard_info_synonym_map = null;
     //词库大小类定义
-    public static Map<String, String> standard_info_classify_map = null;;
+    public static Map<String, String> standard_info_classify_map = null;
+    //树形结构存储大小类
+    public static Map<String, Node> standard_info_type_tree_map = null;
 
     public static void createSegmentCache() {
         Configuration configuration = new DefaultConfig();
@@ -43,6 +45,11 @@ public class NlpCache {
         standard_info_classify_map = configuration.loadMapDict("classify.dict");
     }
 
+    public static void createClassifyTreeCache() {
+        Configuration configuration = new DefaultConfig();
+        standard_info_classify_map = configuration.loadMapDict("classify.dict");
+    }
+
     public static Segment getSegment_cache() {
         if (segment_cache == null) {
             createSegmentCache();
@@ -70,4 +77,81 @@ public class NlpCache {
         }
         return standard_info_classify_map;
     }
+
+    public static Map<String, Node> getStandard_info_type_tree_map() {
+        if (standard_info_type_tree_map == null) {
+            standard_info_type_tree_map = new HashMap<>();
+            for (Map.Entry<String, String> entry : getStandard_info_classify_map().entrySet()) {
+                Node parent_node = standard_info_type_tree_map.get(entry.getValue());
+                if (parent_node == null) {
+                    parent_node = new Node();
+                    parent_node.setName(entry.getValue());
+                }
+                Node child_node = standard_info_type_tree_map.get(entry.getKey());
+                if (child_node == null) {
+                    child_node = new Node();
+                    child_node.setName(entry.getKey());
+                }
+                parent_node.add(parent_node, child_node);
+                standard_info_type_tree_map.put(entry.getValue(), parent_node);
+                standard_info_type_tree_map.put(entry.getKey(), child_node);
+            }
+        }
+        return standard_info_type_tree_map;
+    }
+
+    private void addChilds(Node root, Map<String, String> standardInfoTypeMap, List<String> hasAddList) {
+        for (Node node : root.getChilds()) {
+            for (Map.Entry<String, String> entry : standardInfoTypeMap.entrySet()) {
+                if (node.getName().equals(entry.getValue())) {
+                    node.add(node, entry.getKey());
+                    hasAddList.add(entry.getKey());
+                }
+            }
+        }
+    }
+
+    public static class Node {
+        private String name;
+        private Node parent;
+        private Set<Node> childs = new HashSet<>();
+
+        public Node add(Node parent, String name) {
+            Node node = new Node();
+            node.setName(name);
+            node.setParent(parent);
+            parent.getChilds().add(node);
+            return parent;
+        }
+
+        public Node add(Node parent, Node node) {
+            node.setParent(parent);
+            parent.getChilds().add(node);
+            return parent;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public Set<Node> getChilds() {
+            return childs;
+        }
+
+        public void setChilds(Set<Node> childs) {
+            this.childs = childs;
+        }
+
+        public Node getParent() {
+            return parent;
+        }
+
+        public void setParent(Node parent) {
+            this.parent = parent;
+        }
+    }
 }

+ 17 - 0
nlp/src/main/resources/push-tc.dict

@@ -458,6 +458,8 @@ JTdoOjbgatWQcFECVLg9G9ZRbNcGQguUKg1dGYtm3xs=
 hsbwFzBYLJk=
 EfljK+ZIOcly5vBCFCkWZg==
 woJQuxYHMec=
+bQ2yJJGW3KH4QiLrhJ/s/Q==
+nClfDjWdPdn4QiLrhJ/s/Q==
 5/gubc5nQ2E=
 btcPv768SBZjY+gX3wKAKGO5LswqKQOZN6TwQXeBGABKYBGd+lGX+w==
 8le2K9QM7qo=
@@ -625,6 +627,7 @@ Omi8kExEOvhy5vBCFCkWZg==
 Bz0HhN7CG4blHJqHzJolsS2hqbOUqekOpu3PIqIHn3A0AgNMT+9ROA==
 ZVpSvdyeMjqxMkc+2/UQxQ==
 SxfzKlVxtbsfIwkiwdUP1urUo2OLEJuOwGKphuLh3q8=
+Yfezm6v9H/s=
 cbtXrRz9I6jq1KNjixCbjsBiqYbi4d6v
 Vc+Vo5I9t42+VAWF7JDTDQ==
 KdIxpQHQuF37nxI3tH7b4g==
@@ -3056,6 +3059,7 @@ dpkUBx1gHuOxUxufMlaG5g==
 3lYEJRmTL06bUumNOZBvZwPZnLTJIPKK
 3lYEJRmTL06KrLa76zrxIg==
 ahNwAd2c4gsdNtXIA53V2A==
+DS8I7DhGEZyNPP38FDxyoQ==
 td9+nqHLT+8ov8ft0Ja3vTo1VnYE1h2SwGKphuLh3q8=
 td9+nqHLT+8ov8ft0Ja3vTo1VnYE1h2SQlO7LFWbchiOL/c9da9y/A==
 td9+nqHLT+84rz3be3M+PnLm8EIUKRZm
@@ -9865,6 +9869,7 @@ WcOfWx3BRf4X6fQT2YnqfQ==
 SImWf8WRlF1KYBGd+lGX+w==
 aBv3LwAn24Q87tqCF7OfvQ==
 fRRs4KUQNL47RB8ivPdGFQ==
+zkgAkUkBwolKYBGd+lGX+w==
 VuyvCvNeeyGLQn06fVLkePZtvjHT9QiU
 e162bCrUL98lqakYHKB+BGflaPjOEum3
 /yq6zC1BqhwX6fQT2YnqfQ==
@@ -19378,6 +19383,7 @@ w8PXSiiev6MO0fuuZbNSN3Lm8EIUKRZm
 w8PXSiiev6M/LSIleL7tc5AdTrePDTJ3SmARnfpRl/s=
 w8PXSiiev6ODpwmn83VigFUWUz1oJvxh
 fj6+aX7EHcNKYBGd+lGX+w==
+xii0EmJ2gz5AZLfcZIaSZg==
 Cv4l0UC8fXxKYBGd+lGX+w==
 Iy0MQ22koQxKYBGd+lGX+w==
 qxkgjNUcV33PKWxn0eY+0g==
@@ -22922,6 +22928,7 @@ Yrj7/Cliiazc8D06FmRwrV8m7Hn5ueD3cubwQhQpFmY=
 Yrj7/Cliiazc8D06FmRwrSHoUhwn+q4AcubwQhQpFmY=
 f8aF/kdme/Ldy4xvmExWwg==
 f8aF/kdme/LLBm4uZrYPnsyizcisX1Ri
+YCj+fhJ19iwQM2dnqFlPog==
 W/oWdIZwyzXOQNq5fYqs2zd2F2PBmVlNRXEzvoUC3oljO73z97lWmNjTG59tR5vV
 sgHBu+uc7x/XQDP0xKkkvA==
 i4t+4qIQKq9LlnvDcgZ+sQ==
@@ -25229,6 +25236,7 @@ Z0A2kuK86mv2YvmikroYRvAFBMCYIGKoSmARnfpRl/s=
 treMTxhdXa7vLTts1AXzvw==
 treMTxhdXa4u7hIx79tTyjRhdk3jIj3Q
 y6woOm+2namwpyVzoU9xng==
+QtwV80pBLLvFpI25Ovug3g==
 VdWW0mFv7RjPQmDYTpk1uGxkjd9nq5r0Ss3CBh10U+AQM2dnqFlPog==
 5uUU2on36y4cdrB251kWVA==
 5uUU2on36y47reqH/nwDqqnIH0u9eIRD
@@ -25276,6 +25284,7 @@ SKaLpgRak/8C5jte+G2tDIp5H5hs+HkFy4Ih3T1f5hZ1enOg/hkeoQ==
 SKaLpgRak/8C5jte+G2tDI4VE9jQFPdkZl7o2bncDjXqOXMnLfjosw==
 SKaLpgRak/9zUFAUG+b9Fo0u6jneTTO+
 CggpZP4i6gM7aXf36GTtvA==
+KSHApaED76Qsqzd+cZvBXg==
 yeeO+iS3tm5U/TFXt7v0EBE6VH0VzrXUPKqfh50y5/0JdzcrK7kAQg==
 Cu1i9BhkVrTRH/foyQXBDg==
 naGYg3EsvcUQM2dnqFlPog==
@@ -27628,6 +27637,7 @@ rqonZcZC/Oks895b73yFVQ==
 rqonZcZC/OmJzBm5YfTGUnLm8EIUKRZm
 kvnwtfbL3qxpb/c9CGc9Hg==
 /U1Q1jao1H+vobPCuRzwYA==
+ymkDpsnMGpJpb/c9CGc9Hg==
 8nUt9rW015gs895b73yFVQ==
 8nUt9rW015iJzBm5YfTGUnLm8EIUKRZm
 8nUt9rW015g26jk3M9s3OBWhzBXw9yNKSmARnfpRl/s=
@@ -30053,6 +30063,7 @@ yjta9kLoATEPyj2/wYrswRHJh6tm2uoz
 12pDOdTesEUCYFhPGqrERHLm8EIUKRZm
 HUbKldB8zBTmg5oucXAwIQ==
 bg2gkpc2xuNBQ14oxSYIEw==
+Mcc4U2fg3Iw=
 zsLVfKmpwqBKYBGd+lGX+w==
 RV/fLmPyDtOZ9VHY5rgKcnLm8EIUKRZm
 RV/fLmPyDtO37Zcnu6YDCKRA1J4wEB3ocubwQhQpFmY=
@@ -37020,6 +37031,7 @@ G3vOzP7hrnO+oKK+yVyqfp+w++JfcuM6SmARnfpRl/s=
 /+jl2au2oUn+EkH8d6ukv20m/97Zwnsw
 cE0pNu1/ujloC9GnjZTYcw==
 XyLDtJrm/JMWwuIgr9lcww==
+XyLDtJrm/JMdJlOScVhT8Q==
 x4dZTh1s6UAWvde1AYX8Gw==
 h9gA/4qV8UhR4knotLQIXA==
 8NWNjcYn0HgmtI9RjiIP2HLm8EIUKRZm
@@ -45932,6 +45944,7 @@ eCHyYWL2BwwQM2dnqFlPog==
 BAy9B6hmZkYQM2dnqFlPog==
 Y1pdfQs34QvXEuDktWKox4KoWEtpIM8v
 xkZn7JECZ70QM2dnqFlPog==
+MXX4OfXBzNYOS10YbLNA1w==
 eL5Nf4Ql6yxjdE2DppdHIw==
 eL5Nf4Ql6ywUq1dl2/kfysWkjbk6+6De
 UfQvi1JQGVQ8b6EEPhQlQg==
@@ -48418,6 +48431,7 @@ D1qllWyR/x8wPYrjIRsSWaJrSaKfSSny
 V6sv44FR5GoqDV0Zi2bfGw==
 rHWF4lqPEJbF5q5zTsroew==
 6Eg/rtdgSSnF+pz6J/mJTQ==
+bmLcquZ6UZQ+qWb8rE2y5QPZnLTJIPKK
 8i0Iqj3Sg18nTgA/YRw8ZERqfAZFyu/e
 zRCUgwVE3aaWeMJxUHifhQ==
 qrVEUUx0vH7fhfjpot4NzA==
@@ -53278,6 +53292,7 @@ kPZomRw9tAD90YsKZCWi6w==
 4LE6uhn7oC/fIbPNVARXB4KoWEtpIM8v
 4LE6uhn7oC9GL3Haje71cA==
 kPx14DQbjs+j0f7fhOnxgA==
+Sx+UVhpEwzQ=
 4wpDDtA/i3gWAOAxIHVvg/cHtthsPLwEWG8sYlIU4BBKYBGd+lGX+w==
 lCrj7iocLJFThn+jPKcVbQ==
 lCrj7iocLJHoKs12KG5i3d/+SDx9As0RaBegyxJz7iM=
@@ -56744,6 +56759,7 @@ M8EMhijvydye7VAk0tbu3w==
 NTXNmrCruA9pb/c9CGc9Hg==
 3nhf1VCgJ8stVPWlzFhL8g==
 R2aBTn/xDasToqtXFzcysA==
+wALVljbFqYZpb/c9CGc9Hg==
 14PJMEUAetiwFCmLJuyazw==
 fieOs7Lp0cpKYBGd+lGX+w==
 RHrKAG37jDfwFb7lLBRQWQ==
@@ -56807,6 +56823,7 @@ y+EOqlps0jdJRfXDP5t4pg==
 0IZmYHFR3bASnnsR48d4dA==
 0IZmYHFR3bB7CnWsksTmmg==
 0IZmYHFR3bClBKeGt+I5pEbTdiaUqZ5I
+cAFeOn6C4TfeRoibkq+lCQ==
 plJM8+061IlKYBGd+lGX+w==
 7HAvwzkCh8U9jI6cunvj/g==
 85yOFyDFz6Z8IDGR7GQWRw==

+ 22 - 6
nlp/src/main/resources/tc.dict

@@ -756,6 +756,8 @@ Y67ptv4pA3VKYBGd+lGX+w==
 3vpeK9bDcU5KYBGd+lGX+w==
 NCWNw/7KSipKYBGd+lGX+w==
 EG5497gPwTQ=
+vUPb1d1RkDCEp5n5fo8F6w==
+0ivsD4kPbu2Ep5n5fo8F6w==
 nO1JRdaPiHRKYBGd+lGX+w==
 E4GRFVDWbf9KYBGd+lGX+w==
 YMtNkIw1UrFKYBGd+lGX+w==
@@ -961,7 +963,7 @@ B/M2AHi7C1ZKYBGd+lGX+w==
 89tGWHB21PU=
 6OB/+mECqh3Y0X9x2UcsMapsFEIAk3u+I5XBXNX1aCI=
 eOy64FZQ8Ej2G8hap3GJ0kpgEZ36UZf7
-UXF+ni0rOotgumEKLv3QQQ==
+UXF+ni0rOot37GpgzaW9eQ==
 cL5uDTWH99lgumEKLv3QQQ==
 1lYP0lU3rBQ=
 uFzb4dbfl2tKYBGd+lGX+w==
@@ -1117,6 +1119,7 @@ Omi8kExEOvi0Ir6IIRWAAw==
 Bz0HhN7CG4blHJqHzJolsS2hqbOUqekOpu3PIqIHn3DG/IW0jQv6rQ==
 ZVpSvdyeMjpmIIvSc2QBDg==
 SxfzKlVxtbsfIwkiwdUP1urUo2OLEJuOesbTIdOzkxU=
+xFeMKWo9inFKYBGd+lGX+w==
 cbtXrRz9I6jq1KNjixCbjnrG0yHTs5MV
 Vc+Vo5I9t40W9lP6ggIz9w==
 KdIxpQHQuF3eF7kvF+bcSiyrN35xm8Fe
@@ -14306,6 +14309,7 @@ ahNwAd2c4guk6SMHC7e0jA==
 ahNwAd2c4gt75etqPEmaa3K0iqPGSUFs
 ahNwAd2c4gt6gFDQDxRuo0pgEZ36UZf7
 ahNwAd2c4guXV8LsTlXsVYlmPvkshumy
+DS8I7DhGEZySzhXrQW/JSQ==
 NAydLGKoZo7Op/npxyhXWRAzZ2eoWU+i
 NAydLGKoZo5ioGGbPUb4FBAzZ2eoWU+i
 IyYjxTc+H/qvSkN/fhdHJQ==
@@ -16637,7 +16641,7 @@ CzaYQgUzwPz/SbnJOQHaaQ==
 qdgd/VOFW4aAamObvWGrEw==
 7i9PYt1C12VqQjanXsrwMw==
 wnYHBD6HKdFqQjanXsrwMw==
-3+K9Mmj45ztqQjanXsrwMw==
+3+K9Mmj45zv/SbnJOQHaaQ==
 7ZE6ZODpy1lHngiVVu/VyFEaEkbiUqs0
 kdDlof/eXmFV2pDfjZbN3A==
 xWnbfg8JPj0hQua1nNppeQ==
@@ -55255,6 +55259,7 @@ hGC6R9phQtVqQjanXsrwMw==
 tKCsnGUZyDxqQjanXsrwMw==
 EVqbO4OPHbFqQjanXsrwMw==
 DI0LbLxMtSRqQjanXsrwMw==
+LytClg+/2o/hMsxoeC1GAg==
 dlaw44afYlVqQjanXsrwMw==
 P64+/X/5dGECUk/ZPRZqUA==
 VE0ONz/EQ/tqQjanXsrwMw==
@@ -117600,6 +117605,7 @@ w8PXSiiev6M/LSIleL7tc1Xp/mpqNANkgqhYS2kgzy8=
 w8PXSiiev6ODpwmn83VigA9RBtG3+EUq
 Lxo/huziUKdPS5lCGY2LEg==
 Qp72LW4Z3vzMo3RqAx3EdQ==
+xii0EmJ2gz6/Hq6kenDyJg==
 MtouzoRErmzMo3RqAx3EdQ==
 zhnxMRta0FnMo3RqAx3EdQ==
 qxkgjNUcV31nRFv8sgXCQw==
@@ -121660,7 +121666,6 @@ uWBZFQL0BA5qQjanXsrwMw==
 nz5SlAlI0SiVDWCeMJDVpA==
 1IUktT3qurZqQjanXsrwMw==
 MUYetO65ZOsy2XvOcSMH1w==
-ulMLekmjN6JqQjanXsrwMw==
 2C3Jp+z7CGpqQjanXsrwMw==
 OrLJtqWEF7tqQjanXsrwMw==
 yI6IpDuAOSRqQjanXsrwMw==
@@ -135077,7 +135082,7 @@ XaOyO9wuNAw8veWuLroSGhAzZ2eoWU+i
 nfWbAQ6rJQR6CFYAneQc9hAzZ2eoWU+i
 Zxo2yG1RWm1qQjanXsrwMw==
 WXSguS5iaotqQjanXsrwMw==
-KFa6GbuVPt5qQjanXsrwMw==
+KFa6GbuVPt4m/ysX2HcUug==
 JO28T7ZOi9VIj/eHTT0pPg==
 AL/2aG2fhGXYtcX1ZzFY5A==
 fL+WyvS8HDAwRfCMIYsFMQ==
@@ -137985,6 +137990,7 @@ EwXw1AJpq602BpLJcTPOABAzZ2eoWU+i
 Bi+APHJZ5Gl6tXo6nIvxLBAzZ2eoWU+i
 01qs625lGdsyY0FyezHQXRAzZ2eoWU+i
 8pXi2BlfdRfYtcX1ZzFY5A==
+CMevQ5BgoXXAYqmG4uHerw==
 r8N18ewHQZyukwskAEc2mRAzZ2eoWU+i
 4v9QtaPgjJ1qQjanXsrwMw==
 PdnJ3kjytihpNvpbG04BAxAzZ2eoWU+i
@@ -163009,6 +163015,7 @@ y6woOm+2nal3OUSN2+o+MAl3NysruQBC
 y6woOm+2nameVPZGiDjEpBePOBuqGL+Y
 3R9yGSZRb2L7gDvnLIEySA==
 MwF+ApR9qK3aLV8T5pQKdkpgEZ36UZf7
+UJhqQEr3GiTSra0FI+80rA==
 MxEkNTKfFs+ewj/R0v78bUSc0GLV+OmL
 CLp4b/Pz+s9qQjanXsrwMw==
 CE3qwMTGsCGgjnTDHOQybBAzZ2eoWU+i
@@ -163939,6 +163946,7 @@ RdA8yYgJKHy+DA9y2jP20Q==
 jyH6pyTpNP5ZWMIreMK7rxAzZ2eoWU+i
 bWA2kM4I5L0obpNPLYNZ1hAzZ2eoWU+i
 bWA2kM4I5L0r6Fh72mHgURAzZ2eoWU+i
+EDt32gkZRJPgy9lbgpb0qw==
 bdeHEp57Zuwjrwhv5ialnBAzZ2eoWU+i
 bdeHEp57ZuzT4ibGVQVliw1JKQx3U9ONTX5m3TJzNqg=
 izpgYkzkTP1qQjanXsrwMw==
@@ -182535,6 +182543,7 @@ rCXTxSEkKl5qQjanXsrwMw==
 AskLHb0VGzM+8NK6pwC6whAzZ2eoWU+i
 yXuFjyg1G6DwU0m6qlP3ahAzZ2eoWU+i
 xAtw8TbLKwOnIaFKzUp7HhAzZ2eoWU+i
+8lFn9eI32qXEXnmZwz/S9A==
 QO8f5E/fQRjIvWYZDMRyMxAzZ2eoWU+i
 2/6A4SXz09tqQjanXsrwMw==
 jM5amZ0tg7MYn9RXkOtFFBAzZ2eoWU+i
@@ -204393,6 +204402,7 @@ wxDqFwUutjhBNe9FL59aLQ==
 BaJuIQvHsINEixXtKb/5+w==
 Ijl4Cxth4o2+DA9y2jP20Q==
 P/zWUOhtPkx/wf4wOZ9lRw==
+7stgc/PCeNk=
 4LBEwfXPZ7L+6EHcdYyBsA==
 lO8Fn63J3dhqQjanXsrwMw==
 opEExI2eiIFqQjanXsrwMw==
@@ -244908,6 +244918,7 @@ cE0pNu1/ujng9VYRzJlA0cWkjbk6+6De
 rWmUW4x5FMNwKPG5bazIdw==
 Al5x7S3ojQveTS1RqMC4JRAzZ2eoWU+i
 XyLDtJrm/JN4/Z1zZZmwwcWkjbk6+6De
+XyLDtJrm/JPfGfvjsKZJ2Q==
 fnKaWe6OxAcckS3K4UEAzBAzZ2eoWU+i
 Dk6/279mVWSsYF8ZUJ7+cfhCIuuEn+z9
 Dk6/279mVWR6BeSfzxPcxfhCIuuEn+z9
@@ -260723,7 +260734,7 @@ hYmpFklowiLVOC6pMj91d7QivoghFYAD
 hYmpFklowiLU5idNIdKUGt2qie8PFTyupQ8/BJEuQXbAYqmG4uHerw==
 hYmpFklowiLU5idNIdKUGrxO+cEtlwwoA9YK8eKdn49KYBGd+lGX+w==
 hYmpFklowiKfnrIr5D4DVbQivoghFYAD
-fAw7zPE1/tJqQjanXsrwMw==
+fAw7zPE1/tLgy9lbgpb0qw==
 fKHec3HAuPu8FusWGHxd4sHzp5yCqr0zp1I/Ng297KY=
 j23SOqJWTVIDoG2oA8uCYKqkPc3+6aPE
 j23SOqJWTVIFQIBW644tmRpcbDdPdquXKg1dGYtm3xs=
@@ -265143,6 +265154,7 @@ Y1pdfQs34QvXEuDktWKoxyZ9o6xTCK3p
 G6DmChBjFLMtFZQ8FsFv+hAzZ2eoWU+i
 G6DmChBjFLNZWiwxT3m3UvTn5h+u+omr
 E7+qzUACemrAYqmG4uHerw==
+MXX4OfXBzNZzZ1mpNZLOwvhCIuuEn+z9
 eL5Nf4Ql6yxydQLf8A6kLsWkjbk6+6De
 eL5Nf4Ql6yybIlvCMXdmeNKtrQUj7zSs
 wVHVHe+2V9OU//UNA71MQQ==
@@ -277638,6 +277650,7 @@ DNAkxnAniNK+DA9y2jP20Q==
 Si2tLULKXm1hlbbZkIYu5g==
 6Eg/rtdgSSl0s8kvxxGjwcWkjbk6+6De
 bmLcquZ6UZStnleHxrJ0uxAzZ2eoWU+i
+bmLcquZ6UZQ+qWb8rE2y5fNNEaI2FB0k
 8i0Iqj3Sg18nTgA/YRw8ZNc48iu2K3pP
 zRCUgwVE3abxfmhTExM8HqJrSaKfSSny
 qrVEUUx0vH4K2vHYhn4e6RAzZ2eoWU+i
@@ -318125,7 +318138,7 @@ RP7dJmNtdgBqQjanXsrwMw==
 EKDqxEnQf8BqQjanXsrwMw==
 ac16jlTrAqlqQjanXsrwMw==
 rmDfqhTJydNqQjanXsrwMw==
-5LRZh3NCshxqQjanXsrwMw==
+5LRZh3NCshzEXnmZwz/S9A==
 IUdumqddadtXtu58M05XMQ==
 IHHYHWnwn09qQjanXsrwMw==
 Y7jDPldaxuzRyyxAI3d7kBAzZ2eoWU+i
@@ -322229,6 +322242,7 @@ I9BLV6jf2j3bNHSTJXW7dg==
 krNtI+Chem5qQjanXsrwMw==
 D8yf4bSiRw4hQua1nNppeQ==
 658vnUPjOTNqQjanXsrwMw==
+OqKdoH/t5nw=
 4wpDDtA/i3gWAOAxIHVvg/cHtthsPLwE5SegrfrEQKNy5vBCFCkWZg==
 6f4Yd8Y26EihXNsdbkXGycZvhQC9AxJX
 6f4Yd8Y26EgabdjA4O3J78ZvhQC9AxJX
@@ -336860,6 +336874,7 @@ R2aBTn/xDauhW0DpQ57N6w==
 xKWc5fMfSWIwICicc05V4mlv9z0IZz0e
 j9O5LBYBdwxqQjanXsrwMw==
 KHxSjECcYrdqQjanXsrwMw==
+fYiByBlYh91PiFA97DSzTQ==
 kxS5s7FZV+17z7GxTK3jVRAzZ2eoWU+i
 KEmHLVMeUGiVJFikXu1FDRAzZ2eoWU+i
 MWEPx8fnmo9qQjanXsrwMw==
@@ -337273,6 +337288,7 @@ Cjy8b0mMvAzECdk4OXV+7RAzZ2eoWU+i
 mbt+CkbpGD8tNqdGs9RnSRAzZ2eoWU+i
 +OmFoh8JCj6Z0g+X2nPQdBAzZ2eoWU+i
 HtbTA2XbZ7VyiUwbd11+tBAzZ2eoWU+i
+cAFeOn6C4TcRRLUX/rQrUcWkjbk6+6De
 kQoClr4NqxVxZaT5RQ/jGA==
 EoSkNn11W/Mobfyj1VVwew==
 fudnAZjovCxm9cKNIm0FsQ==

+ 12 - 0
push-web/pom.xml

@@ -49,6 +49,18 @@
 			<version>1.0.0</version>
 		</dependency>
 
+		<dependency>
+			<groupId>org.diagbot</groupId>
+			<artifactId>bigdata-web</artifactId>
+			<version>0.0.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.diagbot</groupId>
+			<artifactId>graph-web</artifactId>
+			<version>0.0.1</version>
+		</dependency>
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>

+ 44 - 3
push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java

@@ -1,12 +1,14 @@
 package org.diagbot.push.controller;
 
-import io.swagger.models.auth.In;
+import org.diagbot.bigdata.work.AlgorithmCore;
 import org.diagbot.common.work.*;
+import org.diagbot.graphWeb.work.GraphCalculate;
 import org.diagbot.pub.api.Response;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.diagbot.pub.utils.http.HttpApi;
 import org.diagbot.pub.web.BaseController;
 import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -37,13 +39,52 @@ public class AlgorithmController extends BaseController {
     @RequestMapping(value = "/page_neural")
     @ResponseBody
     public Response<ResponseData> neuralData(HttpServletRequest request, SearchData searchData) throws Exception {
-        return algorithm(request, searchData);
+        return combine(request, searchData);
     }
 
     @RequestMapping(value = "/neural", method = RequestMethod.POST)
     @ResponseBody
     public Response<ResponseData> bayesPageData(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
-        return algorithm(request, searchData);
+        return combine(request, searchData);
+    }
+
+    public Response<ResponseData> combine(HttpServletRequest request, SearchData searchData) throws Exception {
+        Response<ResponseData> response = new Response();
+        AlgorithmCore core = new AlgorithmCore();
+        ResponseData bigDataResponseData = core.algorithm(request, searchData);
+
+        GraphCalculate graphCalculate = new GraphCalculate();
+        ResponseData graphResponseData = graphCalculate.calculate(request, searchData);
+
+        if (graphResponseData.getDis().size() > 0) {
+            List<FeatureRate> disFeatureRates = new ArrayList<>();
+            boolean isFind = false;
+            for (int i = 0; i < bigDataResponseData.getDis().size(); i++) {
+                FeatureRate bigdata_fr = bigDataResponseData.getDis().get(i);
+                isFind = false;
+                for (FeatureRate graph_fr : graphResponseData.getDis()) {
+                    if (bigdata_fr.getFeatureName().equals(graph_fr.getFeatureName())) {
+                        isFind = true;
+                    }
+                }
+                if (!isFind) {
+                    disFeatureRates.add(bigdata_fr);
+                }
+            }
+            List<FeatureRate> graphFeatureRates = graphResponseData.getDis();
+            graphFeatureRates.addAll(disFeatureRates);
+            //大数据推送疾病数据用知识图谱替换
+            bigDataResponseData.setDis(graphFeatureRates);
+        }
+        bigDataResponseData.setTreat(graphResponseData.getTreat());
+
+        //如果页面有诊断传入,直接替换大数据中的检验检查数据
+        if (!StringUtils.isEmpty(searchData.getDiag())) {
+            bigDataResponseData.setLabs(graphResponseData.getLabs());
+            bigDataResponseData.setPacs(graphResponseData.getPacs());
+        }
+        response.setData(bigDataResponseData);
+        return response;
     }
 
     public Response<ResponseData> algorithm(HttpServletRequest request, SearchData searchData) throws Exception {