瀏覽代碼

更新最近所有功能

louhr 5 年之前
父節點
當前提交
0844eacc1d
共有 100 個文件被更改,包括 4358 次插入51187 次删除
  1. 1 1
      algorithm/src/main/resources/algorithm.properties
  2. 6 0
      bigdata-web/pom.xml
  3. 0 206
      bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java
  4. 0 98
      bigdata-web/src/main/java/org/diagbot/bigdata/common/InitListener.java
  5. 3 3
      bigdata-web/src/main/java/org/diagbot/bigdata/controller/AlgorithmController.java
  6. 0 22
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/mapper/ResultMappingDiagMapper.java
  7. 0 22
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/mapper/ResultMappingFilterMapper.java
  8. 0 22
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/mapper/ResultMappingVitalMapper.java
  9. 0 38
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/ResultMappingDiag.java
  10. 0 38
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/ResultMappingVital.java
  11. 0 12
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/wrapper/ResultMappingDiagWrapper.java
  12. 0 6
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/wrapper/ResultMappingFilterWrapper.java
  13. 0 7
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/wrapper/ResultMappingVitalWrapper.java
  14. 0 55
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/xml/ResultMappingDiagMapper.xml
  15. 0 67
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/xml/ResultMappingFilterMapper.xml
  16. 0 77
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/xml/ResultMappingVitalMapper.xml
  17. 0 8
      bigdata-web/src/main/java/org/diagbot/bigdata/service/ResultMappingDiagService.java
  18. 0 8
      bigdata-web/src/main/java/org/diagbot/bigdata/service/ResultMappingFilterService.java
  19. 0 8
      bigdata-web/src/main/java/org/diagbot/bigdata/service/ResultMappingVitalService.java
  20. 0 21
      bigdata-web/src/main/java/org/diagbot/bigdata/service/impl/ResultMappingDiagServiceImpl.java
  21. 0 21
      bigdata-web/src/main/java/org/diagbot/bigdata/service/impl/ResultMappingFilterServiceImpl.java
  22. 0 21
      bigdata-web/src/main/java/org/diagbot/bigdata/service/impl/ResultMappingVitalServiceImpl.java
  23. 6 9
      bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java
  24. 94 0
      bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataParamsProxy.java
  25. 1 1
      bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataSearchData.java
  26. 0 584
      bigdata-web/src/main/java/org/diagbot/bigdata/work/ParamsDataProxy.java
  27. 19 119
      bigdata-web/src/main/java/org/diagbot/bigdata/work/ResultDataProxy.java
  28. 1 1
      bigdata-web/src/main/resources/application.yml
  29. 0 899
      bigdata-web/src/main/resources/doc_result_mapping_diag.dict
  30. 0 24905
      bigdata-web/src/main/resources/doc_result_mapping_filter.dict
  31. 0 921
      bigdata-web/src/main/resources/doc_result_mapping_vital.dict
  32. 0 79
      bigdata-web/src/main/resources/kl_result_mapping_standword.dict
  33. 48 15
      bigdata-web/src/test/java/org/diagbot/AddStandWordTest.java
  34. 1 1
      bigdata-web/src/test/java/org/diagbot/CacheFileManagerTest.java
  35. 135 0
      bigdata-web/src/test/java/org/diagbot/EyeHospitalData.java
  36. 17 0
      common-push/pom.xml
  37. 34 0
      common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java
  38. 1 1
      common-service/src/main/java/org/diagbot/common/work/FeatureRate.java
  39. 1 1
      common-service/src/main/java/org/diagbot/common/work/LisDetail.java
  40. 79 0
      common-push/src/main/java/org/diagbot/common/push/bean/PreResult.java
  41. 24 4
      common-service/src/main/java/org/diagbot/common/work/ResponseData.java
  42. 1 1
      bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/ResultMappingFilter.java
  43. 143 0
      common-push/src/main/java/org/diagbot/common/push/bean/Rule.java
  44. 45 0
      common-push/src/main/java/org/diagbot/common/push/bean/RuleApp.java
  45. 53 4
      common-service/src/main/java/org/diagbot/common/work/SearchData.java
  46. 1 1
      common-service/src/main/java/org/diagbot/common/javabean/Detail.java
  47. 1 1
      common-service/src/main/java/org/diagbot/common/javabean/Drugs.java
  48. 1 2
      common-service/src/main/java/org/diagbot/common/javabean/Filnlly.java
  49. 1 1
      common-service/src/main/java/org/diagbot/common/javabean/FuzhenFilnlly.java
  50. 1 1
      common-service/src/main/java/org/diagbot/common/javabean/Indicators.java
  51. 1 1
      common-service/src/main/java/org/diagbot/common/javabean/MangementEvaluation.java
  52. 12 1
      common-service/src/main/java/org/diagbot/common/javabean/MedicalIndication.java
  53. 2 2
      common-service/src/main/java/org/diagbot/common/javabean/MedicalIndicationDetail.java
  54. 1 1
      common-service/src/main/java/org/diagbot/common/javabean/Medicition.java
  55. 157 0
      common-push/src/main/java/org/diagbot/common/push/cache/ApplicationCacheUtil.java
  56. 423 0
      common-push/src/main/java/org/diagbot/common/push/cache/CacheFileManager.java
  57. 176 0
      common-push/src/main/java/org/diagbot/common/push/cache/CacheUtil.java
  58. 531 0
      common-push/src/main/java/org/diagbot/common/push/filter/ClassifyDiag.java
  59. 83 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/Pretreatment.java
  60. 39 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentDiag.java
  61. 59 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentLis.java
  62. 43 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentMakeList.java
  63. 46 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentNormal.java
  64. 45 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentOther.java
  65. 51 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentPacs.java
  66. 44 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentSymptom.java
  67. 57 0
      common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentVital.java
  68. 181 0
      common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java
  69. 2 2
      bigdata-web/src/main/java/org/diagbot/bigdata/util/BigDataConstants.java
  70. 266 0
      common-push/src/main/java/org/diagbot/common/push/work/ParamsDataProxy.java
  71. 5 0
      graph-web/pom.xml
  72. 2 10
      graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java
  73. 4 8
      graph-web/src/main/java/org/diagbot/graphWeb/work/DiseaseCalculate.java
  74. 4 4
      graph-web/src/main/java/org/diagbot/graphWeb/work/FilterSortDiag.java
  75. 55 19
      graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java
  76. 1 5
      graph-web/src/main/java/org/diagbot/graphWeb/work/HighRiskCalculate.java
  77. 3 3
      graph-web/src/main/java/org/diagbot/graphWeb/work/LisPacsCalculate.java
  78. 0 84
      graph-web/src/main/java/org/diagbot/graphWeb/work/ParamsDataProxy.java
  79. 1 1
      graph-web/src/main/resources/application.yml
  80. 5 1
      graph/pom.xml
  81. 64 9
      graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java
  82. 0 77
      graph/src/main/java/org/diagbot/graph/util/CacheUtil.java
  83. 2 6
      graph/src/main/resources/bolt.properties
  84. 0 756
      graph/src/main/resources/diagSort.dict
  85. 0 70
      graph/src/main/resources/lexicon.dict
  86. 0 21308
      graph/src/main/resources/sexAge.dict
  87. 0 485
      graph/src/main/resources/vital.dict
  88. 86 2
      graph/src/test/java/org/diagbot/graph/CacheFile.java
  89. 10 0
      graphdb/pom.xml
  90. 41 0
      graphdb/src/main/java/org/diagbot/pub/Ciku.java
  91. 44 0
      graphdb/src/main/java/org/diagbot/pub/Label.java
  92. 46 0
      graphdb/src/main/java/org/diagbot/pub/Type.java
  93. 153 0
      graphdb/src/main/java/org/diagbot/repository/DiseaseRepository.java
  94. 8 3
      graphdb/src/main/java/org/diagbot/service/KnowledgeService.java
  95. 801 4
      graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java
  96. 22 0
      graphdb/src/main/java/org/diagbot/vo/domain/NeoParamVO.java
  97. 38 0
      graphdb/src/main/java/org/diagbot/vo/domain/RespDTO.java
  98. 25 12
      graphdb/src/main/java/org/diagbot/web/KnowledgeController.java
  99. 1 1
      graphdb/src/main/resources/application.yml
  100. 0 0
      nlp-web/src/main/resources/application.yml

+ 1 - 1
algorithm/src/main/resources/algorithm.properties

@@ -1,6 +1,6 @@
 ################################ model basic url ###################################
 
-#basicPath=E:/git/push/algorithm/src/main/models/model_version_replacement/model
+#basicPath=E:/project/push/algorithm/src/main/models/model_version_replacement/model
 basicPath=/opt/models/dev/models/model_version_replacement/model
 #basicPath=E:/xxx/model_version_replacement/model
 

+ 6 - 0
bigdata-web/pom.xml

@@ -43,6 +43,12 @@
             <version>1.0.0</version>
         </dependency>
 
+		<dependency>
+			<groupId>org.diagbot</groupId>
+			<artifactId>common-push</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+
         <dependency>
             <groupId>org.diagbot</groupId>
             <artifactId>common-service</artifactId>

+ 0 - 206
bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java

@@ -1,206 +0,0 @@
-package org.diagbot.bigdata.common;
-
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-import org.diagbot.bigdata.util.BigDataConstants;
-import org.diagbot.nlp.participle.ParticipleUtil;
-import org.diagbot.nlp.participle.cfg.Configuration;
-import org.diagbot.nlp.participle.cfg.DefaultConfig;
-import org.diagbot.nlp.participle.word.Lexeme;
-import org.diagbot.nlp.participle.word.LexemePath;
-import org.diagbot.nlp.util.NegativeEnum;
-import org.diagbot.nlp.util.NlpCache;
-import org.diagbot.pub.utils.security.EncrypDES;
-
-import javax.servlet.ServletContext;
-import java.util.*;
-
-public class ApplicationCacheUtil {
-
-    //词库同义词定义
-    public static Map<String, 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, List<Map<String, String>>> kl_result_mapping_standword_map = null;
-
-    public static Map<String, Map<String, String>> getStandard_info_synonym_map() {
-        if (standard_info_synonym_map == null) {
-            standard_info_synonym_map = NlpCache.getStandard_info_synonym_map();
-        }
-        return standard_info_synonym_map;
-    }
-
-    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 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 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 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 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 {
-                for (int i = 0; i < fileContents.size(); i++) {
-                    line_string = org.apache.commons.lang3.StringUtils.split(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();
-            }
-
-            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;
-    }
-
-    public static Map<String, List<Map<String, String>>> getKl_result_mapping_standword_map() {
-        if (kl_result_mapping_standword_map == null) {
-            kl_result_mapping_standword_map = new HashMap<>();
-            Configuration configuration = new DefaultConfig();
-            List<String> fileContents = configuration.readFileContents("kl_result_mapping_standword.dict");
-            List<Map<String, String>> standWordObjValList = null;
-            Map<String, String> standWordObjVal = null;
-            String operation = ">=|≥|>|大于|>|超过|<=|≤|<|小于|<|少于";
-            try {
-                for (String fileContent : fileContents) {
-                    LexemePath<Lexeme> lexemes = null;
-                    String op = "";
-                    String[] fileContentSplit = null;
-                    //每一个标准词根据大于小于符号切开,不然进行分词时还是会得到原本的标准词
-                    if (fileContent.contains(">") || fileContent.contains("大于")
-                            || fileContent.contains(">") || fileContent.contains("超过")) {
-                        op = ">";
-                        fileContentSplit = fileContent.split(operation);
-                    } else if (fileContent.contains("<") || fileContent.contains("小于")
-                            || fileContent.contains("<") || fileContent.contains("少于")) {
-                        op = "<";
-                        fileContentSplit = fileContent.split(operation);
-                    } else if (fileContent.contains(">=") || fileContent.contains("≥")){
-                        op = ">=";
-                        fileContentSplit = fileContent.split(operation);
-                    } else if (fileContent.contains("<=") || fileContent.contains("≤")) {
-                        op = "<=";
-                        fileContentSplit = fileContent.split(operation);
-                    } else {
-                        continue;
-                    }
-                    LexemePath<Lexeme> lexemeWord = null;
-                    //每一个标准词切开后进行分词
-                    for (String fileContentWords : fileContentSplit) {
-                        lexemeWord = ParticipleUtil.participle(fileContentWords);
-                        if (lexemeWord != null) {
-                            if (null == lexemes) {
-                                lexemes = lexemeWord;
-                            } else {
-                                for (Lexeme lexeme : lexemeWord) {
-                                    lexemes.add(lexeme);
-                                }
-                            }
-                        }
-                    }
-                    String standWordObjKey = "";
-                    standWordObjValList = new ArrayList<>();
-                    standWordObjVal = new HashMap<>();
-                    int i = 0;
-                    for (Lexeme lexeme : lexemes) {
-                        i++;
-                        if (lexeme.getProperty().contains(",")) {
-                            setProterty(lexeme); //如果分词后词性有多个,只选一个(暂时只处理症状,体征)
-                        }
-                        NegativeEnum lexemeNegativeEnum = NegativeEnum.parseOfValue(lexeme.getProperty());
-                        if (lexemeNegativeEnum == NegativeEnum.SYMPTOM || lexemeNegativeEnum == NegativeEnum.CAUSE
-                                || lexemeNegativeEnum == NegativeEnum.VITAL_INDEX) {
-                            if (!kl_result_mapping_standword_map.containsKey(lexeme.getText())) {
-                                kl_result_mapping_standword_map.put(lexeme.getText(), standWordObjValList);
-                            } else {
-                                standWordObjKey = lexeme.getText();
-                            }
-                        } else if (lexemeNegativeEnum == NegativeEnum.DIGITS) {
-                            standWordObjVal.put("value", lexeme.getText());
-                        } else if (lexemeNegativeEnum == NegativeEnum.UNIT
-                                || lexemeNegativeEnum == NegativeEnum.EVENT_TIME) {
-                            standWordObjVal.put("unit", lexeme.getText().toLowerCase());
-                        }
-                        if (lexemes.size() == i) {
-                            standWordObjVal.put("op", op);
-                            standWordObjVal.put("standword", fileContent);
-                            if (kl_result_mapping_standword_map.containsKey(standWordObjKey)) {
-                                kl_result_mapping_standword_map.get(standWordObjKey).add(standWordObjVal);
-                            } else {
-                                standWordObjValList.add(standWordObjVal);
-                            }
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-        return kl_result_mapping_standword_map;
-    }
-
-    public static void setProterty(Lexeme lexeme) {
-        for (String featureType : lexeme.getProperty().split(",")) {
-            switch (featureType) {
-                case "1":
-                    lexeme.setProperty("1");
-                    break;
-                case "33":
-                    lexeme.setProperty("33");
-                    break;
-            }
-        }
-    }
-}

+ 0 - 98
bigdata-web/src/main/java/org/diagbot/bigdata/common/InitListener.java

@@ -1,98 +0,0 @@
-package org.diagbot.bigdata.common;
-
-
-import org.diagbot.bigdata.dao.model.ResultMappingDiag;
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-import org.diagbot.bigdata.dao.model.ResultMappingVital;
-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;
-import javax.servlet.ServletContextListener;
-import javax.servlet.annotation.WebListener;
-import java.util.*;
-
-@WebListener
-public class InitListener implements ServletContextListener {
-    @Autowired
-    ResultMappingVitalService resultMappingVitalService;
-    @Autowired
-    ResultMappingDiagService resultMappingDiagService;
-    @Autowired
-    ResultMappingFilterService resultMappingFilterService;
-
-    public void contextDestroyed(ServletContextEvent arg0) {
-
-    }
-
-    /**
-     * 开始初始化数据
-     *
-     * @return
-     */
-    public void contextInitialized(ServletContextEvent 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) {
-//        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) {
-            value = new ArrayList<>(Arrays.asList(ele));
-            map.put(key, value);
-        } else {
-            if (!value.contains(ele)) {
-                value.add(ele);
-                map.put(key, value);
-            }
-        }
-    }
-}

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

@@ -1,8 +1,8 @@
 package org.diagbot.bigdata.controller;
 
 import org.diagbot.bigdata.work.AlgorithmCore;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.common.work.SearchData;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.nlp.util.Constants;
 import org.diagbot.pub.api.Response;
 import org.diagbot.pub.web.BaseController;
@@ -34,7 +34,7 @@ public class AlgorithmController extends BaseController {
     public Response<ResponseData> algorithm(HttpServletRequest request, SearchData searchData) throws Exception {
         Response<ResponseData> response = new Response();
         AlgorithmCore core = new AlgorithmCore();
-        ResponseData responseData = core.algorithm(request, searchData);
+        ResponseData responseData = core.algorithm(request, searchData, null);
         response.setData(responseData);
         return response;
     }

+ 0 - 22
bigdata-web/src/main/java/org/diagbot/bigdata/dao/mapper/ResultMappingDiagMapper.java

@@ -1,22 +0,0 @@
-/** 
-* @Company: 杭州朗通信息技术有限公司
-* @Department: 医疗事业部
-* @Description: 互动反馈系统 
-* @Address: 浙江省杭州市余杭区向往街1008号乐富海邦园11幢4楼
-*/
-package org.diagbot.bigdata.dao.mapper;
-
-import org.diagbot.bigdata.dao.model.ResultMappingDiag;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingDiagWrapper;
-import org.diagbot.pub.orm.EntityMapper;
-
-/**
-* @Title: Feature.java
-* @Package: com.zjlantone.nlp.web.doc.dao.model
-* @Description: 数据库操作接口类 
-* @author: 楼辉荣
-* @date: 2016年8月8日 下午17:16:23
-* @version: V1.0
-*/
-public interface ResultMappingDiagMapper extends EntityMapper<ResultMappingDiag, ResultMappingDiagWrapper, Long> {
-}

+ 0 - 22
bigdata-web/src/main/java/org/diagbot/bigdata/dao/mapper/ResultMappingFilterMapper.java

@@ -1,22 +0,0 @@
-/** 
-* @Company: 杭州朗通信息技术有限公司
-* @Department: 医疗事业部
-* @Description: 互动反馈系统 
-* @Address: 浙江省杭州市余杭区向往街1008号乐富海邦园11幢4楼
-*/
-package org.diagbot.bigdata.dao.mapper;
-
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingFilterWrapper;
-import org.diagbot.pub.orm.EntityMapper;
-
-/**
-* @Title: Feature.java
-* @Package: com.zjlantone.nlp.web.doc.dao.model
-* @Description: 数据库操作接口类 
-* @author: 楼辉荣
-* @date: 2016年8月8日 下午17:16:23
-* @version: V1.0
-*/
-public interface ResultMappingFilterMapper extends EntityMapper<ResultMappingFilter, ResultMappingFilterWrapper, Long> {
-}

+ 0 - 22
bigdata-web/src/main/java/org/diagbot/bigdata/dao/mapper/ResultMappingVitalMapper.java

@@ -1,22 +0,0 @@
-/** 
-* @Company: 杭州朗通信息技术有限公司
-* @Department: 医疗事业部
-* @Description: 互动反馈系统 
-* @Address: 浙江省杭州市余杭区向往街1008号乐富海邦园11幢4楼
-*/
-package org.diagbot.bigdata.dao.mapper;
-
-import org.diagbot.bigdata.dao.model.ResultMappingVital;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingVitalWrapper;
-import org.diagbot.pub.orm.EntityMapper;
-
-/**
-* @Title: Feature.java
-* @Package: com.zjlantone.nlp.web.doc.dao.model
-* @Description: 数据库操作接口类 
-* @author: 楼辉荣
-* @date: 2016年8月8日 下午17:16:23
-* @version: V1.0
-*/
-public interface ResultMappingVitalMapper extends EntityMapper<ResultMappingVital, ResultMappingVitalWrapper, Long> {
-}

+ 0 - 38
bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/ResultMappingDiag.java

@@ -1,38 +0,0 @@
-package org.diagbot.bigdata.dao.model;
-
-import java.io.Serializable;
-
-/**
- * @Auther: fyeman
- * @Date: 2018/9/12/012 16:50
- * @Description:
- */
-public class ResultMappingDiag implements Serializable {
-    private Long id;
-    private String diagName;
-    private String deptName;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getDiagName() {
-        return diagName;
-    }
-
-    public void setDiagName(String diagName) {
-        this.diagName = diagName;
-    }
-
-    public String getDeptName() {
-        return deptName;
-    }
-
-    public void setDeptName(String deptName) {
-        this.deptName = deptName;
-    }
-}

+ 0 - 38
bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/ResultMappingVital.java

@@ -1,38 +0,0 @@
-package org.diagbot.bigdata.dao.model;
-
-import java.io.Serializable;
-
-/**
- * @Auther: fyeman
- * @Date: 2018/9/10/010 14:30
- * @Description:
- */
-public class ResultMappingVital implements Serializable {
-    private Long id;
-    private String name;
-    private String nameMapping;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getNameMapping() {
-        return nameMapping;
-    }
-
-    public void setNameMapping(String nameMapping) {
-        this.nameMapping = nameMapping;
-    }
-}

+ 0 - 12
bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/wrapper/ResultMappingDiagWrapper.java

@@ -1,12 +0,0 @@
-package org.diagbot.bigdata.dao.model.wrapper;
-
-
-import org.diagbot.bigdata.dao.model.ResultMappingDiag;
-
-/**
- * @Auther: fyeman
- * @Date: 2018/9/12/012 16:51
- * @Description:
- */
-public class ResultMappingDiagWrapper extends ResultMappingDiag {
-}

+ 0 - 6
bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/wrapper/ResultMappingFilterWrapper.java

@@ -1,6 +0,0 @@
-package org.diagbot.bigdata.dao.model.wrapper;
-
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-
-public class ResultMappingFilterWrapper extends ResultMappingFilter {
-}

+ 0 - 7
bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/wrapper/ResultMappingVitalWrapper.java

@@ -1,7 +0,0 @@
-package org.diagbot.bigdata.dao.model.wrapper;
-
-
-import org.diagbot.bigdata.dao.model.ResultMappingVital;
-
-public class ResultMappingVitalWrapper extends ResultMappingVital {
-}

+ 0 - 55
bigdata-web/src/main/java/org/diagbot/bigdata/dao/xml/ResultMappingDiagMapper.xml

@@ -1,55 +0,0 @@
-<?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="org.diagbot.bigdata.dao.mapper.ResultMappingDiagMapper">
-    <!-- 映射定义列-->
-    <resultMap type="org.diagbot.bigdata.dao.model.ResultMappingDiag" id="resultMappingDiagMap">
-        <id property="id" column="id"/>
-        <result property="diagName" column="diag_name"/>
-        <result property="deptName" column="dept_name"/>
-    </resultMap>
-
-    <!-- 映射定义列-->
-    <resultMap type="org.diagbot.bigdata.dao.model.wrapper.ResultMappingDiagWrapper" id="resultMappingDiagWrapperMap">
-        <id property="id" column="id"/>
-        <result property="diagName" column="diag_name"/>
-        <result property="deptName" column="dept_name"/>
-    </resultMap>
-
-    <!-- 通用查询结果列-->
-    <sql id="Base_Column_List">
-		 t.id,	 t.diag_name,	 t.dept_name
-	</sql>
-
-    <!-- 查询(根据主键ID查询) -->
-    <select id="selectByPrimaryKey" resultMap="resultMappingDiagMap" parameterType="java.lang.Integer">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_diag t
-        WHERE t.id = #{id}
-    </select>
-
-    <!-- 查询(根据主键ID查询) -->
-    <select id="selectWrapperByPrimaryKey" resultMap="resultMappingDiagWrapperMap" parameterType="java.lang.Integer">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_diag t
-        WHERE t.id = #{id}
-    </select>
-
-    <!-- 依据Map查询条件返回结果集-->
-    <select id="selectList" resultMap="resultMappingDiagMap" parameterType="java.util.Map">
-        select diag_name, group_concat(dept_name) dept_name from doc_result_mapping_diag  group by diag_name
-    </select>
-
-    <!-- 依据Map查询条件返回扩展属性结果集-->
-    <select id="selectListWrapper" resultMap="resultMappingDiagWrapperMap" parameterType="java.util.Map">
-        select diag_name, group_concat(dept_name) dept_name from doc_result_mapping_diag  group by diag_name
-    </select>
-
-    <!--删除:根据主键ID删除-->
-    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
-		 DELETE FROM doc_result_mapping_diag
-		 WHERE id = #{id}
-	</delete>
-</mapper>

+ 0 - 67
bigdata-web/src/main/java/org/diagbot/bigdata/dao/xml/ResultMappingFilterMapper.xml

@@ -1,67 +0,0 @@
-<?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="org.diagbot.bigdata.dao.mapper.ResultMappingFilterMapper">
-    <!-- 映射定义列-->
-    <resultMap type="org.diagbot.bigdata.dao.model.ResultMappingFilter" id="resultMappingFilterMap">
-        <id property="id" column="id"/>
-        <result property="featureName" column="feature_name"/>
-        <result property="featureType" column="feature_type"/>
-        <result property="sex" column="sex"/>
-        <result property="ageStart" column="age_start"/>
-        <result property="ageEnd" column="age_end"/>
-        <result property="remark" column="remark"/>
-    </resultMap>
-
-    <!-- 映射定义列-->
-    <resultMap type="org.diagbot.bigdata.dao.model.wrapper.ResultMappingFilterWrapper" id="resultMappingFilterWrapperMap">
-        <id property="id" column="id"/>
-        <result property="featureName" column="feature_name"/>
-        <result property="featureType" column="feature_type"/>
-        <result property="sex" column="sex"/>
-        <result property="ageStart" column="age_start"/>
-        <result property="ageEnd" column="age_end"/>
-        <result property="remark" column="remark"/>
-    </resultMap>
-
-    <!-- 通用查询结果列-->
-    <sql id="Base_Column_List">
-		 t.id, t.feature_name, t.feature_type, t.sex, t.age_start, t.age_end, t.remark
-	</sql>
-
-    <!-- 查询(根据主键ID查询) -->
-    <select id="selectByPrimaryKey" resultMap="resultMappingFilterMap" parameterType="java.lang.Integer">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_filter t
-        WHERE t.id = #{id}
-    </select>
-
-    <!-- 查询(根据主键ID查询) -->
-    <select id="selectWrapperByPrimaryKey" resultMap="resultMappingFilterWrapperMap" parameterType="java.lang.Integer">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_filter t
-        WHERE t.id = #{id}
-    </select>
-
-    <!-- 依据Map查询条件返回结果集-->
-    <select id="selectList" resultMap="resultMappingFilterMap" parameterType="java.util.Map">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_filter t WHERE 1=1
-    </select>
-
-    <!-- 依据Map查询条件返回扩展属性结果集-->
-    <select id="selectListWrapper" resultMap="resultMappingFilterWrapperMap" parameterType="java.util.Map">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_filter t WHERE 1=1
-    </select>
-
-    <!--删除:根据主键ID删除-->
-    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
-		 DELETE FROM doc_result_mapping_filter
-		 WHERE id = #{id}
-	</delete>
-</mapper>

+ 0 - 77
bigdata-web/src/main/java/org/diagbot/bigdata/dao/xml/ResultMappingVitalMapper.xml

@@ -1,77 +0,0 @@
-<?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="org.diagbot.bigdata.dao.mapper.ResultMappingVitalMapper">
-    <!-- 映射定义列-->
-    <resultMap type="org.diagbot.bigdata.dao.model.ResultMappingVital" id="resultMappingVitalMap">
-        <id property="id" column="id"/>
-        <result property="name" column="name"/>
-        <result property="nameMapping" column="name_mapping"/>
-    </resultMap>
-
-    <!-- 映射定义列-->
-    <resultMap type="org.diagbot.bigdata.dao.model.wrapper.ResultMappingVitalWrapper" id="resultMappingVitalWrapperMap">
-        <id property="id" column="id"/>
-        <result property="name" column="name"/>
-        <result property="nameMapping" column="name_mapping"/>
-    </resultMap>
-
-    <!-- 通用查询结果列-->
-    <sql id="Base_Column_List">
-		 t.id,	 t.name,	 t.name_mapping
-	</sql>
-
-    <!-- 查询(根据主键ID查询) -->
-    <select id="selectByPrimaryKey" resultMap="resultMappingVitalMap" parameterType="java.lang.Integer">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_vital t
-        WHERE t.id = #{id}
-    </select>
-
-    <!-- 查询(根据主键ID查询) -->
-    <select id="selectWrapperByPrimaryKey" resultMap="resultMappingVitalWrapperMap" parameterType="java.lang.Integer">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_vital t
-        WHERE t.id = #{id}
-    </select>
-
-    <!-- 依据Map查询条件返回结果集-->
-    <select id="selectList" resultMap="resultMappingVitalMap" parameterType="java.util.Map">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_vital t WHERE 1=1
-        <if test="id != null and id != ''">
-            and t.id = #{id}
-        </if>
-        <if test="name != null and name != ''">
-            and t.name = #{name}
-        </if>
-        <if test="nameMapping != null and nameMapping != ''">
-            and t.name_mapping = #{nameMapping}
-        </if>
-    </select>
-
-    <!-- 依据Map查询条件返回扩展属性结果集-->
-    <select id="selectListWrapper" resultMap="resultMappingVitalWrapperMap" parameterType="java.util.Map">
-        SELECT
-        <include refid="Base_Column_List"/>
-        FROM doc_result_mapping_vital t WHERE 1=1
-        <if test="id != null and id != ''">
-            and t.id = #{id}
-        </if>
-        <if test="name != null and name != ''">
-            and t.name = #{name}
-        </if>
-        <if test="nameMapping != null and nameMapping != ''">
-            and t.name_mapping = #{nameMapping}
-        </if>
-    </select>
-
-    <!--删除:根据主键ID删除-->
-    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
-		 DELETE FROM doc_result_mapping_vital
-		 WHERE id = #{id}
-	</delete>
-</mapper>

+ 0 - 8
bigdata-web/src/main/java/org/diagbot/bigdata/service/ResultMappingDiagService.java

@@ -1,8 +0,0 @@
-package org.diagbot.bigdata.service;
-
-import org.diagbot.bigdata.dao.model.ResultMappingDiag;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingDiagWrapper;
-import org.diagbot.pub.service.BaseService;
-
-public interface ResultMappingDiagService extends BaseService<ResultMappingDiag, ResultMappingDiagWrapper, Long> {
-}

+ 0 - 8
bigdata-web/src/main/java/org/diagbot/bigdata/service/ResultMappingFilterService.java

@@ -1,8 +0,0 @@
-package org.diagbot.bigdata.service;
-
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingFilterWrapper;
-import org.diagbot.pub.service.BaseService;
-
-public interface ResultMappingFilterService extends BaseService<ResultMappingFilter, ResultMappingFilterWrapper, Long> {
-}

+ 0 - 8
bigdata-web/src/main/java/org/diagbot/bigdata/service/ResultMappingVitalService.java

@@ -1,8 +0,0 @@
-package org.diagbot.bigdata.service;
-
-import org.diagbot.bigdata.dao.model.ResultMappingVital;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingVitalWrapper;
-import org.diagbot.pub.service.BaseService;
-
-public interface ResultMappingVitalService extends BaseService<ResultMappingVital, ResultMappingVitalWrapper, Long> {
-}

+ 0 - 21
bigdata-web/src/main/java/org/diagbot/bigdata/service/impl/ResultMappingDiagServiceImpl.java

@@ -1,21 +0,0 @@
-package org.diagbot.bigdata.service.impl;
-
-import org.diagbot.bigdata.dao.mapper.ResultMappingDiagMapper;
-import org.diagbot.bigdata.dao.model.ResultMappingDiag;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingDiagWrapper;
-import org.diagbot.bigdata.service.ResultMappingDiagService;
-import org.diagbot.pub.service.BaseServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ResultMappingDiagServiceImpl extends BaseServiceImpl<ResultMappingDiag, ResultMappingDiagWrapper, Long> implements ResultMappingDiagService {
-    @Autowired
-    ResultMappingDiagMapper resultMappingDiagMapper;
-
-    @Autowired
-    private void setEntityMapper() {
-        super.setEntityMapper(resultMappingDiagMapper);
-    }
-
-}

+ 0 - 21
bigdata-web/src/main/java/org/diagbot/bigdata/service/impl/ResultMappingFilterServiceImpl.java

@@ -1,21 +0,0 @@
-package org.diagbot.bigdata.service.impl;
-
-import org.diagbot.bigdata.dao.mapper.ResultMappingFilterMapper;
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingFilterWrapper;
-import org.diagbot.bigdata.service.ResultMappingFilterService;
-import org.diagbot.pub.service.BaseServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ResultMappingFilterServiceImpl extends BaseServiceImpl<ResultMappingFilter, ResultMappingFilterWrapper, Long> implements ResultMappingFilterService {
-    @Autowired
-    ResultMappingFilterMapper resultMappingFilterMapper;
-
-    @Autowired
-    private void setEntityMapper() {
-        super.setEntityMapper(resultMappingFilterMapper);
-    }
-
-}

+ 0 - 21
bigdata-web/src/main/java/org/diagbot/bigdata/service/impl/ResultMappingVitalServiceImpl.java

@@ -1,21 +0,0 @@
-package org.diagbot.bigdata.service.impl;
-
-import org.diagbot.bigdata.dao.mapper.ResultMappingVitalMapper;
-import org.diagbot.bigdata.dao.model.ResultMappingVital;
-import org.diagbot.bigdata.dao.model.wrapper.ResultMappingVitalWrapper;
-import org.diagbot.bigdata.service.ResultMappingVitalService;
-import org.diagbot.pub.service.BaseServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ResultMappingVitalServiceImpl extends BaseServiceImpl<ResultMappingVital, ResultMappingVitalWrapper, Long> implements ResultMappingVitalService {
-    @Autowired
-    ResultMappingVitalMapper resultMappingVitalMapper;
-
-    @Autowired
-    private void setEntityMapper() {
-        super.setEntityMapper(resultMappingVitalMapper);
-    }
-
-}

+ 6 - 9
bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java

@@ -3,9 +3,9 @@ package org.diagbot.bigdata.work;
 import org.algorithm.core.AlgorithmExecutor;
 import org.algorithm.factory.AlgorithmFactory;
 import org.algorithm.util.AlgorithmClassify;
-import org.diagbot.common.work.FeatureRate;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.common.work.SearchData;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.nlp.feature.FeatureType;
 import org.diagbot.nlp.util.Constants;
 import org.diagbot.nlp.util.NlpCache;
@@ -25,12 +25,11 @@ import java.util.*;
  **/
 public class AlgorithmCore {
     Logger logger = LoggerFactory.getLogger(AlgorithmCore.class);
-    public ResponseData algorithm(HttpServletRequest request, SearchData searchData) throws Exception {
-        ResponseData responseData = new ResponseData();
+    public ResponseData algorithm(HttpServletRequest request, SearchData searchData, ResponseData responseData) throws Exception {
         //录入文本处理,包括提取特征、推送类型转换等
-        ParamsDataProxy paramsDataProxy = new ParamsDataProxy();
+        BigDataParamsProxy paramsDataProxy = new BigDataParamsProxy();
         logger.info("页面文本信息:" + searchData.getSymptom());
-        paramsDataProxy.createSearchData(request, searchData);
+        paramsDataProxy.createSearchData(searchData);
         //对象拷贝至BigDataSearchData处理
         BigDataSearchData bigDataSearchData = new BigDataSearchData();
         BeanUtils.copyProperties(searchData, bigDataSearchData);
@@ -63,8 +62,6 @@ public class AlgorithmCore {
                 if (Constants.feature_type_symptom.equals(searchData.getFeatureTypes()[i])) {
                     featuresMap = resultDataProxy.mapAdd(featuresMap, NlpCache.getStandard_info_push_map(), true);
                 }
-                //大小类合并
-                featuresMap = resultDataProxy.resultMerge(request, featuresMap);
                 //按模型计算的概率排序
                 featuresOrderList = new ArrayList<Map.Entry<String, Float>>(featuresMap.entrySet());
                 Collections.sort(featuresOrderList, new Comparator<Map.Entry<String, Float>>() {

+ 94 - 0
bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataParamsProxy.java

@@ -0,0 +1,94 @@
+package org.diagbot.bigdata.work;
+
+import org.algorithm.util.AlgorithmClassify;
+import org.apache.commons.lang3.StringUtils;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.work.ParamsDataProxy;
+import org.diagbot.nlp.feature.FeatureType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @ClassName org.diagbot.bigdata.work.ParamsDataProxy
+ * @Description TODO
+ * @Author fyeman
+ * @Date 2019/1/16/016 14:04
+ * @Version 1.0
+ **/
+public class BigDataParamsProxy {
+    Logger logger = LoggerFactory.getLogger(BigDataParamsProxy.class);
+
+    public void createSearchData(SearchData searchData) throws Exception {
+        ParamsDataProxy paramsDataProxy = new ParamsDataProxy();
+        paramsDataProxy.createSearchData(searchData);
+    }
+    /**
+     * featureType转算法模型类型
+     *
+     * @param sysCode
+     * @param featureTypes
+     * @param searchData
+     */
+    public AlgorithmClassify[] createAlgorithmClassify(String sysCode, String[] featureTypes, SearchData searchData) {
+        AlgorithmClassify[] classifies = new AlgorithmClassify[featureTypes.length];
+        //下了诊断且其他信息全为空 反推标识
+        boolean reverse = !StringUtils.isEmpty(searchData.getDiag()) && StringUtils.isEmpty(searchData.getSymptom());
+        for (int i = 0; i < featureTypes.length; i++) {
+            if (featureTypes[i] != null) {
+                //模型
+                switch (FeatureType.parse(featureTypes[i])) {
+                    case SYMPTOM:
+                        if (reverse) {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_SYMPTOM;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_SYMPTOM;
+                        }
+                        break;
+                    case DIAG:
+                        if (reverse) {
+                            classifies[i] = null;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG;
+                        }
+                        break;
+                    case VITAL:
+                        if (reverse) {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_VITAL;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_VITAL;
+                        }
+                        break;
+                    case LIS:
+                        if (reverse) {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_LIS;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_LIS;
+                        }
+                        break;
+                    case PACS:
+                        if (reverse) {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_PACS;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_PACS;
+                        }
+                        break;
+                    case TREAT:
+                        if (reverse) {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_TREAT;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_TREAT;
+                        }
+                        break;
+                    case HISTORY:
+                        if (reverse) {
+                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_HISTORY;
+                        } else {
+                            classifies[i] = AlgorithmClassify.NEURAL_HISTORY;
+                        }
+                        break;
+                }
+            }
+        }
+        return classifies;
+    }
+}

+ 1 - 1
bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataSearchData.java

@@ -1,7 +1,7 @@
 package org.diagbot.bigdata.work;
 
 import org.algorithm.util.AlgorithmClassify;
-import org.diagbot.common.work.SearchData;
+import org.diagbot.common.push.bean.SearchData;
 
 public class BigDataSearchData extends SearchData {
     //模型

+ 0 - 584
bigdata-web/src/main/java/org/diagbot/bigdata/work/ParamsDataProxy.java

@@ -1,584 +0,0 @@
-package org.diagbot.bigdata.work;
-
-import org.algorithm.util.AlgorithmClassify;
-import org.apache.commons.lang3.StringUtils;
-import org.diagbot.bigdata.common.ApplicationCacheUtil;
-import org.diagbot.bigdata.util.BigDataConstants;
-import org.diagbot.common.work.SearchData;
-import org.diagbot.nlp.feature.FeatureAnalyze;
-import org.diagbot.nlp.feature.FeatureType;
-import org.diagbot.nlp.participle.ParticipleUtil;
-import org.diagbot.nlp.participle.word.Lexeme;
-import org.diagbot.nlp.participle.word.LexemePath;
-import org.diagbot.nlp.util.Constants;
-import org.diagbot.nlp.util.NegativeEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-import java.util.regex.Pattern;
-
-/**
- * @ClassName org.diagbot.bigdata.work.ParamsDataProxy
- * @Description TODO
- * @Author fyeman
- * @Date 2019/1/16/016 14:04
- * @Version 1.0
- **/
-public class ParamsDataProxy {
-    Logger logger = LoggerFactory.getLogger(ParamsDataProxy.class);
-
-    public void createSearchData(HttpServletRequest request, SearchData searchData) throws Exception {
-        //消除空格
-        if (searchData.getSymptom() != null) {
-            searchData.setSymptom(searchData.getSymptom().trim());
-        }
-        if (searchData.getDiag() != null) {
-            searchData.setDiag(searchData.getDiag().trim());
-        }
-        //计算年龄区间
-        if (searchData.getAge() > 0) {
-            searchData.setAge_start(searchData.getAge() - 5);
-            searchData.setAge_end(searchData.getAge() + 5);
-        }
-        //修改性别代码
-        if (!StringUtils.isEmpty(searchData.getSex())) {
-            if ("M".equals(searchData.getSex())) {
-                searchData.setSex("1");
-            } else if ("F".equals(searchData.getSex())) {
-                searchData.setSex("2");
-            } else {
-                searchData.setSex("3");
-            }
-        } else {
-            searchData.setSex("3");
-        }
-        //默认查询门诊数据
-        if (StringUtils.isEmpty(searchData.getResourceType())) {
-            searchData.setResourceType(BigDataConstants.resource_type_o);
-        }
-        //给症状末尾添加诊断依据标准词
-        if (searchData.getSymptom() != null) {
-            LexemePath<Lexeme> featureData = ParticipleUtil.participle(searchData.getSymptom());
-            if (featureData != null) {
-                addStandWord(featureData, ApplicationCacheUtil.getKl_result_mapping_standword_map(), searchData);
-            }
-        }
-        //所有信息参与推送
-        //        searchData.setSymptom(searchData.getSymptom() + searchData.getVital()
-        //                + searchData.getLis() + searchData.getPacs() + searchData.getPast() + searchData.getOther() + searchData.getIndications());
-        if (StringUtils.isNotEmpty(searchData.getSymptom())) {
-            searchData.setSymptom(searchData.getSymptom().trim());
-        }
-        //一次推送多个类别信息
-        String[] featureTypes = searchData.getFeatureType().split(",");
-        //featureType统一转换
-        String[] convertFeatureTypes = new String[featureTypes.length];
-        for (int i = 0; i < featureTypes.length; i++) {
-            convertFeatureTypes[i] = convertFeatureType(searchData.getSysCode(), featureTypes[i]);
-        }
-        searchData.setFeatureType(StringUtils.join(convertFeatureTypes, ","));
-        searchData.setFeatureTypes(convertFeatureTypes);
-
-        //获取入参中的特征信息
-        FeatureAnalyze fa = new FeatureAnalyze();
-        List<Map<String, Object>> featuresList = new ArrayList<>();
-        if (!StringUtils.isEmpty(searchData.getSymptom())) {
-            //提取现病史
-            featuresList = fa.start(searchData.getSymptom(), FeatureType.FEATURE);
-            paramFeatureInit(searchData, featuresList);
-            //提取时间信息
-            featuresList = fa.start(searchData.getSymptom(), FeatureType.TIME);
-            paramFeatureInit(searchData, featuresList);
-        }
-        if (!StringUtils.isEmpty(searchData.getVital())) {
-            //提取体征
-            featuresList = fa.start(searchData.getVital(), FeatureType.FEATURE);
-            paramFeatureInit(searchData, featuresList);
-        }
-        if (!StringUtils.isEmpty(searchData.getPast())) {
-            //提取既往史
-            featuresList = fa.start(searchData.getPast(), FeatureType.FEATURE);
-            paramFeatureInit(searchData, featuresList);
-        }
-        if (!StringUtils.isEmpty(searchData.getOther()) || !StringUtils.isEmpty(searchData.getIndications())) {
-            //提取其他史等
-            featuresList = fa.start(searchData.getOther() == null ? "" : searchData.getOther() + searchData.getIndications() == null ? "" : searchData.getIndications(), FeatureType.FEATURE);
-            paramFeatureInit(searchData, featuresList);
-        }
-        if (!StringUtils.isEmpty(searchData.getPacs())) {
-            featuresList = fa.start(searchData.getPacs(), FeatureType.PACS);
-            paramFeatureInit(searchData, featuresList);
-        }
-        if (!StringUtils.isEmpty(searchData.getLis())) {
-            featuresList = fa.start(searchData.getLis(), FeatureType.LIS);
-            paramFeatureInit(searchData, featuresList);
-        }
-        // 清洗特征词,去除词性不匹配的词
-        searchData = cleanFeature(featuresList, fa, searchData);
-        if (!StringUtils.isEmpty(searchData.getOther())) {
-            //如果既往史中诊断信息,需要提取这个特征
-            featuresList = fa.start(searchData.getOther(), FeatureType.DIAG);
-            paramFeatureInit(searchData, featuresList);
-        }
-
-        if (!StringUtils.isEmpty(searchData.getDiag()) && StringUtils.isEmpty(searchData.getSymptom())) {
-            featuresList = fa.start(searchData.getDiag(), FeatureType.DIAG);
-            paramFeatureInit(searchData, featuresList);
-        }
-    }
-
-    /**
-     * featureType转算法模型类型
-     *
-     * @param sysCode
-     * @param featureTypes
-     * @param searchData
-     */
-    public AlgorithmClassify[] createAlgorithmClassify(String sysCode, String[] featureTypes, SearchData searchData) {
-        AlgorithmClassify[] classifies = new AlgorithmClassify[featureTypes.length];
-        //下了诊断且其他信息全为空 反推标识
-        boolean reverse = !StringUtils.isEmpty(searchData.getDiag()) && StringUtils.isEmpty(searchData.getSymptom());
-        for (int i = 0; i < featureTypes.length; i++) {
-            //            featureTypes[i] = convertFeatureType(sysCode, featureTypes[i]);
-            if (featureTypes[i] != null) {
-                //模型
-                switch (FeatureType.parse(featureTypes[i])) {
-                    case SYMPTOM:
-                        if (reverse) {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_SYMPTOM;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_SYMPTOM;
-                        }
-                        break;
-                    case DIAG:
-                        if (reverse) {
-                            classifies[i] = null;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG;
-                        }
-                        break;
-                    case VITAL:
-                        if (reverse) {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_VITAL;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_VITAL;
-                        }
-                        break;
-                    case LIS:
-                        if (reverse) {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_LIS;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_LIS;
-                        }
-                        break;
-                    case PACS:
-                        if (reverse) {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_PACS;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_PACS;
-                        }
-                        break;
-                    case TREAT:
-                        if (reverse) {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_TREAT;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_TREAT;
-                        }
-                        break;
-                    case HISTORY:
-                        if (reverse) {
-                            classifies[i] = AlgorithmClassify.NEURAL_DIAG_HISTORY;
-                        } else {
-                            classifies[i] = AlgorithmClassify.NEURAL_HISTORY;
-                        }
-                        break;
-                }
-            }
-        }
-        return classifies;
-    }
-
-    /**
-     * 外部系统featureType需要转化为大数据定义的featureType
-     *
-     * @param sysCode
-     * @param featureType
-     * @return
-     */
-    private String convertFeatureType(String sysCode, String featureType) {
-        if (StringUtils.isEmpty(sysCode) || sysCode.equals("1")) {
-            if ("1".equals(featureType)) {
-                return BigDataConstants.feature_type_symptom;
-            }
-            if ("7".equals(featureType)) {
-                return BigDataConstants.feature_type_diag;
-            }
-            if ("4".equals(featureType)) {
-                return BigDataConstants.feature_type_vital;
-            }
-            if ("5".equals(featureType)) {
-                return BigDataConstants.feature_type_lis;
-            }
-            if ("6".equals(featureType)) {
-                return BigDataConstants.feature_type_pacs;
-            }
-            if ("3".equals(featureType)) {
-                return BigDataConstants.feature_type_history;
-            }
-            if ("8".equals(featureType)) {
-                return BigDataConstants.feature_type_treat;
-            }
-            if ("22".equals(featureType)) {
-                return BigDataConstants.feature_type_labelpush;
-            }
-            if ("11".equals(featureType)) {
-                return BigDataConstants.feature_type_manju;
-            }
-            if ("42".equals(featureType)) {
-                return BigDataConstants.feature_type_vital_index;
-            }
-            return null;
-        }
-        return featureType;
-    }
-
-    /**
-     * 推送模型入参
-     *
-     * @param searchData
-     * @throws Exception
-     */
-    private void paramFeatureInit(SearchData searchData, List<Map<String, Object>> featuresList) throws Exception {
-        if (featuresList != null && featuresList.size() > 0) {
-            Map<String, Object> featureMap = null;
-            for (int i = 0; i < featuresList.size(); i++) {
-                featureMap = featuresList.get(i);
-                Map<String, String> map = new HashMap<>();
-                for (Map.Entry<String, Object> entry : featureMap.entrySet()) {
-                    map.put(entry.getKey(), String.valueOf(entry.getValue()));
-                }
-                map.put("featureType", String.valueOf(featureMap.get("feature_type")));
-                map.put("featureName", String.valueOf(featureMap.get("feature_name")));
-                map.put("property", String.valueOf(featureMap.get("property")));
-                map.put("concept", String.valueOf(featureMap.get("concept")));
-                if (Constants.default_negative.equals(featureMap.get("negative"))) {
-                    if (map.get("featureType").equals(Constants.feature_type_time)) {
-                        searchData.getInputs().put("时间", map);
-                    } else {
-                        if (searchData.getInputs().get(map.get("feature_name")) == null) {
-                            if (i < 5) {
-                                searchData.getInputs().put(map.get("feature_name"), map);
-                            }
-                            searchData.getGraphInputs().put(map.get("feature_name"), map);
-                        }
-                    }
-                } else {
-                    searchData.getFilters().put(map.get("feature_name"), map);
-                }
-            }
-        }
-    }
-
-    /**
-     * 给SearchData中症状末尾添加诊断依据标准词
-     *
-     * @param lexemes
-     * @param standWords
-     * @param sData
-     * @return
-     */
-    public SearchData addStandWord(List<Lexeme> lexemes, Map<String, List<Map<String, String>>> standWords, SearchData sData) {
-        List<Lexeme> feature = new ArrayList<>();
-        //收集分词结果中体征指标或体征指标值(数字)
-        for (Lexeme lexeme : lexemes) {
-            if (lexeme.getProperty().contains(",")) {
-                ApplicationCacheUtil.setProterty(lexeme); //如果分词后词性有多个,只选一个(暂时只处理症状,体征)
-            }
-            NegativeEnum lexemeNegativeEnum = NegativeEnum.parseOfValue(lexeme.getProperty());
-            if (lexemeNegativeEnum == NegativeEnum.VITAL_INDEX || lexemeNegativeEnum == NegativeEnum.SYMPTOM || lexemeNegativeEnum == NegativeEnum.DIGITS
-                    || lexemeNegativeEnum == NegativeEnum.EVENT_TIME || lexemeNegativeEnum == NegativeEnum.UNIT
-                    ) {
-                feature.add(lexeme);
-            }
-        }
-        //根据收集到的分词结果把体征指标和对应体征指标值(数字)拼接
-        List<String> featureType = new ArrayList<>();
-        for (int i = 0; i < feature.size(); i++) {
-            boolean featureTypeState = true;
-            if (i < feature.size() - 2) {
-                if ((NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
-                        && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                        && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.UNIT)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.EVENT_TIME)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.SYMPTOM
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.UNIT)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.SYMPTOM
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.EVENT_TIME)) {
-                    featureType.add(feature.get(i).getText() + "\t" + feature.get(i + 1).getText() + "\t"
-                            + feature.get(i + 2).getText());
-                    featureTypeState = false;
-                }
-            }
-            if (featureTypeState && i < feature.size() - 1) {
-                if ((NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
-                        && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.SYMPTOM
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS)) {
-                    featureType.add(feature.get(i).getText() + "\t" + feature.get(i + 1).getText());
-                }
-            }
-        }
-        //将标准词中体征指标值(数字)与分词结果中体征指标值(数字)比较
-        String newStandWord = "";
-        for (String f : featureType) {
-            String[] features = f.split("\t");
-            if (standWords.containsKey(features[0])) {
-                List<Map<String, String>> standWordList = standWords.get(features[0]);
-                for (Map<String, String> standWordMap : standWordList) {
-                    if (standWordMap.containsKey("unit") && standWordMap.containsKey("value")) {
-                        if (features.length == 2) {
-                            newStandWord = judgment(features, standWordMap, newStandWord, sData);
-                        } else {
-                            if (standWordMap.get("unit").equals(features[2].toLowerCase())) {
-                                newStandWord = judgment(features, standWordMap, newStandWord, sData);
-                            }
-                        }
-                    } else if (standWordMap.containsKey("value")) {
-                        if (features.length == 2) {
-                            newStandWord = judgment(features, standWordMap, newStandWord, sData);
-                        }
-                    }
-                }
-            }
-        }
-        //血压既满足血压≥140/90mmHg,又满足血压小于90/60mmHg时,只取前者
-        String addStandWords = "";
-        String smallerStandWord = "";
-        boolean flag = true;
-        for (String standWord : newStandWord.split(",")) {
-            if (!"".equals(standWord) || standWord.length() > 0) {
-                if (standWord.contains("<") || standWord.contains("<=") || standWord.contains("小于")) {
-                    smallerStandWord += "," + standWord;
-                } else {
-                    addStandWords += "," + proxy(standWord);
-                    flag = false;
-                }
-            }
-        }
-        if (flag) {
-            addStandWords += smallerStandWord;
-        }
-        sData.setSymptom(sData.getSymptom() + "," + addStandWords);
-        System.out.println(sData.getSymptom());
-        return sData;
-    }
-
-    /**
-     * 将标准词中体征指标值(数字)与分词结果中体征指标值(数字)比较
-     * 除了血压>140/90mmHg类似标准词,其他标准词直接添加在症状后面
-     *
-     * @param features
-     * @param standWordMap
-     * @param standWord
-     * @param sData
-     * @return 血压>140/90mmHg或血压小于90/60mmHg或同时返回,在addStandWord()中进一步处理
-     */
-    private String judgment(String[] features, Map<String, String> standWordMap, String standWord, SearchData sData) {
-        if (hasDigit(features[1])) {
-            try {
-                if (">".equals(standWordMap.get("op"))) {
-                    //单独处理  血压>140/90mmHg   类似情况
-                    if (features[1].contains("/")) {
-                        if (standWordMap.get("value").contains("/")) {
-                            String[] feature = features[1].split("/");
-                            Integer featuresSBP = Integer.valueOf(feature[0]); //分词特征收缩压
-                            Integer featuresDBP = Integer.valueOf(feature[1]); //分词特征舒张压
-
-                            String[] values = standWordMap.get("value").split("/");
-                            Integer standWordSBP = Integer.valueOf(values[0]); //标准词收缩压
-                            Integer standWordDBP = Integer.valueOf(values[1]); //标准词舒张压
-                            if (featuresSBP > standWordSBP || featuresDBP > standWordDBP) {
-                                standWord += "," + standWordMap.get("standword");
-                            }
-                        }
-                    } else {
-                        String num = getNum(standWordMap.get("value"));
-                        if (Double.valueOf(getNum(features[1])) > Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + proxy(standWordMap.get("standword")));
-                        }
-                    }
-                } else if ("<".equals(standWordMap.get("op"))) {
-                    //单独处理  血压小于90/60mmHg   类似情况
-                    if (standWordMap.get("value").contains("/")) {
-                        if (features[1].contains("/")) {
-                            String[] feature = features[1].split("/");
-                            Integer featuresSBP = Integer.valueOf(feature[0]); //分词特征收缩压
-                            Integer featuresDBP = Integer.valueOf(feature[1]); //分词特征舒张压
-
-                            String[] values = standWordMap.get("value").split("/");
-                            Integer standWordSBP = Integer.valueOf(values[0]); //标准词收缩压
-                            Integer standWordDBP = Integer.valueOf(values[1]); //标准词舒张压
-                            if (featuresSBP < standWordSBP || featuresDBP < standWordDBP) {
-                                standWord += "," + standWordMap.get("standword");
-                            }
-                        }
-                    } else {
-                        String num = getNum(standWordMap.get("value"));
-                        if (Double.valueOf(getNum(features[1])) < Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
-                        }
-                    }
-                } else if (">=".equals(standWordMap.get("op"))) {
-                    //单独处理  血压大于等于140/90mmHg   类似情况
-                    if (standWordMap.get("value").contains("/")) {
-                        if (features[1].contains("/")) {
-                            String[] feature = features[1].split("/");
-                            Integer featuresSBP = Integer.valueOf(feature[0]); //分词特征收缩压
-                            Integer featuresDBP = Integer.valueOf(feature[1]); //分词特征舒张压
-
-                            String[] values = standWordMap.get("value").split("/");
-                            Integer standWordSBP = Integer.valueOf(values[0]); //标准词收缩压
-                            Integer standWordDBP = Integer.valueOf(values[1]); //标准词舒张压
-                            if (featuresSBP >= standWordSBP || featuresDBP >= standWordDBP) {
-                                standWord += "," + standWordMap.get("standword");
-                            }
-                        }
-                    } else {
-                        String num = getNum(standWordMap.get("value"));
-                        if (Double.valueOf(getNum(features[1])) >= Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + proxy(standWordMap.get("standword")));
-                        }
-                    }
-                } else if ("<=".equals(standWordMap.get("op"))) {
-                    //单独处理  血压小于等于90/60mmHg   类似情况
-                    if (standWordMap.get("value").contains("/")) {
-                        if (features[1].contains("/")) {
-                            String[] feature = features[1].split("/");
-                            Integer featuresSBP = Integer.valueOf(feature[0]); //分词特征收缩压
-                            Integer featuresDBP = Integer.valueOf(feature[1]); //分词特征舒张压
-
-                            String[] values = standWordMap.get("value").split("/");
-                            Integer standWordSBP = Integer.valueOf(values[0]); //标准词收缩压
-                            Integer standWordDBP = Integer.valueOf(values[1]); //标准词舒张压
-                            if (featuresSBP <= standWordSBP || featuresDBP <= standWordDBP) {
-                                standWord += "," + standWordMap.get("standword");
-                            }
-                        }
-                    } else {
-                        String num = getNum(standWordMap.get("value"));
-                        if (Double.valueOf(getNum(features[1])) <= Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-        return standWord;
-    }
-
-    /**
-     * 判断分词后的特征中是否含有数字
-     *
-     * @param content
-     * @return
-     */
-    private boolean hasDigit(String content) {
-        boolean flag = false;
-        if (Pattern.compile(".*\\d+.*").matcher(content).matches()) {
-            flag = true;
-        }
-        return flag;
-    }
-
-    /**
-     * 将字符串中的数字提取出来,针对分词结果中"90."类似情况
-     *
-     * @param standWord
-     * @return
-     */
-    private String getNum(String standWord) {
-        StringBuffer sb = new StringBuffer();
-        for (String num : standWord.replaceAll("[^0-9]", ",").split(",")) {
-            if (num.length() > 0) {
-                sb.append(num);
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * 将血压超过标准值的标准词改为血压升高
-     *
-     * @param standWord
-     * @return
-     */
-    private String proxy(String standWord) {
-        if (standWord.contains("压") && (standWord.contains("≥") || standWord.contains("大于"))) {
-            standWord = "血压升高";
-        } else if (standWord.contains("心率") && (standWord.contains("大于") || standWord.contains("超过"))) {
-            standWord = "心率快";
-        }
-        return standWord;
-    }
-
-    private SearchData cleanFeature(List<Map<String, Object>> featuresList, FeatureAnalyze fa,
-                                    SearchData searchData) {
-        // 在输入的辅检文本中,只提取辅检信息
-        String[] PACS_Feature = { Constants.word_property_PACS,
-                Constants.word_property_PACS_Detail, Constants.word_property_PACS_Result };
-        searchData = removeFeature(searchData.getLis(), fa, searchData, PACS_Feature, FeatureType.PACS);
-
-        // 在输入的化验文本中,只提取化验信息
-        String[] LIS_Feature = { Constants.word_property_LIS,
-                Constants.word_property_LIS_Detail, Constants.word_property_LIS_Result };
-        searchData = removeFeature(searchData.getPacs(), fa, searchData, LIS_Feature, FeatureType.LIS);
-
-        return searchData;
-    }
-
-    private SearchData removeFeature(String text, FeatureAnalyze fa,
-                                     SearchData searchData, String[] properties, FeatureType featureType) {
-        String name = "";
-        Boolean related = false;
-
-        try {
-            List<Map<String, Object>> featureList = fa.start(text, featureType);
-            if (featureList != null) {
-                for (Map<String, Object> item : featureList) {
-                    name = item.get("feature_name").toString();
-                    String[] property = item.get("property").toString().split(",");
-                    for (String prop : property) {
-                        if (Arrays.asList(properties).contains(prop)) {
-                            //                            related = true;
-                            searchData.getInputs().remove(name);
-                            break;
-                        }
-                    }
-
-                    //                    if (!related) {
-                    //                        searchData.getInputs().remove(name);
-                    //                    }
-                    //9
-                    //                    related = false;
-                }
-            }
-
-        } catch (Exception ex) {
-            ex.printStackTrace();
-        } finally {
-            return searchData;
-        }
-    }
-}

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

@@ -1,10 +1,9 @@
 package org.diagbot.bigdata.work;
 
 import org.apache.commons.lang3.StringUtils;
-import org.diagbot.bigdata.common.ApplicationCacheUtil;
-import org.diagbot.bigdata.dao.model.ResultMappingFilter;
-import org.diagbot.bigdata.util.BigDataConstants;
-import org.diagbot.common.work.FeatureRate;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.ResultMappingFilter;
+import org.diagbot.common.push.cache.ApplicationCacheUtil;
 import org.diagbot.nlp.feature.FeatureType;
 import org.diagbot.nlp.util.Constants;
 import org.diagbot.nlp.util.NegativeEnum;
@@ -12,10 +11,7 @@ import org.diagbot.nlp.util.NlpCache;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @ClassName org.diagbot.bigdata.work.ResultDataProxy
@@ -25,17 +21,19 @@ import java.util.Map;
  * @Version 1.0
  **/
 public class ResultDataProxy {
+    protected static String[] vital_filter_data = Constants.vital_filter_data;
+
     public List<FeatureRate> proxy(HttpServletRequest request, BigDataSearchData searchData, List<Map.Entry<String, Float>> featuresOrderList, String featureType) {
         int cursor = 1;
         DecimalFormat df = new DecimalFormat("0.####");
         List<FeatureRate> featureList = new ArrayList<>(10);
 
-        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();
+        Map<String, Map<String, String>> synonymMap = ApplicationCacheUtil.getStandard_info_synonym_map();
         for (Map.Entry<String, Float> entry : featuresOrderList) {
             //过滤特征数据, 过滤低于阈值的数据
-            if (!resultFilter(request, searchData, featureType, entry.getKey(), entry.getValue())) {
+            if (!resultFilter(request, searchData, featureType, entry.getKey(), entry.getValue(), synonymMap)) {
                 continue;
             }
             //性别年龄过滤
@@ -58,15 +56,7 @@ public class ResultDataProxy {
             }
             FeatureRate featureRate = new FeatureRate();
             featureRate.setRate(df.format(entry.getValue()));
-            if (FeatureType.parse(featureType) == FeatureType.VITAL) {
-                if (StringUtils.isEmpty(resultMappingVitalMap.get(entry.getKey()))) {
-                    continue;
-                } else {
-                    featureRate.setFeatureName(resultMappingVitalMap.get(entry.getKey()));
-                }
-            } else {
-                featureRate.setFeatureName(entry.getKey());
-            }
+            featureRate.setFeatureName(entry.getKey());
 
             if (FeatureType.parse(featureType) == FeatureType.DIAG) {
                 featureRate.setFeatureName(entry.getKey());
@@ -75,33 +65,30 @@ public class ResultDataProxy {
                 }
             }
             featureList.add(featureRate);
-//            if (!featureType.equals(Constants.feature_type_diag)) {
                 if (cursor < searchData.getLength()) {
                     cursor++;
                 } else {
                     break;
                 }
-//            } else {            //诊断最多返回5个
-//                if (cursor < 5) {
-//                    cursor++;
-//                } else {
-//                    break;
-//                }
-//            }
         }
 
         return featureList;
     }
 
-    public boolean resultFilter(HttpServletRequest request, BigDataSearchData searchData, String featureType, String result, float threshold) {
+    public boolean resultFilter(HttpServletRequest request, BigDataSearchData searchData, String featureType, String result, float threshold, Map<String, Map<String, String>> synonymMap) {
         //过滤录入条件中已有的特征信息
         if (searchData.getGraphInputs().get(result) != null && FeatureType.parse(featureType) != FeatureType.DIAG) {
             return false;
         }
-        //
-//        if (searchData.getFilters().get(result) != null) {
-//            return false;
-//        }
+        if (FeatureType.parse(featureType) == FeatureType.SYMPTOM) {
+            if (searchData.getGraphInputs().get(synonymMap.get(Constants.word_property_symptom).get(result))!= null) {
+                return false;
+            }
+        }
+        int searched_position = Arrays.binarySearch(vital_filter_data, result);
+        if (searched_position > -1) {
+            return false;
+        }
         return true;
     }
 
@@ -141,9 +128,6 @@ public class ResultDataProxy {
         for (Map.Entry<String, Float> entry : map.entrySet()) {
             synonym = convertMap.get(entry.getKey());
             if (synonym != null) {
-                if (isFilter && synonym.equals("阴道出血")) {
-                    System.out.println(entry.getKey() + "-->" + entry.getValue());
-                }
                 if (result.get(synonym) == null) {
                     result.put(synonym, entry.getValue());
                 } else {
@@ -155,88 +139,4 @@ public class ResultDataProxy {
         }
         return result;
     }
-
-    /**
-     * 大小类数据合并
-     *
-     * @param request
-     * @param map
-     */
-    public Map<String, Float> resultMerge(HttpServletRequest request, Map<String, Float> map) {
-        Map<String, NlpCache.Node> nodesMap = NlpCache.getStandard_info_type_tree_map();
-        Map<String, Float> resultMap = new HashMap<>();
-        //设定阀值
-        float threshold = 0.001f;
-        Map<String, Float> thresholdMap = new HashMap<>();
-        for (Map.Entry<String, Float> entry : map.entrySet()) {
-            if (!"null".equals(entry.getKey()) && entry.getValue() >= threshold) {
-                thresholdMap.put(entry.getKey(), entry.getValue());
-            }
-        }
-
-        NlpCache.Node node = null;
-        List<String> delList = new ArrayList<>();
-        for (Map.Entry<String, Float> entry : thresholdMap.entrySet()) {
-            if (delList.contains(entry.getKey())) continue;
-
-            node = nodesMap.get(entry.getKey());
-            if (node != null) {
-                String topName = node.getName();
-                NlpCache.Node p = node.getParent();
-                if (p != null && nodesMap.get(p.getName()) != null) {
-                    topName = p.getName();
-                }
-                while (p != null) {
-                    List<String> nodeNamesList = new ArrayList<>();
-                    lookChilds(topName, p, thresholdMap, nodeNamesList);
-                    if (nodeNamesList.size() > 0) {
-                        topName = p.getName();
-                    }
-                    p = p.getParent();
-                }
-
-                if (thresholdMap.get(topName) != null) {
-                    resultMap.put(topName, thresholdMap.get(topName));
-                    delList.add(topName);
-                }
-                NlpCache.Node topNode = nodesMap.get(topName);
-                lookChildsAndCal(resultMap, thresholdMap, topNode, delList, topNode.getName());
-                delList.add(topName);
-            } else {
-                resultMap.put(entry.getKey(), entry.getValue());
-            }
-        }
-        return resultMap;
-    }
-
-    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 {
-                if (thresholdMap.get(n.getName()) != null) {
-                    nodeNamesList.add(n.getName());
-                }
-                if (n.getChilds().size() > 0) {
-                    lookChilds("", n, thresholdMap, nodeNamesList);
-                }
-            }
-        }
-    }
-
-    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()));
-                } else {
-                    resultMap.put(topName, resultMap.get(topName) + thresholdMap.get(n.getName()));
-                }
-                delList.add(n.getName());
-            }
-            if (n.getChilds().size() > 0) {
-                lookChildsAndCal(resultMap, thresholdMap, n, delList, topName);
-            }
-        }
-    }
 }

+ 1 - 1
bigdata-web/src/main/resources/application.yml

@@ -12,7 +12,7 @@ spring:
       charset: UTF-8
       enabled: true
   datasource:       # mybatis 配置,使用druid数据源
-    url: jdbc:mysql://192.168.2.235:3306/bigdata-web?useUnicode=true&characterEncoding=UTF-8
+    url: jdbc:mysql://1.1.1.1:3306/bigdata-web?useUnicode=true&characterEncoding=UTF-8
     username: root
     password: diagbot@20180822
     type: com.alibaba.druid.pool.DruidDataSource

+ 0 - 899
bigdata-web/src/main/resources/doc_result_mapping_diag.dict

@@ -1,899 +0,0 @@
-iWoXV4ISKfEEe8p5BEeGMXcP2fi9nVPgIVOt7Mod6Ptttw/uxcjHEZNGAwm1dTlh
-13BZUxQKtR8khcL82U/gR6xTxv6q3ER1T31+8tdUysA=
-13BZUxQKtR8Ee8p5BEeGMbPfb65AhyohrCW1qrlOrIXnCFVQR0+OhAr8ipqZuWdE
-13BZUxQKtR8Ee8p5BEeGMSgN76O6SVyHRQ5SX/rmfCbnCFVQR0+OhAr8ipqZuWdE
-13BZUxQKtR8Ee8p5BEeGMTGSeaWwHrO28DsYuNRP2xrzo/C7RYPhiQ==
-13BZUxQKtR8Ee8p5BEeGMfy0mrZa9NlMB+04xUYH/mDnCFVQR0+OhAr8ipqZuWdE
-13BZUxQKtR8Ee8p5BEeGMVDAaNQ6vkAnhf6kv3fA54PnCFVQR0+OhAr8ipqZuWdE
-13BZUxQKtR9x+KllafTRWVzBEC3KTBfP57Coq4ynowFKYBGd+lGX+w==
-UBb+CN3DpdXV4GVpSzaFCvOj8LtFg+GJ
-RwfaZMa+tcJkNVRINR3RaHpmvKAVeqCzRPB+qQ9rdKU=
-aExuyB28XAR0Cy32pByLQhO3DcTvO3TKaXBl6wZu5y0=
-Rq6VzCfzICn9+r0EMibpOfOj8LtFg+GJ
-tjTBHQOg4JZWgHE3Y5h4coemfMvU1eABfER6RG1klik=
-LPekO1Vw5kgU8eAB+2lgKlX9mMU2d4g0sKnW7jmERCH1rLaDeGOQwfOj8LtFg+GJ
-LPekO1Vw5khtd8WtUYdrl/znlgPCB6PWstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-iB2sYRaVfwL9+r0EMibpOfOj8LtFg+GJ
-XQT3SHWafIA+AOWtZC88XC+F4lgKG0ZK9Z7CDt8UKI/v3eyoY7qwoXAul+X1XFtHy4x6AQXguls=
-GG71AOESABIJbTP+AlIFufOj8LtFg+GJ
-GOs/j0/PHelIkRc7oSI9szKnOEpdVQkO9RrMjQw02M5PfX7y11TKwA==
-GOs/j0/PHelIkRc7oSI9szlHsXZwP1nWl2UMsW6I5bP1rLaDeGOQwfOj8LtFg+GJ
-GOs/j0/PHelIkRc7oSI9s97P1cGs5sNK6P3MMb1JPeD1rLaDeGOQwfOj8LtFg+GJ
-GOs/j0/PHelIkRc7oSI9s94er8ZM74QIQtrkkMzshHxxqUIOvKQ/dwLm/EKxWl15
-cDwUoESXFL5MSclGunBL8q4kLpO4b0WCN5m+Gay4mDc=
-XTjWGwZLoH1auJLtJZplqtSXQVOsJCee52mHitj3oNVPfX7y11TKwA==
-is24Ye5iddmK0fcjJ8eyd1F5djzFc1mvfywvCjeRl/T0fQTyIpclWA==
-KbKku7ucQ39uoije31Jd6MgDR9Ol2aU1fER6RG1klik=
-XeNsCvsSABj/1Gi6u346QEpgEZ36UZf7
-u9VShjNiQLaEh57YJ81oCvOj8LtFg+GJ
-8eEwHEIyR3CEqKNFUcAAUEpgEZ36UZf7
-oRqu1B35G5r4prflBcOI/gfkmii5BuyZu7hkhPiE07E=
-oRqu1B35G5oQ+WWu+Cc9mPRovAvBdywmstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-0jJMm1O24VdIuBTSfWq8fz8zYxNh6qQehkzsWr2fJvRpwcfsxZv+X0iU8imBtrfgy4x6AQXguls=
-NhbO6gkLwqjse810KERveORV0q3Q8qjoy4x6AQXguls=
-NhbO6gkLwqh9giU0ougSyIemfMvU1eABfER6RG1klik=
-IOQii0cLb7Ss+U6SBrCCGp+9Oh29Slfk52mHitj3oNVPfX7y11TKwA==
-enu6avlk5YpYqoBsat2Ybx/ps2807HA2y4x6AQXguls=
-0sR5tvt5nTkiJp0gJWIG2B/ps2807HA2y4x6AQXguls=
-ike6hX0KY4854R3RmIhG3R/ps2807HA2y4x6AQXguls=
-DOXrtCrKcXSzbDHIoU2htR/ps2807HA2y4x6AQXguls=
-DOXrtCrKcXQc6kU7pH5cVR/ps2807HA2y4x6AQXguls=
-MzrnRYF60fg1zeORSYfFpEoPmHAI4936
-yWaySNFE8XgC0uinfuVoYjBrQoRmQwfSteq+RIooEghPfX7y11TKwA==
-MdIN8DMpaEBWgHE3Y5h4cvjGqlRxOSxuKSotK/v0yek=
-Oed05VhE/J8vZEYJ+Qgwo0oPmHAI4936
-95YPV7nX9j+yPJEuX5FlVfOj8LtFg+GJ
-BGL6SBJINCSqv45Aj5fuOh/ps2807HA2y4x6AQXguls=
-ZNQWeAaprLh+Mdl3Bm+eOB/ps2807HA2y4x6AQXguls=
-Ys4HY1VWiNz9qI/NdGuLvvjGqlRxOSxuKSotK/v0yek=
-E4hT7N3ytDu1bH4gSInujULj3Su8S5w3fywvCjeRl/S0FrgmK9pWPA==
-7mHfSs2ahWgivWPiUX9ug78AMGVXssqQKJZKOfgg6nHJOvnYyXNsXpC4iPbph9qG
-ltfmaY06UmH2YvmikroYRkv4Vh0daqQJrFPG/qrcRHVPfX7y11TKwA==
-xbg5pYjlVtXGgDHUkbi1wK7QEgPGBpLdgymuBa+h7SiRwhQGBKdSp/Oj8LtFg+GJ
-Zlo5WYcgZKpNiiBTZZbq1WJoTAS/DAZEoEfwk8+pyRbnsKirjKejAUpgEZ36UZf7
-vPPRWcr4YTeEfvwh8gqO7i9GjCJsfm4xPCHvXzw0mit1CazNTv2aYfOj8LtFg+GJ
-fHK6mvJmg/7/1Gi6u346QEpgEZ36UZf7
-qptm92sSB/VYvUmCs9IY3d7SGlS0JFuG
-qtlkwnn27ACw8mEQdSz4E/Oj8LtFg+GJ
-Vrbj4RFVsOeGcy6xPYEwTveK6RLf4xMTy4x6AQXguls=
-laj6iFmYc2DeUidRm/poynAul+X1XFtHy4x6AQXguls=
-uQzgoFGJdFjdnbhWjFDvHwT1tZsHfiBBy4x6AQXguls=
-fMSADmyw8MVv8ZabwFNKANsp4Ism9gRNy4x6AQXguls=
-Sg9tt2ZNeu5v8ZabwFNKANsp4Ism9gRNy4x6AQXguls=
-1MVvkAG3zx1v8ZabwFNKANsp4Ism9gRNy4x6AQXguls=
-tFWoa+Fa+E0KvpYijT+IHq4kLpO4b0WCN5m+Gay4mDc=
-HlBPgXjTWrPCE5zi/CJYd0pgEZ36UZf7
-qJyJhtR9wYUzXDr7TYw7uQLm/EKxWl15
-5HgQz9bhZBZ5fyp8g0MqBZBwNuVVH6sq
-W+uRpV2VRGfOEs8faPFbVJBwNuVVH6sq
-+1VsVSgMX3q9FppGobofTZBwNuVVH6sq
-fd7Rpt8fWBifF7pIg0uQua1TqwiA1pre
-fd7Rpt8fWBhUIm92l3iN1WDAN33wOHW6wQ7cCkCUWxZPfX7y11TKwA==
-ZtiRChQSkznxJj5V9utwy0iU8imBtrfgy4x6AQXguls=
-1+jfA83l+iKF3SayFI67uACfONS6MbsgaXBl6wZu5y0=
-/VqIfk4vfde3JvJ2Xjm9/UpgEZ36UZf7
-3OUUj3H9vbXrfZHpEMHYgUpgEZ36UZf7
-3OUUj3H9vbXwozCIpR0nf0pgEZ36UZf7
-JWBCcm2oC0hlDmn3A9bDMCZCeN6biUcBg1jh8Ox1rhV6m9y9N5DCvA==
-5whVUEdPjoQERGJhJJb/jB5IdN0yf6TrxJjmGu3AgzrnsKirjKejAUpgEZ36UZf7
-pJZkFr1uMau5/0FNXste6fOj8LtFg+GJ
-jnQH++UTPaibBHhE3G65A5OH5JCq/vF1WhqDUIQPQGM=
-de3O9146cmULVgLDGsMmxnAul+X1XFtHy4x6AQXguls=
-9UQdU1VIB/Ztd8WtUYdrl/znlgPCB6PWstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-zybTgccYrmvNZmfBQxP52cK0z0/1KIV28K8JgXllPjTLjHoBBeC6Ww==
-kdU8UcCILZA2zqe2dEz9kO/1mwKFPYtV1K7XQRHlBMM=
-x9ZTV7gEMRCi91Qg24vlA75amaIn5rxJIrRdP5MeE9j1rLaDeGOQwfOj8LtFg+GJ
-FQUi8oWeKA22mkhDBQ8Od0ffVX1Kx6/gaXBl6wZu5y0=
-FQUi8oWeKA009nSxFi4IHE7wB8aAVMVRF2Mdrjp/QpU=
-FQUi8oWeKA0t2SdYDpcKM4jI8KpajKVSpg10U7yntVtPfX7y11TKwA==
-FQUi8oWeKA2km2jSURfVd0ffVX1Kx6/gaXBl6wZu5y0=
-FQUi8oWeKA1DOzz3YWNJ69+VJP2lrbmu
-FQUi8oWeKA16K4HqriD8jUffVX1Kx6/gaXBl6wZu5y0=
-FQUi8oWeKA2ZveeDa7x7vQ26QOL8owUaqUTgJrEohqbQx1T34QTwhkpgEZ36UZf7
-PN71jlSk34UCxwQXdsGm4ZQZTiZNO+I5N5m+Gay4mDc=
-2aDJllB28JLJXbPtseCSr61TqwiA1pre
-24AwIW/ZQevhfJ7nO4hl9jqmLc90JllH+QN+W6do9IvLzkZfPTHbZw==
-e8PUaMqGKBjbjtQVzMQGtVO8SBODgX57y4x6AQXguls=
-g6f6B3EKC0mq/hI3Siy1ns1Rj9szbZqu9RrMjQw02M5PfX7y11TKwA==
-cn9SelEe5HtR55atK842DPOj8LtFg+GJ
-kN7D+ZqtUAf40aKLMAZlPfBjDc6YVozA/Moy/+Vge7xPfX7y11TKwA==
-kN7D+ZqtUAcsXyKn8XbgBbbrO1fPMBV70pCfO/z5g6Y=
-kN7D+ZqtUAfgxTPOJka4x+1sIpk3UltPRPB+qQ9rdKU=
-kN7D+ZqtUAdEPzDylc672CH/h1pywZ5c0pCfO/z5g6Y=
-kN7D+ZqtUAe6K5+69vyqZ9/Pdt1H5L9h0pCfO/z5g6Y=
-2uRZ3LWgKU3RH5Nj+q+LtlPq3vaS3WGD
-rt8lOfUgZoK3CTjvFzoCRlQlsPKn/6q1hFq5sh8RQyE=
-rt8lOfUgZoJlQTf2O+iulomK/3Xny8ms9hT2lIaacqU=
-IHXErJfSSFCNuoiIa651tyyfxx3KDwLB
-785EOhh4F5sj7CuznFHzhJBwNuVVH6sq
-I1DBVtavRK2E1PvLgQn/VJBwNuVVH6sq
-liY3+k43l7+Q4FSyzAKv7/wyznKZVl2qYcKCqJ6M1pTMhUL6uE0NXEpgEZ36UZf7
-UrVzAjnIcuBxOkPtc5YzshjdGWQl0x5hy4x6AQXguls=
-cZht5tTkz8OyPJEuX5FlVfOj8LtFg+GJ
-DGdum4rbXqc5TekogOYmZ5BwNuVVH6sq
-kMsfiffRfraGOny5ykosGoUXNaoO/BVxA4H4FjoDGQbLzkZfPTHbZw==
-k63/U+Ort/t1sXunLF29ToZjzlmb0DiP9hT2lIaacqU=
-w0f3DSSJVtT4n7ZrF0P2pJBwNuVVH6sq
-anqc376RwxH2YvmikroYRr8AMGVXssqQKJZKOfgg6nHJOvnYyXNsXpC4iPbph9qG
-anqc376RwxEclteAVjASagjVcYt6XiKfROcxxZkPB1r0fQTyIpclWA==
-anqc376RwxFrnfoP+wEgV+RV0q3Q8qjoy4x6AQXguls=
-anqc376RwxGunL6RPUuCpx1hqIGQ97twstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-anqc376RwxEl2d7cPemZpxAJGqasuIcYJfZSBCKF4gHm9GlJmRbg+OcIVVBHT46ECvyKmpm5Z0Q=
-rsOHmN/4ufkL8rKaud4vfO/1mwKFPYtV1K7XQRHlBMM=
-0z7NEIWwDp3MhUL6uE0NXEpgEZ36UZf7
-6CdJfik1TY5WtttuC4yb65BwNuVVH6sq
-kigrNEhv/MvSNFr9wNKob/Oj8LtFg+GJ
-G4j5jFyDtCkSCQzGhDDQ3yH/h1pywZ5c0pCfO/z5g6Y=
-qna3IZTy69SQLBb9TLgT0vOj8LtFg+GJ
-Qnj2SoYUQEDwOxi41E/bGvOj8LtFg+GJ
-mpaFzePG/5qUfFjfGL0+BmL6uHlLqsog
-u2y2FVfBqZ7HXWLfSvfpsvOj8LtFg+GJ
-md7FgUY16RRpHAHM1WsmQ8/EDJLz2N3ohFq5sh8RQyE=
-WeRGepVqdPi7Pl0reaplqbOsDNsReNLeRPB+qQ9rdKU=
-oVJkClU0Bvh5NR6CtIcYXyJQS0qubhjOCpU7P23QhntPfX7y11TKwA==
-LX1/RTaigThHUNbECAUpcAfkmii5BuyZ+wmNWke18BM=
-Iwq5Ivop+7oJTP+5mC6pPL13FBy0uL+iRPB+qQ9rdKU=
-f/NLwF/5qBnwshyLxCfprPOj8LtFg+GJ
-XEK48ftZVQvwshyLxCfprPOj8LtFg+GJ
-xm0YhMMvUrTv6eQ9seoGjEUzv8FEiuOYROcxxZkPB1r0fQTyIpclWA==
-KA3vo7pJXIdFDlJf+uZ8JnpmvKAVeqCzRPB+qQ9rdKU=
-BIsR7PAOZaBXpjffLvuUW0wWBzUGIE3Fy4x6AQXguls=
-l0FzfX6DT5kc2AsKYh9Av0wWBzUGIE3Fy4x6AQXguls=
-OgGc28R9XYqrdXvWFsyZiN7SGlS0JFuG
-LxBJSTkhXn+dGLiDN2Hnj97SGlS0JFuG
-zp7DEq21BTwlFymD5/1N/rBzljBEfN2xy4x6AQXguls=
-tlK7bfXVIBXcuzi3+wsImh/ps2807HA2y4x6AQXguls=
-UhUtlWoQP1DCE5zi/CJYd0pgEZ36UZf7
-SaUpgNmsHasnHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
-0FmNHjoeZ7YD+iwJRdWW+/Oj8LtFg+GJ
-KBLbMm9Rg00q123TAhgbee/1mwKFPYtV1K7XQRHlBMM=
-nC3Olv+9F3VfoGFpKmLQzCBZw/ZMqkrAepvcvTeQwrw=
-ZnpTQ/05IxPiTIsP7LhxYtHEM4o6ZCR6y4x6AQXguls=
-BWf2VPSq/CBX70UMh3l1zfOj8LtFg+GJ
-rHGVkOky9lRkNVRINR3RaFPq3vaS3WGD
-wkneReaVJMEUYWv2tTiLuBL2525Y8Jlzy4x6AQXguls=
-vecfpO5xbBycNLWbhMusxFQlsPKn/6q1hFq5sh8RQyE=
-9pI83TCsPVXWUpDt6Xr+nkpgEZ36UZf7
-9ATztfXQ4YI5ywm7JAmEzt7SGlS0JFuG
-1gUH5d9S+SQP+0LchfW6bt7SGlS0JFuG
-Sa+uZygGJsFTEX0WzzhmTd7SGlS0JFuG
-0xF9G4KuCCSdGLiDN2Hnj97SGlS0JFuG
-DefAwZ4n13SXuNGxONPgs+RV0q3Q8qjoy4x6AQXguls=
-nAVIQhmgLsUqzclmSTZy7O/1mwKFPYtV1K7XQRHlBMM=
-VQyanJdAJxr8KlV1ph0Yje1sIpk3UltPRPB+qQ9rdKU=
-54MHTIPxFWm5/0FNXste6fOj8LtFg+GJ
-AC5wqOrDg0OEh57YJ81oCvOj8LtFg+GJ
-xEUfjPFZ/xYq17w2ajSKHLBzljBEfN2xy4x6AQXguls=
-qDJCWQ+e+n61f4daHIwZR9HEM4o6ZCR6y4x6AQXguls=
-mAvmI45vfiVtV7mJSxdBKJBwNuVVH6sq
-aMsbvjbfGsUxQ2HeHu18jlufv0N47kkKaAYhz49iPPQ=
-m+hvPY3d9tI9PnHdu7yUaSBZw/ZMqkrAepvcvTeQwrw=
-CDrQ2ea5LGDJOvnYyXNsXpC4iPbph9qG
-GeOoxHykR0NIkRc7oSI9szKnOEpdVQkOwQ7cCkCUWxZPfX7y11TKwA==
-9X6X38YdgQciqg4ZKtRMEaFjfApLwKh/PtbZND328nI=
-sdjtfGRtUulfuLJtpOjzH/Oj8LtFg+GJ
-gywMijxUj6c+OyyB6z9n5POj8LtFg+GJ
-R2eAdMyK6zSU7JD4YB6JqfOj8LtFg+GJ
-gkB282ET6CHZnuNxhT4mNoDCsJ8T2pbfepvcvTeQwrw=
-rmw3y68nbTxtR8wDUlebCerUo2OLEJuOCpU7P23QhntPfX7y11TKwA==
-+bJ/vQZNZX5a94t2FvAzVBjdGWQl0x5hy4x6AQXguls=
-Ijs5NwarmpdGNWh/ueDr//oslnIPxwMNqY/rONiW9dfLzkZfPTHbZw==
-Fa4m96t0Af/TV3ww/e2cDZBwNuVVH6sq
-GLZe/17QCbzt0Lwb79na4yq1UHZ+9sTmCpU7P23QhntPfX7y11TKwA==
-GLZe/17QCbxmXvUvjgbr4kY8THOUtOF7856CtLA2mBI=
-GLZe/17QCbw2Hyl0WmLydTOZLUhfMDr5Z36YRUA/eqPMhUL6uE0NXEpgEZ36UZf7
-zy+BWp25HIY8YGgnfhG/CpBwNuVVH6sq
-YmFbY+KQ4Y7q4CxvGXZpehjdGWQl0x5hy4x6AQXguls=
-YmFbY+KQ4Y62jZ0HIHtNhCKNGmIIhDZD856CtLA2mBI=
-YmFbY+KQ4Y5QHYDAU4bOhUr9oz8W6N26epvcvTeQwrw=
-YmFbY+KQ4Y4dNToG2d9B8wPMYZdUQfnX856CtLA2mBI=
-YmFbY+KQ4Y4dNToG2d9B8/x4wZJZoVmQ8GwBcK2jcmzLzkZfPTHbZw==
-YmFbY+KQ4Y4bHBvW0gRQFxjdGWQl0x5hy4x6AQXguls=
-YmFbY+KQ4Y4JJVgL5g3rBuRV0q3Q8qjoy4x6AQXguls=
-SEf6luKEZaNhu51s4ddTcxak9y4lRig4856CtLA2mBI=
-YdusYOZMMEEHkzvFoiBCspGRrBPOUOsvCd7cH2MFQVPLzkZfPTHbZw==
-WAXiD8YngH/NviT5sRQoM5BwNuVVH6sq
-Qud0EeTCG2GQfWiEdArhspBwNuVVH6sq
-Jl+v2iIQ3PRl6qtXuMmmfRjdGWQl0x5hy4x6AQXguls=
-EpkhMubA/KU2uRhwSJ6d+Y6XI0/uKdr28GwBcK2jcmzLzkZfPTHbZw==
-lk8o5519Kxjg6njkDcx/a4LXI+MfHNbWfywvCjeRl/T0fQTyIpclWA==
-DIt4Xp3Xbla1QXPpBNd8kQncLU6QuExl9RrMjQw02M5PfX7y11TKwA==
-2ldeYKVA5RpUYRP2vPq8D9ll6SkFs1l/9RrMjQw02M5PfX7y11TKwA==
-ZHexhB9C/Zz4F0w18YK/UcJTRkl7CKPoepvcvTeQwrw=
-0aA0U9ckmH2SPaLA/eokGpBwNuVVH6sq
-0aA0U9ckmH1WgHE3Y5h4chak9y4lRig4856CtLA2mBI=
-udHQ1AK6s0BHbbfugUQuewG5f+vLIXgw856CtLA2mBI=
-udHQ1AK6s0BHbbfugUQuezWfKD51et5xAQXL9AdSuF7MhUL6uE0NXEpgEZ36UZf7
-qBVDKbnPe4DL9/eiOW3PNvOj8LtFg+GJ
-ammVyKzxh8yyPJEuX5FlVfOj8LtFg+GJ
-6fCswTdb7gp4T5EqkTXoH5BwNuVVH6sq
-jmczOIjm5GmjJuX2eeHASfOj8LtFg+GJ
-hck8BB9RXPfRv+VvHMI2mBL2525Y8Jlzy4x6AQXguls=
-xGJWNwmRrvjSNFr9wNKob/Oj8LtFg+GJ
-Dme0iKBg4ltC5hNG7CjHwfOj8LtFg+GJ
-Dme0iKBg4lsKVHWF4Myk4AIg5cy+cuSy8Qk70COrU7VPfX7y11TKwA==
-C4Bngy5bB8t1b91EHw30B0oPmHAI4936
-5yuQig9LutUtwK0yz09R30oPmHAI4936
-dyMnqxlKzdN/JSshJxQ3iqf2wJuFXvN5y4x6AQXguls=
-BKa9L3k9bnJkzZHOvFXHIKf2wJuFXvN5y4x6AQXguls=
-BKa9L3k9bnKHDjyHip04zkffVX1Kx6/gaXBl6wZu5y0=
-GCjAqXPF1Dof+sd2M1vkT/Oj8LtFg+GJ
-tN2/kArLFem7Pl0reaplqbOsDNsReNLeRPB+qQ9rdKU=
-PhvRblnFgRvdce7uzab8M4ydqAmNreE85+3hueUDKGFPfX7y11TKwA==
-asaad8Q4C6Ctv3/3+UBOAUpgEZ36UZf7
-mW7W5BgaP+MjHOA2mhvm0OrUo2OLEJuOROcxxZkPB1r0fQTyIpclWA==
-mW7W5BgaP+MlWHMII4NFM1/cKgeh02Cpy4x6AQXguls=
-mW7W5BgaP+MvmaXSzDwxNK4kLpO4b0WCN5m+Gay4mDc=
-4fpWUFa+lACNuoiIa651tyyfxx3KDwLB
-Iv1mcWBS5FKHDjyHip04zjO11wrX//LPpDa+H9/X6UI=
-qvpIupBm2WX/AxGfixJ3IUpgEZ36UZf7
-8FSnJAv4mC/Mc5Bnc8mDRe54uYxEV7tyotGKnIGJ8i70fQTyIpclWA==
-eAGFq9Be2c60E0hhBYOohO/1mwKFPYtV1K7XQRHlBMM=
-7KSbuV1nCERWtttuC4yb65BwNuVVH6sq
-PbluYqiSMUInlR5KMGbbXKxfcB7OUo5Mk0YDCbV1OWE=
-SvUyT0up+YUaegOSGrYRJl4BNx8oMOoc856CtLA2mBI=
-8y8wJLjHjH8TNfXi0hp2zzxKSn9brCFL0J2lNnMxKpaYzJ6oJv+qKw==
-6EiWonjOwKYAZgmfbgyEWuHSb9kEZhbZAfBGcSNe17xPfX7y11TKwA==
-iXWjcPj0niUZmdQ/MALAmPL6oKDxDkyLHWnCZH6t2//hH/tXNeBfPQ==
-E0zofMTBmei7Pl0reaplqbOsDNsReNLeRPB+qQ9rdKU=
-zC/bIffd/q9utdpwhrdIlAfkmii5BuyZ+wmNWke18BM=
-oVV0uxz5T6z1aHc/UGh87LOsDNsReNLeRPB+qQ9rdKU=
-4yKVkHCQKXYwTqu9Wh9027OsDNsReNLeRPB+qQ9rdKU=
-RjlHunEZKP0T7ne662LsTrOsDNsReNLeRPB+qQ9rdKU=
-iwZpY5oYT+RXSiqVjN5JhLOsDNsReNLeRPB+qQ9rdKU=
-Cks1i1RgvXeuzpfidcLfubOsDNsReNLeRPB+qQ9rdKU=
-xQ8n2p9QTXp30QT7blyM3Qfkmii5BuyZ+wmNWke18BM=
-vGTRMHlT7dXj43Itc7bH7nAul+X1XFtHy4x6AQXguls=
-kRGK26rRVyvv3eyoY7qwoXAul+X1XFtHy4x6AQXguls=
-2jobYaE9hqkLVgLDGsMmxnAul+X1XFtHy4x6AQXguls=
-P7cKB1x3/7hGsAqNnhnTULOsDNsReNLeRPB+qQ9rdKU=
-QY8HRySr7Iwnp75iBJ/Vjwfkmii5BuyZ+wmNWke18BM=
-IAucFrl7qqxLIGJootoeXhDHi1ipAZxkepvcvTeQwrw=
-+812jhbb/MJhfXGLID+DlwxRxeTVAFkvibzFuc+pkRD0fQTyIpclWA==
-Gc+2o0fCUZzBRTe6oIudrbBzljBEfN2xy4x6AQXguls=
-g30soSzYKlYqYKw79TNc7ZU9yEFVkW8kfywvCjeRl/T0fQTyIpclWA==
-5Y1mwjb8gujXQ5dFwFvnLzH8At29S2vWUUnOob68iS9PfX7y11TKwA==
-By5Q/SU5xir2hPuSHwJFxG4yDp8xPBuoawyE6TLbCTavkJTSWMnxMA==
-cJPzYw+8qO2U1kX+sOaXa7BzljBEfN2xy4x6AQXguls=
-cJPzYw+8qO2oTyQOFtqiPd7SGlS0JFuG
-IfQDH7CTkzKwq57YkquoA97SGlS0JFuG
-1AooRnXbEgiveRA5ybYZwBjdGWQl0x5hy4x6AQXguls=
-+8iGrGjQRQXLJRvWtAt1iX4eJb4c8+yiwQ7cCkCUWxZPfX7y11TKwA==
-vKMadaRxCnt9yZ92+zfrDUX1wgDB6SwAlcfDWHvheBM=
-nVdA10JEgrH58tUSo2w3wV8pxEoXZNj5aeu8Uvl+alM=
-+/2OC1vcA4B763zk1n7SVL13FBy0uL+iRPB+qQ9rdKU=
-Gcnsiwomf6vBdIdG8bPRHll2tDC4Deily4x6AQXguls=
-h6H8S6JOlFZIg9VPXIEScier9kpF888AbpgFshbO4WxPfX7y11TKwA==
-ScnIyRoXkewIde0NTCKaofeK6RLf4xMTy4x6AQXguls=
-xUYZz/Y1ys3dPmsNsdD0UjilXWM8iFGV5+3hueUDKGFPfX7y11TKwA==
-rwSi9v0Y5/n868dzID7JMkiU8imBtrfgy4x6AQXguls=
-rwSi9v0Y5/k3lCRoHQSzQaNUfX3uZ7rARPB+qQ9rdKU=
-L4guYbOD3ybEiQqgpijBkO1sIpk3UltPRPB+qQ9rdKU=
-L4guYbOD3ybiWybz9IQNYu1sIpk3UltPRPB+qQ9rdKU=
-L4guYbOD3yaYjQ+nZpk4a/rLJk4dYoKYaXBl6wZu5y0=
-L4guYbOD3yb/9bq0lnqP8u1sIpk3UltPRPB+qQ9rdKU=
-ZpI2ZmzFQJ3d+AsDA8cg40X1wgDB6SwAlcfDWHvheBM=
-xG5CG1VWnMcYMNtTOEq0iiJCwkfSBhWqy4x6AQXguls=
-xG5CG1VWnMemkG9esmQL6vmkGF5eJuLT5YX/dOX/57O0FrgmK9pWPA==
-xG5CG1VWnMfdjUukdGSSoRjdGWQl0x5hy4x6AQXguls=
-XkypoFugO9L4osiym+Qx7rBzljBEfN2xy4x6AQXguls=
-yUBIpiXiGhsjuTEjt/+DHza5a1CR31xtKBLbMm9Rg01qyZUMAi3tqTcKfUh6nySUeU9Behr53wnItVyfMJtsjQ==
-leErXN0I8raC/1FVali0VVqOf3u62uxi
-uNYj01ma7BBp6IUveDLb/kSqVvpudkC5stNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-h/GuGMcf1KaKSb8pX7R3+VqOf3u62uxi
-HzTSi3irigCvmjkAhtg9xlV2rXAZxRtdwIyvNNx82Fm3si0+gPyQ+SSpKIYunmKc
-iUchhe2/rwlC7NNIijAHcl/cKgeh02Cpy4x6AQXguls=
-G6wb24Mf5+T6zB3Lcx4OpWIjE56GxM2wy4x6AQXguls=
-G6wb24Mf5+Q2bj7D5mvDy2IjE56GxM2wy4x6AQXguls=
-G6wb24Mf5+SuA6VKJ2wwgcrVGJOptXRVls1GZC9Rtus=
-G6wb24Mf5+QAEQQg1tP+b+1sIpk3UltPRPB+qQ9rdKU=
-P2k5Ue4Lv8y64ZIHXxB1ELMtDXvYITGLl5Oa2cfGZzRXXWJcXpDSx0pgEZ36UZf7
-P2k5Ue4Lv8wDd7+GstpwnGI2rUC8DjuD1kZ6inS5X/8qp3pee9AtDUpgEZ36UZf7
-v4ihoCtNRVm64ZIHXxB1ELMtDXvYITGLl5Oa2cfGZzRXXWJcXpDSx0pgEZ36UZf7
-VCHr/EMKXxzO0EtYHLOvpgMNBhUCi+wQ9hT2lIaacqU=
-GDDHjFNx9y3/htQJCfkj0jH8At29S2vWUUnOob68iS9PfX7y11TKwA==
-GDDHjFNx9y3/htQJCfkj0jH8At29S2vW2tJwUxoKu3abbUwv5Q8S+d7SGlS0JFuG
-MetFyWuxralvb3xYsvaR/MMR6cuqYjY1KHgdbgnkKc7wshyLxCfprPOj8LtFg+GJ
-xt3ch79mTxiU1kX+sOaXa7BzljBEfN2xy4x6AQXguls=
-xt3ch79mTxioTyQOFtqiPd7SGlS0JFuG
-JZwfCTqSDJWwq57YkquoA97SGlS0JFuG
-V36oXX8CJ64Yoo5YVl4ymjt1kYZzlOQoepvcvTeQwrw=
-duEQlK0W9zCQ4FSyzAKv77AtFeQR31keepvcvTeQwrw=
-NBBXNZCaNE99yZ92+zfrDUX1wgDB6SwAlcfDWHvheBM=
-tsogkendiar58tUSo2w3wV8pxEoXZNj5aeu8Uvl+alM=
-tsogkendiar58tUSo2w3wU8KuEfhpPX9nvxJfBqZsKF1CazNTv2aYfOj8LtFg+GJ
-/nSM2iK24qLBTtMburLns1QlsPKn/6q1hFq5sh8RQyE=
-s6xvxms4FKy3Z3wCjfQBfKEFpmD/7rphVYc272jQVlw9isRJWDpCZQBzJ7mfsQkty4x6AQXguls=
-0XdboMChu2E5gHpaD2pPoiWj50Qs67mB52mHitj3oNVPfX7y11TKwA==
-ms3NmDDAWXnBdIdG8bPRHll2tDC4Deily4x6AQXguls=
-ms3NmDDAWXmcg+a+FanOcFl2tDC4Deily4x6AQXguls=
-/i480IQgLMepMlZ7KX1uK7L8zAiM/vumYB+cHAiOl8tPfX7y11TKwA==
-VynNxYGlkQCQYi/wKhpaD0iU8imBtrfgy4x6AQXguls=
-VynNxYGlkQD3+GLPpxcTj1tgWhqdfi+qibzFuc+pkRD0fQTyIpclWA==
-VynNxYGlkQDbOP3RQ7tZ/vQnZieAvsPmzWNhsrxTgYM=
-VynNxYGlkQCj2Ow89poxDRL8JTHsvtpK9H0E8iKXJVg=
-VynNxYGlkQDiAh217GaWBX6iA24juz/gy4x6AQXguls=
-hUAdePKw8FbP7S63W+brpEiU8imBtrfgy4x6AQXguls=
-i8Syi+i2egOEUBf+PUKtAiWj50Qs67mB52mHitj3oNVPfX7y11TKwA==
-nly0EGexHS8W40YEz3OcshThMltj0h+y52mHitj3oNVPfX7y11TKwA==
-Z6ORYEVTHAYYMNtTOEq0iiJCwkfSBhWqy4x6AQXguls=
-Z6ORYEVTHAbdjUukdGSSoRjdGWQl0x5hy4x6AQXguls=
-Z6ORYEVTHAZcKrbMkfbHlC2cRMPa25eHibzFuc+pkRD0fQTyIpclWA==
-Z6ORYEVTHAZcKrbMkfbHlPSzXA5wk6riG7gWkmicr4aqKNVkN8emPEwWBzUGIE3Fy4x6AQXguls=
-Yrj7/CliiawTfm2BwPdp0LBzljBEfN2xy4x6AQXguls=
-Yrj7/Cliiax2vHf+pDgnBN7SGlS0JFuG
-Yrj7/Cliiaz4osiym+Qx7rBzljBEfN2xy4x6AQXguls=
-f8aF/kdme/IKyS+7h+VKSWL6uHlLqsog
-bK8Zpab/PptNYls6bckCK/nQ97t6cMEn9RrMjQw02M5PfX7y11TKwA==
-h+WfKYcw8/5UYRP2vPq8D9ll6SkFs1l/9RrMjQw02M5PfX7y11TKwA==
-dQt5mgUKF7RGbvA+FxO6AQfkmii5BuyZu7hkhPiE07E=
-9K+PZ38Hd/3Lq4u7hNFVk7BzljBEfN2xy4x6AQXguls=
-9K+PZ38Hd/0q17w2ajSKHLBzljBEfN2xy4x6AQXguls=
-sPbuqnenXG9VSWDLbldzl1Pq3vaS3WGD
-WVz6k53vYlvCE5zi/CJYd0pgEZ36UZf7
-wMnWetYvwcB22baEwHSHdWDAN33wOHW6wQ7cCkCUWxZPfX7y11TKwA==
-FQ7Z0CPc4AlqXJH1d/vXxlqOf3u62uxi
-6uJVi7VzfR9fuLJtpOjzH/Oj8LtFg+GJ
-LbpsRClvKt7SNFr9wNKob/Oj8LtFg+GJ
-zOB+Gixkrqq0PZ7rDpYw+g==
-ShmFYWl9kbLSNFr9wNKob/Oj8LtFg+GJ
-BPywirVs7BwjgMng2FanCRjdGWQl0x5hy4x6AQXguls=
-ttuFIQiBSmBL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-miKP0CYl3W5Ym2pzcr/F6L13FBy0uL+iRPB+qQ9rdKU=
-8n8zV92Zv6l9KDxIQfEX1r13FBy0uL+iRPB+qQ9rdKU=
-8n8zV92Zv6nu8xwJpBGB7r13FBy0uL+iRPB+qQ9rdKU=
-8n8zV92Zv6krX2BZrGZD8VpIinwp+ERxibzFuc+pkRD0fQTyIpclWA==
-8n8zV92Zv6krX2BZrGZD8VPHTAexdz+zibzFuc+pkRD0fQTyIpclWA==
-8n8zV92Zv6k1kZKII+JesEwWBzUGIE3Fy4x6AQXguls=
-/SbDH4creAHCE5zi/CJYd0pgEZ36UZf7
-9zUaxn05IBwS7PNKz81G4R36d9MG7xUn6uzv0j5wVxhPfX7y11TKwA==
-9zUaxn05IBxgnwnOZ+hQK4kq0N9SOLm5
-FRuKyrtJj/RL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-+Coj8KXFfRxp2idI23BKPPOj8LtFg+GJ
-iF6Bt9zVCn7ItVyfMJtsjQ==
-PfdaDBocFQixm2LbXcoIDXpmvKAVeqCzRPB+qQ9rdKU=
-k7aDH3uuoqARhkIHqx1H7tsp4Ism9gRNy4x6AQXguls=
-d60eywEVz6xBSvshOJLAoJBwNuVVH6sq
-obe5iClk984NDakaoCCLCJBwNuVVH6sq
-1TVDxDeahUN5RG1vEUP2O5BwNuVVH6sq
-B6XhfErTTJgfRf0i/Vkb/bOsDNsReNLeRPB+qQ9rdKU=
-+wYtQHJp691kNVRINR3RaHpmvKAVeqCzRPB+qQ9rdKU=
-Y3uHEyYQDdrSNFr9wNKob/Oj8LtFg+GJ
-WV4Ty/OMJBjA2E20A93dy1/cKgeh02Cpy4x6AQXguls=
-m0lX8CRPaqiw8mEQdSz4E/Oj8LtFg+GJ
-Do2wiH59igUFYo+n99SzmPrLJk4dYoKYaXBl6wZu5y0=
-UQx8DfENDTsDlTTw1nBAWlPq3vaS3WGD
-hT2R6oNQDGiD+EtUMNSV0fOj8LtFg+GJ
-xGjxEbbo/twhJLbnEbgPLFPq3vaS3WGD
-xGjxEbbo/txre6ZjJY/aDNSX1ILygfSsdTD26Z5KQnpal+TXCztiQ/yCn2NHqVIHy4x6AQXguls=
-Xeg5n8JTu9Gw5i8Z7YSfZkpgEZ36UZf7
-VQVgaWVz5xKx92ImtPG7wALm/EKxWl15
-lQFziLYwAFR/Rx3+b7qP0/Oj8LtFg+GJ
-v9yCwhqLXXRy0a0P9VppW0oPmHAI4936
-Ss1fTwot0Qh1CazNTv2aYfOj8LtFg+GJ
-mbpi6adHTerCE5zi/CJYd0pgEZ36UZf7
-1aJE0MOrznGQLBb9TLgT0vOj8LtFg+GJ
-2O5atTA83YryUEMJR9kTcPOj8LtFg+GJ
-b30Bnk44ReFqPP6LYZnzpu1sIpk3UltPRPB+qQ9rdKU=
-aak3L9Lnp6k4jrPr+Vc2QkffVX1Kx6/gaXBl6wZu5y0=
-SPMC0Or3Wq5Ym2pzcr/F6EffVX1Kx6/gaXBl6wZu5y0=
-Od0k7somw0+ognNgz49kBq1TqwiA1pre
-neSRPR/Dc1r+5avra8D+/N7SGlS0JFuG
-NPyf8uRLdZAxgppd7vKR30iU8imBtrfgy4x6AQXguls=
-EMu7srLgFkT8KlV1ph0Yje1sIpk3UltPRPB+qQ9rdKU=
-x9PLCfVsCr/aY475fTCHFCJCwkfSBhWqy4x6AQXguls=
-x9PLCfVsCr+l3V44t9O2VSJCwkfSBhWqy4x6AQXguls=
-x9PLCfVsCr+UayicXLX+aCJCwkfSBhWqy4x6AQXguls=
-gre6Tf1xXnA8kiJVq+hjxkoPmHAI4936
-LAphuzvX0+3XoplDMw5YiCJCwkfSBhWqy4x6AQXguls=
-LAphuzvX0+1cKg99X5f5WEoPmHAI4936
-RT8uwG1AoLRL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-tKMGaq5ZqS8faicHeoCF8GnzW8KqwV7b9RrMjQw02M5PfX7y11TKwA==
-tKMGaq5ZqS/cxQIQipmO5ytKOLKlA1ksMvC5rExawa6V8xmS/Gv42azwXryjYWOyFt/BclTC+KpZOr/GQaeSWEpgEZ36UZf7
-MEV2TdfjfmxsgNJHgfD0IHy5ViVd9uvlrFPG/qrcRHVPfX7y11TKwA==
-SZ7z14JzRxz8N5fA/Bb0QEoPmHAI4936
-bhXPjU5Ou0zCE5zi/CJYd0pgEZ36UZf7
-ZTORLADhCW2V5Bc5DWG/rll2tDC4Deily4x6AQXguls=
-ZTORLADhCW0//Lt/QRmfpyH/h1pywZ5c0pCfO/z5g6Y=
-L9fVUSRavgJxLBNTp+QtPfeK6RLf4xMTy4x6AQXguls=
-dNe0XAa3Jm+3JvJ2Xjm9/UpgEZ36UZf7
-GJGUhATERBm3JvJ2Xjm9/UpgEZ36UZf7
-/9URtgHOtUUmgH9IsYidFKiSzovJkrG6856CtLA2mBI=
-lxyRA/zOuaXhlvYRJmLKFghNNHLHKan7QE1oNjRzv0A=
-k/AWU8J38exqXJH1d/vXxlqOf3u62uxi
-0Xh3Jo3x1fcVN9/lDCFFSFqOf3u62uxi
-sXhYv4ghjQ393cgW1OhgWPOj8LtFg+GJ
-ddsicK1RKkr8LfyJUw8Qg3ynnASRkZlj
-Wj5HYIWDLWGw78a972g1EkpgEZ36UZf7
-su0V2rk2gah2w8q8JxH30WL6uHlLqsog
-7YT/1gWrFMOsITkil5j+MAxHjZXQ2XqDuF3NIeLI7v0kqSiGLp5inA==
-GPdd2yIwWWesOniOA5cBq41ncbSjshCEmQCWLXtYoTFPfX7y11TKwA==
-mtIyd1Hqz2UxOjWwaO+5DiH/h1pywZ5c0pCfO/z5g6Y=
-1MHev69zrjZj004btOAkes94cw1mrZqiQE1oNjRzv0A=
-PbYt1gxECy9PyDHKyZ3KARCOh35FTrhDYCbiEbl34508wX/qhzBqr0pgEZ36UZf7
-EjAf+Fk40oLXv2qPN2R841D8sLBRuvnPVj3R0+P6Ke796uutIWsx7JC4iPbph9qG
-it7CAuuV7SAxR6MAda5351Pq3vaS3WGD
-IS3trY+w1C5ped3RWFjnRS7e/oaau9gAXpBSJ5uhUAo=
-7ttNQ1aOZmErxH/5ZZarV4EwIA0kxtT3y4x6AQXguls=
-fDYkXHftmz8W40YEz3OcsuYEtK9W2WqUmQCWLXtYoTFPfX7y11TKwA==
-XXxX/NgmOKOlw/JG9WEaL36iA24juz/gy4x6AQXguls=
-Lwk9eym56F2hG0E0QBbiBCyfxx3KDwLB
-UCgJlS/HXezaY475fTCHFK1TqwiA1pre
-UCgJlS/HXexHXYr3weuURK1TqwiA1pre
-mqvMdLunKrO04LVLknUe10UNUQ2QoJYZBtmtkvJYaYzLzkZfPTHbZw==
-JuMgbbZn7fp/Rx3+b7qP0/Oj8LtFg+GJ
-Be1T87t+ge5XlrymvmHctvsjOZIlqq3hrFPG/qrcRHVPfX7y11TKwA==
-Be1T87t+ge5XqKHPIBx1decIVVBHT46ECvyKmpm5Z0Q=
-Be1T87t+ge409nSxFi4IHE7wB8aAVMVRF2Mdrjp/QpU=
-Be1T87t+ge6oc3vYT7LsOXLLIfzR98fTHWnCZH6t2//hH/tXNeBfPQ==
-Be1T87t+ge6yBrpNLcSpoZjZkopBAnj4HWnCZH6t2//hH/tXNeBfPQ==
-Be1T87t+ge5YEOaSf136eQT1tZsHfiBBy4x6AQXguls=
-Be1T87t+ge6km2jSURfVd+cIVVBHT46ECvyKmpm5Z0Q=
-Be1T87t+ge5gONVh6hyj4FjBxRP/noEkHWnCZH6t2//hH/tXNeBfPQ==
-Be1T87t+ge6BEzUegK+LzecIVVBHT46ECvyKmpm5Z0Q=
-Be1T87t+ge52p/GUBvJlKgT1tZsHfiBBy4x6AQXguls=
-Be1T87t+ge48js9ij9+tfOcIVVBHT46ECvyKmpm5Z0Q=
-Be1T87t+ge56K4HqriD8jeRV0q3Q8qjoy4x6AQXguls=
-+89J6TR32voQgbOipa/YegfPpApbMOkMhFq5sh8RQyE=
-LlMqJlMfp5XCE5zi/CJYd0pgEZ36UZf7
-q3wgm/88Ra/5FA/QNzKqWKEmC0tHnFgTKSotK/v0yek=
-JRjgwC9Nl8D07Pr83yxuuoZiRLknPIhby4x6AQXguls=
-23R1BuGALKkPTIc+xqy84g==
-MejiOyuUSYXCE5zi/CJYd0pgEZ36UZf7
-DdOs5Dtw0QwfYrJTd7u97V8pxEoXZNj5aeu8Uvl+alM=
-4HI+0PfJaYN8YPH6c539+jzmU+FOUsy4fER6RG1klik=
-lx6eh+YkHBXGQf4A1Ut9bKuL51BaHbjJstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-9Mqch0gZ4bPxBEF6YmaZtkcdj80TCvSKqzKLxcx+tSc=
-9Mqch0gZ4bPz0v8j23MbjNPaFoMUutn7RPB+qQ9rdKU=
-9Mqch0gZ4bMvCICzkLDDGehZn9/adx3vy4GGkE0bbpyw8mEQdSz4E/Oj8LtFg+GJ
-9Mqch0gZ4bO3ZIY+lmc/+RnMjLDUY5xny4x6AQXguls=
-LZyp1gIf6wiOl3qik2jwk6RDFmbmXXil
-oUHoi3J+yiDI1bw1UsJaVEpgEZ36UZf7
-E03BI5P/0r/MhUL6uE0NXEpgEZ36UZf7
-ZYCQozJW2qvwOxi41E/bGvOj8LtFg+GJ
-Wx+TYikA2urCE5zi/CJYd0pgEZ36UZf7
-qW7Uf+cuUKUCAZnq4oBF/POj8LtFg+GJ
-JsWoe4vRDt+jI1emh9XUFPOj8LtFg+GJ
-qMdsxFnf7SjCE5zi/CJYd0pgEZ36UZf7
-7nUs+pzMGNQU2voVSXubFpBwNuVVH6sq
-rh16PU/bLznKwSWbD40NLyyfxx3KDwLB
-Mpws87qKqdUCAZnq4oBF/POj8LtFg+GJ
-wAG7h4jgsHz1hFgQXur/mkpgEZ36UZf7
-cyrUnsE+xTt/Rx3+b7qP0/Oj8LtFg+GJ
-FeneHV0jniXhjOGBjP0tkSoVbfyrL10EWhqDUIQPQGM=
-FeneHV0jniUYclRR5n6EOPeK6RLf4xMTy4x6AQXguls=
-B2EBAR60IppisJUSU6syO0oPmHAI4936
-2auQrCxhHIuioNaJ2OEJLEoPmHAI4936
-Vfay8OeyRBHCE5zi/CJYd0pgEZ36UZf7
-3BvyzjY734aioNaJ2OEJLEoPmHAI4936
-cFYwLcx8lBi40Fj+KszbNkoPmHAI4936
-+BWPPfYlvW1XqKHPIBx1ddHEM4o6ZCR6y4x6AQXguls=
-tqfw6NEVIE2E1PvLgQn/VJBwNuVVH6sq
-D/nWCdnKl6ptV7mJSxdBKJBwNuVVH6sq
-wesEbkcq3G2JlqzsLpoontS+kgXZKgOPy4x6AQXguls=
-YUhOmXNESHB2ZZeRKlYPOEoPmHAI4936
-w0pNO/G/ztmyPJEuX5FlVfOj8LtFg+GJ
-aALCXOoFPx92VgIo4mv4FtS+kgXZKgOPy4x6AQXguls=
-aALCXOoFPx8Ey0tJ0nESHdS+kgXZKgOPy4x6AQXguls=
-E/5wOVIsF6a+DupvRV9k9N7SGlS0JFuG
-+js67kDQcFh9h8vjUcC6wfOj8LtFg+GJ
-JOWuxy1tcO63K9xlTBbaJvOj8LtFg+GJ
-vw9DQsUCodtXqKHPIBx1da1TqwiA1pre
-q8SO41xH4H+tv3/3+UBOAUpgEZ36UZf7
-X+2h3edByPRXrrLCZAbA0IBwebx29WjwN5m+Gay4mDc=
-zCVSXXb5NXkVN9/lDCFFSFqOf3u62uxi
-DtuuJAfVwT3VGlpd50u+NkpgEZ36UZf7
-EiJtPPoy5YOqBDtVMagTbba/H5IGWzTO9hT2lIaacqU=
-JawkevnCrNdts8zcqwR2eKHvMDErP7gJstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-lPChL110T8qH6H8fqQsEDQYd3czwK5kuaXBl6wZu5y0=
-rCMp7rtnhxrHQdqfJSKMLAYd3czwK5kuaXBl6wZu5y0=
-TG2nF5NcrshL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-4wo8hNCdEQEmaNNvL8sx3NdP8cG+AoEp9hT2lIaacqU=
-/7ct4BMAXCUzXDr7TYw7uQLm/EKxWl15
-t6I+Wba8BRC9FppGobofTZBwNuVVH6sq
-FuqufNWLbz7WJtI2H4aUC7BzljBEfN2xy4x6AQXguls=
-Nt6VZaeWqZzN5z6vOYv1dKlsit/TVI3D9RrMjQw02M5PfX7y11TKwA==
-Nt6VZaeWqZy1QXPpBNd8kQncLU6QuExl9RrMjQw02M5PfX7y11TKwA==
-rKBk01Fx9j23JvJ2Xjm9/UpgEZ36UZf7
-ySmvEQkp+QnDVB+FOWxfQpMk2YgHTvJIlG2KEQazVUfqIZZcdg+1Fg==
-ONKJPxQ05EuDeZQi7n+ymPeK6RLf4xMTy4x6AQXguls=
-/ZBZNOiYzE+2EkinjidSXecIVVBHT46ECvyKmpm5Z0Q=
-PmXiFkkqLljCK04zVVZrqh9chXIUgi4lFw5IxUfsdvk=
-VgjQjLlxJgbVGlpd50u+NkpgEZ36UZf7
-oCdVZ3TjXszsI02ZCbErN/CvCYF5ZT40y4x6AQXguls=
-06VstCfw9TsVN9/lDCFFSFqOf3u62uxi
-yIwYB0D5ANpIkRc7oSI9s7K8YzH4gDQgy4x6AQXguls=
-kQHtQ28+jmSs22EWcIktH5C4iPbph9qG
-l88DeydS7Mr/5w6rMKFsfecIVVBHT46ECvyKmpm5Z0Q=
-cchXAGqWaFReJ21yxIT3be1sIpk3UltPRPB+qQ9rdKU=
-RNUTN8me5q1ReH0oBHbJGNqY7RGsCVoPAfBGcSNe17xPfX7y11TKwA==
-RNUTN8me5q1or2m5+SKQMMSKe9vVY/8AlG2KEQazVUfqIZZcdg+1Fg==
-hU2JsvCVd8iVbaq0hPsRvnpmvKAVeqCzRPB+qQ9rdKU=
-CQJvmF3yt1F6BlAdBV+jGC9myxH6CkHeEFyO6huNc6Q=
-3w3xExz5BYjfEMKoqqshoIaR13R3nUd3teq+RIooEghPfX7y11TKwA==
-xjGHNt3JuT9IOeeheINUM0oPmHAI4936
-HQ4O/5TsBQbpSgcoVE4LbXHIgbvw9UUMxNhXTmnBUo8=
-jDc+I5DLhjcdldob8yjvsEoPmHAI4936
-jDc+I5DLhjdaVQ4Lv2EkrkoPmHAI4936
-ERG/my0wCEMmgH9IsYidFKiSzovJkrG6856CtLA2mBI=
-8GR+KuRP/IrZpafk8rhqLjO11wrX//LPpDa+H9/X6UI=
-+SvHIm2Mlu9B+y4G1LWUjUoPmHAI4936
-+SvHIm2Mlu9WgHE3Y5h4clmDacM1Qce94KJlnTPYf0iYzJ6oJv+qKw==
-HLbF1HKtXYGIo7PKykxrN0iU8imBtrfgy4x6AQXguls=
-UnEQf/j0jK6x92ImtPG7wALm/EKxWl15
-FkH+3MJcYBmyPJEuX5FlVfOj8LtFg+GJ
-bq4owRXG1PiioNaJ2OEJLEoPmHAI4936
-bq4owRXG1PiMRJQtxc8R6koPmHAI4936
-osXaeNVdi5Bh4GvBMx4eJ/Oj8LtFg+GJ
-uCAuXCRbEjOtv3/3+UBOAUpgEZ36UZf7
-YTFr6yTNbAO9SSnHHBVGA/Oj8LtFg+GJ
-GhRXduWr8cb2YvmikroYRiHFVYFksbf2rFPG/qrcRHVPfX7y11TKwA==
-GhRXduWr8cb3R9KvkRZsVtHEM4o6ZCR6y4x6AQXguls=
-z0NB6EgQrYuej9syichlRRjdGWQl0x5hy4x6AQXguls=
-7dwIUGq+pHAjgMng2FanCRjdGWQl0x5hy4x6AQXguls=
-7dwIUGq+pHDVNpX+SJIcBl2BBsIawet1u+2srYn+TwXMhUL6uE0NXEpgEZ36UZf7
-8F5Rffa3tXf4n7ZrF0P2pJBwNuVVH6sq
-DH2VViKrbzkp6/lKXi3UMOrUo2OLEJuOxJkxuUM2UM3TUyqisEKkO0pgEZ36UZf7
-jryElcwKEMNxLBNTp+QtPfeK6RLf4xMTy4x6AQXguls=
-J2nslBNjSd9lRnm22WMLCZBwNuVVH6sq
-CrymWgzKBwmowyaOlIWPkfOj8LtFg+GJ
-W6++NOLhnGKW64PK7OzRci1TUpamJyWhy4x6AQXguls=
-W6++NOLhnGImgH9IsYidFKiSzovJkrG6856CtLA2mBI=
-pU876B1hGC6+86Rb1W1pEQ==
-ymBA422YpT60tTwm0ePTu/Oj8LtFg+GJ
-B64Md1JCAwjWUpDt6Xr+nkpgEZ36UZf7
-0GpXlkW1y6vWUpDt6Xr+nkpgEZ36UZf7
-iOqRqy56ghCDwJ8yRW4QTd7SGlS0JFuG
-sxgS7X/mz0eeQpPRvTm3LFPq3vaS3WGD
-jhM9JTBsgxfSNFr9wNKob/Oj8LtFg+GJ
-wyDvFk8TTUS0PZ7rDpYw+g==
-X9EC5zk/BzLTp7h58XZ5OfOj8LtFg+GJ
-YbFLLWDTZX6jebsJIc8YlfOj8LtFg+GJ
-6gWj62/jMx79+r0EMibpOfOj8LtFg+GJ
-mc0v41Pmxbu3JvJ2Xjm9/UpgEZ36UZf7
-93ZjDiJwkDG8RbktMnXXHfOj8LtFg+GJ
-Xn4HnNubANHFZ5D2h4QJfYZhCmXNWZmGaXBl6wZu5y0=
-/VfPpD7+6ViEcDEYG6zc49S+kgXZKgOPy4x6AQXguls=
-048X8sVpSrC5/0FNXste6fOj8LtFg+GJ
-odwlcbPCv1V2ZZeRKlYPOEoPmHAI4936
-s9fvPkvw+eO5/0FNXste6fOj8LtFg+GJ
-mVQ8Q8ewqYWXVpljuLaKukxdyVOf7XNtZ5wrfkhkzAA=
-ffIYZ1PjuXBx4u2IJrBm00oPmHAI4936
-0oaWW6Ft5KK1f4daHIwZR9HEM4o6ZCR6y4x6AQXguls=
-L2rEB7a+UV80RdSYnDioG4yT35O/ZMlXjuyKZVVSxxc=
-/nZa4JHvh5RutdpwhrdIlO1sIpk3UltPRPB+qQ9rdKU=
-/nZa4JHvh5S+AVOQd4583+1sIpk3UltPRPB+qQ9rdKU=
-0j/OcOgq4vblQZ/5Ca6DjU5xRxlEwuuujuyKZVVSxxc=
-yAZvjf/Npq3Jcbvke1EgJ0oPmHAI4936
-wg6D0EnuXuQnHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
-zONWHZaMDFDdMM/Jx/UGaCQln6pOmJcZ0pCfO/z5g6Y=
-b+p7oPuIEcXgfJazTxRSvALm/EKxWl15
-b+p7oPuIEcWpakXUpZ6hBrfQ1g178t/sR4q+tB+teD3wshyLxCfprPOj8LtFg+GJ
-T8EFg6F1LsJnJtwh+biWBnUGLM4fr3KEy4x6AQXguls=
-9ln3OtBAZ4xYHWoVS6+3aE7wB8aAVMVRF2Mdrjp/QpU=
-2w7I+GMn9H92bBstIl8fQUoPmHAI4936
-zmnYQWRJshw8pS//ypC4EfrLJk4dYoKYaXBl6wZu5y0=
-zmnYQWRJshxfVjmT72+IU/rLJk4dYoKYaXBl6wZu5y0=
-pP/EazI2ohTJcbvke1EgJ0oPmHAI4936
-HSlkVdSEOqxDB6mfhWFtF/rLJk4dYoKYaXBl6wZu5y0=
-iaqd4ac59tkwmxiV/uttpe1sIpk3UltPRPB+qQ9rdKU=
-6950kamGyz1jn8atkAa4WRWb7Iq+ue9U0pCfO/z5g6Y=
-ZBlMqkWFMgGHlQYO/29XsPOj8LtFg+GJ
-etqHd962VKXwshyLxCfprPOj8LtFg+GJ
-1rOjBHyFj+eHnIZJN6/3sBATcNYyjC0W0pCfO/z5g6Y=
-yjsVsC9nyaHCE5zi/CJYd0pgEZ36UZf7
-RL9wd7sqH8nJ/XFJLG1noC3MK637qtLAFw5IxUfsdvk=
-FfjvvdggP/1GEF1igpqnMjoZ9Con4QX6A2+HaLUZbe0=
-tVBVCkW2P2vvP1LP4h1GfVPq3vaS3WGD
-c8fipJzZpKHSNFr9wNKob/Oj8LtFg+GJ
-bAvcVi4Iw6s88My+QyBF4iOSA1tar8TQ0Rzn8E7ul0JLV1Hq0b8BpPOj8LtFg+GJ
-PARbOnEYlB3rgwUip8TSvrBzljBEfN2xy4x6AQXguls=
-go/dWWwGU8bJOvnYyXNsXpC4iPbph9qG
-TkKCqeWSukeV4wuSWx4U26GFuSH/HQxAy4x6AQXguls=
-TkKCqeWSuke8RbktMnXXHfOj8LtFg+GJ
-TkKCqeWSukd0P3wPBDQ7QFPq3vaS3WGD
-hO72ygyNsdS3JvJ2Xjm9/UpgEZ36UZf7
-LoM+jDhQqFDwozCIpR0nf0pgEZ36UZf7
-mySxSoQQ5hH9+r0EMibpOfOj8LtFg+GJ
-3jzcnOifPTGUtstGJWfN1Hrz3wa3t9i6y4x6AQXguls=
-4kdkKXQ7T0R1hHUpo6tg/ajv8HiCer8Ay4x6AQXguls=
-4Wm1uiOER9zSNFr9wNKob/Oj8LtFg+GJ
-7ddpONXhUU5L7w5GPenWeql77FvoyOUCfywvCjeRl/T0fQTyIpclWA==
-d1sVTi4llK7lQZ/5Ca6DjTtDCKtSyZ8Eaeu8Uvl+alM=
-Fmkib4/xoTMCeemNLJHnJgLm/EKxWl15
-PaGbbzoWurQnHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
-9Si22Bpxf/QBFq6hXHFOTkwWBzUGIE3Fy4x6AQXguls=
-5z/FaS08FC2I51kihoSlswLm/EKxWl15
-unXa+WSPJaRSSitwj7vrXQLm/EKxWl15
-aoyMNdWOkHd1CazNTv2aYfOj8LtFg+GJ
-4+Hqev/UbHPPxYlpacEdI0pgEZ36UZf7
-TQRngJH1Ek1qPP6LYZnzpr13FBy0uL+iRPB+qQ9rdKU=
-CcAtnE63g1xa033tXDwlqSgM1VPOu4sN
-2n75FC3uwfC2lddTY1y4I0wWBzUGIE3Fy4x6AQXguls=
-erLQ3JyUfISiMFttLBCaNgLm/EKxWl15
-psmYD1yV0+1SSitwj7vrXQLm/EKxWl15
-T0tpWQa0WBy9wwymMgTHHEwWBzUGIE3Fy4x6AQXguls=
-GU9rv7S9HDKCGC55KuzT8UwWBzUGIE3Fy4x6AQXguls=
-eYAwQTFdThU3xjZ6HMSwQb13FBy0uL+iRPB+qQ9rdKU=
-ZcATeY3SOmU8js9ij9+tfH6iA24juz/gy4x6AQXguls=
-ZcATeY3SOmV6K4HqriD8jX6iA24juz/gy4x6AQXguls=
-WpMnbnNRcj++AVOQd458336iA24juz/gy4x6AQXguls=
-LT2QzTDBMvBSn/fQrSogfSanigrTdC7fzWNhsrxTgYM=
-3S0zBzzcG28nHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
-rH75MlwLe4iHDjyHip04zn6iA24juz/gy4x6AQXguls=
-ORtAqQQY1sfPxYlpacEdI0pgEZ36UZf7
-BtmsuCW8kSpA4pTRFdS/KQLm/EKxWl15
-hgKSS6WIoWEdo9FMoGbGk0oPmHAI4936
-hgKSS6WIoWEBDkcxYXRMQhToYGFen0lpzWNhsrxTgYM=
-hgKSS6WIoWHSQcDia9XkMUZDtywxNaqwqebDJ2D3GrP0fQTyIpclWA==
-ObtZggguHVH75+AsqJdaK/Oj8LtFg+GJ
-5ElRLBbico5HfaFd/KsR0koPmHAI4936
-gBhYk85FRG6M6X8re3fQg/Oj8LtFg+GJ
-IIbeVb1Zp2Vw6L/p6JSpG/Oj8LtFg+GJ
-z71z+qSu7Ey0IhLdN9AyUEoPmHAI4936
-cGT7aZk2gf7PxYlpacEdI0pgEZ36UZf7
-79ikOahtbziMeW7poAUy4dDGrvtwVnWwfER6RG1klik=
-oDX9OktCqQS5+Ag8CVGtZAEles108WxdRfifV1nUUrFKYBGd+lGX+w==
-4WFREg6StsXlQZ/5Ca6DjXXPc5Ki/J8mZ5wrfkhkzAA=
-+/5WFE6HdRIVk1QoQHbV70oPmHAI4936
-/rrEnWld478nHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
-LBjLIuMcxdXj9lLGelo0UO1sIpk3UltPRPB+qQ9rdKU=
-h1XeOIBMRZ14iFg1egzOlALm/EKxWl15
-Liq4+z+iHBbwshyLxCfprPOj8LtFg+GJ
-hMPHG8zWfevwshyLxCfprPOj8LtFg+GJ
-+pXXyHkf87vPxYlpacEdI0pgEZ36UZf7
-O8xLRFQpwrDdxEXzi6UoSsyW8297TnFZ0pCfO/z5g6Y=
-59OFXSNrO2ax92ImtPG7wALm/EKxWl15
-MyZ2EamTQ95rfLPYpSRg6UoPmHAI4936
-1suDit3Eq7XNgWyWzjfkBTVnubG+Sf58Qxxo88aAg3c=
-p+oXZGb9felB+y4G1LWUjUoPmHAI4936
-T8qiUcOxWGex92ImtPG7wALm/EKxWl15
-megPgZgZatmyPJEuX5FlVfOj8LtFg+GJ
-hIcKxvB0qrStKsK1NKEnjnUGLM4fr3KEy4x6AQXguls=
-hIcKxvB0qrQ1/obow+hNxNS3UCP+Xxke56zwMY8I/+GEqKNFUcAAUEpgEZ36UZf7
-hIcKxvB0qrQ1/obow+hNxM87KOEe5EKO56zwMY8I/+GEqKNFUcAAUEpgEZ36UZf7
-hIcKxvB0qrRmdPhpVvErmmU8YnidNLyF56zwMY8I/+GEqKNFUcAAUEpgEZ36UZf7
-hIcKxvB0qrTRUDfrIg6YeeOaiJxfN2NojuyKZVVSxxc=
-IgfkS/yzfiNl6qtXuMmmfSJCwkfSBhWqy4x6AQXguls=
-vdDujKxsGqTu8xwJpBGB7vrLJk4dYoKYaXBl6wZu5y0=
-vdDujKxsGqRfVjmT72+IUyJCwkfSBhWqy4x6AQXguls=
-vdDujKxsGqSuYTcjFB8CYIW56gVH63DBT8qiUcOxWGe/98RHxldG1vOj8LtFg+GJ
-vdDujKxsGqSuYTcjFB8CYL6qBg32lrLQT8qiUcOxWGe/98RHxldG1vOj8LtFg+GJ
-NUY6EzUNBcupT2zvt/urCUoPmHAI4936
-O8LPxcSZWgCyPJEuX5FlVfOj8LtFg+GJ
-MsAiyvZZGvKtKsK1NKEnjnUGLM4fr3KEy4x6AQXguls=
-Lz3xBm67RkV4emxgFA0tiJBwNuVVH6sq
-2UBsnltmJt+RNpK5CN0kEoEwIA0kxtT3y4x6AQXguls=
-53+yvEZVribSNFr9wNKob/Oj8LtFg+GJ
-s/Uo311nB4nNgWyWzjfkBTVnubG+Sf58Qxxo88aAg3c=
-hIwdjylHLGpzJ4M0r7zib0iU8imBtrfgy4x6AQXguls=
-cq6XXjMR3YCyPJEuX5FlVfOj8LtFg+GJ
-URZTYYOprr+ioNaJ2OEJLEoPmHAI4936
-URZTYYOprr+MRJQtxc8R6koPmHAI4936
-8a/odfEE6zzSNFr9wNKob/Oj8LtFg+GJ
-pou90Ds2zWZCzwZsznq8ZEwWBzUGIE3Fy4x6AQXguls=
-pkeEKh1jPSBWgHE3Y5h4coemfMvU1eABfER6RG1klik=
-OwPmdJgfleD9qI/NdGuLvopY37QaCE2vaXBl6wZu5y0=
-98gWtMm+tR46B4D4P9VTIQLm/EKxWl15
-Jv1hD0HAYBs9M2n0C2t1jkoPmHAI4936
-ghSbmaLOO99L/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-ghSbmaLOO9+2eQd7E/7L89HEM4o6ZCR6y4x6AQXguls=
-ghSbmaLOO99tji7RQU6MglXygIrc0WtXfER6RG1klik=
-Ls5FWwWEd6pSR0e9F1/EYPOj8LtFg+GJ
-at1Bn/0PBKEPvuklRRGDBgLm/EKxWl15
-wDXNPMfkdyNsE0uOQeg/4POj8LtFg+GJ
-dHtBk0+GYeJ8wv8Kzlk4jBL2525Y8Jlzy4x6AQXguls=
-bd68Ff0/MOdHmITcZ8OvTALm/EKxWl15
-RlqtTc1ddfqEqKNFUcAAUEpgEZ36UZf7
-5EBWJUcB7QrWN4gnV7c93koPmHAI4936
-5EBWJUcB7QpKxBbFVac+1wtqBXZ4E+c/PtbZND328nI=
-162SX0X5QG3chbqz0R3o2V3BzxGJLcsP8sfKPfIpMQNPfX7y11TKwA==
-C+CTZb0f4RMrkmpQpbhvUoY/p688/scQYB+cHAiOl8tPfX7y11TKwA==
-XT3mt0mRlBrY32VsZPX+0EoPmHAI4936
-LJS42ZwcpdFDHOAJ30mSrEoPmHAI4936
-LJS42ZwcpdEKOGJCRlOCGEMsG0RZhXWmN5m+Gay4mDc=
-LJS42ZwcpdE7jee3IyQ7GQtqBXZ4E+c/N5m+Gay4mDc=
-7NGKKJN34ogCAZnq4oBF/POj8LtFg+GJ
-Az4+5t1fUEIHBZ5Mnx6yw0oPmHAI4936
-fJTXcZwpB8kt87PJTa1JoRL2525Y8Jlzy4x6AQXguls=
-ndv/6Tbir2Al9SPHO/q0fgLm/EKxWl15
-1/6y3xqeTKfY32VsZPX+0EoPmHAI4936
-wK1sZrL3pJAXtVFp7veb3xL2525Y8Jlzy4x6AQXguls=
-CqFH5cAKYw6qhKm7+HXh+aRDFmbmXXil
-LQrltoM1cpvCE5zi/CJYd0pgEZ36UZf7
-Ol11wPce++vCE5zi/CJYd0pgEZ36UZf7
-w9678/OUZYnSNFr9wNKob/Oj8LtFg+GJ
-RtC8zrx8egrP0mfP1bj7qKFjfApLwKh/N5m+Gay4mDc=
-ERwzEHJFSaSkXYAzJbi62ajv8HiCer8Ay4x6AQXguls=
-ERwzEHJFSaS8RbktMnXXHfOj8LtFg+GJ
-Kr9NpwKWfsKHDjyHip04zlPq3vaS3WGD
-6Oqf3E+UYp2A2FeyW2xavPOj8LtFg+GJ
-/aUJ40q0OGE8js9ij9+tfFl2tDC4Deily4x6AQXguls=
-fkGZhX/El4RpsvPgzA9aB2L6uHlLqsog
-RZ+v/54TrXap58z+jjbwkUpds7npaylHy4x6AQXguls=
-iHNF0shQTZ0i5uPoBbmGy2ksmHFhrajUy4x6AQXguls=
-IzqZUh1jNoW7fEDIh3MPj/Oj8LtFg+GJ
-xjBOWYwtJQIcjhU/Xv96eKyD0xvYLTOLy4x6AQXguls=
-xjBOWYwtJQInz2o+xwX02Whf20/Sfg2Oy4x6AQXguls=
-xjBOWYwtJQInz2o+xwX02cQ6uk/WHcyf6MIva6/KGSO0PZ7rDpYw+g==
-xjBOWYwtJQLNj3osZXWK/wNqyAperh+Gceie1Maa4Hdfzaof9cbYCvOj8LtFg+GJ
-xjBOWYwtJQJRKpnwl88SZLCpTXnOszLxAuqg1HJi1UpPfX7y11TKwA==
-fG3H/eYATNjSNFr9wNKob/Oj8LtFg+GJ
-fG3H/eYATNhSRQKZWsra5zmXZqcwXuLSy4x6AQXguls=
-9WcEVwVcacS0PZ7rDpYw+g==
-5Od2zL01rcmjebsJIc8YlfOj8LtFg+GJ
-NIMkrNyEXQQTkBuMqRoBcqjv8HiCer8Ay4x6AQXguls=
-bL0xvp6bKsyA2FeyW2xavPOj8LtFg+GJ
-OlIufldps163JvJ2Xjm9/UpgEZ36UZf7
-H250ngXCLbRa74IbmJiVRPOj8LtFg+GJ
-v0o/NZ2Flyh0rznFov+n2+fhcFcsFNKYQxxo88aAg3c=
-ILtHucU7b9vwshyLxCfprPOj8LtFg+GJ
-B5DO9dw1D2a7yXAHVflBY0oPmHAI4936
-entKqGlyDvuN/55cHq0j7EiU8imBtrfgy4x6AQXguls=
-REmCvUYOcA6Cg6aQfJfPZkoPmHAI4936
-IRF3FIzGK/WMRJQtxc8R6koPmHAI4936
-Kc1jyiJVnGWx92ImtPG7wALm/EKxWl15
-2gjhNrDt+eeioNaJ2OEJLEoPmHAI4936
-0D2aGEdKA2ZKGV/+gaFbkKf2wJuFXvN5y4x6AQXguls=
-0D2aGEdKA2ZWgHE3Y5h4coemfMvU1eABfER6RG1klik=
-KxlRPOIG9ZstwK0yz09R30oPmHAI4936
-ysFI1Rx/lmayPJEuX5FlVfOj8LtFg+GJ
-BT/fHxNzenBkzZHOvFXHIKf2wJuFXvN5y4x6AQXguls=
-AHJVRVXWVMjbiQGOjO5mmqf2wJuFXvN5y4x6AQXguls=
-AHJVRVXWVMiK6lgP/9Y2oqf2wJuFXvN5y4x6AQXguls=
-LwTctfycqwn1eDN17P0yBwk1seY0eQtCpg10U7yntVtPfX7y11TKwA==
-oJ7KGIaocyBSndz+M2zpG0ffVX1Kx6/gaXBl6wZu5y0=
-46rP4jXWI5nbMhjb7ruRAgLm/EKxWl15
-XXIUiO8imQcnTs9sqqXWpRS4C2VAq+q+Fw5IxUfsdvk=
-XXIUiO8imQfCgbjpU0Ib6VPq3vaS3WGD
-XXIUiO8imQdip1CQWTvLTfOj8LtFg+GJ
-3oeh0L+U9UBZp8LAxcbkMZBwNuVVH6sq
-bpBWCSOn5muOpn2IcS2BfMlK0pFWqtW2CrACxSMFVJ1PfX7y11TKwA==
-ljwmOqHUx3m9FppGobofTZBwNuVVH6sq
-ntKwejfnuA0YgouZt2pykBRGX6dD+yb9qWi9XkUN3uznsKirjKejAUpgEZ36UZf7
-+yp7LhPh6/o2wwd3InzQFy4v4ck8itax5kzFRBUU5DACAZnq4oBF/POj8LtFg+GJ
-twznt9msCJOjJuX2eeHASfOj8LtFg+GJ
-oVwjgLWM2luHDjyHip04zrBzljBEfN2xy4x6AQXguls=
-ZMr6bs8Pd9byUEMJR9kTcPOj8LtFg+GJ
-ZMr6bs8Pd9bQ6oLuzbuHdMAyuvLUrV6nwEoaBEGc9RE=
-MWXFwS+gXECVbaq0hPsRvnpmvKAVeqCzRPB+qQ9rdKU=
-MWXFwS+gXEBL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-eYrwlVYgQAsNLBVQVO59LecIVVBHT46ECvyKmpm5Z0Q=
-zm66Ok5YvbJgW+fN9gkOExnMjLDUY5xny4x6AQXguls=
-ocjyg6d/YZbYuiqsh91JVPOj8LtFg+GJ
-C6eysrtIgcAgcxiJCY3Ya7JwOivdSNCn8sfKPfIpMQNPfX7y11TKwA==
-aM6jPf4QFiflc3LHoaCHKTiUnYxvdTs4aAYhz49iPPQ=
-orFEvaQa0+AHI68W/MPHCYZhCmXNWZmGaXBl6wZu5y0=
-orFEvaQa0+DIKZk4XelWJ9S+kgXZKgOPy4x6AQXguls=
-S7N5m+yTVdiTXs+YU4gZf3pmvKAVeqCzRPB+qQ9rdKU=
-39rO+Kxnmjjv3eyoY7qwoXAul+X1XFtHy4x6AQXguls=
-6N8OYQckkzXbjtQVzMQGtVO8SBODgX57y4x6AQXguls=
-/WeDlc4QzvHCE5zi/CJYd0pgEZ36UZf7
-Q+t2NuZi/bYYBYr4xsa99POj8LtFg+GJ
-m7NwXX44/6UMorRxG+mAPKl6skmHW//Gy4x6AQXguls=
-5sZDUmzYHMSQadl/kdNn9Gp3SEzZLUEIXpBSJ5uhUAo=
-4Qvrbb1JTp8Qc5QWoX2eifOj8LtFg+GJ
-m/tIDzJi3OZXUDBIWUrqSK1TqwiA1pre
-S9B++UiCXWUkpVTVLAAIUPOj8LtFg+GJ
-O3P6K+AfRNzF44QHb2ipd8svCgK9hR1bXpBSJ5uhUAo=
-wtKpMto5s6ytv3/3+UBOAUpgEZ36UZf7
-0OYj7bJYGaCbsiqDLJxCRhnMjLDUY5xny4x6AQXguls=
-TEJT79gBm7PDY4PKs+sJ4F/cKgeh02Cpy4x6AQXguls=
-6sLf9oF5/2cFSyaIvrb/N/Oj8LtFg+GJ
-cRBYkFVyJUwqp3pee9AtDUpgEZ36UZf7
-GYBI2zJwMBNey2dyHe3hZWCQBVIqdo0V0pCfO/z5g6Y=
-ynINb2Eqx7SloP32ysnd4UpgEZ36UZf7
-pgzRnG9D+zC0PZ7rDpYw+g==
-Kpq53a0+iGDSNFr9wNKob/Oj8LtFg+GJ
-ky+iLMs6QhG3JvJ2Xjm9/UpgEZ36UZf7
-2Om0H6dKuzbSNFr9wNKob/Oj8LtFg+GJ
-g0zbV1jZvRGV4wuSWx4U26GFuSH/HQxAy4x6AQXguls=
-g0zbV1jZvRG+FqF3alT2MFPq3vaS3WGD
-g0zbV1jZvRG8RbktMnXXHfOj8LtFg+GJ
-XZm6QFzDmJh5QHl4Rg/BHfCvCYF5ZT40y4x6AQXguls=
-/gVNZGSuGULWbJef4vcbmDpK56AtCq0bQE1oNjRzv0A=
-7AFfCdxoVJaez/DwjHv7eCH/h1pywZ5c0pCfO/z5g6Y=
-ycU0RK38xbDLdJNqyw1kxCJCwkfSBhWqy4x6AQXguls=
-pd1F9WAw6p6GsXOp2DRhHxjdGWQl0x5hy4x6AQXguls=
-b8ErQvNUZgeHmDmTzSfyUE7wB8aAVMVRF2Mdrjp/QpU=
-b8ErQvNUZgc8pS//ypC4EUffVX1Kx6/gaXBl6wZu5y0=
-b8ErQvNUZgdfVjmT72+IU0ffVX1Kx6/gaXBl6wZu5y0=
-bKuUJ1epVUJL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
-bKuUJ1epVULWXIcogNVO9PeK6RLf4xMTy4x6AQXguls=
-bKuUJ1epVUKAB2gzKtqpWrBzljBEfN2xy4x6AQXguls=
-bKuUJ1epVUL/BocxQ/VkHF6uLIHrocIjibzFuc+pkRD0fQTyIpclWA==
-ZVyEsgcvvqkCxwQXdsGm4T/R8tJQvU4AN5m+Gay4mDc=
-a50cHx99OyS+86Rb1W1pEQ==
-WgaH2IFpABYVN9/lDCFFSFqOf3u62uxi
-YC4R/Hqz5OjVS9iZLCqmXZOdTChiEQ4H
-CA9qvj9VlfX4aBmcnHTh+e1sIpk3UltPRPB+qQ9rdKU=
-5thMB8eHe2f/1Gi6u346QEpgEZ36UZf7
-B9uuO07HaYDhefW3q+MscXpmvKAVeqCzRPB+qQ9rdKU=
-jTuQkMDtjykttMlk2S6x6POj8LtFg+GJ
-j5r7gucVUZPSNFr9wNKob/Oj8LtFg+GJ
-pF+/2e5PCdiYv/g0PaK/jL13FBy0uL+iRPB+qQ9rdKU=
-entv5lp5ztG/98RHxldG1vOj8LtFg+GJ
-fHieFygyEvy40Fj+KszbNkoPmHAI4936
-uensoKoCEG0i5wfAwIsXFiyfxx3KDwLB
-xEHYC5PyimNE0MxH/kbINQm+ik3u28cBbhNbzfKkM+JxqUIOvKQ/dwLm/EKxWl15
-xEHYC5PyimPg6njkDcx/a4LXI+MfHNbWfywvCjeRl/T0fQTyIpclWA==
-xEHYC5PyimOQuCgWDzuDNJzjfvzgtybvfywvCjeRl/T0fQTyIpclWA==
-xEHYC5PyimOlLpDXPIWwurSL2LbT/xPdKGYaGfDHL2mUDVAInWSevrOsDNsReNLeRPB+qQ9rdKU=
-MmnONpzqj5b7W3Ekux8q5C73DbanPF9TRccUPCPq9v2crq/MRwHEjUwWBzUGIE3Fy4x6AQXguls=
-VcWnl3ReS/WiJEG5WqIaFPOj8LtFg+GJ
-BcX7V3pTwpetFaNdnKehnD/R8tJQvU4AN5m+Gay4mDc=
-BcX7V3pTwpetFaNdnKehnGbGMFTW030UPIp5tKIseY5ZOr/GQaeSWEpgEZ36UZf7
-bRU8Xd4lWq/dTZAg/dA2ZFgGDQzefWVhjuyKZVVSxxc=
-767F12U7TA7L9/eiOW3PNvOj8LtFg+GJ
-x8Xhf0IsI6jVGlpd50u+NkpgEZ36UZf7
-sPozkzJeO5QUA88Ffjsp4r73AC6YF/AdfywvCjeRl/T0fQTyIpclWA==
-hS36/7wW1bLYQHkH4ek/mxjdGWQl0x5hy4x6AQXguls=
-cgYrEOZbHFKw8mEQdSz4E/Oj8LtFg+GJ
-n4KofNyd2vY4R2AxmSq+I0pgEZ36UZf7
-b8nVx09fy5I4ol1WGH/UYwc35O/wfJWEWhqDUIQPQGM=
-GxXLVwg10cxZKfrHsoPLMnpmvKAVeqCzRPB+qQ9rdKU=
-4CgPGy6SSwl9UjjrSV1dAF/cKgeh02Cpy4x6AQXguls=
-pFdZPuCKzsz5i3FRvU5uBhL2525Y8Jlzy4x6AQXguls=
-sfDdVW5fHlb1trjY76bzOvOj8LtFg+GJ
-NiV9MVLKhXKHDjyHip04zgfkmii5BuyZ+wmNWke18BM=
-pjQ6oNqUNpDNgWyWzjfkBUkSLXgOkKuLYB+cHAiOl8tPfX7y11TKwA==
-2nSar6BjfcOCJKgpiEaOwl/cKgeh02Cpy4x6AQXguls=
-4dmt9tLfxArcemGYPMM4W3M6cjhRvLxgy4x6AQXguls=
-CK6wOt90IerSNFr9wNKob/Oj8LtFg+GJ
-j9TJ0zgrtW3XWx32zET11Xc9lFxBaLeD9RrMjQw02M5PfX7y11TKwA==
-j9TJ0zgrtW0CemFOIJjudWYAKjuUUIzqstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
-XsRueZvhAyrZenX/hyHS+gfkmii5BuyZu7hkhPiE07E=
-XsRueZvhAyoY2HrRmU8pmnfPzG5Uk11rstNvNKfkPxHoX8GccRaWYkpgEZ36UZf7
-Y0UYF4M6ChLrfZHpEMHYgUpgEZ36UZf7
-MWehmVZf6C3SNFr9wNKob/Oj8LtFg+GJ
-MWehmVZf6C1SRQKZWsra5zmXZqcwXuLSy4x6AQXguls=
-rWYaShuEwPU8js9ij9+tfFl2tDC4Deily4x6AQXguls=
-6SsNbr0oX/ax7oF3dV8rMlPq3vaS3WGD
-HCEq+yB3xiRUIm92l3iN1WDAN33wOHW69RrMjQw02M5PfX7y11TKwA==
-X6lEFzNDmIp9OfyBOiPDBSJCwkfSBhWqy4x6AQXguls=
-skgWSl8Po0/OnczYMVtnUkiU8imBtrfgy4x6AQXguls=
-QqZvghyTZW3Etpl/UCrmDnNnfPcTejy4aXBl6wZu5y0=
-AEyn6ksEetlWgHE3Y5h4coemfMvU1eABfER6RG1klik=
-R2Qp0UuOuBmx92ImtPG7wALm/EKxWl15
-WEck0+cxgSKioNaJ2OEJLEoPmHAI4936
-06uexQw4y8b+wP1ZSJe0FSJCwkfSBhWqy4x6AQXguls=
-r83+pje9TfVip1CQWTvLTfOj8LtFg+GJ
-IstZUls4S9C0PZ7rDpYw+g==
-Be6thebZitW0PZ7rDpYw+g==
-P6wUpZ7cEfLSNFr9wNKob/Oj8LtFg+GJ
-24DcSkM24SyWrgmkghmdO1Ko6ZZdPmtcIstZUls4S9C0PZ7rDpYw+g==
-24DcSkM24SyfWNoX9a3Od+cIVVBHT46ECvyKmpm5Z0Q=
-vnwU+0qImZgMfYHTbdiqgzafjRHdOXF7kZHZKTLqi55oSc+ICvgEcA==
-Wv0p/PwJHRdip1CQWTvLTfOj8LtFg+GJ
-Wv0p/PwJHRe8RbktMnXXHfOj8LtFg+GJ
-ZWQHTSD6hCvSNFr9wNKob/Oj8LtFg+GJ
-EB1+TmwsWHFLSooFBSheEecIVVBHT46ECvyKmpm5Z0Q=
-fSwdf2OLVVybhnAszwc98POj8LtFg+GJ
-xADmzjZLg26rDnbY10uRMhdFowAX23QPk0YDCbV1OWE=
-Ul8U37ddLmtgUpBCSW/6PxdFowAX23QPk0YDCbV1OWE=
-bIi9Gd5dx4UOvr8fRUm9HQT1tZsHfiBBy4x6AQXguls=
-tQqyk3JtpQRKvIGmSUkp3n8sLwo3kZf09H0E8iKXJVg=
-tQqyk3JtpQQRTjBq75VbAgfkmii5BuyZ+wmNWke18BM=
-tQqyk3JtpQROxwZ9C7+94Qfkmii5BuyZ+wmNWke18BM=
-tQqyk3JtpQTFSvfKUaOFUKvYn9sFOwi1fywvCjeRl/T0fQTyIpclWA==
-tQqyk3JtpQRkcAErkj/nUrOsDNsReNLeRPB+qQ9rdKU=
-tEm/PKNO8d3xYWtd1M6BhPOj8LtFg+GJ
-NyAak/c85ik4bE/6KHjA/hmH3vQ7kTSoXpBSJ5uhUAo=
-rT95lZHuLzm/RoLGcCoeUvOj8LtFg+GJ
-246DAPSPSX+UWPSfdoP5UPOj8LtFg+GJ
-TRi1oeyNUdOyMfjkGshymtHEM4o6ZCR6y4x6AQXguls=
-W0u07doTgmmAgbdnywkvhNHEM4o6ZCR6y4x6AQXguls=
-ubdFc9Fjb2NAHJSgJ0mhqt7SGlS0JFuG
-Thq2mIfRTdi8HjJqAapif7BzljBEfN2xy4x6AQXguls=
-8iRAY6UGp0Zb0ng1o0nHZ/Oj8LtFg+GJ
-ccapIA2Os+Sw7MyLlkc8AN7SGlS0JFuG
-hlmCVY6Y2sCyPJEuX5FlVfOj8LtFg+GJ
-gh+pwxxYTntwBAZHGE82h/Oj8LtFg+GJ
-f9vKvkRJdeDWUpDt6Xr+nkpgEZ36UZf7
-rlgWhYLTdSWdGLiDN2Hnj97SGlS0JFuG
-NxXJMZyQWz+dGLiDN2Hnj97SGlS0JFuG
-HSkrEwRQj92+DupvRV9k9N7SGlS0JFuG
-v0cw1FPyd87WUpDt6Xr+nkpgEZ36UZf7
-asbQtasot/N/NfWlTO+M8g==
-hYF2byblOfrmON+KcZNNZ9oEi1pr5Y8k
-FOjb6eu8wujVGlpd50u+NkpgEZ36UZf7

File diff suppressed because it is too large
+ 0 - 24905
bigdata-web/src/main/resources/doc_result_mapping_filter.dict


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

@@ -1,921 +0,0 @@
-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==

+ 0 - 79
bigdata-web/src/main/resources/kl_result_mapping_standword.dict

@@ -1,79 +0,0 @@
-L1EmrYbiw1OUhT2Mgp9IYw==
-ITtp7xJvm7xN85EE9UKFSw==
-wD/+T2Rb77CRvSo1kXtPNEpgEZ36UZf7
-7Mb9gmlxjvh1F9jmC1k7P883fdy234AQ
-uxw8ICp6pO5wpgcXrQMg2VJhtasX0D86
-L1EmrYbiw1OIbvEPe9JVrA==
-L1EmrYbiw1PkvbIQjSH0ig==
-F8CWtrMTFqpULF2mGv8rXkpgEZ36UZf7
-vs5IhqszS0FV5nxcKLHXX+78A3F5ApoOtoX2nv595w8=
-ITtp7xJvm7yIbvEPe9JVrA==
-MsRMye4Ce1Tzd4Q5WYcI38K6Q4zNu6SzmeHG94k7IE0=
-4TVdgXZNhk6n617WIf7gjXqAFzRaz0s/E+oKnTDMgwM=
-Izz3qmtzr5r2IotS+Hrtgdt5hAoCEWE7
-kDiWMe1LBSn7WUAQirnyfkgPjzQSs0k2rBCI2o7bKak=
-8sjigmd8+cDI/ooGhntbPA==
-srat2SPWwxguIyv673ST2QbfxHf7qINy
-ml/2hklo0UHyOdjBHhpw6PD8KRVpDE2pSmARnfpRl/s=
-0otZcLsmIrh2Hs6rzcTSZXR2BAIQaNSQ
-uxw8ICp6pO7cN+yZQPS235v06pW+h+fV
-L1EmrYbiw1M/B+Rc2AlyxA==
-gnVG/ah+09SgRGW2oBYU+OEPDCWsDtGsSmARnfpRl/s=
-ml/2hklo0UHRmEFsc/9x2xajCnoy4DJaiJbgaKVsTrQ=
-IEYbDrCxln+pW/vODY540MSGO/2qkdhdzzd93LbfgBA=
-AotDretpE0ZBFWHcMGrhB79ZnX6q3jyT
-ml/2hklo0UF7OY2n/wXeGT2+sd4EngoW
-Iif1Jo1fyT++bhIKk0opxubM/HlMOKIR
-k1Gm7uC3txeV4R0r6B0UJw==
-uxw8ICp6pO7cN+yZQPS239cJHQx8ZPvQ
-F8CWtrMTFqoniUaZHKRtDg==
-O42GEYS2XrdrGTzkULBH0kpgEZ36UZf7
-lkGXVn+qv6wGpUvQ4LCbUQbfxHf7qINy
-Z8+G5B4yQAJEwaP0L1YpIsPLHHt4XU0w
-p2ksykmrwo4sihl+rIlDVaVct0+Wq2CHEEF4xA7BbNegwlRNlXVsGDiKp8v4EWLupiYV+OrJ7h95YV9F3XyyBQ==
-4TVdgXZNhk5uKjwx+NAMWfTPF+uOpY+N
-F8CWtrMTFqowgxhDjRXyhEpgEZ36UZf7
-8dihNLZO9dsX36WzpVuRF37u779IPQ1ApHp904IlTO0=
-qFhztcYdBhFSDqcM0GqgiEpgEZ36UZf7
-Dtl+1pXSqsCf7K9ZHfGUKeT5pyumoJAc
-ml/2hklo0UHyOdjBHhpw6LIcBy6P5pyfSmARnfpRl/s=
-M70fhXofuTuHyKDY6fnNSg==
-agwII1gQdty9lYvhKCiqzS8U3XrqgX2Qav3bY6gAyDY=
-kQHtQ28+jmRAgr/8kpwGtkoFpO2Z+GK8mk4WDpuB0fM=
-L1EmrYbiw1MHlWGXOa5WbQ==
-JC9KNSWPlz/yDK/cT4Wye5J2baIy6NOV
-ZXupFoR9xZZjPoDtlfNC/A==
-vs5IhqszS0FV5nxcKLHXX7RwSUIUaOzHYqTxfQMiC+k=
-LIhCJXufKxbf6yFB4KnNr7rtJS+DwsR+
-vs5IhqszS0FV5nxcKLHXX7RwSUIUaOzHHbSHS03vfmM=
-XLKpe1H4VQhm8TLMxgEyXHG+vSuxnv1tO6MyYWiOJ+8=
-SxCOqpR2m2vgqikXUwdVYSLuXWTUWavGdSu4/NSFMh2JDVVDa5aQ2qaDIhnMf3RgNSgeLpxHM1E=
-wYpoUOLxkWFyh8xi1Rb8FaKZXwCRnuzt
-xKjH098+V6WUhT2Mgp9IYw==
-wD/+T2Rb77DCStLw9D5GqEpgEZ36UZf7
-eOtp99ION5Ds8QGp8Y0fbaA/XJb5OMRF
-TTBoaK2XBA4Ul03O+JczYJkRlKkZ9goc
-Gl9t95Qgz7iDmNITYSpk9CnCJ2qqEZhF21nfxGCpJI4=
-deJ9ShdG0Iy3IgDj49Nd+wNeAFNXO6znEuIPRVt0zxrIFF7BEQ9/q5jT4dqI9dL0uKZSIUBrfqA=
-5b10ZecEq03DkIo5s7WKJO+9h847MVcISRS2rAck6VmAbjjMVsD+tagfqsNDuH7D0Zi/2VsQQhM=
-jkwAIBuL8J2rfWt+2fRjEHK76WBBMdTh
-wD/+T2Rb77DRxndKkqpYem2vzYM7pAHX
-JFoPNMqvscDYfrYzhvi2TUpgEZ36UZf7
-o586QSXa3yeSW7t/AXaZIPTPF+uOpY+N
-QuVFY0AsqDePuV7DZypuDJvIFLIFEYbK9AhSgsk0aTOyK9+CPwy73SvTg01va5zFEzbsQLwk3co+DpVh+1RB20pgEZ36UZf7
-8q2ztLDj5WrCOGEPa6tCFpTz+I5xZDsT
-HdMzbFa8esje00No8KDgnw==
-xbaeH6dIBS3RxndKkqpYel0Yre9PRlQPBiNf+1YVhVY=
-JC9KNSWPlz932m7E2QUuLb9PY5/aDDrQ
-KXjWK7CEAInDL9KKIPcR9w==
-Dtl+1pXSqsCdXBQ/c9gkD5Tz+I5xZDsT
-Z8+G5B4yQAJkIniXV51XYQbfxHf7qINy
-OiF4bqXkMEEAhZ46GKERaQ==
-6AdBr9ESXwxuAA4RzKQl7T8g5XqLhLp48PwpFWkMTalKYBGd+lGX+w==
-Q1zDVi3U7rI9l9Q+tlWf4Ee1cgYEdEeI/hgyPNS4IPeyXSyYJNIU/qAb9hNrEulyYTDxNHZVHIA=
-wD/+T2Rb77ANCqoCZftfGUpgEZ36UZf7
-6AdBr9ESXwx67Pnnr+kPStAxGsaAxJuz
-6AdBr9ESXwxuAA4RzKQl7Qx20j9Jd6MvshwHLo/mnJ9KYBGd+lGX+w==
-yE3028GRw4t2DqtTuKPPOg==
-SZ1VckZNWlv6YxRRpZKkEoKBWdL/M3D3
-U3FxTQC11De8fGTn0OiIddGYv9lbEEIT

+ 48 - 15
bigdata-web/src/test/java/org/diagbot/AddStandWordTest.java

@@ -1,8 +1,8 @@
 package org.diagbot;
 
-import org.diagbot.bigdata.common.ApplicationCacheUtil;
-import org.diagbot.bigdata.work.ParamsDataProxy;
-import org.diagbot.common.work.SearchData;
+import org.diagbot.bigdata.work.BigDataParamsProxy;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.cache.ApplicationCacheUtil;
 import org.diagbot.nlp.participle.ParticipleUtil;
 import org.diagbot.nlp.participle.cfg.Configuration;
 import org.diagbot.nlp.participle.cfg.DefaultConfig;
@@ -11,10 +11,6 @@ import org.diagbot.nlp.participle.word.LexemePath;
 
 import java.io.IOException;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
  * @Description:
@@ -28,25 +24,62 @@ public class AddStandWordTest {
         //        for (Map.Entry<String, List<Map<String, String>>> entry:entries) {
         //            System.out.println(entry.getKey() + "\t"+ entry.getValue());
         //        }
-//        getStandWordFeatureType();
-//        ApplicationCacheUtil.getKl_result_mapping_standword_map();
-        long startTime = System.currentTimeMillis();
+        //        getStandWordFeatureType();
+        //        ApplicationCacheUtil.getKl_result_mapping_standword_map();
+        /*long startTime = System.currentTimeMillis();
         ApplicationCacheUtil.getKl_result_mapping_standword_map();
         long endCacheTime = System.currentTimeMillis();
         long cacheTime = endCacheTime - startTime;
         System.out.println("处理标准词最终用了:" + cacheTime + "毫秒.");
         SearchData searchData = new SearchData();
 //        searchData.setSymptom("血压14/43mmhg,收缩压140mmhg,血压149/43mmhg");
-        searchData.setSymptom("血压140/?");
+        searchData.setSymptom("病程6月");
         long splitStartTime = System.currentTimeMillis();
         LexemePath<Lexeme> data = ParticipleUtil.participle(searchData.getSymptom());
         ParamsDataProxy paramsDataProxy = new ParamsDataProxy();
-        paramsDataProxy.addStandWord(data, ApplicationCacheUtil.kl_result_mapping_standword_map, searchData);
+        paramsDataProxy.addStandWord(data, ApplicationCacheUtil.kl_result_mapping_standword_map, searchData,"symptom");
         long endTime = System.currentTimeMillis();
         long splitSeconds = endTime - splitStartTime;
         long seconds = endTime - startTime;
         System.out.println("添加标准词使用了:"+splitSeconds + "毫秒.");
-        System.out.println("处理文本总共使用了:"+seconds + "毫秒.");
+        System.out.println("处理文本总共使用了:"+seconds + "毫秒.");*/
+//        for (int j = 1; j < 11; j++) {
+//
+//
+//            SearchData searchData = new SearchData();
+//            BigDataParamsProxy paramsDataProxy = new BigDataParamsProxy();
+//            searchData.setSymptom("安静时心率98次/分");
+//            searchData.setOther("心率156次/分");
+//            searchData.setVital("男性43岁");
+//            searchData.setLis("Hachinski缺血积分2分");
+//            searchData.setPacs("病程9个月");
+//            searchData.setDiag("BMI12");
+//            String[] items = { searchData.getSymptom(), searchData.getOther(), searchData.getVital()
+//                    , searchData.getLis(), searchData.getPacs(), searchData.getDiag() };
+//            String[] itemsType = { "symptom", "other", "vital", "lis", "pacs", "diag" };
+//            long startTime = System.currentTimeMillis();
+//            for (int i = 0; i < items.length; i++) {
+//                if (items[i] != null) {
+//                    LexemePath<Lexeme> featureData = ParticipleUtil.participle(items[i]);
+//                    if (featureData != null) {
+//                        paramsDataProxy.addStandWord(featureData, ApplicationCacheUtil.getKl_result_mapping_standword_map(), searchData, itemsType[i]);
+//                    }
+//                }
+//            }
+//            System.out.println(searchData.getSymptom());
+//            System.out.println(searchData.getOther());
+//            System.out.println(searchData.getVital());
+//            System.out.println(searchData.getLis());
+//            System.out.println(searchData.getPacs());
+//            System.out.println(searchData.getDiag());
+//            long endTime = System.currentTimeMillis();
+//            System.out.println("处理文本总共使用了:" + (endTime - startTime) + "毫秒.");
+//            System.out.println("---------------------------第" + j + "次处理---------------------------------");
+//        }
+        //        String s = "\tsafGG\tAFASSADG";
+        //        System.out.println(s);
+        //        System.out.println(s.trim());
+
     }
 
     public static void getStandWordFeatureType() throws IOException {
@@ -83,9 +116,9 @@ public class AddStandWordTest {
                 }
             }
             int i = 1;
-            for (Lexeme lexeme:lexemes) {
+            for (Lexeme lexeme : lexemes) {
                 if (lexeme.getProperty().contains(",")) {
-                    ApplicationCacheUtil.setProterty(lexeme);
+//                    ApplicationCacheUtil.setProterty(lexeme);
                 }
                 if (lexemes.size() != i) {
                     System.out.print(lexeme.getText() + "(" + lexeme.getProperty() + ")|");

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

@@ -26,7 +26,7 @@ public class CacheFileManagerTest {
     }
 
     public void contextMappingInitialized() {
-        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "lantone", "jdbc:mysql://192.168.2.121:3306/med?useUnicode=true&characterEncoding=UTF-8");
         Connection conn = nlpJdbc.connect();
         Statement st = null;
         ResultSet rs = null;

+ 135 - 0
bigdata-web/src/test/java/org/diagbot/EyeHospitalData.java

@@ -0,0 +1,135 @@
+package org.diagbot;
+
+import org.diagbot.pub.jdbc.MysqlJdbc;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.sql.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.Date;
+import java.util.stream.Collectors;
+
+/**
+ * Created by louhr on 2019/9/3.
+ */
+public class EyeHospitalData {
+
+    public static void main(String[] args) {
+//        EyeHospitalData ehl = new EyeHospitalData();
+//        Connection conn = ehl.createOracleJdbc();
+//        ehl.queryHospitalInput(conn);
+    }
+
+//    private List<Map<String, Object>> queryHospitalInput(Connection conn) {
+//        PreparedStatement pstmt = null;
+//        ResultSet rs = null;
+//        List<Map<String, Object>> list = new ArrayList<>();
+//        String ipid = "";
+//        try {
+//
+//            DateFormat df = new SimpleDateFormat("yyyyMMdd");
+//
+//            Calendar cal = Calendar.getInstance();
+//            cal.setTime(new Date());
+//            String end_time = df.format(cal.getTime());
+//
+//            cal.add(Calendar.DATE, -7);
+//            String start_time = df.format(cal.getTime());
+//
+//
+//            int record_cnt = 1;
+//
+//            while (start_time.compareTo("20190801") > -1) {
+//                System.out.println(start_time + "..." + end_time);
+//
+//                String sql = "select xml_cont, ipid, pid, dept_name, dept_code, create_time from inpcase.hospital_record " +
+//                        "where substr(create_time, 0, 8) > '" + start_time + "' and substr(create_time, 0, 8) <= '" + end_time + "'";
+//                pstmt = conn.prepareStatement(sql);
+//                //建立一个结果集,用来保存查询出来的结果
+//                rs = pstmt.executeQuery();
+//
+//
+//                while (rs.next()) {
+//                    if (record_cnt % 100 == 0) {
+//                        System.out.println("已查询" + record_cnt + "行数据!");
+//                    }
+//                    Map<String, Object> map = new HashMap<>();
+//                    OracleResultSet ors = (OracleResultSet) rs;
+//                    OPAQUE op = ors.getOPAQUE(1);
+//                    ipid = ors.getString(2);
+//                    String pid = ors.getString(3);
+//                    String dept_name = ors.getString(4);
+//                    String dept_code = ors.getString(5);
+//                    String create_time = ors.getString(6);
+//
+//                    XMLType xml = XMLType.createXML(op);
+//                    String xml_cont = xml.getStringVal();
+//                    xml_cont = xml_cont.substring(xml_cont.indexOf("<text>") + 6, xml_cont.indexOf("</text>"));
+//
+//                    String sex = xml_cont.substring(xml_cont.indexOf("性  别:") + 5, xml_cont.indexOf("性  别:") + 8);
+//                    String age = xml_cont.substring(xml_cont.indexOf("年  龄:") + 5, xml_cont.indexOf("年  龄:") + 8);
+//                    String marry = xml_cont.substring(xml_cont.indexOf("婚  姻:") + 5, xml_cont.indexOf("婚  姻:") + 8);
+//                    String in_hospital = xml_cont.substring(xml_cont.indexOf("入院日期:") + 5, xml_cont.indexOf("入院日期:") + 22);
+//                    String content = xml_cont.substring(xml_cont.indexOf("主  诉:"), xml_cont.indexOf("医师签名:"));
+//
+//                    map.put("ipid", ipid);
+//                    map.put("pid", pid);
+//                    map.put("dept_name", dept_name);
+//                    map.put("dept_code", dept_code);
+//                    map.put("create_time", create_time);
+//                    map.put("sex", sex);
+//                    map.put("age", age);
+//                    map.put("marry", marry);
+//                    map.put("in_hospital", in_hospital);
+//                    map.put("content", content);
+//
+//                    System.out.println(sex);
+//                    System.out.println(age);
+//                    System.out.println(marry);
+//                    System.out.println(in_hospital);
+//                    System.out.println(content);
+//
+//                    list.add(map);
+//
+//                    record_cnt++;
+//                }
+//
+//                end_time = start_time;
+//                cal.add(Calendar.DATE, -7);
+//                start_time = df.format(cal.getTime());
+//            }
+//        } catch (Exception e) {
+//            System.out.println(ipid);
+//            e.printStackTrace();
+//        } finally {
+//            try {
+//                rs.close();
+//                pstmt.close();
+//            }catch (SQLException sqle) {
+//                sqle.printStackTrace();
+//            }
+//        }
+//        return list;
+//    }
+//
+//    private void insertMysql(List<Map<String, Object>> list) {
+//        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "", "jdbc:mysql://127.0.0.1:3306/eye_hospital?useUnicode=true&characterEncoding=UTF-8");
+//        nlpJdbc.insert(list, "hospital_record", new String[]{"ipid", "pid", "dept_name", "dept_code", "create_time", "sex", "age", "marry", "in_hospital", "content"});
+//    }
+//
+//    private Connection createOracleJdbc() {
+//        Connection conn = null;
+//        try {
+//            Class.forName("oracle.jdbc.driver.OracleDriver");
+//            conn = DriverManager.getConnection("jdbc:oracle:thin:@//172.17.1.143:1521/orc1",
+//                    "louhr", "louhr");
+//            return conn;
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//        return conn;
+//    }
+}

+ 17 - 0
common-push/pom.xml

@@ -17,6 +17,23 @@
     <url>http://www.example.com</url>
 
     <dependencies>
+        <dependency>
+            <groupId>org.diagbot</groupId>
+            <artifactId>public</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.diagbot</groupId>
+            <artifactId>nlp</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.diagbot</groupId>
+            <artifactId>common-service</artifactId>
+            <version>1.0.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 34 - 0
common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java

@@ -0,0 +1,34 @@
+package org.diagbot.common.push.bean;
+
+/**
+ * Created by louhr on 2019/8/31.
+ */
+public class CrisisDetail {
+    private String remindText;
+    private String standardText;
+    private String originText;
+
+    public String getRemindText() {
+        return remindText;
+    }
+
+    public void setRemindText(String remindText) {
+        this.remindText = remindText;
+    }
+
+    public String getStandardText() {
+        return standardText;
+    }
+
+    public void setStandardText(String standardText) {
+        this.standardText = standardText;
+    }
+
+    public String getOriginText() {
+        return originText;
+    }
+
+    public void setOriginText(String originText) {
+        this.originText = originText;
+    }
+}

+ 1 - 1
common-service/src/main/java/org/diagbot/common/work/FeatureRate.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.work;
+package org.diagbot.common.push.bean;
 
 /**
  * Created by fyeman on 2018/1/17.

+ 1 - 1
common-service/src/main/java/org/diagbot/common/work/LisDetail.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.work;
+package org.diagbot.common.push.bean;
 
 public class LisDetail {
     private String detailName;

+ 79 - 0
common-push/src/main/java/org/diagbot/common/push/bean/PreResult.java

@@ -0,0 +1,79 @@
+package org.diagbot.common.push.bean;
+
+/**
+ * Created by louhr on 2019/8/31.
+ */
+public class PreResult {
+    private String detailName = "";
+    private String uniqueName = "";
+    private String maxValue = "";
+    private String minValue = "";
+    private String name = "";
+    private String otherValue = "";
+    private String units = "";
+    private String value = "";
+
+    public String getDetailName() {
+        return detailName;
+    }
+
+    public void setDetailName(String detailName) {
+        this.detailName = detailName;
+    }
+
+    public String getUniqueName() {
+        return uniqueName;
+    }
+
+    public void setUniqueName(String uniqueName) {
+        this.uniqueName = uniqueName;
+    }
+
+    public String getMaxValue() {
+        return maxValue;
+    }
+
+    public void setMaxValue(String maxValue) {
+        this.maxValue = maxValue;
+    }
+
+    public String getMinValue() {
+        return minValue;
+    }
+
+    public void setMinValue(String minValue) {
+        this.minValue = minValue;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getOtherValue() {
+        return otherValue;
+    }
+
+    public void setOtherValue(String otherValue) {
+        this.otherValue = otherValue;
+    }
+
+    public String getUnits() {
+        return units;
+    }
+
+    public void setUnits(String units) {
+        this.units = units;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

+ 24 - 4
common-service/src/main/java/org/diagbot/common/work/ResponseData.java

@@ -1,7 +1,7 @@
-package org.diagbot.common.work;
-import com.alibaba.fastjson.JSONObject;
-import org.diagbot.common.javabean.Filnlly;
-import org.diagbot.common.javabean.MedicalIndication;
+package org.diagbot.common.push.bean;
+
+import org.diagbot.common.push.bean.neo4j.Filnlly;
+import org.diagbot.common.push.bean.neo4j.MedicalIndication;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -21,6 +21,8 @@ public class ResponseData {
     private List<FeatureRate> pacs = new ArrayList<>(10);
     private List<FeatureRate> history = new ArrayList<>(10);
 
+    private List<FeatureRate> beforeCombineDis = new ArrayList<>(10);
+
     private Map<String, Filnlly> treat = new HashMap<>();
     private List<FeatureRate> graphWords = new ArrayList<>(10);
     private List<MedicalIndication> medicalIndications;//量表和指标推送
@@ -29,6 +31,8 @@ public class ResponseData {
     private List<String> diffDiag;//鉴别诊断
     private List<String> excludeDiag; //排除诊断
 
+    private Map<String, List<CrisisDetail>> crisisDetails = new HashMap<>();
+
     public List<String> getDiffDiag() {
         return diffDiag;
     }
@@ -150,4 +154,20 @@ public class ResponseData {
     public void setHistory(List<FeatureRate> history) {
         this.history = history;
     }
+
+    public List<FeatureRate> getBeforeCombineDis() {
+        return beforeCombineDis;
+    }
+
+    public void setBeforeCombineDis(List<FeatureRate> beforeCombineDis) {
+        this.beforeCombineDis = beforeCombineDis;
+    }
+
+    public Map<String, List<CrisisDetail>> getCrisisDetails() {
+        return crisisDetails;
+    }
+
+    public void setCrisisDetails(Map<String, List<CrisisDetail>> crisisDetails) {
+        this.crisisDetails = crisisDetails;
+    }
 }

+ 1 - 1
bigdata-web/src/main/java/org/diagbot/bigdata/dao/model/ResultMappingFilter.java

@@ -1,4 +1,4 @@
-package org.diagbot.bigdata.dao.model;
+package org.diagbot.common.push.bean;
 
 
 public class ResultMappingFilter {

+ 143 - 0
common-push/src/main/java/org/diagbot/common/push/bean/Rule.java

@@ -0,0 +1,143 @@
+package org.diagbot.common.push.bean;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 触发规则
+ * @author Mark Huang
+ * @since 27/08/2019
+ */
+@Getter
+@Setter
+public class Rule {
+    private String id = "";
+    // 大类名称
+    private String pub_name = "";
+    // 最小值比较符
+    private String min_operator = "";
+    // 最小值
+    private String min_value = "";
+    // 最小值单位
+    private String min_unit = "";
+    // 最大值比较符
+    private String max_operator = "";
+    // 最大值
+    private String max_value = "";
+    // 最大值单位
+    private String max_unit = "";
+    // 标准值 用作等于
+    private String eq_operator = "";
+    // 标准值
+    private String eq_value = "";
+    // 标准值单位
+    private String eq_unit = "";
+    //提醒信息
+    private String remind = "";
+    //提醒信息
+    private String originText = "";
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPub_name() {
+        return pub_name;
+    }
+
+    public void setPub_name(String pub_name) {
+        this.pub_name = pub_name;
+    }
+
+    public String getMin_operator() {
+        return min_operator;
+    }
+
+    public void setMin_operator(String min_operator) {
+        this.min_operator = min_operator;
+    }
+
+    public String getMin_value() {
+        return min_value;
+    }
+
+    public void setMin_value(String min_value) {
+        this.min_value = min_value;
+    }
+
+    public String getMin_unit() {
+        return min_unit;
+    }
+
+    public void setMin_unit(String min_unit) {
+        this.min_unit = min_unit;
+    }
+
+    public String getMax_operator() {
+        return max_operator;
+    }
+
+    public void setMax_operator(String max_operator) {
+        this.max_operator = max_operator;
+    }
+
+    public String getMax_value() {
+        return max_value;
+    }
+
+    public void setMax_value(String max_value) {
+        this.max_value = max_value;
+    }
+
+    public String getMax_unit() {
+        return max_unit;
+    }
+
+    public void setMax_unit(String max_unit) {
+        this.max_unit = max_unit;
+    }
+
+    public String getEq_operator() {
+        return eq_operator;
+    }
+
+    public void setEq_operator(String eq_operator) {
+        this.eq_operator = eq_operator;
+    }
+
+    public String getEq_value() {
+        return eq_value;
+    }
+
+    public void setEq_value(String eq_value) {
+        this.eq_value = eq_value;
+    }
+
+    public String getEq_unit() {
+        return eq_unit;
+    }
+
+    public void setEq_unit(String eq_unit) {
+        this.eq_unit = eq_unit;
+    }
+
+    public String getRemind() {
+        return remind;
+    }
+
+    public void setRemind(String remind) {
+        this.remind = remind;
+    }
+
+    public String getOriginText() {
+        return originText;
+    }
+
+    public void setOriginText(String originText) {
+        this.originText = originText;
+    }
+}

+ 45 - 0
common-push/src/main/java/org/diagbot/common/push/bean/RuleApp.java

@@ -0,0 +1,45 @@
+package org.diagbot.common.push.bean;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/9/3 13:21
+ */
+public class RuleApp {
+    private String id;
+    private String ruleIds;
+    private String typeId;
+    private String remind;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getRuleIds() {
+        return ruleIds;
+    }
+
+    public void setRuleIds(String ruleIds) {
+        this.ruleIds = ruleIds;
+    }
+
+    public String getTypeId() {
+        return typeId;
+    }
+
+    public void setTypeId(String typeId) {
+        this.typeId = typeId;
+    }
+
+    public String getRemind() {
+        return remind;
+    }
+
+    public void setRemind(String remind) {
+        this.remind = remind;
+    }
+}

+ 53 - 4
common-service/src/main/java/org/diagbot/common/work/SearchData.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.work;
+package org.diagbot.common.push.bean;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -23,7 +23,8 @@ public class SearchData {
     protected String resourceType;
     //外部系统编码 用于返回映射数据,如果sysCode为空或null,则返回kl_standard_info标准名称
     protected String sysCode;
-    private List<LisDetail> lisArr = new ArrayList<>();
+    private List<PreResult> lisArr = new ArrayList<>();
+    protected String normal  = "";
     protected String chief  = "";
     protected String symptom = "";
     protected String vital = "";
@@ -32,6 +33,12 @@ public class SearchData {
     protected String diag = "";
     protected String past = "";
     protected String other = "";
+    //当前开单lis项目
+    protected String lisOrder = "";
+    //当前开单pacs项目
+    protected String pacsOrder = "";
+    //当前开单其他 预留
+    protected String otherOrder = "";
     //大数据推送诊断结果信息
     protected List<FeatureRate> pushDiags = new ArrayList<>();
 
@@ -48,6 +55,8 @@ public class SearchData {
     private Map<String, Map<String, String>> graphInputs = new HashMap<>(10, 0.8f);
     //阴性 页面录入数据需要对结果过滤的集合
     private Map<String, Map<String, String>> filters = new HashMap<>(10, 0.8f);
+    //满足规则的ID集合
+    private Map<String, List<Rule>> rules = new HashMap<>();
 
     public Integer getDisType() {
         return disType;
@@ -57,11 +66,11 @@ public class SearchData {
         this.disType = disType;
     }
 
-    public List<LisDetail> getLisArr() {
+    public List<PreResult> getLisArr() {
         return lisArr;
     }
 
-    public void setLisArr(List<LisDetail> lisArr) {
+    public void setLisArr(List<PreResult> lisArr) {
         this.lisArr = lisArr;
     }
 
@@ -151,6 +160,14 @@ public class SearchData {
         this.inputs = inputs;
     }
 
+    public String getNormal() {
+        return normal;
+    }
+
+    public void setNormal(String normal) {
+        this.normal = normal;
+    }
+
     public String getChief() {
         return chief;
     }
@@ -262,4 +279,36 @@ public class SearchData {
     public void setGraphInputs(Map<String, Map<String, String>> graphInputs) {
         this.graphInputs = graphInputs;
     }
+
+    public String getLisOrder() {
+        return lisOrder;
+    }
+
+    public void setLisOrder(String lisOrder) {
+        this.lisOrder = lisOrder;
+    }
+
+    public String getPacsOrder() {
+        return pacsOrder;
+    }
+
+    public void setPacsOrder(String pacsOrder) {
+        this.pacsOrder = pacsOrder;
+    }
+
+    public String getOtherOrder() {
+        return otherOrder;
+    }
+
+    public void setOtherOrder(String otherOrder) {
+        this.otherOrder = otherOrder;
+    }
+
+    public Map<String, List<Rule>> getRules() {
+        return rules;
+    }
+
+    public void setRules(Map<String, List<Rule>> rules) {
+        this.rules = rules;
+    }
 }

+ 1 - 1
common-service/src/main/java/org/diagbot/common/javabean/Detail.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 /**
  * 指标的详细信息

+ 1 - 1
common-service/src/main/java/org/diagbot/common/javabean/Drugs.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import java.util.LinkedList;
 

+ 1 - 2
common-service/src/main/java/org/diagbot/common/javabean/Filnlly.java

@@ -1,8 +1,7 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 public class Filnlly {
     private List<Indicators> adverseEvent;

+ 1 - 1
common-service/src/main/java/org/diagbot/common/javabean/FuzhenFilnlly.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import java.util.ArrayList;
 import java.util.Map;

+ 1 - 1
common-service/src/main/java/org/diagbot/common/javabean/Indicators.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import java.util.List;
 

+ 1 - 1
common-service/src/main/java/org/diagbot/common/javabean/MangementEvaluation.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import com.alibaba.fastjson.JSONObject;
 

+ 12 - 1
common-service/src/main/java/org/diagbot/common/javabean/MedicalIndication.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import java.util.List;
 
@@ -7,6 +7,8 @@ import java.util.List;
  */
 public class MedicalIndication {
     private String name;
+    // 触发推送的规则
+    private String rule;
     private List<MedicalIndicationDetail> details;
 
     public String getName() {
@@ -17,6 +19,14 @@ public class MedicalIndication {
         this.name = name;
     }
 
+    public String getRule() {
+        return rule;
+    }
+
+    public void setRule(String rule) {
+        this.rule = rule;
+    }
+
     public List<MedicalIndicationDetail> getDetails() {
         return details;
     }
@@ -24,4 +34,5 @@ public class MedicalIndication {
     public void setDetails(List<MedicalIndicationDetail> details) {
         this.details = details;
     }
+
 }

+ 2 - 2
common-service/src/main/java/org/diagbot/common/javabean/MedicalIndicationDetail.java

@@ -1,9 +1,9 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 import com.alibaba.fastjson.JSONObject;
 
 public class MedicalIndicationDetail {
-    private Integer type;//1-量表,2-公式,3-其他指标
+    private Integer type;//1-量表,2-公式,3-其他指标,4-危急值
     private JSONObject content;
 
     public Integer getType() {

+ 1 - 1
common-service/src/main/java/org/diagbot/common/javabean/Medicition.java

@@ -1,4 +1,4 @@
-package org.diagbot.common.javabean;
+package org.diagbot.common.push.bean.neo4j;
 
 /**
  * 药

+ 157 - 0
common-push/src/main/java/org/diagbot/common/push/cache/ApplicationCacheUtil.java

@@ -0,0 +1,157 @@
+package org.diagbot.common.push.cache;
+
+import org.diagbot.common.push.bean.ResultMappingFilter;
+import org.diagbot.common.push.bean.Rule;
+import org.diagbot.common.push.bean.RuleApp;
+import org.diagbot.nlp.participle.cfg.Configuration;
+import org.diagbot.nlp.participle.cfg.DefaultConfig;
+import org.diagbot.nlp.util.NlpCache;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ApplicationCacheUtil {
+
+    //词库同义词定义
+    public static Map<String, Map<String, String>> standard_info_synonym_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, List<Rule>> kl_rule_filter_map = null;
+    //危险值提醒
+    public static Map<String, RuleApp> kl_rule_app_filter_map = null;
+
+    public static Map<String, Map<String, String>> getStandard_info_synonym_map() {
+        if (standard_info_synonym_map == null) {
+            standard_info_synonym_map = NlpCache.getStandard_info_synonym_map();
+        }
+        return standard_info_synonym_map;
+    }
+
+    public static Map<String, String> getDoc_result_mapping_diag_map() {
+        if (doc_result_mapping_diag_map == null) {
+            createDoc_result_mapping_diag_map();
+        }
+        return doc_result_mapping_diag_map;
+    }
+
+    public static Map<String, String> createDoc_result_mapping_diag_map() {
+        Configuration configuration = new DefaultConfig();
+        doc_result_mapping_diag_map = configuration.loadMapDict("bigdata_diag_2_dept.dict");
+        return doc_result_mapping_diag_map;
+    }
+
+    public static Map<String, Map<String, ResultMappingFilter>> getDoc_result_mapping_filter_map() {
+        if (doc_result_mapping_filter_map == null) {
+            createDoc_result_mapping_filter_map();
+        }
+        return doc_result_mapping_filter_map;
+    }
+
+    public static Map<String, Map<String, ResultMappingFilter>> createDoc_result_mapping_filter_map() {
+        Configuration configuration = new DefaultConfig();
+        List<String> fileContents = configuration.readFileContents("bigdata_sex_age_filter.dict");
+        String[] line_string;
+        List<ResultMappingFilter> resultMappingFilters = new ArrayList<>();
+        try {
+            for (int i = 0; i < fileContents.size(); i++) {
+                line_string = org.apache.commons.lang3.StringUtils.split(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();
+        }
+
+        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;
+    }
+
+
+    public static Map<String, List<Rule>> getKl_rule_filter_map() {
+        if (kl_rule_filter_map == null) {
+            create_kl_rule_filter_map();
+        }
+        return kl_rule_filter_map;
+    }
+
+    public static void create_kl_rule_filter_map() {
+        kl_rule_filter_map = new HashMap<>();
+
+        Configuration configuration = new DefaultConfig();
+        List<String> fileContents = configuration.readFileContents("bigdata_rule_filter.dict");
+
+        List<Rule> rules = null;
+        for (String line : fileContents) {
+            String[] content = line.split("\\|", -1);
+            Rule rule = new Rule();
+            if (content.length == 12) {
+                rule.setId(content[0] == null ? "" : content[0]);
+                rule.setPub_name(content[1] == null ? "" : content[1]);
+                rule.setMin_operator(content[2] == null ? "" : content[2]);
+                rule.setMin_value(content[3] == null ? "" : content[3]);
+                rule.setMin_unit(content[4] == null ? "" : content[4]);
+                rule.setMax_operator(content[5] == null ? "" : content[5]);
+                rule.setMax_value(content[6] == null ? "" : content[6]);
+                rule.setMax_unit(content[7] == null ? "" : content[7]);
+                rule.setEq_operator(content[8] == null ? "" : content[8]);
+                rule.setEq_value(content[9] == null ? "" : content[9]);
+                rule.setEq_unit(content[10] == null ? "" : content[10]);
+                rule.setRemind(content[11] == null ? "" : content[11]);
+                if (kl_rule_filter_map.get(rule.getPub_name()) == null) {
+                    rules = new ArrayList<>();
+                } else {
+                    rules = kl_rule_filter_map.get(rule.getPub_name());
+                }
+                rules.add(rule);
+                kl_rule_filter_map.put(rule.getPub_name(), rules);
+            }
+        }
+    }
+
+    public static Map<String, RuleApp> getKl_rule_app_filter_map() {
+        if (kl_rule_app_filter_map == null) {
+            create_kl_rule_app_filter_map();
+        }
+        return kl_rule_app_filter_map;
+    }
+
+    public static void create_kl_rule_app_filter_map() {
+        kl_rule_app_filter_map = new HashMap<>();
+
+        Configuration configuration = new DefaultConfig();
+        List<String> fileContents = configuration.readFileContents("bigdata_rule_app_filter.dict");
+
+        for (String line : fileContents) {
+            String[] content = line.split("\\|", -1);
+            RuleApp ruleApp = new RuleApp();
+            if (content.length == 4) {
+                ruleApp.setId(content[0] == null ? "" : content[0]);
+                ruleApp.setRuleIds(content[1] == null ? "" : content[1]);
+                ruleApp.setTypeId(content[2] == null ? "" : content[2]);
+                ruleApp.setRemind(content[3] == null ? "" : content[3]);
+                kl_rule_app_filter_map.put(ruleApp.getId(), ruleApp);
+            }
+        }
+    }
+}

+ 423 - 0
common-push/src/main/java/org/diagbot/common/push/cache/CacheFileManager.java

@@ -0,0 +1,423 @@
+package org.diagbot.common.push.cache;
+
+import org.diagbot.pub.jdbc.MysqlJdbc;
+import org.diagbot.pub.utils.PropertiesUtil;
+import org.diagbot.pub.utils.security.EncrypDES;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import java.io.File;
+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.*;
+
+/**
+ * Created by louhr on 2019/8/16.
+ */
+public class CacheFileManager {
+    Logger logger = LoggerFactory.getLogger(CacheFileManager.class);
+
+    private String user = "root";
+    private String password = "lantone";
+    private String url = "jdbc:mysql://192.168.2.121:3306/med?useUnicode=true&characterEncoding=UTF-8";
+
+    private String path = "";
+
+    public static void main(String[] args) {
+        CacheFileManager cacheFileManager = new CacheFileManager();
+        PropertiesUtil propertiesUtil = new PropertiesUtil("nlp.properties");
+        String p = propertiesUtil.getProperty("cache.file.dir");
+        File file = new File(p);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        //自然语言处理
+        cacheFileManager.createNlpCacheFile(p);
+        //大数据
+        cacheFileManager.createBigDataCacheFile(p);
+        //图谱
+        cacheFileManager.createGraphCacheFile(p);
+    }
+
+    public CacheFileManager() {
+        PropertiesUtil propertiesUtil = new PropertiesUtil("nlp.properties");
+        String p = propertiesUtil.getProperty("cache.file.dir");
+        File file = new File(p);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        logger.info("cache file path...." + p);
+        path = p;
+    }
+
+    public void createCacheFile() {
+        createNlpCacheFile(path);
+        createGraphCacheFile(path);
+        createBigDataCacheFile(path);
+    }
+
+    public void createNlpCacheFile() {
+        createNlpCacheFile(path);
+    }
+
+    public void createNlpCacheFile(String path) {
+        MysqlJdbc nlpJdbc = new MysqlJdbc(user, password, url);
+        Connection conn = nlpJdbc.connect();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            EncrypDES encrypDES = new EncrypDES();
+            //所有词典库 不能用concat_group 大小写不区分
+            String sql = "select l_1.name l_1_name, l_1.type_id type_id, l_2.name l_2_name, kc.lib_name from kl_library_info l_1\n" +
+                    "                    left join kl_library_info l_2 on l_1.concept_id = l_2.concept_id and l_2.is_concept = 1\n" +
+                    "left join kl_concept kc on l_1.concept_id = kc.id\n" +
+                    "where kc.is_deleted = 'N' ";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            FileWriter fw = new FileWriter(path + "tc.dict");
+
+            Map<String, String> idMap = new HashMap<>(10);
+            Map<String, String> nameMap = new HashMap<>(10);
+            String r1;
+            String r2;
+            String r3;
+            while (rs.next()) {
+                r1 = rs.getString(1);
+                r2 = rs.getString(2);
+                r3 = rs.getString(4);
+                if (idMap.get(r1) == null) {
+                    idMap.put(r1, r2);
+                    nameMap.put(r1, r3);
+                } else if (idMap.get(r1) != null) {
+                    idMap.put(r1, idMap.get(r1) + "," + r2);
+                    nameMap.put(r1, nameMap.get(r1) + "," + r3);
+                }
+            }
+
+            List<Map.Entry<String, String>> libraryList = new ArrayList<Map.Entry<String, String>>(idMap.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());
+                }
+            });
+            for (Map.Entry<String, String> entry : libraryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|9|"
+                        + entry.getValue() + "|" + nameMap.get(entry.getKey())));
+                fw.write("\n");
+            }
+
+            fw.close();
+
+            sql = "SELECT l_1.name l_1_name, l_2.name l_2_name, l_1.type_id FROM kl_library_info l_1 " +
+                    "left join kl_library_info l_2 on l_1.concept_id = l_2.concept_id and l_2.is_concept = '1' " +
+                    "where l_1.is_concept = '0'";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+
+            fw = new FileWriter(path + "synonym.dict");
+            while (rs.next()) {
+                r1 = rs.getString(1);
+                r2 = rs.getString(2);
+                r3 = rs.getString(3);
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3));
+                fw.write("\n");
+            }
+            fw.close();
+
+            sql = "SELECT l_1.name l_1_name, l_2.name l_2_name FROM kl_relation r " +
+                    "left join kl_concept c1 on r.start_id = c1.id " +
+                    "left join kl_concept c2 on r.end_id = c2.id " +
+                    "left join kl_library_info l_1 on l_1.id = c1.lib_id " +
+                    "left join kl_library_info l_2 on l_2.id = c2.lib_id where r.relation_id = 3";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+
+            libraryList = rsToMap(rs, false);
+
+            fw = new FileWriter(path + "chronic.dict");
+            for (Map.Entry<String, String> entry : libraryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+
+            //推送词典
+            sql = "select k1.lib_name k1_lib_name, k2.lib_name k2_lib_name from kl_relation r " +
+                    "left join kl_concept k1 on k1.id = r.start_id " +
+                    "left join kl_concept k2 on k2.id = r.end_id " +
+                    "where r.relation_id = 19 and k1.is_deleted = 'N' and k2.is_deleted = 'N' and k1.lib_type = 1 and k2.lib_type = 1";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            libraryList = rsToMap(rs, true);
+
+            fw = new FileWriter(path + "push-tc.dict");
+            for (Map.Entry<String, String> entry : libraryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+
+            fw = new FileWriter(path + "classify.dict");
+            fw.close();
+        } catch (IOException ioe) {
+            ioe.printStackTrace();
+        } catch (SQLException sqle) {
+            sqle.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
+    }
+
+    public void createGraphCacheFile() {
+        createGraphCacheFile(path);
+    }
+
+    public void createGraphCacheFile(String path) {
+        MysqlJdbc nlpJdbc = new MysqlJdbc(user, password, url);
+        Connection conn = nlpJdbc.connect();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            //疾病I、II类
+            EncrypDES encrypDES = new EncrypDES();//加密对象
+            String sql = "SELECT con.lib_name, dis.classify from kl_disease dis, kl_concept con where dis.concept_id = con.id";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            FileWriter fw = new FileWriter(path + "graph_diag_classify.dict");
+            String r2, r3;
+            while (rs.next()) {
+                r2 = rs.getString(1);//疾病名称
+                r3 = rs.getString(2);//疾病类别
+                fw.write(encrypDES.encrytor(r2 + "|" + r3));
+                fw.write("\n");
+            }
+            fw.close();
+            //性别年龄
+            sql = "SELECT k1.lib_name, k1.lib_type, kcc.sex_type, kcc.min_age, kcc.max_age \n" +
+                    "FROM kl_concept_common kcc, kl_concept k1 \n" +
+                    "where kcc.concept_id = k1.id \n" +
+                    "and k1.lib_type in (18)";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "graph_sex_age_filter.dict");
+            String r1, r4, r5;
+            while (rs.next()) {
+                r1 = rs.getString(1);//术语名称
+                r2 = rs.getString(3);//sexType 1:男 2:女 3:都可以
+                r3 = rs.getString(4);//min_age
+                r4 = rs.getString(5);//max_age
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3 + "|" + r4));
+                fw.write("\n");
+            }
+            fw.close();
+            //体征结果转体征指标
+            sql = "SELECT\n" +
+                    "\ti1.lib_name name1,\n" +
+                    "\ti2.lib_name name2 \n" +
+                    "FROM\n" +
+                    "\t`kl_relation` l \n" +
+                    "\tLEFT JOIN kl_concept i1 ON l.start_id = i1.id \n" +
+                    "\tLEFT JOIN kl_concept i2 ON l.end_id = i2.id \n" +
+                    "where l.relation_id=19 AND i1.lib_type=35 AND i2.lib_type=33 AND l.is_deleted='N'";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "graph_vital_convert.dict");
+            while (rs.next()) {
+                r1 = rs.getString(1);//体征结果
+                r2 = rs.getString(2);//体征指标
+                fw.write(encrypDES.encrytor(r1 + "|" + r2));
+                fw.write("\n");
+            }
+            fw.close();
+            //疾病科室信息
+            sql = "SELECT k1.lib_name diag_name, k2.lib_name dept_name FROM kl_concept_common kcc, kl_concept k1, kl_concept k2 " +
+                    "where kcc.concept_id = k1.id and kcc.dept_id = k2.id " +
+                    "and k1.lib_type = 18 and kcc.dept_id  is not null";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            List<Map.Entry<String, String>> libaryList = rsToMap(rs, true);
+            fw = new FileWriter(path + "graph_diag_2_dept.dict");
+            for (Map.Entry<String, String> entry : libaryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+
+            sql = "SELECT g.diag_level1,g.diag_level2,g.diag_level3 FROM `kl_disease_normalize` g ";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "graph_diag_normalize.dict");
+            while (rs.next()) {
+                r1 = rs.getString(1);
+                r2 = rs.getString(2);
+                r3 = rs.getString(3);
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3));
+                fw.write("\n");
+            }
+            fw.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
+    }
+
+    public void createBigDataCacheFile() {
+        createBigDataCacheFile(path);
+    }
+
+    public void createBigDataCacheFile(String path) {
+        MysqlJdbc nlpJdbc = new MysqlJdbc(user, password, url);
+        Connection conn = nlpJdbc.connect();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            EncrypDES encrypDES = new EncrypDES();
+            //疾病科室
+            String sql = "SELECT k1.lib_name diag_name, k2.lib_name dept_name FROM kl_concept_common kcc, kl_concept k1, kl_concept k2 " +
+                    "where kcc.concept_id = k1.id and kcc.dept_id = k2.id " +
+                    "and k1.lib_type = 18 and kcc.dept_id  is not null";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            List<Map.Entry<String, String>> libraryList = rsToMap(rs, true);
+
+            FileWriter fw = new FileWriter(path + "bigdata_diag_2_dept.dict");
+            for (Map.Entry<String, String> entry : libraryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+
+            //性别年龄
+            sql = "SELECT k1.lib_name, k1.lib_type, kcc.sex_type, kcc.min_age, kcc.max_age " +
+                    "FROM kl_concept_common kcc, kl_concept k1 " +
+                    "where kcc.concept_id = k1.id " +
+                    "and k1.lib_type in (1, 18)";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "bigdata_sex_age_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);
+                if ("18".equals(r2)) {
+                    r2 = "2";
+                }
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3 + "|" + r4 + "|" + r5));
+                fw.write("\n");
+            }
+            fw.close();
+
+            sql = "SELECT lib_name FROM kl_concept WHERE is_deleted = 'N' AND lib_type = 70 AND lib_name regexp '[0-9]'";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+
+            fw = new FileWriter(path + "bigdata_value_analyze.dict");
+            while (rs.next()) {
+                fw.write(encrypDES.encrytor(rs.getString(1)));
+                fw.write("\n");
+            }
+            fw.close();
+
+            //规则过滤信息
+            sql = "SELECT id, pub_name, min_operator, min_value, min_unit, max_operator, max_value, " +
+                    "max_unit, eq_operator, eq_value, eq_unit, remind FROM kl_rule_pub";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "bigdata_rule_filter.dict");
+            String r6, r7, r8, r9, r10, r11, r12;
+            while (rs.next()) {
+                r1 = String.valueOf(rs.getInt(1));
+                r2 = rs.getString(2);
+                r3 = rs.getString(3);
+                r4 = rs.getString(4);
+                r5 = rs.getString(5);
+                r6 = rs.getString(6);
+                r7 = rs.getString(7);
+                r8 = rs.getString(8);
+                r9 = rs.getString(9);
+                r10 = rs.getString(10);
+                r11 = rs.getString(11);
+                r12 = rs.getString(12);
+                r1 = StringUtils.isEmpty(r1) ? "" : r1;
+                r2 = StringUtils.isEmpty(r2) ? "" : r2;
+                r3 = StringUtils.isEmpty(r3) ? "" : r3;
+                r4 = StringUtils.isEmpty(r4) ? "" : r4;
+                r5 = StringUtils.isEmpty(r5) ? "" : r5;
+                r6 = StringUtils.isEmpty(r6) ? "" : r6;
+                r7 = StringUtils.isEmpty(r7) ? "" : r7;
+                r8 = StringUtils.isEmpty(r8) ? "" : r8;
+                r9 = StringUtils.isEmpty(r9) ? "" : r9;
+                r10 = StringUtils.isEmpty(r10) ? "" : r10;
+                r11 = StringUtils.isEmpty(r11) ? "" : r11;
+                r12 = StringUtils.isEmpty(r12) ? "" : r12;
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3 + "|" + r4 + "|" + r5
+                        + "|" + r6 + "|" + r7 + "|" + r8 + "|" + r9 + "|" + r10 + "|" + r11
+                        + "|" + r12));
+                fw.write("\n");
+            }
+            fw.close();
+
+            sql = "SELECT id, rule_id, type_id, remind FROM kl_rule_app";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "bigdata_rule_app_filter.dict");
+            while (rs.next()) {
+                r1 = String.valueOf(rs.getInt(1));
+                r2 = rs.getString(2);
+                r3 = rs.getString(3);
+                r4 = rs.getString(4);
+                r1 = StringUtils.isEmpty(r1) ? "" : r1;
+                r2 = StringUtils.isEmpty(r2) ? "" : r2;
+                r3 = StringUtils.isEmpty(r3) ? "" : r3;
+                r4 = StringUtils.isEmpty(r4) ? "" : r4;
+                fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3 + "|" + r4));
+                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;
+    }
+}

+ 176 - 0
common-push/src/main/java/org/diagbot/common/push/cache/CacheUtil.java

@@ -0,0 +1,176 @@
+package org.diagbot.common.push.cache;
+
+import org.apache.commons.lang3.StringUtils;
+import org.diagbot.nlp.participle.cfg.Configuration;
+import org.diagbot.nlp.participle.cfg.DefaultConfig;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CacheUtil {
+    public static Map<String,Map<String,String>> sexAgeMap=null;
+    public static Map<String,String> vitalMap=null;
+    public static Map<String,String> disgSortMap=null;
+    public static Map<String,String> diagClassifyMap = null;
+    public static Map<String,Integer> diagClassifyJiMap = null;
+    //诊断科室衍射
+    public static Map<String, String> doc_result_mapping_diag_map = null;
+
+    //疾病科室,获取缓存
+    public static Map<String,String> getDiagDepartCache(){
+        if (doc_result_mapping_diag_map == null) {
+            createDiagDepartCache();
+        }
+        return doc_result_mapping_diag_map;
+    }
+
+    public static Map<String,String> createDiagDepartCache(){
+        Configuration configuration = new DefaultConfig();
+        doc_result_mapping_diag_map = new HashMap<>();
+        List<String> contentList = configuration.readFileContents("graph_diag_2_dept.dict");
+        for (String s:contentList) {
+            String[] splits = s.split("\\|");
+            doc_result_mapping_diag_map.put(splits[0],splits[1]);
+        }
+        return doc_result_mapping_diag_map;
+    }
+
+    //疾病分级解析,获取缓存
+    public static Map<String,Integer> getDiagClassifyJiCache(){
+        if (diagClassifyJiMap == null) {
+            createDiagClassifyJiCache();
+        }
+        return diagClassifyJiMap;
+    }
+
+    public static Map<String,Integer> createDiagClassifyJiCache(){
+        Configuration configuration = new DefaultConfig();
+        diagClassifyJiMap = new HashMap<>();
+        List<String> contentList = configuration.readFileContents("graph_diag_normalize.dict");
+        String diagName =null,bigdiagName=null;
+        String[] diagSort =null;String[] split = null;
+        for (String s:contentList) {
+            String[] splits = s.split("\\|");
+            if (splits.length >= 2) {
+                diagName = splits[0].trim();//疾病本体
+                bigdiagName = splits[1].trim();//疾病大类
+                split = bigdiagName.split("\\、");
+                for (String dis:split) {
+                    diagClassifyJiMap.put(dis, 2);
+                }
+                diagClassifyJiMap.put(diagName,1);
+                if (splits.length == 3) {
+                    diagSort = splits[2].split("\\、");
+                    for (String dis : diagSort) {
+                        if (StringUtils.isNotEmpty(dis.trim())) {
+                            diagClassifyJiMap.put(dis.trim(), 3);
+                        }
+                    }
+                }
+            }
+        }
+        return diagClassifyJiMap;
+    }
+
+    //疾病归一解析,获取缓存
+    public static Map<String,String> getDiagClassifyCache(){
+        if (diagClassifyMap == null) {
+            createDiagClassifyCache();
+        }
+        return diagClassifyMap;
+    }
+
+    public static Map<String,String> createDiagClassifyCache(){
+        Configuration configuration = new DefaultConfig();
+        diagClassifyMap = new HashMap<>();
+        List<String> contentList = configuration.readFileContents("graph_diag_normalize.dict");
+        String diagName =null,bigdiagName=null;
+        String[] diagSort =null;String[] split =null;
+        for (String s:contentList) {
+            String[] splits = s.split("\\|");
+            if (splits.length >= 2) {
+                diagName = splits[0].trim();//疾病本体
+                bigdiagName = splits[1].trim();//疾病大类
+                split = bigdiagName.split("\\、");
+                for (String dis:split
+                        ) {
+                    diagClassifyMap.put(dis, diagName);
+                }
+
+                if (splits.length == 3) {
+                    diagSort = splits[2].split("\\、");
+                    for (String dis : diagSort) {
+                        if (StringUtils.isNotEmpty(dis.trim())) {
+                            diagClassifyMap.put(dis.trim(), bigdiagName);
+                        }
+                    }
+                }
+            }
+        }
+        return diagClassifyMap;
+    }
+
+    public static Map<String,String> getDiagSortCache(){
+        if(disgSortMap == null){
+            createDiagSortCache();
+        }
+        return disgSortMap;
+    }
+    public static Map<String,String> createDiagSortCache(){
+        disgSortMap = new HashMap<>();
+
+        Configuration configuration = new DefaultConfig();
+        List<String> contentList = configuration.readFileContents("graph_diag_classify.dict");
+        for (String s:contentList) {
+            String[] splits = s.split("\\|");
+            String diagName = splits[0];
+            String diagType = splits[1];
+            disgSortMap.put(diagName,diagType);
+        }
+        return disgSortMap;
+    }
+
+    public static Map<String,Map<String,String>> getSexAgeCache(){
+        if (sexAgeMap == null) {
+            createSexAgeCache();
+        }
+        return sexAgeMap;
+    }
+
+    public static Map<String,Map<String,String>> createSexAgeCache(){
+        Configuration configuration = new DefaultConfig();
+        sexAgeMap = new HashMap<>();
+        List<String> contentList = configuration.readFileContents("graph_sex_age_filter.dict");
+        for (String s:contentList) {
+            Map<String,String> contentMap = new HashMap<>();
+            String[] splits = s.split("\\|");
+            String sexTyep = splits[1];
+            String min_age = splits[2];
+            String max_age = splits[3];
+            contentMap.put("sexType",sexTyep);
+            contentMap.put("min_age",min_age);
+            contentMap.put("max_age",max_age);
+            sexAgeMap.put(splits[0],contentMap);
+        }
+        return sexAgeMap;
+    }
+
+    public static Map<String,String> getVitalCache(){
+        if (vitalMap == null) {
+            createVitalCache();
+        }
+        return vitalMap;
+    }
+
+    public static Map<String,String> createVitalCache(){
+        Configuration configuration = new DefaultConfig();
+        vitalMap = new HashMap<>();
+        List<String> contentList = configuration.readFileContents("graph_vital_convert.dict");
+        for (String s:contentList) {
+            String[] splits = s.split("\\|");
+            vitalMap.put(splits[0],splits[1]);
+        }
+        return vitalMap;
+    }
+}

+ 531 - 0
common-push/src/main/java/org/diagbot/common/push/filter/ClassifyDiag.java

@@ -0,0 +1,531 @@
+package org.diagbot.common.push.filter;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.cache.CacheUtil;
+
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.stream.Stream;
+
+/**
+ * Created by kwz on 2019/8/5.
+ */
+public class ClassifyDiag {
+    //诊断-->部门
+    Map<String, String>  diagDepartCache     = CacheUtil.getDiagDepartCache();
+    //get diagClassifyCache
+    Map<String, String>  diagClassifyCache   = CacheUtil.getDiagClassifyCache();
+    //每个诊断所在的级别缓存
+    Map<String, Integer> diagClassifyJiCache = CacheUtil.getDiagClassifyJiCache();
+
+   /* public static void main(String[] args) {
+
+        List<String> disList = new LinkedList<>();
+        String[] disArray = {"急性胰腺炎","冠心病","急性冠状动脉综合征","急性非ST段抬高型心肌梗死","急性ST段抬高型心肌梗死"
+        ,"三度房室传导阻滞","心力衰竭","急性心力衰竭"};
+         disList = Arrays.asList(disArray);
+        System.out.println("输入的诊断"+disList);
+        List<FeatureRate> inintFeature = new ArrayList<>();
+        Double inintNumber = 0.95;
+        String rate = "";
+        for (String dis:disList) {
+            FeatureRate featureRate = new FeatureRate();
+            featureRate.setFeatureName(dis);
+            inintNumber = inintNumber - 0.1;
+            rate = String.valueOf(inintNumber);
+            featureRate.setRate(rate);
+            inintFeature.add(featureRate);
+        }
+
+        ClassifyDiag classifyDiag = new ClassifyDiag();
+        List<FeatureRate> classify = classifyDiag.diagClassify(inintFeature);
+        System.out.println("hao hai you");
+        for (FeatureRate d:classify) {
+            System.out.println(d.getFeatureName()+"\t"+d.getRate()+"\t"+d.getExtraProperty());
+        }
+
+    }*/
+
+    /**
+     * 根据诊断依据规则过滤诊断
+     * @param graphResponseData 把过滤的诊断包装在这个对象里
+     * @param graphFeatures 过滤前的诊断结果
+     * @return 返回过滤后的诊断结果
+     */
+    public List<FeatureRate> filterDiag(ResponseData graphResponseData, List<FeatureRate> graphFeatures){
+        //根据诊断依据规则过滤掉的诊断列表
+        List<String> excludeDiag = graphResponseData.getExcludeDiag();
+        //将需要排除的诊断从列表中删除
+        List<FeatureRate> updateFeatures = new ArrayList<>();
+        if(excludeDiag != null){
+            for(int j = 0;j<graphFeatures.size();j++){
+                if(excludeDiag.indexOf(graphFeatures.get(j).getFeatureName()) == -1){
+                    updateFeatures.add(graphFeatures.get(j));
+                }
+            }
+            return updateFeatures;
+        }else {
+            return graphFeatures;
+        }
+
+    }
+
+    /**
+     * 诊断归一
+     * @param updateFeatures 归一前的诊断
+     * @return 归一后的诊断
+     */
+    public List<FeatureRate> diagClassify(List<FeatureRate> updateFeatures){
+        List<FeatureRate> finalDiagList = new LinkedList<>();//最终返回
+        List<String> highDiagList = new LinkedList<>();//警惕集合
+        List<String> queDiagList = new LinkedList<>();//确诊集合
+        List<String> bigDiagList = new LinkedList<>();//可能诊断集合
+        if(updateFeatures != null && updateFeatures.size()>0){
+            for(FeatureRate featureRate:updateFeatures){
+                String featureName = featureRate.getFeatureName();
+                String desc = featureRate.getDesc();
+                Map<String,Object> d = new HashMap<>();
+                if(desc != null){
+                    JSONObject jsonObject = JSONObject.parseObject(desc);
+                    d = jsonObject;
+                    if(d.keySet().size() == 1 && "警惕".equals(d.keySet().toArray()[0])){
+                        highDiagList.add(featureName);
+                    }else {
+                        queDiagList.add(featureName);
+                    }
+                }else {
+                    bigDiagList.add(featureName);
+                }
+            }
+        }
+        //先把警惕的加进去
+        if(highDiagList.size()>0){
+            for(int j =0;j<updateFeatures.size();j++){
+                FeatureRate featureRate = updateFeatures.get(j);
+                String featureName = featureRate.getFeatureName();
+                int i = highDiagList.indexOf(featureName);
+                if(i >= 0){
+                    finalDiagList.add(featureRate);
+                }
+            }
+        }
+        /**
+         * 这里处理一下可能诊断剔除的功能
+         * 如果图谱推出的诊断和可能诊断有层级关系,就把对应的可能诊断剔除
+         */
+        Set<String> queSet =null;
+        List<String> newBIgDiagList = this.removeKeng(queDiagList, bigDiagList);
+        System.out.println("图谱归一前数据 :"+queDiagList);
+        if(queDiagList != null && queDiagList.size()>0){
+            //图谱归一 ,图谱sign =0,大数据sign = 1
+            queSet = this.diagProcess(queDiagList,0);
+            System.out.println("图谱归一后的数据    :"+queSet);
+            if(queSet != null && queSet.size()>0){
+                for (String queDis:queSet) {
+                    if(queDiagList.indexOf(queDis)>=0){ //可以找到,就取出来,用原来的
+                        FeatureRate feature = this.getFeature(updateFeatures, queDis);
+                        feature.setExtraProperty(diagDepartCache.get(queDis));
+                        finalDiagList.add(feature);
+                    }else {
+                        FeatureRate featureRate = new FeatureRate();
+                        featureRate.setFeatureName(queDis);
+                        featureRate.setDesc("{\"确诊\":\"\"}");
+                        featureRate.setExtraProperty(diagDepartCache.get(queDis));
+                        featureRate.setSource("neo4j");
+                        finalDiagList.add(featureRate);
+                    }
+                }
+            }
+        }
+
+
+        if(newBIgDiagList!= null && newBIgDiagList.size()>0){
+            //大数据的可能诊断归一和排序
+            List<FeatureRate> featureRates = this.sortFeatureList(newBIgDiagList, updateFeatures);
+            //把可能诊断中和图谱相同的诊断去除
+            if(featureRates != null && featureRates.size()>0 && queSet !=null){
+                for (FeatureRate f:featureRates) {
+                    if(queSet.contains(f.getFeatureName())){
+                        featureRates.remove(f);
+                        continue;
+                    }
+                }
+            }
+            finalDiagList.addAll(featureRates);
+        }
+
+        return finalDiagList;
+
+    }
+
+    /**
+     * 诊断排序(诊断分为I类和II类,I类在前,II类在后,没有分类的诊断认为是I类)
+     * @param updateFeatureRates  //入参(通过过滤条件过滤后)
+     * @return
+     */
+    public List<FeatureRate> sortDiag(List<FeatureRate> updateFeatureRates){
+        Map<String, String> diagSortCache = CacheUtil.getDiagSortCache();
+        List<String> finalDiagList = new LinkedList<>();
+        List<String> neoDiagList = new LinkedList<>();
+        List<String> bigDataIDiagList = new LinkedList<>();
+        List<String> bigDataIIDiagList = new LinkedList<>();
+        List<FeatureRate> finalDiagFeature = new LinkedList<>();
+        if(updateFeatureRates != null || updateFeatureRates.size()>0){
+            for (FeatureRate feature:updateFeatureRates) {
+                String featureName = feature.getFeatureName();
+                String source = feature.getSource();
+                if("neo4j".equals(source)){
+                    neoDiagList.add(featureName);
+                }else {
+                    String s = diagSortCache.get(featureName);
+                    if(StringUtils.isNotEmpty(s)){
+                        if("Ⅰ".equals(s)){
+                            bigDataIDiagList.add(featureName);
+                        }else if("Ⅱ".equals(s)){
+                            bigDataIIDiagList.add(featureName);
+                        }
+                    }else {
+                        bigDataIDiagList.add(featureName);
+                    }
+                }
+            }
+        }
+        finalDiagList.addAll(neoDiagList);
+        finalDiagList.addAll(bigDataIDiagList);
+        finalDiagList.addAll(bigDataIIDiagList);
+        if(finalDiagList != null && finalDiagList.size()>0){
+            for (String diag:finalDiagList){
+                for (FeatureRate f:updateFeatureRates) {
+                    if(diag.equals(f.getFeatureName())){
+                        finalDiagFeature.add(f);
+                        break;
+                    }
+                }
+            }
+        }
+        return finalDiagFeature;
+    }
+
+    /**
+     * 去除可能诊断和确诊有关系的诊断
+     * @param queDiagList
+     * @param bigDiagList
+     * @return
+     */
+    public List<String> removeKeng(List<String> queDiagList,List<String> bigDiagList){
+        List<String> bigList = new ArrayList<>();
+        Set<String> queAll = new HashSet<>();
+        if(queDiagList.size()>0 && bigDiagList.size()>0){
+            for (String dis:queDiagList) {
+                String s = diagClassifyCache.get(dis);
+                if(s != null){
+                    queAll.add(s);
+                    List<Object> key = this.getKey(diagClassifyCache, s);
+                    if(key.size()>0){
+                        for (Object o:key
+                             ) {
+                            queAll.add(o.toString());
+                        }
+                    }
+                }
+                queAll.add(dis);
+                List<Object> key = this.getKey(diagClassifyCache, dis);
+                if(key != null && key.size()>0){
+                    for (Object o:key) {
+                        queAll.add(o.toString());
+                        List<Object> key1 = this.getKey(diagClassifyCache, o.toString());
+                        if(key1 !=null && key1.size()>0){
+                            for (Object o1:key1
+                                 ) {
+                                queAll.add(o1.toString());
+                            }
+                        }
+                    }
+
+                }
+
+            }
+        }
+        System.out.println(queAll);
+        String[] strings = queAll.stream().toArray(String[]::new);
+        if(bigDiagList != null && bigDiagList.size()>0){
+            for (String dis:bigDiagList) {
+                if(Arrays.asList(strings).indexOf(dis) == -1){
+                    bigList.add(dis);
+                }
+            }
+        }
+        return bigList;
+    }
+
+
+
+
+
+    /**
+     * 诊断归一和排序
+     * @param disList
+     * @return
+     */
+    public Set<String> diagProcess(List<String> disList,int sign){
+        Set<String> first = new LinkedHashSet<>();
+        Set<String> second= new LinkedHashSet<>();
+        Set<String> third= new LinkedHashSet<>();
+        Set<String> other= new LinkedHashSet<>();
+
+        /**
+         * 分级
+         * 初始化每个病出现的次数为0
+         */
+        Map<String, Integer> children_cnt = new HashMap<>();
+        for (String dis:disList) {
+            Integer ji = diagClassifyJiCache.get(dis);
+            if(ji != null){
+                if(1 == ji){
+                    first.add(dis);
+                    children_cnt.put(dis,0);
+                }else if(2 == ji){
+                    second.add(dis);
+                    children_cnt.put(dis,0);
+                }else if(3 == ji){
+                    third.add(dis);
+                    children_cnt.put(dis,0);
+                }
+            }else {
+                other.add(dis);
+            }
+        }
+        /**
+         * 从孙子找父亲,根据父亲找爷爷
+         */
+        if(third != null && third.size()>0){
+            for (String dis:third) {
+                String s = diagClassifyCache.get(dis);
+                Integer count = children_cnt.get(s);
+                if(s != null){
+                    children_cnt.put(s,(count == null)?1:count+1);
+                    second.add(s);
+                }
+
+            }
+        }
+
+        if(second != null && second.size()>0){
+            for (String dis:second) {
+                String s = diagClassifyCache.get(dis);
+                Integer count = children_cnt.get(s);
+                if(s != null){
+                    children_cnt.put(s,(count == null)?1:count+1);
+                    first.add(s);
+                }
+            }
+        }
+        List<String> pushDiag = new ArrayList<>();
+        //从顶级往下级依次看
+        for (String dis:first) {
+            Integer count = children_cnt.get(dis);
+            if(count == 0){
+                pushDiag.add(dis);
+            }else if(count == 1){
+                List<Object> key = this.getKey(diagClassifyCache, dis);
+                for (String diss:second) {
+                    Integer c2 = children_cnt.get(diss);
+                    if(key.contains(diss)){
+                        if(c2 == 0){
+                            pushDiag.add(diss);
+                        }else if(c2 == 1){
+                            List<Object> key1 = this.getKey(diagClassifyCache, diss);
+                            for (String disss:third) {
+                                if(key1.contains(disss)){
+                                    pushDiag.add(disss);
+                                }
+                            }
+                        }else if(c2 >1){
+                            pushDiag.add(diss);
+                        }
+                    }
+
+                }
+            }else if(count >1){
+                pushDiag.add(dis);
+            }
+
+        }
+        pushDiag.addAll(other); //归一后的
+
+        Set<String> finalList = new LinkedHashSet<>();
+        if(sign == 0){
+            finalList.addAll(pushDiag);
+        }else if(sign == 1){
+            for (String dis:disList) {
+                int i = pushDiag.indexOf(dis);
+                if(i >= 0){
+                    finalList.add(dis);
+
+                }else {
+                    List<Object> testList= new ArrayList<>();
+                    String s = diagClassifyCache.get(dis);
+                    if(StringUtils.isNotEmpty(s)){
+                        testList.add(s);
+                    }
+                    List<Object> key = this.getKey(diagClassifyCache, dis);
+                    boolean b = testList.addAll(key);
+                    for (Object dis1:testList) {
+                        if(pushDiag.indexOf(dis1)>=0){
+                            finalList.add(dis1.toString());
+
+                        }
+                    }
+                }
+            }
+        }
+
+        return finalList;
+
+    }
+
+    /**
+     * 根据rate排序
+     * @param diss 大数据可能诊断列表
+     * @param updates 所有推送的诊断
+     * @return 排好序并且归一的可能诊断列表
+     */
+    public List<FeatureRate> sortFeatureList(List<String> diss,List<FeatureRate> updates){
+        DecimalFormat df = new DecimalFormat("0.####");
+       List<FeatureRate> sortFeatures = new LinkedList<>();
+        Set<String> strings = this.diagProcess(diss,1);
+
+        Map<String,Double> disRate = new HashMap<>();
+        //归一确诊
+        if(diss!= null &&diss.size()>0){
+            //归一后的确诊(图谱出来的)
+
+            if(strings != null && strings.size()>0){
+                for (String queDis:strings) {
+                    List<Object> testCollect = new ArrayList<>();
+//                    FeatureRate feature = classifyDiag.getFeature(inintFeature, queDis);
+                    //如果能找到就把相关联的rate加起来
+                    testCollect.add(queDis);
+
+                    String s = null;
+                    s= diagClassifyCache.get(queDis);
+                    if(s != null){
+                        testCollect.add(s);
+                        s = diagClassifyCache.get(s);
+                        if(s != null){
+                            testCollect.add(s);
+                        }
+                    }
+                    List<Object> key =null;
+                    key = this.getKey(diagClassifyCache, queDis);
+                    testCollect.addAll(key);
+                    if(key != null && key.size()>0){
+                        for (Object o:key) {
+                            key = this.getKey(diagClassifyCache,o.toString());
+                            if(key!= null){
+                                testCollect.addAll(key);
+                            }
+                        }
+                    }
+                    Double count = 0.0;
+                    for (String dis:diss) {
+                        if(testCollect.indexOf(dis) >= 0){
+                            FeatureRate feature1 = this.getFeature(updates, dis);
+                            String rate1 = feature1.getRate();
+                            count = count+Double.parseDouble(rate1);
+                        }
+                    }
+                    disRate.put(queDis,count);
+                }
+            }
+
+        }
+        //根据rate排序
+        List<Map.Entry<String,Double>> list = new ArrayList<>(disRate.entrySet());
+        Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {
+            @Override
+            public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
+                return o2.getValue().compareTo(o1.getValue());
+            }
+        });
+        for (Map.Entry<String,Double> s:list) {
+            System.out.println(s.getKey()+"\t"+s.getValue());
+            FeatureRate featureRate = new FeatureRate();
+            featureRate.setRate(df.format(s.getValue()));
+            featureRate.setFeatureName(s.getKey());
+            featureRate.setExtraProperty(diagDepartCache.get(s.getKey()));
+            sortFeatures.add(featureRate);
+        }
+
+        return sortFeatures;
+    }
+
+    /**
+     * 根据诊断名找到这个feature
+     * @param updateFeatures
+     * @param disName
+     * @return
+     */
+    public FeatureRate getFeature(List<FeatureRate> updateFeatures,String disName){
+        FeatureRate f = new FeatureRate();
+        for (FeatureRate fe:updateFeatures){
+            if(disName.equals(fe.getFeatureName())){
+                f = fe;
+            }
+        }
+        return f;
+    }
+
+    /**
+     * dis找大类
+     * @param inputs
+     * @return
+     */
+    public List<String> getDisList(List<String> inputs){
+        List<String> newDiagList = new ArrayList<>();
+        if(inputs!= null && inputs.size()>0){
+            for (String dis:inputs) {
+                String s = diagClassifyCache.get(dis);
+                if(StringUtils.isNotEmpty(s)){
+                    newDiagList.add(s);
+                }else {
+                    newDiagList.add(dis);
+                }
+
+            }
+        }
+        return newDiagList;
+    }
+
+    /**
+     * 统计列表中每个字符出现的次数
+     * @param inputs 输入列表
+     * @return
+     */
+    public Map<String,Integer> fildCount(List<String> inputs){
+        Map<String,Integer> map = new HashMap<>();
+        for (String dis:inputs) {
+            Integer count = map.get(dis);
+            map.put(dis,(count == null)?1:count+1);
+        }
+        return map;
+    }
+
+    public List<Object>  getKey(Map map, Object value){
+        Set set = map.entrySet(); //通过entrySet()方法把map中的每个键值对变成对应成Set集合中的一个对象
+        Iterator<Map.Entry<Object, Object>> iterator = set.iterator();
+        List<Object> arrayList = new ArrayList();
+        while(iterator.hasNext()){
+            //Map.Entry是一种类型,指向map中的一个键值对组成的对象
+            Map.Entry<Object, Object> entry = iterator.next();
+            if(entry.getValue().equals(value)){
+                arrayList.add(entry.getKey());
+            }
+        }
+        return arrayList;
+    }
+
+}

+ 83 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/Pretreatment.java

@@ -0,0 +1,83 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/8/31.
+ */
+public abstract class Pretreatment {
+    protected NegativeEnum[] nees_time_and_unit = new NegativeEnum[]{NegativeEnum.EVENT_TIME, NegativeEnum.UNIT};
+
+    protected int cursor = 0;
+
+    protected int max_back_search = 3;
+
+    public abstract List<PreResult> analyze(String content) throws java.io.IOException;
+
+    abstract PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index);
+
+    abstract String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index);
+
+    protected List<PreResult> analyzeDefault(String content) throws java.io.IOException{
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+
+        List<PreResult> preResultList = new ArrayList<>();
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_time_and_unit)) {
+                PreResult result = data2Object(lexemes, l, i, l.getProperty());
+                if (result != null) {
+                    preResultList.add(result);
+                }
+            }
+        }
+        return preResultList;
+    }
+
+    protected PreResult data2Object(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index, String property) {
+        if (index < 2) {
+            return null;
+        }
+        return createPreResult(lexemes, lexeme, index);
+    }
+
+    public PreResult createDefaultPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        double value = findNumberValue(lexemes, lexeme, index);
+        if (value == -1) return null;
+        //继续往前找本体
+        String text = findBodyValue(lexemes, lexeme, index);
+        if (StringUtils.isEmpty(text)) {
+            return null;
+        }
+        PreResult result = new PreResult();
+        result.setValue(String.valueOf(value));
+        result.setUnits(lexeme.getText());
+        result.setDetailName(text);
+        result.setUniqueName(text);
+        return result;
+    }
+
+    protected double findNumberValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        if (index < 1) return -1;
+        cursor = index - 1;
+        Lexeme leftLexeme = lexemes.get(cursor);
+        if ("×".equals(leftLexeme.getText())) {
+            if  (cursor <= 0) return -1;
+            cursor--;
+            leftLexeme = lexemes.get(cursor);
+        }
+        if (NlpUtil.isNumberString(leftLexeme)) {
+            return NlpUtil.numberText2value(leftLexeme);
+        }
+        return -1;
+    }
+}

+ 39 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentDiag.java

@@ -0,0 +1,39 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PretreatmentDiag extends Pretreatment {
+    protected NegativeEnum[] nees_disease = new NegativeEnum[]{NegativeEnum.DISEASE};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_disease)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("诊断--");
+                result.setDetailName("诊断--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.DISEASE));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 59 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentLis.java

@@ -0,0 +1,59 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.lang.reflect.Array;
+import java.util.List;
+
+public class PretreatmentLis extends Pretreatment {
+    private String join_symbols = ";:;:";
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        return super.analyzeDefault(content);
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        PreResult result = new PreResult();
+        double value = findNumberValue(lexemes, lexeme, index);
+        if (value == -1) return null;
+        //继续往前找化验明细项
+        if (cursor > 0) cursor--;
+        Lexeme leftLexeme = lexemes.get(cursor);
+        if (join_symbols.contains(leftLexeme.getText())) {
+            if (cursor > 0) {
+                cursor--;
+                leftLexeme = lexemes.get(cursor);
+            } else {
+                return null;
+            }
+        }
+        if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[]{NegativeEnum.LIS_NAME})) {
+            result.setDetailName(NlpUtil.concept(leftLexeme, NegativeEnum.LIS_NAME));
+        } else if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[]{NegativeEnum.PUB_NAME})) {
+            result.setUniqueName(NlpUtil.concept(leftLexeme, NegativeEnum.PUB_NAME));
+        } else {
+            return null;
+        }
+        //查找化验套餐
+        int position = cursor - 1;
+        while (position > -1) {
+            leftLexeme = lexemes.get(position);
+            if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[]{NegativeEnum.LIS_TYPE})) {
+                result.setName(NlpUtil.concept(leftLexeme, NegativeEnum.LIS_TYPE));
+                break;
+            }
+            position--;
+        }
+        result.setValue(String.valueOf(value));
+        result.setUnits(lexeme.getText());
+        return result;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 43 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentMakeList.java

@@ -0,0 +1,43 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PretreatmentMakeList extends Pretreatment {
+    protected NegativeEnum[] nees_pacs_name = new NegativeEnum[]{NegativeEnum.PACS_NAME};
+    protected NegativeEnum[] nees_lis_type = new NegativeEnum[]{NegativeEnum.LIS_TYPE};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            PreResult result = new PreResult();
+            result.setUniqueName("开单--");
+            result.setDetailName("开单--");
+            if (NlpUtil.isFeature(l.getProperty(), nees_pacs_name)) {
+                result.setValue(NlpUtil.concept(l, NegativeEnum.PACS_NAME));
+                preResults.add(result);
+            } else if (NlpUtil.isFeature(l.getProperty(), nees_lis_type)) {
+                result.setValue(NlpUtil.concept(l, NegativeEnum.LIS_TYPE));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 46 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentNormal.java

@@ -0,0 +1,46 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.List;
+
+public class PretreatmentNormal extends Pretreatment {
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = super.analyzeDefault(content);
+
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (l.getText().equals("性别") && i < lexemes.size() - 1) {
+                Lexeme afterLexeme = lexemes.get(i + 1);
+                if ("男性".equals(afterLexeme.getText()) || "女性".equals(afterLexeme.getText())) {
+                    PreResult result = new PreResult();
+                    result.setUniqueName(l.getText()+"--");
+                    result.setDetailName(l.getText()+"--");
+                    result.setValue(afterLexeme.getText());
+                    preResults.add(result);
+                    return preResults;
+                }
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return super.createDefaultPreResult(lexemes, lexeme, index);
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        if (cursor > 0) cursor--;
+        Lexeme leftLexeme = lexemes.get(cursor);
+        if (leftLexeme.getText().equals("年龄")) {
+            return leftLexeme.getText()+"--";
+        }
+        return null;
+    }
+}

+ 45 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentOther.java

@@ -0,0 +1,45 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PretreatmentOther extends Pretreatment {
+    protected NegativeEnum[] nees_disease = new NegativeEnum[]{NegativeEnum.DISEASE};
+    protected NegativeEnum[] nees_operation = new NegativeEnum[]{NegativeEnum.OPERATION};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            PreResult result = new PreResult();
+            if (NlpUtil.isFeature(l.getProperty(), nees_disease)) {
+                result.setUniqueName("诊断--");
+                result.setDetailName("诊断--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.DISEASE));
+                preResults.add(result);
+            } else if (NlpUtil.isFeature(l.getProperty(), nees_operation)) {
+                result.setUniqueName("手术--");
+                result.setDetailName("手术--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.OPERATION));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 51 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentPacs.java

@@ -0,0 +1,51 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.List;
+
+public class PretreatmentPacs extends Pretreatment {
+    protected NegativeEnum[] nees_pacs_result = new NegativeEnum[]{NegativeEnum.PACS_RESULT};
+    protected NegativeEnum[] nees_pacs_name = new NegativeEnum[]{NegativeEnum.PACS_NAME};
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResultList = super.analyzeDefault(content);
+        //pacs除了数值型需要转, 还需要对部分检查结果提取,以便做危机警示
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+
+        Lexeme leftLexeme;
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_pacs_result) && i > 0) {
+                int c = i - 1;
+                while (c > -1) {
+                    leftLexeme = lexemes.get(c);
+                    if (NlpUtil.isFeature(leftLexeme.getProperty(), nees_pacs_name)) {
+                        PreResult result = new PreResult();
+                        result.setValue(NlpUtil.concept(l, NegativeEnum.PACS_RESULT));
+                        result.setDetailName(NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
+                        result.setUniqueName(NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
+                        preResultList.add(result);
+                        break;
+                    }
+                    c--;
+                }
+
+            }
+        }
+
+        return preResultList;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return super.createDefaultPreResult(lexemes, lexeme, index);
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 44 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentSymptom.java

@@ -0,0 +1,44 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.List;
+
+public class PretreatmentSymptom extends Pretreatment {
+    protected NegativeEnum[] nees_symptom = new NegativeEnum[]{NegativeEnum.SYMPTOM};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = super.analyzeDefault(content);
+
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            PreResult result = new PreResult();
+            result.setUniqueName("症状--");
+            result.setDetailName("症状--");
+            if (NlpUtil.isFeature(l.getProperty(), nees_symptom)) {
+                result.setValue(NlpUtil.concept(l, NegativeEnum.SYMPTOM));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return super.createDefaultPreResult(lexemes, lexeme, index);
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        if (cursor > 0) cursor--;
+        Lexeme leftLexeme = lexemes.get(cursor);
+        if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[]{NegativeEnum.SYMPTOM})) {
+            return NlpUtil.concept(leftLexeme, NegativeEnum.SYMPTOM);
+        }
+        return null;
+    }
+}

+ 57 - 0
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/PretreatmentVital.java

@@ -0,0 +1,57 @@
+package org.diagbot.common.push.filter.pretreat;
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.List;
+
+public class PretreatmentVital extends Pretreatment {
+    protected NegativeEnum[] nees_vital_result = new NegativeEnum[]{NegativeEnum.VITAL_RESULT};
+    protected NegativeEnum[] nees_vital_index = new NegativeEnum[]{NegativeEnum.VITAL_INDEX};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = super.analyzeDefault(content);
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_vital_result)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("体征结果--");
+                result.setDetailName("体征结果--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.VITAL_RESULT));
+                preResults.add(result);
+            }else if (NlpUtil.isFeature(l.getProperty(), nees_vital_index)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("体征结果--");
+                result.setDetailName("体征结果--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.VITAL_INDEX));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return super.createDefaultPreResult(lexemes, lexeme, index);
+    }
+
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        if (cursor > 0) cursor--;
+        int search_len = 0;
+        Lexeme leftLexeme = null;
+        while (search_len < max_back_search && cursor > -1) {
+            leftLexeme = lexemes.get(cursor);
+            if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[]{NegativeEnum.VITAL_INDEX})) {
+                return NlpUtil.concept(leftLexeme, NegativeEnum.VITAL_INDEX);
+            }
+            search_len++;
+            cursor--;
+        }
+        return null;
+    }
+}

+ 181 - 0
common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java

@@ -0,0 +1,181 @@
+package org.diagbot.common.push.filter.rule;
+
+
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.Rule;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.cache.ApplicationCacheUtil;
+import org.diagbot.common.push.filter.pretreat.*;
+import org.diagbot.pub.Constants;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PretreatmentRule {
+    public void rule(SearchData searchData) throws java.io.IOException {
+        //患者基本信息 性别 年龄
+        if (!StringUtils.isEmpty(searchData.getNormal())) {
+            searchData.setNormal(add2PreResultList(new PretreatmentNormal(), searchData.getNormal(), "normal", searchData));
+        }
+        //症状数据
+        if (!StringUtils.isEmpty(searchData.getSymptom())) {
+            searchData.setSymptom(add2PreResultList(new PretreatmentSymptom(), searchData.getSymptom(), "symptom", searchData));
+        }
+        //体征数据
+        if (!StringUtils.isEmpty(searchData.getVital())) {
+            searchData.setVital(add2PreResultList(new PretreatmentVital(), searchData.getVital(), "vital", searchData));
+        }
+        //lis结构化信息
+        if (searchData.getLisArr() != null && searchData.getLisArr().size() > 0) {
+            searchData.setLis(add2PreResultList(searchData.getLisArr(), searchData.getLis(), "lis", searchData));
+        } else if (!StringUtils.isEmpty(searchData.getLis())) {
+            searchData.setLis(add2PreResultList(new PretreatmentLis(), searchData.getLis(), "lis", searchData));
+        }
+        //pacs数据
+        if (!StringUtils.isEmpty(searchData.getPacs())) {
+            searchData.setPacs(add2PreResultList(new PretreatmentPacs(), searchData.getPacs(), "pacs", searchData));
+        }
+        //其他史
+        if (!StringUtils.isEmpty(searchData.getOther())) {
+            searchData.setOther(add2PreResultList(new PretreatmentOther(), searchData.getOther(), "other", searchData));
+        }
+        //开具诊断
+        if (!StringUtils.isEmpty(searchData.getDiag())) {
+            add2PreResultList(new PretreatmentDiag(), searchData.getDiag(), "diag", searchData);
+        }
+        //开具辅检化验
+        if (!StringUtils.isEmpty(searchData.getLisOrder())) {
+            add2PreResultList(new PretreatmentMakeList(), searchData.getLisOrder(), "lisOrder", searchData);
+        }
+        //开具辅检化验
+        if (!StringUtils.isEmpty(searchData.getPacsOrder())) {
+            add2PreResultList(new PretreatmentMakeList(), searchData.getPacsOrder(), "pacsOrder", searchData);
+        }
+    }
+
+    private String add2PreResultList(Pretreatment pretreatment, String content, String ruleType, SearchData searchData) throws java.io.IOException {
+        List<PreResult> preResultList = pretreatment.analyze(content);
+        return add2PreResultList(preResultList, content, ruleType, searchData);
+    }
+
+    public static void main(String[] args) throws IOException {
+        PretreatmentRule pretreatmentRule = new PretreatmentRule();
+        SearchData searchData = new SearchData();
+        searchData.setSymptom("钠(Na)110mmol/L");
+        pretreatmentRule.rule(searchData);
+    }
+
+    private String add2PreResultList(List<PreResult> preResultList, String content, String ruleType, SearchData searchData) throws java.io.IOException {
+        Map<String, List<Rule>> kl_rule_filter_map = ApplicationCacheUtil.getKl_rule_filter_map();
+        //符合条件的规则
+        Map<String, List<Rule>> accord_rule_map = searchData.getRules();
+        List<Rule> accord_rules = null;
+        if (preResultList != null) {
+            for (PreResult result : preResultList) {
+                //规则库中匹配
+                if (kl_rule_filter_map.get(result.getUniqueName()) != null) {
+                    List<Rule> rules = kl_rule_filter_map.get(result.getUniqueName());
+                    if (rules == null) {
+                        continue;
+                    }
+                    for (Rule rule : rules) {
+                        boolean isSuit = suitRule(result, rule, content);
+                        if (isSuit) {
+                            rule.setOriginText(result.getUniqueName() + ":" + result.getValue() + result.getUnits());
+                            if (accord_rule_map.get(ruleType) == null) {
+                                accord_rules = new ArrayList<>();
+                            } else {
+                                accord_rules = accord_rule_map.get(ruleType);
+                            }
+                            accord_rules.add(rule);
+                            accord_rule_map.put(ruleType, accord_rules);
+                            searchData.setRules(accord_rule_map);
+
+                            content = content + (rule.getRemind() == null ? "" : rule.getRemind());
+                        }
+                    }
+                }
+            }
+
+        }
+        return content;
+    }
+
+    private boolean suitRule(PreResult result, Rule rule, String content) {
+        //标准值最优先匹配
+        if (org.apache.commons.lang3.StringUtils.isNotEmpty(rule.getEq_value())) {
+            if (compareEqual(result.getValue(), rule.getEq_value())) {
+                return true;
+            } else {
+                return false;
+            }
+        } else if (org.apache.commons.lang3.StringUtils.isNotEmpty(rule.getMax_value()) && org.apache.commons.lang3.StringUtils.isNotEmpty(rule.getMin_value())) {
+            if (compareMin(result.getValue(), rule.getMax_value(), rule.getMax_operator()) //比最大值小
+                    && compareMax(result.getValue(), rule.getMin_value(), rule.getMin_operator()) //比最小值大
+                    && result.getUnits().equals(rule.getMin_unit())
+                    && result.getUnits().equals(rule.getMax_unit())) {
+                return true;
+            } else {
+                return false;
+            }
+        } else if (org.apache.commons.lang3.StringUtils.isNotEmpty(rule.getMin_value())) {
+            if (compareMin(result.getValue(), rule.getMin_value(), rule.getMin_operator())   //比最小值小
+                    && result.getUnits().equals(rule.getMin_unit())) {
+                return true;
+            } else {
+                return false;
+            }
+        } else if(org.apache.commons.lang3.StringUtils.isNotEmpty(rule.getMax_value()))  {
+            if (compareMax(result.getValue(), rule.getMax_value(), rule.getMax_operator())   //比最大值大
+                    && result.getUnits().equals(rule.getMax_unit())) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+        return false;
+    }
+
+
+    private boolean compareEqual(String c1, String c2) {
+        if (!StringUtils.isEmpty(c1) && !StringUtils.isEmpty(c2)
+                && c1.equals(c2)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean compareMin(String c1, String c2, String operator) {
+        if (!StringUtils.isEmpty(c1) && !StringUtils.isEmpty(c2) && !StringUtils.isEmpty(operator)) {
+            try {
+                if (operator.contains("=")) {
+                    return Double.valueOf(c1) <= Double.valueOf(c2);
+                } else {
+                    return Double.valueOf(c1) < Double.valueOf(c2);
+                }
+            } catch (Exception e) {
+            }
+        }
+        return false;
+    }
+
+    private boolean compareMax(String c1, String c2, String operator) {
+        if (!StringUtils.isEmpty(c1) && !StringUtils.isEmpty(c2) && !StringUtils.isEmpty(operator)) {
+            try {
+                if (operator.contains("=")) {
+                    return Double.valueOf(c1) >= Double.valueOf(c2);
+                } else {
+                    return Double.valueOf(c1) > Double.valueOf(c2);
+                }
+            } catch (Exception e) {
+            }
+        }
+        return false;
+    }
+
+}

+ 2 - 2
bigdata-web/src/main/java/org/diagbot/bigdata/util/BigDataConstants.java

@@ -1,4 +1,4 @@
-package org.diagbot.bigdata.util;
+package org.diagbot.common.push.util;
 
 /**
  * @ClassName org.diagbot.bigdata.util.BigDataConstants
@@ -7,7 +7,7 @@ package org.diagbot.bigdata.util;
  * @Date 2019/1/16/016 14:06
  * @Version 1.0
  **/
-public class BigDataConstants {
+public class PushConstants {
     public final static String resource_type_i = "I";       //住院
     public final static String resource_type_o = "O";       //门诊
     public final static String resource_type_e = "E";       //急诊

+ 266 - 0
common-push/src/main/java/org/diagbot/common/push/work/ParamsDataProxy.java

@@ -0,0 +1,266 @@
+package org.diagbot.common.push.work;
+
+import org.apache.commons.lang3.StringUtils;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.util.PushConstants;
+import org.diagbot.nlp.feature.FeatureAnalyze;
+import org.diagbot.nlp.feature.FeatureType;
+import org.diagbot.nlp.util.Constants;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName org.diagbot.bigdata.work.ParamsDataProxy
+ * @Description TODO
+ * @Author fyeman
+ * @Date 2019/1/16/016 14:04
+ * @Version 1.0
+ **/
+public class ParamsDataProxy {
+    Logger logger = LoggerFactory.getLogger(ParamsDataProxy.class);
+    //标准词只处理的词性
+    public static NegativeEnum[] negativeEnums = new NegativeEnum[] { NegativeEnum.VITAL_INDEX, NegativeEnum.SYMPTOM
+            , NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME, NegativeEnum.UNIT, NegativeEnum.DIAG_STAND
+            , NegativeEnum.OTHER};
+    //标准词处理的三元组
+    public static NegativeEnum[][] negativeEnumTriple = {
+            { NegativeEnum.VITAL_INDEX, NegativeEnum.DIGITS, NegativeEnum.UNIT },
+            { NegativeEnum.VITAL_INDEX, NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME },
+            { NegativeEnum.SYMPTOM, NegativeEnum.DIGITS, NegativeEnum.UNIT },
+            { NegativeEnum.SYMPTOM, NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME },
+            { NegativeEnum.DIAG_STAND, NegativeEnum.DIGITS, NegativeEnum.UNIT },
+            { NegativeEnum.DIAG_STAND, NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME },
+            { NegativeEnum.DIAG_STAND, NegativeEnum.DIGITS, NegativeEnum.OTHER }
+    };
+    //标准词处理的二元组
+    public static NegativeEnum[][] negativeEnumTwoTuple = {
+            { NegativeEnum.VITAL_INDEX, NegativeEnum.DIGITS },
+            { NegativeEnum.SYMPTOM, NegativeEnum.DIGITS }
+    };
+
+    public void createNormalInfo(SearchData searchData) throws Exception {
+        //计算年龄区间
+        if (searchData.getAge() > 0) {
+            searchData.setAge_start(searchData.getAge() - 5);
+            searchData.setAge_end(searchData.getAge() + 5);
+
+            searchData.setNormal("年龄" + searchData.getAge() + "岁");
+        }
+        //修改性别代码
+        if (!StringUtils.isEmpty(searchData.getSex())) {
+            if ("M".equals(searchData.getSex())) {
+                searchData.setSex("1");
+                searchData.setNormal(searchData.getNormal() + "性别男性");
+            } else if ("F".equals(searchData.getSex())) {
+                searchData.setSex("2");
+                searchData.setNormal(searchData.getNormal() + "性别女性");
+            } else {
+                searchData.setSex("3");
+                searchData.setNormal(searchData.getNormal() + "性别其他");
+            }
+        } else {
+            searchData.setSex("3");
+        }
+    }
+
+    public void createSearchData(SearchData searchData) throws Exception {
+        //消除空格
+        if (searchData.getSymptom() != null) {
+            searchData.setSymptom(searchData.getSymptom().trim());
+        }
+        if (searchData.getDiag() != null) {
+            searchData.setDiag(searchData.getDiag().trim());
+        }
+        //默认查询门诊数据
+        if (StringUtils.isEmpty(searchData.getResourceType())) {
+            searchData.setResourceType(PushConstants.resource_type_o);
+        }
+        if (StringUtils.isNotEmpty(searchData.getSymptom())) {
+            searchData.setSymptom(searchData.getSymptom().trim());
+        }
+        //一次推送多个类别信息
+        String[] featureTypes = searchData.getFeatureType().split(",");
+        //featureType统一转换
+        String[] convertFeatureTypes = new String[featureTypes.length];
+        for (int i = 0; i < featureTypes.length; i++) {
+            convertFeatureTypes[i] = convertFeatureType(searchData.getSysCode(), featureTypes[i]);
+        }
+        searchData.setFeatureType(StringUtils.join(convertFeatureTypes, ","));
+        searchData.setFeatureTypes(convertFeatureTypes);
+
+        //获取入参中的特征信息
+        FeatureAnalyze fa = new FeatureAnalyze();
+        List<Map<String, Object>> featuresList = new ArrayList<>();
+        if (!StringUtils.isEmpty(searchData.getSymptom())) {
+            //提取现病史
+            featuresList = fa.start(searchData.getSymptom(), FeatureType.FEATURE);
+            paramFeatureInit(searchData, featuresList);
+            //提取时间信息
+            featuresList = fa.start(searchData.getSymptom(), FeatureType.TIME);
+            paramFeatureInit(searchData, featuresList);
+        }
+        if (!StringUtils.isEmpty(searchData.getVital())) {
+            //提取体征
+            featuresList = fa.start(searchData.getVital(), FeatureType.FEATURE);
+            paramFeatureInit(searchData, featuresList);
+        }
+        if (!StringUtils.isEmpty(searchData.getPast())) {
+            //提取既往史
+            featuresList = fa.start(searchData.getPast(), FeatureType.FEATURE);
+            paramFeatureInit(searchData, featuresList);
+        }
+        if (!StringUtils.isEmpty(searchData.getOther()) || !StringUtils.isEmpty(searchData.getIndications())) {
+            //提取其他史等
+            featuresList = fa.start((searchData.getOther() == null ? "" : searchData.getOther()) + (searchData.getIndications() == null ? "" : searchData.getIndications()), FeatureType.FEATURE);
+            paramFeatureInit(searchData, featuresList);
+        }
+        if (!StringUtils.isEmpty(searchData.getPacs())) {
+            featuresList = fa.start(searchData.getPacs(), FeatureType.PACS);
+            paramFeatureInit(searchData, featuresList);
+        }
+        if (!StringUtils.isEmpty(searchData.getLis())) {
+            featuresList = fa.start(searchData.getLis(), FeatureType.LIS);
+            paramFeatureInit(searchData, featuresList);
+        }
+        // 清洗特征词,去除词性不匹配的词
+        searchData = cleanFeature(featuresList, fa, searchData);
+        if (!StringUtils.isEmpty(searchData.getOther())) {
+            //如果既往史中诊断信息,需要提取这个特征
+            featuresList = fa.start(searchData.getOther(), FeatureType.DIAG);
+            paramFeatureInit(searchData, featuresList);
+        }
+        if (!StringUtils.isEmpty(searchData.getDiag()) && StringUtils.isEmpty(searchData.getSymptom())) {
+            featuresList = fa.start(searchData.getDiag(), FeatureType.DIAG);
+            paramFeatureInit(searchData, featuresList);
+        }
+    }
+
+    /**
+     * 外部系统featureType需要转化为大数据定义的featureType
+     *
+     * @param sysCode
+     * @param featureType
+     * @return
+     */
+    private String convertFeatureType(String sysCode, String featureType) {
+        if (StringUtils.isEmpty(sysCode) || sysCode.equals("1")) {
+            if ("1".equals(featureType)) {
+                return PushConstants.feature_type_symptom;
+            }
+            if ("7".equals(featureType)) {
+                return PushConstants.feature_type_diag;
+            }
+            if ("4".equals(featureType)) {
+                return PushConstants.feature_type_vital;
+            }
+            if ("5".equals(featureType)) {
+                return PushConstants.feature_type_lis;
+            }
+            if ("6".equals(featureType)) {
+                return PushConstants.feature_type_pacs;
+            }
+            if ("3".equals(featureType)) {
+                return PushConstants.feature_type_history;
+            }
+            if ("8".equals(featureType)) {
+                return PushConstants.feature_type_treat;
+            }
+            if ("22".equals(featureType)) {
+                return PushConstants.feature_type_labelpush;
+            }
+            if ("11".equals(featureType)) {
+                return PushConstants.feature_type_manju;
+            }
+            if ("42".equals(featureType)) {
+                return PushConstants.feature_type_vital_index;
+            }
+            return null;
+        }
+        return featureType;
+    }
+
+    private SearchData cleanFeature(List<Map<String, Object>> featuresList, FeatureAnalyze fa,
+                                    SearchData searchData) {
+        // 在输入的辅检文本中,只提取辅检信息
+        String[] PACS_Feature = { Constants.word_property_PACS,
+                Constants.word_property_PACS_Detail, Constants.word_property_PACS_Result };
+        searchData = removeFeature(searchData.getLis(), fa, searchData, PACS_Feature, FeatureType.PACS);
+
+        // 在输入的化验文本中,只提取化验信息
+        String[] LIS_Feature = { Constants.word_property_LIS,
+                Constants.word_property_LIS_Detail, Constants.word_property_LIS_Result };
+        searchData = removeFeature(searchData.getPacs(), fa, searchData, LIS_Feature, FeatureType.LIS);
+
+        return searchData;
+    }
+
+    private SearchData removeFeature(String text, FeatureAnalyze fa,
+                                     SearchData searchData, String[] properties, FeatureType featureType) {
+        String name = "";
+        Boolean related = false;
+
+        try {
+            List<Map<String, Object>> featureList = fa.start(text, featureType);
+            if (featureList != null) {
+                for (Map<String, Object> item : featureList) {
+                    name = item.get("feature_name").toString();
+                    String[] property = item.get("property").toString().split(",");
+                    for (String prop : property) {
+                        if (Arrays.asList(properties).contains(prop)) {
+                            //                            related = true;
+                            searchData.getInputs().remove(name);
+                            break;
+                        }
+                    }
+                }
+            }
+
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return searchData;
+        }
+    }
+
+    /**
+     * 推送模型入参
+     *
+     * @param searchData
+     * @throws Exception
+     */
+    private void paramFeatureInit(SearchData searchData, List<Map<String, Object>> featuresList) throws Exception {
+        if (featuresList != null && featuresList.size() > 0) {
+            Map<String, Object> featureMap = null;
+            for (int i = 0; i < featuresList.size(); i++) {
+                featureMap = featuresList.get(i);
+                Map<String, String> map = new HashMap<>();
+                for (Map.Entry<String, Object> entry : featureMap.entrySet()) {
+                    map.put(entry.getKey(), String.valueOf(entry.getValue()));
+                }
+                map.put("featureType", String.valueOf(featureMap.get("feature_type")));
+                map.put("featureName", String.valueOf(featureMap.get("feature_name")));
+                map.put("property", String.valueOf(featureMap.get("property")));
+                map.put("concept", String.valueOf(featureMap.get("concept")));
+                if (Constants.default_negative.equals(featureMap.get("negative"))) {
+                    if (map.get("featureType").equals(Constants.feature_type_time)) {
+                        searchData.getInputs().put("时间", map);
+                    } else {
+                        if (searchData.getInputs().get(map.get("feature_name")) == null) {
+                            if (i < 5) {
+                                searchData.getInputs().put(map.get("feature_name"), map);
+                            }
+                            searchData.getGraphInputs().put(map.get("feature_name"), map);
+                        }
+                    }
+                } else {
+                    searchData.getFilters().put(map.get("feature_name"), map);
+                }
+            }
+        }
+    }
+}

+ 5 - 0
graph-web/pom.xml

@@ -35,6 +35,11 @@
 			<artifactId>common-service</artifactId>
 			<version>1.0.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.diagbot</groupId>
+			<artifactId>common-push</artifactId>
+			<version>1.0.0</version>
+		</dependency>
 		<dependency>
 			<groupId>org.diagbot</groupId>
 			<artifactId>nlp</artifactId>

+ 2 - 10
graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java

@@ -1,18 +1,13 @@
 package org.diagbot.graphWeb.controller;
 
-import com.alibaba.fastjson.JSONObject;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.graph.javabean.GdbResponse;
-import org.diagbot.graph.jdbc.DriverManager;
-import org.diagbot.graph.jdbc.Neo4jAPI;
-import org.diagbot.graphWeb.dao.BackResponse;
 import org.diagbot.graphWeb.work.DiseaseCalculate;
 import org.diagbot.graphWeb.work.GraphCalculate;
 import org.diagbot.graphWeb.work.HighRiskCalculate;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.common.work.SearchData;
 import org.diagbot.graphWeb.work.LisPacsCalculate;
 import org.diagbot.pub.api.Response;
-import org.diagbot.pub.utils.PropertiesUtil;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,9 +15,6 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Map;
-
-import static org.diagbot.graph.jdbc.DriverManager.propertiesUtil;
 
 @Controller
 @RequestMapping("/graph")

+ 4 - 8
graph-web/src/main/java/org/diagbot/graphWeb/work/DiseaseCalculate.java

@@ -1,18 +1,14 @@
 package org.diagbot.graphWeb.work;
 
-import com.alibaba.fastjson.JSONObject;
-import org.diagbot.common.javabean.*;
-import org.diagbot.common.work.FeatureRate;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.common.work.SearchData;
-import org.diagbot.nlp.relation.module.Lis;
-import org.diagbot.pub.api.Response;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.bean.neo4j.*;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.diagbot.pub.utils.http.HttpApi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 
 /**

+ 4 - 4
graph-web/src/main/java/org/diagbot/graphWeb/work/FilterSortDiag.java

@@ -1,10 +1,9 @@
 package org.diagbot.graphWeb.work;
 
 import org.apache.commons.lang3.StringUtils;
-import org.diagbot.common.work.FeatureRate;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.graph.jdbc.Neo4jAPI;
-import org.diagbot.graph.util.CacheUtil;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.cache.CacheUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -15,6 +14,7 @@ import java.util.*;
  */
 public class FilterSortDiag {
     Logger logger = LoggerFactory.getLogger(FilterSortDiag.class);
+
     /**
      * 过滤诊断
      */

+ 55 - 19
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -4,21 +4,21 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.lang3.StringUtils;
-import org.diagbot.common.javabean.MangementEvaluation;
-import org.diagbot.common.work.FeatureRate;
-import org.diagbot.common.javabean.Filnlly;
-import org.diagbot.common.work.LisDetail;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.common.work.SearchData;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.PreResult;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.bean.neo4j.Filnlly;
+import org.diagbot.common.push.bean.neo4j.MangementEvaluation;
+import org.diagbot.common.push.bean.neo4j.MedicalIndication;
+import org.diagbot.common.push.bean.neo4j.MedicalIndicationDetail;
+import org.diagbot.common.push.cache.CacheUtil;
 import org.diagbot.graph.jdbc.DriverManager;
 import org.diagbot.graph.jdbc.Neo4jAPI;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 
-import org.diagbot.common.javabean.MedicalIndication;
-import org.diagbot.common.javabean.MedicalIndicationDetail;
-import org.diagbot.graph.util.CacheUtil;
 import org.diagbot.graphWeb.util.MapValueComparator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,8 +47,7 @@ public class GraphCalculate {
         int age = searchData.getAge();
         String sex = searchData.getSex();
         logger.info("前端传来的年龄为 :"+age+" 前端传来的性别为 :"+sex);
-        //获取缓存
-//        Map<String, String> lexionCache = CacheUtil.getLexionCache();
+
         Map<String, Map<String, String>> sexAgeCache = CacheUtil.getSexAgeCache();
         Map<String, Map<String, String>> inputs = searchData.getGraphInputs();
         Set<String> ss = new HashSet<>();
@@ -65,8 +64,7 @@ public class GraphCalculate {
         logger.info("从分词系统接收到的词 :" + ss);
         System.out.println("Participle takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
 
-        String[] featureTypes = searchData.getFeatureType().split(",");
-        List<String> featureTypeList = Arrays.asList(featureTypes);
+        List<String> featureTypeList = Arrays.asList(searchData.getFeatureTypes());
         logger.info("featureTypeList : " + featureTypeList);
         inputList.addAll(ss);
         if(neo4jAPI == null){
@@ -118,14 +116,14 @@ public class GraphCalculate {
             logger.info("diseaseSet :" + diseaseSet);
         }
         Integer diseaseType = searchData.getDisType();
-        List<LisDetail> lisArr = searchData.getLisArr();
+        List<PreResult> lisArr = searchData.getLisArr();
         Set<String> lisSet = new HashSet<>();
         Map<String,Double> lis_Result = new HashMap<>();
         if(lisArr != null && lisArr.size() > 0){
-            for (LisDetail lis:lisArr) {
+            for (PreResult lis:lisArr) {
                 String detailName = lis.getUniqueName();
                 logger.info("公表名为  :"+detailName);
-                Double value = lis.getValue();
+                Double value = Double.valueOf(lis.getValue());
                 lis_Result.put(detailName,value);
                 lisSet.add(detailName);
             }
@@ -153,14 +151,19 @@ public class GraphCalculate {
                 responseData.setManagementEvaluation(mangementEvaluation1);
             }
         }
-
+        String pacsOrder = searchData.getPacsOrder();
         //指标推送
         if (featureTypeList.contains("22") ) {
+            List<MedicalIndication> pacsMi = getPacsMi(pacsOrder, inputList,webDiag);
             //查找指标
             Set<String> indSet = neo4jAPI.getInd((String[]) inputList.toArray(new String[inputList.size()]));
             logger.info("featureTypeList 包含22,走指标推送!!!,图谱推出的指标为:" + indSet);
-            List<MedicalIndication> idn = neo4jAPI.getIdn(indSet, age, sex);
-            responseData.setMedicalIndications(idn);
+            if(indSet.contains("肾功能不全")){
+                List<MedicalIndication> idn = neo4jAPI.getIdn(indSet, age, sex);
+                pacsMi.addAll(idn);
+                responseData.setMedicalIndications(pacsMi);
+            }
+            responseData.setMedicalIndications(pacsMi);
 
         }
 
@@ -171,6 +174,39 @@ public class GraphCalculate {
         System.out.println("Total takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
         return responseData;
     }
+    public List<MedicalIndication> getPacsMi(String pacsOrder,List<String> inputList,String webDiag){
+        if(StringUtils.isNotEmpty(webDiag)){
+            String[] webDiagsplits = webDiag.split(",|,|、|;|:|;");
+            for (String wd:webDiagsplits
+                 ) {
+                inputList.add(wd);
+            }
+        }
+
+        List<MedicalIndication> pacsMi = new ArrayList<>();
+        Map<String, String> newInd = neo4jAPI.getNewInd((String[]) inputList.toArray(new String[inputList.size()]));
+        if(StringUtils.isNotEmpty(pacsOrder)){
+            String[] pacsOrders = pacsOrder.split(",|,");
+            for (String pacs:pacsOrders) {
+                if(newInd.containsKey(pacs)){
+                    String causes = newInd.get(pacs);
+                    MedicalIndication m = new MedicalIndication();
+                    List<MedicalIndicationDetail> mds = new ArrayList<>();
+                    MedicalIndicationDetail medicalIndicationDetail = new MedicalIndicationDetail();
+                    medicalIndicationDetail.setType(4);
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("name", causes);
+                    jsonObject.put("controlType",2);
+                    medicalIndicationDetail.setContent(jsonObject);
+                    mds.add(medicalIndicationDetail);
+                    m.setName("不建议做:"+pacs);
+                    m.setDetails(mds);
+                    pacsMi.add(m);
+                }
+            }
+        }
+        return pacsMi;
+    }
 //    诊断过滤
     public void filterDis(List<FeatureRate> graphFeatureRates,String sex,Integer age) throws Exception {
         if(neo4jAPI == null){

+ 1 - 5
graph-web/src/main/java/org/diagbot/graphWeb/work/HighRiskCalculate.java

@@ -1,16 +1,12 @@
 package org.diagbot.graphWeb.work;
 
-import org.diagbot.common.work.SearchData;
+import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.graph.javabean.GdbResponse;
-import org.diagbot.graph.jdbc.DriverManager;
-import org.diagbot.graph.jdbc.Neo4jAPI;
 import org.diagbot.pub.api.Response;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.diagbot.pub.utils.http.HttpApi;
-import org.neo4j.driver.v1.Driver;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.LinkedHashMap;
 import java.util.Map;
 
 public class HighRiskCalculate {

+ 3 - 3
graph-web/src/main/java/org/diagbot/graphWeb/work/LisPacsCalculate.java

@@ -1,8 +1,8 @@
 package org.diagbot.graphWeb.work;
 
-import org.diagbot.common.work.FeatureRate;
-import org.diagbot.common.work.ResponseData;
-import org.diagbot.common.work.SearchData;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.ResponseData;
+import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.pub.api.Response;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.diagbot.pub.utils.http.HttpApi;

+ 0 - 84
graph-web/src/main/java/org/diagbot/graphWeb/work/ParamsDataProxy.java

@@ -1,84 +0,0 @@
-package org.diagbot.graphWeb.work;
-
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.diagbot.common.work.SearchData;
-import org.diagbot.nlp.feature.FeatureAnalyze;
-import org.diagbot.nlp.feature.FeatureType;
-import org.diagbot.nlp.util.Constants;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
-public class ParamsDataProxy {
-    public void createSearchData(HttpServletRequest request, SearchData searchData)throws Exception {
-        //消除空格
-        if (searchData.getSymptom() != null) {
-            searchData.setSymptom(searchData.getSymptom().trim());
-        }
-        if (searchData.getDiag() != null) {
-            searchData.setDiag(searchData.getDiag().trim());
-        }
-        //计算年龄区间
-        if (searchData.getAge() > 0) {
-            searchData.setAge_start(searchData.getAge() - 5);
-            searchData.setAge_end(searchData.getAge() + 5);
-        }
-        //默认查询门诊数据
-//        if (org.springframework.util.StringUtils.isEmpty(searchData.getResourceType())) {
-//            searchData.setResourceType(BigDataConstants.resource_type_o);
-//        }
-        //所有信息参与推送
-        searchData.setSymptom(searchData.getSymptom() + searchData.getVital()
-                + searchData.getLis() + searchData.getPacs() + searchData.getPast() + searchData.getOther() + searchData.getIndications());
-        searchData.setSymptom(searchData.getSymptom().trim());
-        //一次推送多个类别信息
-        String[] featureTypes = searchData.getFeatureType().split(",");
-        searchData.setFeatureTypes(featureTypes);
-
-        //获取入参中的特征信息
-        FeatureAnalyze fa = new FeatureAnalyze();
-
-        if (!org.springframework.util.StringUtils.isEmpty(searchData.getSymptom())) {
-            List<Map<String, Object>> featuresList = fa.start(searchData.getSymptom(), FeatureType.FEATURE);
-            paramFeatureInit(searchData, featuresList);
-
-            //如果既往史中诊断信息,需要提取这个特征
-            featuresList = fa.start(searchData.getOther(), FeatureType.DIAG);
-            paramFeatureInit(searchData, featuresList);
-        }
-
-        if (!org.springframework.util.StringUtils.isEmpty(searchData.getDiag()) && org.springframework.util.StringUtils.isEmpty(searchData.getSymptom())) {
-            List<Map<String, Object>> featuresList = fa.start(searchData.getDiag(), FeatureType.DIAG);
-            paramFeatureInit(searchData, featuresList);
-        }
-
-    }
-
-    /**
-     * 推送模型入参
-     *
-     * @param searchData
-     * @throws Exception
-     */
-    private void paramFeatureInit(SearchData searchData, List<Map<String, Object>> featuresList) throws Exception {
-        if (featuresList != null && featuresList.size() > 0) {
-//            BeanUtils.setProperty(searchData, property_list, featuresList);
-            Map<String, Object> featureMap = null;
-            for (int i = 0; i < featuresList.size(); i++) {
-                featureMap = featuresList.get(i);
-                Map<String, String> map = new HashMap<>();
-                for (Map.Entry<String, Object> entry : featureMap.entrySet()) {
-                    map.put(entry.getKey(), String.valueOf(entry.getValue()));
-                }
-                map.put("featureType", String.valueOf(featureMap.get("feature_type")));
-                map.put("featureName", String.valueOf(featureMap.get("feature_name")));
-                if (Constants.default_negative.equals(featureMap.get("negative"))) {
-                    searchData.getInputs().put(map.get("feature_name"), map);
-                } else {
-                    searchData.getFilters().put(map.get("feature_name"), map);
-                }
-            }
-        }
-    }
-}

+ 1 - 1
graph-web/src/main/resources/application.yml

@@ -12,7 +12,7 @@ spring:
       charset: UTF-8
       enabled: true
   datasource:       # mybatis 配置,使用druid数据源
-    url: jdbc:mysql://192.168.2.235:3306/graph-web?useUnicode=true&characterEncoding=UTF-8
+    url: jdbc:mysql://1.1.1.1:3306/graph-web?useUnicode=true&characterEncoding=UTF-8
     username: root
     password: diagbot@20180822
     type: com.alibaba.druid.pool.DruidDataSource

+ 5 - 1
graph/pom.xml

@@ -27,7 +27,11 @@
             <artifactId>common-service</artifactId>
             <version>1.0.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.diagbot</groupId>
+            <artifactId>common-push</artifactId>
+            <version>1.0.0</version>
+        </dependency>
         <dependency>
             <groupId>org.diagbot</groupId>
             <artifactId>nlp</artifactId>

+ 64 - 9
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java

@@ -4,12 +4,9 @@ import com.alibaba.druid.support.json.JSONUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import io.netty.handler.codec.json.JsonObjectDecoder;
-import org.assertj.core.util.Lists;
-import org.diagbot.common.javabean.*;
-import org.diagbot.common.work.*;
+import org.diagbot.common.push.bean.FeatureRate;
+import org.diagbot.common.push.bean.neo4j.*;
 import org.diagbot.pub.utils.PropertiesUtil;
-import org.neo4j.driver.internal.value.NodeValue;
 import org.neo4j.driver.v1.*;
 import org.neo4j.driver.v1.types.Node;
 import org.neo4j.driver.v1.types.Path;
@@ -863,6 +860,9 @@ public class Neo4jAPI {
                     } else if(que.equals("拟诊")){
                         queMap.put("拟诊","");
                         neoPushMap.put(quezhenName,queMap);
+                    }else {
+                        queMap.put(que,"");
+                        neoPushMap.put(quezhenName,queMap);
                     }
                 }else {
                     Map<String,String> newMap = new HashMap<>();
@@ -1146,7 +1146,54 @@ public class Neo4jAPI {
         }
     }
 
-
+    /**
+     * 指标推送,检查预警
+     */
+    public Map<String,String> getNewInd(String[] keys) {
+        //查找指标推送
+        Map<String ,String> indMap = new HashMap<>();
+        List<String> fildList = new ArrayList<>();
+        for (String fild : keys) {
+            fildList.add("\"" + fild.trim() + "\"");
+        }
+        logger.info("根据 " + fildList + " 这些词推送指标!!!");
+        Session session = null;
+        StatementResult result = null;
+        String query = "";
+        try {
+            session = driver.session(AccessMode.WRITE);
+            //第一步查询输入的词所在number
+            query = "match(t:Temporary)-[r:属于]->(n:NewCondition)-[r1:诊断依据]->(n1:NewCondition)-[r2:拟诊]->(n2:NewIndicators) \n" +
+                    "where t.name in "+fildList+" return n2.name as name";
+            System.out.println(query);
+            result = session.run(query);
+            while (result.hasNext()) {
+                Record record = result.next();
+                String newIndName = record.get("name").toString();
+                StringBuffer s = new StringBuffer();
+                query = "match(n2:NewIndicators)-[r:表现]->(t:Temporary) where n2.name="+newIndName+" return collect(t.name) as names";
+                StatementResult sr = session.run(query);
+                while (sr.hasNext()){
+                    Record next = sr.next();
+                    List<Object> names = next.get("names").asList();
+                    if(names.size()>0){
+                        for (Object o:names) {
+
+                            if(fildList.indexOf("\""+o.toString()+"\"") >= 0){
+                                s.append(o.toString().replace("\"", ""));
+                            }
+                        }
+                    }
+                }
+                indMap.put(newIndName.replace("\"", ""),s.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            CloseSession(session);
+            return indMap;
+        }
+    }
     /**
      * 多疾病下治疗方案
      *
@@ -1478,7 +1525,11 @@ public class Neo4jAPI {
                             //                            Map<String, String> bigSubDrugs = new DrugsPattern().bigSubDrugs(drugsName);
                             Map<String, String> bigSubDrugs = drugsPattern.bigSubDrugs(drugsName);
                             drugs.setBigdrugsName(bigSubDrugs.get("big"));
-                            drugs.setSubdrugsName(bigSubDrugs.get("sub"));
+                            drugs.setSubdrugsName("");
+                            // 如果大类和小类相等,则不推小类
+                            if (!bigSubDrugs.get("sub").equals(drugs.getBigdrugsName())) {
+                                drugs.setSubdrugsName(bigSubDrugs.get("sub"));
+                            }
                             LinkedList<Medicition> medicitionsList = new LinkedList<>();
                             LinkedHashMap<String, String> meditionRate = w.getValue();
                             if ("忌用".equals(drugsUseMap.get(bigSubDrugs.get("big"))) || "忌用".equals(drugsUseMap.get(bigSubDrugs.get("sub")))) {
@@ -2687,7 +2738,7 @@ public class Neo4jAPI {
 
         } catch (Exception ex) {
             ex.printStackTrace();
-            System.out.println("返回带得分需要计算的量表时出了问题!---->getScaleCalc");
+            logger.error("返回带得分需要计算的量表出了问题!---->getScaleCalc2");
         } finally {
             CloseSession(session);
             return scaleStructure;
@@ -2746,6 +2797,10 @@ public class Neo4jAPI {
                     scaleStructure.put("scaleName", scaleName);
                 }
 
+                if (index.contains("-")) {
+                    index = index.split("-")[0];
+                }
+
                 JSONObject detail = new JSONObject();
                 detail.put("detailName", feature);
                 detail.put("state", 0);
@@ -2779,7 +2834,7 @@ public class Neo4jAPI {
             }
         } catch (Exception ex) {
             ex.printStackTrace();
-            System.out.println("返回不带得分不需要计算的量表出了问题!---->getScaleNoCalc");
+            logger.error("返回不带得分不需要计算的量表出了问题!---->getScaleNoCalc");
         } finally {
             CloseSession(session);
             return scaleStructure;

+ 0 - 77
graph/src/main/java/org/diagbot/graph/util/CacheUtil.java

@@ -1,77 +0,0 @@
-package org.diagbot.graph.util;
-
-import org.diagbot.nlp.participle.cfg.Configuration;
-import org.diagbot.nlp.participle.cfg.DefaultConfig;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class CacheUtil {
-    public static Map<String,String> lexionMap=null;
-    public static Map<String,Map<String,String>> sexAgeMap=null;
-    public static Map<String,String> vitalMap=null;
-    public static Map<String,String> disgSortMap=null;
-    public static Map<String,String> getDiagSortCache(){
-        String path = "diagSort.dict";
-        Configuration configuration = new DefaultConfig();
-        if(disgSortMap == null){
-            disgSortMap = new HashMap<>();
-            List<String> contentList = configuration.readFileContents(path);
-            for (String s:contentList) {
-                String[] splits = s.split("\\|");
-                String diagName = splits[0];
-                String diagType = splits[1];
-                disgSortMap.put(diagName,diagType);
-            }
-        }
-        return disgSortMap;
-    }
-    public static Map<String,String> getLexionCache(){
-        String path = "lexicon.dict";
-        Configuration configuration = new DefaultConfig();
-        if(lexionMap == null){
-            lexionMap = new HashMap<>();
-            List<String> contentList = configuration.readFileContents(path);
-            for (String s:contentList) {
-                String[] splits = s.split("\\|");
-                lexionMap.put(splits[0],splits[1]);
-            }
-
-        }
-        return lexionMap;
-    }
-    public static Map<String,Map<String,String>> getSexAgeCache(){
-        String path = "sexAge.dict";
-        Configuration configuration = new DefaultConfig();
-        if(sexAgeMap == null){
-            sexAgeMap = new HashMap<>();
-            List<String> contentList = configuration.readFileContents(path);
-            for (String s:contentList) {
-                Map<String,String> contentMap = new HashMap<>();
-                String[] splits = s.split("\\|");
-                String sexTyep = splits[1];
-                String min_age = splits[2];
-                String max_age = splits[3];
-                contentMap.put("sexType",sexTyep);
-                contentMap.put("min_age",min_age);
-                contentMap.put("max_age",max_age);
-                sexAgeMap.put(splits[0],contentMap);
-            }
-        }
-        return sexAgeMap;
-    }
-    public static Map<String,String> getVitalCache(){
-        String path = "vital.dict";
-        Configuration configuration = new DefaultConfig();
-        if(vitalMap == null){
-            vitalMap = new HashMap<>();
-            List<String> contentList = configuration.readFileContents(path);
-            for (String s:contentList) {
-                String[] splits = s.split("\\|");
-                vitalMap.put(splits[0],splits[1]);
-            }
-        }
-        return vitalMap;
-    }
-}

+ 2 - 6
graph/src/main/resources/bolt.properties

@@ -1,5 +1,5 @@
 #235Mysql\u6570\u636E\u5E93
-url_235 = jdbc:mysql://192.168.2.235:3306/scale?useUnicode=true&characterEncoding=UTF-8
+url_235 = jdbc:mysql://1.1.1.1:3306/scale?useUnicode=true&characterEncoding=UTF-8
 userNmae_235 = root
 pass_235 = diagbot@20180822
 
@@ -9,10 +9,6 @@ bolt.uri=bolt://192.168.2.233
 bolt.user=neo4j
 bolt.passwd=root
 
-#\u533B\u5B66\u672F\u8BED\u4F7F\u7528
-bolt232.uri=bolt://192.168.2.232
-bolt232.user=neo4j
-bolt232.passwd=root
 
 #\u6D4B\u8BD5\u4F7F\u7528
 bolt112.uri=bolt://192.168.3.112
@@ -91,7 +87,7 @@ searchDifferentialDiagnose=match(d:Disease)-[r:\u9274\u522B\u8BCA\u65AD]->(h) wh
 searchEmergency=match(d:Disease) where d.name in disList return d.name as emDis,d.emergency as em
 
 #\u67E5\u627E\u6307\u6807\u7684\u8BED\u53E5
-searchIndication=match (n:Condition)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:Indicators)\n \
+    searchIndication=match (n:Condition)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:Indicators)\n \
 where n.name in fildList\n \
 with distinct m,r\n \
 return m.name as name

+ 0 - 756
graph/src/main/resources/diagSort.dict

@@ -1,756 +0,0 @@
-BcX7V3pTwpetFaNdnKehnARlNLC4WkMM
-pFdZPuCKzszYU6xqspywv0pgEZ36UZf7
-cyrUnsE+xTu69RZQsnc3eg==
-wAG7h4jgsHxcX5zqNHHt/Q==
-FeneHV0jniUYclRR5n6EOK6TFu1St0Q+
-FeneHV0jniXhjOGBjP0tkYJ/8HhcFBMjQsjDFyh0etI=
-JXDJAOpdlPoQbzZMuyy9fQ==
-RnmiLlZn/N8QbzZMuyy9fQ==
-rh16PU/bLzkK6I86gb+Ao0pgEZ36UZf7
-7nUs+pzMGNQjLd5G+EcdiUpgEZ36UZf7
-2uRZ3LWgKU3RH5Nj+q+LtrATS+O+j2ux
-cn9SelEe5HuV5wTT88NyS0pgEZ36UZf7
-GYBI2zJwMBNey2dyHe3hZXRjEyS9gTVe
-ccapIA2Os+T9oXeA5vVZEUpgEZ36UZf7
-rlgWhYLTdSUKVV36DWVEmkpgEZ36UZf7
-gh+pwxxYTnu/GGpwIprIPQ==
-v90Q9YDK3e0QbzZMuyy9fQ==
-Thq2mIfRTdi8HjJqAapif66TFu1St0Q+
-9K+PZ38Hd/3Lq4u7hNFVk66TFu1St0Q+
-9K+PZ38Hd/0q17w2ajSKHK6TFu1St0Q+
-ZWQHTSD6hCtjsD7stN1IVkpgEZ36UZf7
-LZyp1gIf6wgpLJFGqVmt30pgEZ36UZf7
-9Mqch0gZ4bMvCICzkLDDGehZn9/adx3vvk9zQiFPShUQbzZMuyy9fQ==
-UCgJlS/HXezaY475fTCHFK6TFu1St0Q+
-UCgJlS/HXexHXYr3weuURK6TFu1St0Q+
-tlK7bfXVIBUQF98iypbgjkpgEZ36UZf7
-xbg5pYjlVtXGgDHUkbi1wK7QEgPGBpLdgymuBa+h7Sj5ddv1PS4NAA==
-ZBlMqkWFMgF4AoArZ/s7PQ==
-cbrTnbEyu0MQbzZMuyy9fQ==
-6950kamGyz1jn8atkAa4WS1kFUX8b1/V
-aZM1EQIbHX4QbzZMuyy9fQ==
-kdU8UcCILZA2zqe2dEz9kJTAjlN+0rCKQsjDFyh0etI=
-VuA+VaAbW6kQbzZMuyy9fQ==
-2xt2LoFXv4UQbzZMuyy9fQ==
-GeOoxHykR0NIkRc7oSI9s0DkVM7urTWs
-4fpWUFa+lAB8bnaDayw0F0pgEZ36UZf7
-PoSiDC1E8k0QbzZMuyy9fQ==
-IHXErJfSSFB8bnaDayw0F0pgEZ36UZf7
-785EOhh4F5tf/w933Z8XSUpgEZ36UZf7
-O8LPxcSZWgDrtccsLlj5wA==
-MsAiyvZZGvKIR37fpmmVAUpgEZ36UZf7
-NUY6EzUNBcu69RZQsnc3eg==
-hIcKxvB0qrSIR37fpmmVAUpgEZ36UZf7
-hIcKxvB0qrQ1/obow+hNxNS3UCP+XxkeHMgLh0YjYP8QbzZMuyy9fQ==
-hIcKxvB0qrQ1/obow+hNxM87KOEe5EKOHMgLh0YjYP8QbzZMuyy9fQ==
-p+oXZGb9femkmRvSpkGJU0pgEZ36UZf7
-IgfkS/yzfiNl6qtXuMmmfa6TFu1St0Q+
-T8qiUcOxWGe69RZQsnc3eg==
-1suDit3Eq7XNgWyWzjfkBeK+1Ww6oK4tQsjDFyh0etI=
-vdDujKxsGqRfVjmT72+IU66TFu1St0Q+
-vdDujKxsGqSuYTcjFB8CYIW56gVH63DBT8qiUcOxWGe69RZQsnc3eg==
-vdDujKxsGqSuYTcjFB8CYL6qBg32lrLQT8qiUcOxWGe69RZQsnc3eg==
-ocjyg6d/YZbcONVccNlNVA==
-iXWjcPj0niUZmdQ/MALAmPL6oKDxDkyLMUxkNOfOKBk=
-fMSADmyw8MXq+bor/PgnsEpgEZ36UZf7
-1MVvkAG3zx3q+bor/PgnsEpgEZ36UZf7
-uQzgoFGJdFj2i9L+69DtekpgEZ36UZf7
-laj6iFmYc2AO7u5UUGMv2g==
-8MZjPdx7E/YQbzZMuyy9fQ==
-iOqRqy56ghDd1s+oEyUq9UpgEZ36UZf7
-e8PUaMqGKBiyk0jmTIrtlQ==
-JawkevnCrNdts8zcqwR2eKHvMDErP7gJMUxkNOfOKBk=
-aMsbvjbfGsUxQ2HeHu18jrvXt2imflBA
-CDrQ2ea5LGBD55v6CvxK1g==
-m+hvPY3d9tI9PnHdu7yUaWzLelbG6d/HQsjDFyh0etI=
-leErXN0I8rbT5yLaXLnA4UpgEZ36UZf7
-E4hT7N3ytDu1bH4gSInujbSy3yYbdHE3QsjDFyh0etI=
-3aCjb4B6LUgQbzZMuyy9fQ==
-G4j5jFyDtCkSCQzGhDDQ3xFd186JPWIx
-dQt5mgUKF7RGbvA+FxO6Aa6TFu1St0Q+
-bK8Zpab/PptNYls6bckCK0b9mG02yi89
-w4uh9xHmZ7333UOSXmsr6UpgEZ36UZf7
-b8nVx09fy5I4ol1WGH/UY+uB4rqv7sHTQsjDFyh0etI=
-PARbOnEYlB3rgwUip8TSvq6TFu1St0Q+
-go/dWWwGU8ZD55v6CvxK1g==
-T0tpWQa0WBwpLJFGqVmt30pgEZ36UZf7
-GU9rv7S9HDIGHMaWPyuU9EpgEZ36UZf7
-Fmkib4/xoTNW31DI1h7eFg==
-PaGbbzoWurQnHOlkm0sxA7ATS+O+j2ux
-unXa+WSPJaTcONVccNlNVA==
-5z/FaS08FC1BnszADhIUyA==
-6VoNgNkfRe8QbzZMuyy9fQ==
-d1sVTi4llK7lQZ/5Ca6Djemquk3AdnJs
-erLQ3JyUfITosWPRubTz9g==
-HCEq+yB3xiRUIm92l3iN1QRlNLC4WkMM
-x8Xhf0IsI6i69RZQsnc3eg==
-767F12U7TA669RZQsnc3eg==
-VQyanJdAJxr8KlV1ph0Yja6TFu1St0Q+
-v0o/NZ2Flyh0rznFov+n29Lc9dC9R8SPQsjDFyh0etI=
-H250ngXCLbQRBJ/GG5blyg==
-2gjhNrDt+ecKVV36DWVEmkpgEZ36UZf7
-B5DO9dw1D2aNtey2rT+RsUpgEZ36UZf7
-zmnYQWRJshxfVjmT72+IU66TFu1St0Q+
-/nZa4JHvh5RutdpwhrdIlK6TFu1St0Q+
-/nZa4JHvh5S+AVOQd458366TFu1St0Q+
-yAZvjf/Npq3cONVccNlNVA==
-L2rEB7a+UV80RdSYnDioGwasHACEUXCA
-pP/EazI2ohTcONVccNlNVA==
-b+p7oPuIEcXg3Myw7p6Prw==
-0j/OcOgq4vblQZ/5Ca6DjavOQA58TWdB
-2w7I+GMn9H/osWPRubTz9g==
-G6wb24Mf5+Q2bj7D5mvDy66TFu1St0Q+
-G6wb24Mf5+SuA6VKJ2wwgRFd186JPWIx
-Iv1mcWBS5FKHDjyHip04zq6TFu1St0Q+
-odwlcbPCv1W69RZQsnc3eg==
-yBoOCGRT4wkQbzZMuyy9fQ==
-XNaWB0E7siMQbzZMuyy9fQ==
-0oaWW6Ft5KK1f4daHIwZR66TFu1St0Q+
-Xn4HnNubANHFZ5D2h4QJfa6TFu1St0Q+
-/VfPpD7+6VgDBxRO/zU9JkpgEZ36UZf7
-fSwdf2OLVVwUSzruuERD/kpgEZ36UZf7
-xADmzjZLg26rDnbY10uRMnRjEyS9gTVe
-EB1+TmwsWHFLSooFBSheEa6TFu1St0Q+
-EiJtPPoy5YOqBDtVMagTbV0cGoICqv+Y
-2Om0H6dKuzZjsD7stN1IVkpgEZ36UZf7
-ky+iLMs6QhG69RZQsnc3eg==
-Do2wiH59igUFYo+n99SzmK6TFu1St0Q+
-4Wm1uiOER9xjsD7stN1IVkpgEZ36UZf7
-4kdkKXQ7T0R1hHUpo6tg/RFd186JPWIx
-0aA0U9ckmH1WgHE3Y5h4cq+zvaDCtmOC
-udHQ1AK6s0BHbbfugUQuexFNDyQXudPo
-udHQ1AK6s0BHbbfugUQuezWfKD51et5xM88MNA/vQMjPtKrR/HyW6g==
-ZHexhB9C/Zz4F0w18YK/UXNxLrmbdg4ypHp904IlTO0=
-0aA0U9ckmH2kmRvSpkGJU0pgEZ36UZf7
-qBVDKbnPe4AKlwQICYBuZARlNLC4WkMM
-asaad8Q4C6C69RZQsnc3eg==
-FfjvvdggP/1GEF1igpqnMqTO0BUuhgmmpHp904IlTO0=
-c8fipJzZpKFjsD7stN1IVkpgEZ36UZf7
-tVBVCkW2P2vvP1LP4h1GfbATS+O+j2ux
-RL9wd7sqH8nJ/XFJLG1noC3MK637qtLAMUxkNOfOKBk=
-pNyUesdLMVAQbzZMuyy9fQ==
-P6wUpZ7cEfJjsD7stN1IVkpgEZ36UZf7
-lcvWexuh08kQbzZMuyy9fQ==
-cOvzp9XLrnHPtKrR/HyW6g==
-24DcSkM24Sy550INzsMxI0pgEZ36UZf7
-24DcSkM24SyWrgmkghmdO1Ko6ZZdPmtccOvzp9XLrnEQbzZMuyy9fQ==
-ubdFc9Fjb2PZLxnyiQ/rkkpgEZ36UZf7
-3OUUj3H9vbXc+KxpsRsDrA==
-/VqIfk4vfde69RZQsnc3eg==
-eAGFq9Be2c60E0hhBYOohJTAjlN+0rCKQsjDFyh0etI=
-hYF2byblOfrmON+KcZNNZ66TFu1St0Q+
-FOjb6eu8wui69RZQsnc3eg==
-6Oqf3E+UYp0uSzhzXn0QB0pgEZ36UZf7
-bKuUJ1epVUL/BocxQ/VkHF6uLIHrocIjMUxkNOfOKBk=
-bKuUJ1epVUJL/UW/zBqatq6TFu1St0Q+
-bKuUJ1epVULWXIcogNVO9K6TFu1St0Q+
-Pj9SI6V8cpAQbzZMuyy9fQ==
-2O5atTA83Yr6YqjoYt1SRw==
-TRi1oeyNUdOyMfjkGshymq6TFu1St0Q+
-zm66Ok5YvbJgW+fN9gkOExFd186JPWIx
-0FmNHjoeZ7ZzPdxvkmOOUQ==
-oVJkClU0Bvh5NR6CtIcYXyJQS0qubhjOMUxkNOfOKBk=
-l0FzfX6DT5kkzaN7ZmJDz0pgEZ36UZf7
-twznt9msCJMFAh5yz5V5DA==
-GJGUhATERBm69RZQsnc3eg==
-dNe0XAa3Jm+69RZQsnc3eg==
-g0zbV1jZvRG+FqF3alT2MK6TFu1St0Q+
-g0zbV1jZvRFGaekUD7uix0pgEZ36UZf7
-rT95lZHuLzl5qXvK6bns50pgEZ36UZf7
-246DAPSPSX+jDwBn58SGBA==
-qptm92sSB/UuSzhzXn0QB0pgEZ36UZf7
-SZ7z14JzRxxIEyQTlUlZeA==
-mc0v41Pmxbu69RZQsnc3eg==
-X9EC5zk/BzLe//s1SyicgUpgEZ36UZf7
-YbFLLWDTZX7s9iRt3fGmm0pgEZ36UZf7
-JhrB2RKqSO8QbzZMuyy9fQ==
-vKMadaRxCnt9yZ92+zfrDRFd186JPWIx
-rwSi9v0Y5/kpw8jvosnBbEpgEZ36UZf7
-L4guYbOD3ybiWybz9IQNYq6TFu1St0Q+
-g30soSzYKlYqYKw79TNc7WzLelbG6d/HQsjDFyh0etI=
-IfQDH7CTkzLhHU77rtW3IEpgEZ36UZf7
-Gc+2o0fCUZzBRTe6oIudra6TFu1St0Q+
-xG5CG1VWnMcYMNtTOEq0iq6TFu1St0Q+
-xG5CG1VWnMemkG9esmQL6vmkGF5eJuLTgcGpywLGjyk=
-+812jhbb/MJhfXGLID+DlwxRxeTVAFkvMUxkNOfOKBk=
-ZpI2ZmzFQJ3d+AsDA8cg4xFd186JPWIx
-+8iGrGjQRQXLJRvWtAt1iWXPkQWk08oq
-Gcnsiwomf6vBdIdG8bPRHq6TFu1St0Q+
-cJPzYw+8qO2U1kX+sOaXa66TFu1St0Q+
-cJPzYw+8qO3DvZfDAYgFeEpgEZ36UZf7
-L4guYbOD3yb/9bq0lnqP8q6TFu1St0Q+
-nVdA10JEgrH58tUSo2w3wRFd186JPWIx
-dHtBk0+GYeLrnk1qsavO30pgEZ36UZf7
-wDXNPMfkdyNaJVU3B73UtkpgEZ36UZf7
-DH2VViKrbzkp6/lKXi3UMOrUo2OLEJuOMUxkNOfOKBk=
-JuMgbbZn7fq69RZQsnc3eg==
-hNhIxSJODQcQbzZMuyy9fQ==
-Be1T87t+ge5XlrymvmHctullg955GZOyQsjDFyh0etI=
-Be1T87t+ge6yBrpNLcSpoZjZkopBAnj4MUxkNOfOKBk=
-Be1T87t+ge6km2jSURfVd66TFu1St0Q+
-Be1T87t+ge6BEzUegK+Lza6TFu1St0Q+
-Be1T87t+ge5XqKHPIBx1da6TFu1St0Q+
-Be1T87t+ge4WsteAkC3pgkpgEZ36UZf7
-Be1T87t+ge48js9ij9+tfK6TFu1St0Q+
-pF+/2e5PCdiYv/g0PaK/jLATS+O+j2ux
-mySxSoQQ5hHpWpvdSbbRuEpgEZ36UZf7
-vw9DQsUCodtXqKHPIBx1da6TFu1St0Q+
-q8SO41xH4H+69RZQsnc3eg==
-bL0xvp6bKswuSzhzXn0QB0pgEZ36UZf7
-OlIufldps1669RZQsnc3eg==
-k/AWU8J38ewgXPwNYOJVVEpgEZ36UZf7
-4Qvrbb1JTp8NEtu2B0J0EkpgEZ36UZf7
-m/tIDzJi3OZXUDBIWUrqSK6TFu1St0Q+
-O3P6K+AfRNzF44QHb2ipdySJiF99b0wTQsjDFyh0etI=
-m7NwXX44/6UMorRxG+mAPOpKBtESlcIq
-wtKpMto5s6y69RZQsnc3eg==
-S9B++UiCXWVbnA9om6yqTUpgEZ36UZf7
-WIGh7D0Sh7QQbzZMuyy9fQ==
-ttuFIQiBSmBL/UW/zBqatq6TFu1St0Q+
-FkH+3MJcYBklYvB1qywZ0w==
-+SvHIm2Mlu9WgHE3Y5h4clmDacM1Qce9g5pwDthfxF0=
-+SvHIm2Mlu+kmRvSpkGJU0pgEZ36UZf7
-UnEQf/j0jK669RZQsnc3eg==
-bq4owRXG1Pi9sAs6ya9NVUpgEZ36UZf7
-bq4owRXG1PjYU6xqspywv0pgEZ36UZf7
-8GR+KuRP/IrZpafk8rhqLq6TFu1St0Q+
-GhRXduWr8cb3R9KvkRZsVq6TFu1St0Q+
-osXaeNVdi5Dge6sx1rKnBkpgEZ36UZf7
-uCAuXCRbEjO69RZQsnc3eg==
-+Eu7/eJLklcQbzZMuyy9fQ==
-rKBk01Fx9j269RZQsnc3eg==
-HX/6YLaQ1igQbzZMuyy9fQ==
-exVNBGNkzovmV1tSJ5bX/kpgEZ36UZf7
-HzTSi3irigCvmjkAhtg9xlV2rXAZxRtdwIyvNNx82FmIhPyc0rS35Q==
-VgjQjLlxJga69RZQsnc3eg==
-oCdVZ3TjXszsI02ZCbErN66TFu1St0Q+
-06VstCfw9TvjkaMZ4YNV7kpgEZ36UZf7
-yIwYB0D5ANpIkRc7oSI9s0DkVM7urTWs
-XsRueZvhAyoY2HrRmU8pmnfPzG5Uk11rMUxkNOfOKBk=
-MWehmVZf6C03ix6bNeTT50pgEZ36UZf7
-53+yvEZVriY3ix6bNeTT50pgEZ36UZf7
-JWBCcm2oC0hlDmn3A9bDMCZCeN6biUcBzIoa92Sdy9uken3TgiVM7Q==
-z0NB6EgQrYuej9syichlRa6TFu1St0Q+
-7dwIUGq+pHAjgMng2FanCa6TFu1St0Q+
-7dwIUGq+pHDVNpX+SJIcBl2BBsIawet1Y+n1GTEPqeIQbzZMuyy9fQ==
-ZtiRChQSkzkHtd+QAWXXl0pgEZ36UZf7
-u2y2FVfBqZ669RZQsnc3eg==
-md7FgUY16RRpHAHM1WsmQ76iSxkTQlgB
-Wv0p/PwJHRdhDZurQlhANEpgEZ36UZf7
-Wv0p/PwJHRdGaekUD7uix0pgEZ36UZf7
-ZTORLADhCW0//Lt/QRmfpxFd186JPWIx
-ZTORLADhCW2V5Bc5DWG/rq6TFu1St0Q+
-wMnWetYvwcB22baEwHSHdQRlNLC4WkMM
-fHieFygyEvwDBxRO/zU9JkpgEZ36UZf7
-entv5lp5ztG69RZQsnc3eg==
-W6++NOLhnGImgH9IsYidFBFd186JPWIx
-JAdHujdWNWIQbzZMuyy9fQ==
-jhM9JTBsgxc3ix6bNeTT50pgEZ36UZf7
-neSRPR/Dc1o3BEhoG6ZHqEpgEZ36UZf7
-ySmvEQkp+QnDVB+FOWxfQgEdVR4JW0pvQsjDFyh0etI=
-gre6Tf1xXnDfF8fdQPwqgkpgEZ36UZf7
-LAphuzvX0+1w5Y5BQVzk8EpgEZ36UZf7
-LAphuzvX0+3XoplDMw5YiK6TFu1St0Q+
-4dmt9tLfxArcemGYPMM4W/2FWCxcMLt3
-pjQ6oNqUNpDNgWyWzjfkBeK+1Ww6oK4tpHp904IlTO0=
-I1DBVtavRK0sCT9VnjItvUpgEZ36UZf7
-DGdum4rbXqe9sAs6ya9NVUpgEZ36UZf7
-liY3+k43l7+Q4FSyzAKv7/wyznKZVl2qm9NdDcVBO4TPtKrR/HyW6g==
-Yrj7/Cliiaz4osiym+Qx7q6TFu1St0Q+
-Yrj7/CliiawTfm2BwPdp0K6TFu1St0Q+
-Yrj7/CliiazUFVAdmhdxV0pgEZ36UZf7
-NBBXNZCaNE99yZ92+zfrDRFd186JPWIx
-VynNxYGlkQAAYjr/iAXyc0pgEZ36UZf7
-/nSM2iK24qLBTtMburLnsxFd186JPWIx
-JZwfCTqSDJXhHU77rtW3IEpgEZ36UZf7
-GDDHjFNx9y3/htQJCfkj0jH8At29S2vWMUxkNOfOKBk=
-GDDHjFNx9y3/htQJCfkj0jH8At29S2vW2tJwUxoKu3Z3Ejg0x6Jg7UpgEZ36UZf7
-s6xvxms4FKy3Z3wCjfQBfKEFpmD/7rphVYc272jQVlzsAYHIvlGaQ0pgEZ36UZf7
-nly0EGexHS8W40YEz3OcsrfiN+rZvC5rpHp904IlTO0=
-Z6ORYEVTHAYYMNtTOEq0iq6TFu1St0Q+
-V36oXX8CJ64Yoo5YVl4ymlHJ+U6ttM36QsjDFyh0etI=
-VCHr/EMKXxzO0EtYHLOvphFd186JPWIx
-0XdboMChu2E5gHpaD2pPooAQZEKNzc0cQsjDFyh0etI=
-hUAdePKw8FaO4zpxKF2pcUpgEZ36UZf7
-ms3NmDDAWXmcg+a+FanOcK6TFu1St0Q+
-ms3NmDDAWXnBdIdG8bPRHq6TFu1St0Q+
-xt3ch79mTxjDvZfDAYgFeEpgEZ36UZf7
-v4ihoCtNRVm64ZIHXxB1ELMtDXvYITGLQDXerzMEonY=
-Z6ORYEVTHAbdjUukdGSSoa6TFu1St0Q+
-/i480IQgLMepMlZ7KX1uK5Uu1LwoAZE1pHp904IlTO0=
-tsogkendiar58tUSo2w3wRFd186JPWIx
-tsogkendiar58tUSo2w3wU8KuEfhpPX9R/7mzGnZhPgQbzZMuyy9fQ==
-Z6ORYEVTHAZcKrbMkfbHlPSzXA5wk6riG7gWkmicr4asR1PWtjwftUpgEZ36UZf7
-lQFziLYwAFS69RZQsnc3eg==
-Lwk9eym56F3nQ5g+cqaOAEpgEZ36UZf7
-WV4Ty/OMJBg8ZussIEHzGUpgEZ36UZf7
-cchXAGqWaFReJ21yxIT3ba6TFu1St0Q+
-SPMC0Or3Wq5Ym2pzcr/F6K6TFu1St0Q+
-aak3L9Lnp6k4jrPr+Vc2Qq6TFu1St0Q+
-joRcuCpi9AbCf5nF5XhYkzq++rVj/JEh
-GxXLVwg10cxZKfrHsoPLMq6TFu1St0Q+
-q3wgm/88Ra/5FA/QNzKqWH0+UvKLRoJx
-5EBWJUcB7QrxvRcuB5L/UQ==
-5EBWJUcB7QpKxBbFVac+13RjEyS9gTVe
-LJS42ZwcpdF4AoArZ/s7PQ==
-Az4+5t1fUEIHfJh8pHGbwQ==
-ndv/6Tbir2C69RZQsnc3eg==
-fJTXcZwpB8lUhVo494mV+0pgEZ36UZf7
-C+CTZb0f4RMrkmpQpbhvUmzLelbG6d/HQsjDFyh0etI=
-wK1sZrL3pJCqgAN13k3kyUpgEZ36UZf7
-GR4nmuKDRgsQbzZMuyy9fQ==
-IAucFrl7qqxLIGJootoeXm20YNLFrd/2QsjDFyh0etI=
-BKa9L3k9bnKIR37fpmmVAUpgEZ36UZf7
-dyMnqxlKzdOMygbJsihIC0pgEZ36UZf7
-Dme0iKBg4ltD55v6CvxK1g==
-NFJD2ylSPGAT2FYvg8EptOOtyzPBIb3PQsjDFyh0etI=
-gkB282ET6CHZnuNxhT4mNuOtyzPBIb3PQsjDFyh0etI=
-mW7W5BgaP+OyKY5S6qj9y0pgEZ36UZf7
-BPywirVs7BwjgMng2FanCa6TFu1St0Q+
-LwTctfycqwn1eDN17P0yB2DeAGTxF+LrQsjDFyh0etI=
-BT/fHxNzenCIR37fpmmVAUpgEZ36UZf7
-oJ7KGIaocyBSndz+M2zpG66TFu1St0Q+
-KxlRPOIG9Zu69RZQsnc3eg==
-AHJVRVXWVMi9sAs6ya9NVUpgEZ36UZf7
-AHJVRVXWVMgKVV36DWVEmkpgEZ36UZf7
-Od0k7somw0+ognNgz49kBq6TFu1St0Q+
-4HI+0PfJaYN8YPH6c539+gh0Xdfz1dmI
-tqfw6NEVIE0sCT9VnjItvUpgEZ36UZf7
-D/nWCdnKl6rYU6xqspywv0pgEZ36UZf7
-3BvyzjY734YKVV36DWVEmkpgEZ36UZf7
-B2EBAR60IppviaU6KjCIOkpgEZ36UZf7
-2auQrCxhHIsKVV36DWVEmkpgEZ36UZf7
-qafVZjrsTecQbzZMuyy9fQ==
-+BWPPfYlvW1XqKHPIBx1da6TFu1St0Q+
-qJyJhtR9wYX3LsIUn3DSXA==
-Kj80l/0jF1MQbzZMuyy9fQ==
-BF5qDHsTq5IQbzZMuyy9fQ==
-v9yCwhqLXXSMygbJsihIC0pgEZ36UZf7
-pqQNd+2bsKQQbzZMuyy9fQ==
-2aDJllB28JLJXbPtseCSr66TFu1St0Q+
-FQUi8oWeKA0t2SdYDpcKMx4+/JjZmx5+QsjDFyh0etI=
-FQUi8oWeKA22mkhDBQ8Od66TFu1St0Q+
-FQUi8oWeKA16K4HqriD8jbATS+O+j2ux
-FQUi8oWeKA2ZveeDa7x7vQ26QOL8owUahm+575xLNpk=
-PN71jlSk34UCxwQXdsGm4RFd186JPWIx
-6EiWonjOwKYAZgmfbgyEWhFd186JPWIx
-n4KofNyd2vaf5Pk0Hz2DJw==
-KbKku7ucQ39uoije31Jd6N+AB/9JRYLv
-GCjAqXPF1DpefKc/Qs1jJ0pgEZ36UZf7
-XZm6QFzDmJh5QHl4Rg/BHa6TFu1St0Q+
-/gVNZGSuGULWbJef4vcbmEDKk/bXBHJ0
-PrCzvDaC5BIQbzZMuyy9fQ==
-jryElcwKEMNxLBNTp+QtPa6TFu1St0Q+
-Y3uHEyYQDdpjsD7stN1IVkpgEZ36UZf7
-sfDdVW5fHlbz7I3BdGQeAUpgEZ36UZf7
-Ijs5NwarmpdGNWh/ueDr//oslnIPxwMNOpiZwhxoQoY=
-GLZe/17QCbw2Hyl0WmLydTOZLUhfMDr5ccu/ewAJfBAQbzZMuyy9fQ==
-GLZe/17QCbxmXvUvjgbr4gRlNLC4WkMM
-FRuKyrtJj/RL/UW/zBqatq6TFu1St0Q+
-0sR5tvt5nTnz7I3BdGQeAUpgEZ36UZf7
-ike6hX0KY49viaU6KjCIOkpgEZ36UZf7
-DOXrtCrKcXQKVV36DWVEmkpgEZ36UZf7
-MzrnRYF60fhD55v6CvxK1g==
-MdIN8DMpaEBWgHE3Y5h4cq+zvaDCtmOC
-ZNQWeAaprLh99UDbqfbz0kpgEZ36UZf7
-Oed05VhE/J+69RZQsnc3eg==
-BGL6SBJINCS9sAs6ya9NVUpgEZ36UZf7
-/aUJ40q0OGE8js9ij9+tfK6TFu1St0Q+
-fkGZhX/El4S9sAs6ya9NVUpgEZ36UZf7
-RwfaZMa+tcJkNVRINR3RaK6TFu1St0Q+
-JsWoe4vRDt9D55v6CvxK1g==
-aExuyB28XAR0Cy32pByLQhyTd0zrhZHS
-Rq6VzCfzICnrnk1qsavO30pgEZ36UZf7
-/7ct4BMAXCX3LsIUn3DSXA==
-rH75MlwLe4iHDjyHip04zq6TFu1St0Q+
-WpMnbnNRcj++AVOQd458366TFu1St0Q+
-hgKSS6WIoWEBDkcxYXRMQuvrVV57TYMGQsjDFyh0etI=
-hgKSS6WIoWHSQcDia9XkMUZDtywxNaqwssFnX7VEXvk=
-ObtZggguHVG8I/xD/AcfOw==
-ZcATeY3SOmV6K4HqriD8jbATS+O+j2ux
-BtmsuCW8kSoRbt1qFeXe90pgEZ36UZf7
-IIbeVb1Zp2XBTiXSG8DU5A==
-gBhYk85FRG7osWPRubTz9g==
-1gUH5d9S+SToQkvGwyeRdEpgEZ36UZf7
-9ATztfXQ4YKkmRvSpkGJU0pgEZ36UZf7
-0xF9G4KuCCQKVV36DWVEmkpgEZ36UZf7
-zL88MVcVUc0QbzZMuyy9fQ==
-kN7D+ZqtUAcsXyKn8XbgBb6iSxkTQlgB
-06uexQw4y8b+wP1ZSJe0Fa6TFu1St0Q+
-R2Qp0UuOuBm69RZQsnc3eg==
-QqZvghyTZW3Etpl/UCrmDhwtk57bhXro
-WEck0+cxgSIKVV36DWVEmkpgEZ36UZf7
-lk8o5519Kxjg6njkDcx/a2H0eyG7sJmpQsjDFyh0etI=
-DIt4Xp3Xbla1QXPpBNd8kSwG0AwB1kzR
-9FJF/kSi49wQbzZMuyy9fQ==
-pd1F9WAw6p6GsXOp2DRhH66TFu1St0Q+
-b8ErQvNUZgdfVjmT72+IU66TFu1St0Q+
-kigrNEhv/MtjsD7stN1IVkpgEZ36UZf7
-6CdJfik1TY5qn1dzSYzfhEpgEZ36UZf7
-rsOHmN/4ufkL8rKaud4vfJTAjlN+0rCKQsjDFyh0etI=
-Ps9uzDrPzbEQbzZMuyy9fQ==
-WV+0RBWFalgQbzZMuyy9fQ==
-zCVSXXb5NXnjkaMZ4YNV7kpgEZ36UZf7
-F5JwbV5nfmcQbzZMuyy9fQ==
-j5r7gucVUZM3ix6bNeTT50pgEZ36UZf7
-Lz3xBm67RkVAXn6hyCEMM0pgEZ36UZf7
-kQHtQ28+jmTc+KxpsRsDrA==
-it7CAuuV7SAxR6MAda53566TFu1St0Q+
-Lt5EcigUzFAQbzZMuyy9fQ==
-OSSSe/Go/jgQbzZMuyy9fQ==
-b6PxRZiWRCUQbzZMuyy9fQ==
-R2eAdMyK6zQlxofoR4BxXUpgEZ36UZf7
-gywMijxUj6cKVV36DWVEmkpgEZ36UZf7
-FuqufNWLbz7WJtI2H4aUC66TFu1St0Q+
-3oeh0L+U9UBwCZz7QgmQzkpgEZ36UZf7
-qDJCWQ+e+n61f4daHIwZR66TFu1St0Q+
-3WlQtmhq3G8QbzZMuyy9fQ==
-ERwzEHJFSaRGaekUD7uix0pgEZ36UZf7
-ERwzEHJFSaSkXYAzJbi62RFd186JPWIx
-Kr9NpwKWfsKHDjyHip04zq6TFu1St0Q+
-nC3Olv+9F3VfoGFpKmLQzGzLelbG6d/HQsjDFyh0etI=
-59OFXSNrO2a69RZQsnc3eg==
-/rrEnWld478nHOlkm0sxA7ATS+O+j2ux
-h1XeOIBMRZ3khe8KFBemAA==
-oO2ddiOCY54QbzZMuyy9fQ==
-+/5WFE6HdRK/GGpwIprIPQ==
-QUZE6hSkMkwQbzZMuyy9fQ==
-4WFREg6StsXlQZ/5Ca6Djemquk3AdnJs
-MyZ2EamTQ97osWPRubTz9g==
-XXIUiO8imQdhDZurQlhANEpgEZ36UZf7
-RNUTN8me5q1or2m5+SKQMOG738ihzCxHQsjDFyh0etI=
-LPekO1Vw5kgU8eAB+2lgKlX9mMU2d4g04nizU8ePnqM=
-LPekO1Vw5khtd8WtUYdrl/znlgPCB6PWMUxkNOfOKBk=
-GOs/j0/PHelIkRc7oSI9s0DkVM7urTWs
-GOs/j0/PHelIkRc7oSI9s94er8ZM74QIohNK2NQcv24QbzZMuyy9fQ==
-GOs/j0/PHelIkRc7oSI9szlHsXZwP1nWHPP9v0009f4=
-GOs/j0/PHelIkRc7oSI9s97P1cGs5sNKgcGpywLGjyk=
-iB2sYRaVfwLrnk1qsavO30pgEZ36UZf7
-GG71AOESABJkrUfAWW2QvEpgEZ36UZf7
-fd7Rpt8fWBhUIm92l3iN1dKheJtuSshr
-+1VsVSgMX3odh+oZBnL0F0pgEZ36UZf7
-NPyf8uRLdZBatvb7qk/XrEpgEZ36UZf7
-x9PLCfVsCr/aY475fTCHFK6TFu1St0Q+
-x9PLCfVsCr+UayicXLX+aK6TFu1St0Q+
-oVV0uxz5T6yivb31KYUN5UpgEZ36UZf7
-xQ8n2p9QTXp30QT7blyM3bATS+O+j2ux
-KGYaGfDHL2mQ2aVf04oAuUpgEZ36UZf7
-Cks1i1RgvXc5Ed+Ka07xCkpgEZ36UZf7
-iwZpY5oYT+TOfQYjfoBcgkpgEZ36UZf7
-zC/bIffd/q9utdpwhrdIlK6TFu1St0Q+
-vGTRMHlT7dX3LsIUn3DSXA==
-4yKVkHCQKXbjkaMZ4YNV7kpgEZ36UZf7
-E0zofMTBmegkzaN7ZmJDz0pgEZ36UZf7
-RjlHunEZKP1X5Xi4jlyrm0pgEZ36UZf7
-QY8HRySr7Iwnp75iBJ/Vj66TFu1St0Q+
-9zUaxn05IBxgnwnOZ+hQK66TFu1St0Q+
-98gWtMm+tR669RZQsnc3eg==
-pou90Ds2zWaivb31KYUN5UpgEZ36UZf7
-OwPmdJgfleD9qI/NdGuLvq+zvaDCtmOC
-8a/odfEE6zxjsD7stN1IVkpgEZ36UZf7
-6N8OYQckkzWyk0jmTIrtlQ==
-39rO+Kxnmji69RZQsnc3eg==
-orFEvaQa0+AHI68W/MPHCa6TFu1St0Q+
-orFEvaQa0+Df4Ry3EMOjKEpgEZ36UZf7
-aM6jPf4QFiflc3LHoaCHKXRjEyS9gTVe
-ZMr6bs8Pd9bQ6oLuzbuHdNRcpn4U7x3XQsjDFyh0etI=
-k63/U+Ort/t1sXunLF29TqwbjE3nDcTo
-Wj5HYIWDLWG69RZQsnc3eg==
-OgGc28R9XYpbnA9om6yqTUpgEZ36UZf7
-LxBJSTkhXn8KVV36DWVEmkpgEZ36UZf7
-J2nslBNjSd/qU/CttlgjmEpgEZ36UZf7
-NIMkrNyEXQQTkBuMqRoBchFd186JPWIx
-5Od2zL01rcns9iRt3fGmm0pgEZ36UZf7
-fG3H/eYATNhjsD7stN1IVkpgEZ36UZf7
-RZ+v/54TrXap58z+jjbwkfD8PqSz/7Xm
-IzqZUh1jNoXP6Wwlw4zyOkpgEZ36UZf7
-xjBOWYwtJQIcjhU/Xv96eLcGb2RN0GIf
-xjBOWYwtJQInz2o+xwX02aNte/OiYaRw
-xjBOWYwtJQInz2o+xwX02cQ6uk/WHcyfjRUon1R0ficQbzZMuyy9fQ==
-xjBOWYwtJQJRKpnwl88SZLCpTXnOszLxmTjcpX4Xv1I=
-xjBOWYwtJQLNj3osZXWK/wNqyAperh+Gceie1Maa4HfKk5CmR15tCUpgEZ36UZf7
-MWXFwS+gXEBL/UW/zBqatq6TFu1St0Q+
-EsD6jrkHSH0QbzZMuyy9fQ==
-s/Uo311nB4nNgWyWzjfkBeK+1Ww6oK4tpHp904IlTO0=
-URZTYYOprr+9sAs6ya9NVUpgEZ36UZf7
-URZTYYOprr8KVV36DWVEmkpgEZ36UZf7
-PbluYqiSMUInlR5KMGbbXNoBODUAt1xc
-SvUyT0up+YUaegOSGrYRJhyTd0zrhZHS
-7KSbuV1nCERqn1dzSYzfhEpgEZ36UZf7
-6uJVi7VzfR9D55v6CvxK1g==
-FQ7Z0CPc4AkgXPwNYOJVVEpgEZ36UZf7
-CrymWgzKBwmXque4CiKiB0pgEZ36UZf7
-uensoKoCEG2eZ3vw9RQTrkpgEZ36UZf7
-swNZuvrdsrUKVV36DWVEmkpgEZ36UZf7
-jTuQkMDtjync+KxpsRsDrA==
-eYrwlVYgQAsNLBVQVO59La6TFu1St0Q+
-lPChL110T8qH6H8fqQsEDa6TFu1St0Q+
-8FSnJAv4mC/Mc5Bnc8mDRe54uYxEV7tyMUxkNOfOKBk=
-oK0P3jpMVZs=
-RT8uwG1AoLRL/UW/zBqatq6TFu1St0Q+
-NiV9MVLKhXKHDjyHip04zq6TFu1St0Q+
-anqc376RwxFrnfoP+wEgV7ATS+O+j2ux
-BWf2VPSq/CBAUyCjrKlDyUpgEZ36UZf7
-PfdaDBocFQixm2LbXcoIDa6TFu1St0Q+
-ZVyEsgcvvqkCxwQXdsGm4QRlNLC4WkMM
-7wQJN9L6tHcQbzZMuyy9fQ==
-+Coj8KXFfRzcONVccNlNVA==
-PmXiFkkqLljCK04zVVZrqh9chXIUgi4lMUxkNOfOKBk=
-/ZBZNOiYzE+2EkinjidSXa6TFu1St0Q+
-ShmFYWl9kbI3ix6bNeTT50pgEZ36UZf7
-xEHYC5PyimNE0MxH/kbINQm+ik3u28cBouZscKxJy/sQbzZMuyy9fQ==
-8n8zV92Zv6nu8xwJpBGB7q6TFu1St0Q+
-8n8zV92Zv6krX2BZrGZD8VPHTAexdz+zMUxkNOfOKBk=
-8n8zV92Zv6krX2BZrGZD8VpIinwp+ERxMUxkNOfOKBk=
-8n8zV92Zv6nfF8fdQPwqgkpgEZ36UZf7
-miKP0CYl3W5Ym2pzcr/F6K6TFu1St0Q+
-at1Bn/0PBKERBJ/GG5blyg==
-Ls5FWwWEd6qyk0jmTIrtlQ==
-ghSbmaLOO99tji7RQU6MggRlNLC4WkMM
-ghSbmaLOO99L/UW/zBqatq6TFu1St0Q+
-ghSbmaLOO9+2eQd7E/7L866TFu1St0Q+
-wesEbkcq3G2kmRvSpkGJU0pgEZ36UZf7
-YUhOmXNESHC69RZQsnc3eg==
-aALCXOoFPx+9sAs6ya9NVUpgEZ36UZf7
-aALCXOoFPx8KVV36DWVEmkpgEZ36UZf7
-Kpq53a0+iGA3ix6bNeTT50pgEZ36UZf7
-LbpsRClvKt43ix6bNeTT50pgEZ36UZf7
-u9VShjNiQLa69RZQsnc3eg==
-NIl1dVHO3ljPtKrR/HyW6g==
-79ikOahtbziMeW7poAUy4X/CFQJ6Jsg9
-B9uuO07HaYDhefW3q+Msca6TFu1St0Q+
-KA3vo7pJXIdFDlJf+uZ8Jq6TFu1St0Q+
-xm0YhMMvUrTv6eQ9seoGjEUzv8FEiuOYMUxkNOfOKBk=
-93ZjDiJwkDFGaekUD7uix0pgEZ36UZf7
-C6eysrtIgcAgcxiJCY3Ya/cUbP5RhaV1QsjDFyh0etI=
-oRqu1B35G5r4prflBcOI/q6TFu1St0Q+
-hT2R6oNQDGiMygbJsihIC0pgEZ36UZf7
-xGjxEbbo/twhJLbnEbgPLK6TFu1St0Q+
-xGjxEbbo/txre6ZjJY/aDNSX1ILygfSsdTD26Z5KQnpal+TXCztiQ5Wfx8uQEQHg
-YmFbY+KQ4Y4dNToG2d9B8/XBa+Kh9WVu
-YmFbY+KQ4Y4bHBvW0gRQF66TFu1St0Q+
-YmFbY+KQ4Y5QHYDAU4bOheuHMKDFBbtlQsjDFyh0etI=
-YmFbY+KQ4Y62jZ0HIHtNhJwEnpF63SM/
-WAXiD8YngH8WPHcX9Dw7dEpgEZ36UZf7
-ljwmOqHUx3kdh+oZBnL0F0pgEZ36UZf7
-ntKwejfnuA0YgouZt2pykBRGX6dD+yb9gcGpywLGjyk=
-jDc+I5DLhje9sAs6ya9NVUpgEZ36UZf7
-jDc+I5DLhjcKVV36DWVEmkpgEZ36UZf7
-qoXyHyshoZMQbzZMuyy9fQ==
-MmnONpzqj5b7W3Ekux8q5C73DbanPF9TRccUPCPq9v2tI0S3/hMLM0pgEZ36UZf7
-VcWnl3ReS/XcONVccNlNVA==
-rHGVkOky9lRkNVRINR3RaK6TFu1St0Q+
-8iRAY6UGp0asSn8lipkRgSEe0u0sni+vQsjDFyh0etI=
-yv1RINJhphm69RZQsnc3eg==
-hlmCVY6Y2sAlYvB1qywZ0w==
-9Mqch0gZ4bO3ZIY+lmc/+RFd186JPWIx
-lx6eh+YkHBXGQf4A1Ut9bKuL51BaHbjJMUxkNOfOKBk=
-d8YButcgSKy/GGpwIprIPQ==
-tLkA0HWKMWjBTiXSG8DU5A==
-G4j5jFyDtCnrgwUip8TSvq6TFu1St0Q+
-7ddpONXhUU5TrTt6Fbm2X66TFu1St0Q+
-+MgAf4yLpQY8TSWUY79gMxFd186JPWIx
-Ngf3L37GaRvPtKrR/HyW6g==
-HSlkVdSEOqy5HHs5qDJVekpgEZ36UZf7
-ib079HkmfIwFhfnjPKd+oa6TFu1St0Q+
-ammVyKzxh8wlYvB1qywZ0w==
-bKuUJ1epVUKAB2gzKtqpWq6TFu1St0Q+
-4kxYBh5F0zLPtKrR/HyW6g==
-By5Q/SU5xir2hPuSHwJFxI/omWU0gKKLgcGpywLGjyk=
-L4guYbOD3yaO4zpxKF2pcUpgEZ36UZf7
-Be1T87t+ge5BZVErSSLMkkpgEZ36UZf7
-Be1T87t+ge5XlrymvmHctmn8RnMo+1iNQsjDFyh0etI=
-Be1T87t+ge5pkJQbsmHa/762YPsz23OTQsjDFyh0etI=
-h3S6VnDguDdD55v6CvxK1g==
-Y0UYF4M6ChLc+KxpsRsDrA==
-p+PT4G88QsGRfyXfMqE5O0pgEZ36UZf7
-+yp7LhPh6/o2wwd3InzQFy4v4ck8itax/Xp6gMoyyMQQbzZMuyy9fQ==
-LAphuzvX0+2kcrqjTBL39q6TFu1St0Q+
-cZht5tTkz8MlYvB1qywZ0w==
-VynNxYGlkQARbt1qFeXe90pgEZ36UZf7
-ms3NmDDAWXmTSCZEw9Bjyq6TFu1St0Q+
-xt3ch79mTxiU1kX+sOaXa66TFu1St0Q+
-tsogkendiar58tUSo2w3wQehUZ8S0w0KpaXovc0uc2MQbzZMuyy9fQ==
-Z6ORYEVTHAZcKrbMkfbHlC2cRMPa25eHMUxkNOfOKBk=
-5yuQig9LutW69RZQsnc3eg==
-ysFI1Rx/lmYlYvB1qywZ0w==
-BmPGbmcgdsK69RZQsnc3eg==
-kfC/iWx/K4spLJFGqVmt30pgEZ36UZf7
-FQUi8oWeKA1rEaB0qwb7ZEpgEZ36UZf7
-95YPV7nX9j8lYvB1qywZ0w==
-yWaySNFE8XgC0uinfuVoYmxnLXyqWaWjq4nk6RWjNaSuOimBYbHarOSNmpdLG25hSmARnfpRl/s=
-6BDZh8XXSw/QW4f4GF4XkEPAqrofHlb1QsjDFyh0etI=
-ZLWYaLTQwFNT00yxoDHMbgh0Xdfz1dmI
-TG2nF5NcrshL/UW/zBqatq6TFu1St0Q+
-Koz74bTKswzPtKrR/HyW6g==
-hgKSS6WIoWEHfJh8pHGbwQ==
-uw03DblMIrbcONVccNlNVA==
-kN7D+ZqtUAcvuW9pCWYbuGlYN0mKKFe+MUxkNOfOKBk=
-P2TLxMjm2PklYvB1qywZ0w==
-kQHtQ28+jmQeXACFhyzR/EToXNOcYRXdMUxkNOfOKBk=
-kQHtQ28+jmSuZouGVKLMvARlNLC4WkMM
-xEUfjPFZ/xZw5Y5BQVzk8EpgEZ36UZf7
-Tp8FZ6IAYDa69RZQsnc3eg==
-y6RwJnkotMFeJ21yxIT3ba6TFu1St0Q+
-I2ROGuDdtN7PtKrR/HyW6g==
-jq1tAOYOLUzmoyKg9rVtm6+zvaDCtmOC
-yKOlDzIs7nh79Bls1yXlHUpgEZ36UZf7
-U2xwEYK0gKK69RZQsnc3eg==
-fG3H/eYATNhSRQKZWsra53QBhj7RcU8iEGY2jgtMMp1iOVqKm1lC/jM3kbRj5FbJ
-hDZPgYg3NGU8pS//ypC4Ea6TFu1St0Q+
-cq6XXjMR3YAlYvB1qywZ0w==
-NhbO6gkLwqjse810KERveLATS+O+j2ux
-01lEYT849pC69RZQsnc3eg==
-d60eywEVz6wsFNs75I9pNUpgEZ36UZf7
-8n8zV92Zv6l9KDxIQfEX1q6TFu1St0Q+
-w0pNO/G/ztklYvB1qywZ0w==
-NUh0oCFJpEFIkRc7oSI9sxj54g9K3MEJMUxkNOfOKBk=
-l7j+4xdzHzaOpn2IcS2BfMlK0pFWqtW2MUxkNOfOKBk=
-1pAXVFN8MM6Y9nqem1MzFUpgEZ36UZf7
-YmFbY+KQ4Y4JJVgL5g3rBrATS+O+j2ux
-Qud0EeTCG2HBJp7imN6w30pgEZ36UZf7
-Jl+v2iIQ3PRN5yGUeKvlYbATS+O+j2ux
-anqc376RwxH63G/Sd+ITwU5N5aNL8Kb/sYTug1WK1UI=
-2n75FC3uwfA9OsdS8GioTA==
-Y4jxzwGsXhhh+6+zPCsGcEpgEZ36UZf7
-pF+/2e5PCdgJTP+5mC6pPLATS+O+j2ux
-de3O9146cmXc+KxpsRsDrA==
-ZcATeY3SOmWeKpuD11H1CrATS+O+j2ux
-tQqyk3JtpQQO7u5UUGMv2g==
-2UBsnltmJt8O0fuuZbNSN7ATS+O+j2ux
-xLCK8OpxvoPp/jdmOjkFz0pgEZ36UZf7
-3nu5sG93VQNYm2pzcr/F6K6TFu1St0Q+
-x1gDU8j+LVoQbzZMuyy9fQ==
-zy+BWp25HIYgXPwNYOJVVEpgEZ36UZf7
-rik2KFw0W9LKk5CmR15tCUpgEZ36UZf7
-iD2zFkoaIYn3jKn9VtRuUUpgEZ36UZf7
-W+uRpV2VRGcYmeMFfkzoqEpgEZ36UZf7
-4/QeAGcSSrGAdZmDqSGbKK6TFu1St0Q+
-caYmDfoAMRXosWPRubTz9g==
-5HgQz9bhZBYtp15Pg4z9+EpgEZ36UZf7
-Zt3PQjNhZt4dh+oZBnL0F0pgEZ36UZf7
-hIcKxvB0qrQGCgxTQavhQXTYlvIzP0QKMUxkNOfOKBk=
-NkCyaqE/ps8KVV36DWVEmkpgEZ36UZf7
-wlNxo/NEgQIQbzZMuyy9fQ==
-xGjxEbbo/tyk/LGvU0BaO3zRjTs5FWKZT9LKSDBjzI0=
-bDPf+nD+hxwE73RpDGKI40pgEZ36UZf7
-hQZYrUVY72S69RZQsnc3eg==
-/ON9/SiyESq69RZQsnc3eg==
-v8vThZRoE6z5Du8sgvEkyUpgEZ36UZf7
-ImwczbJet4gpLJFGqVmt30pgEZ36UZf7
-gJq/yMRPk7ghU63syh3o+wRlNLC4WkMM
-x9PLCfVsCr872pP1HOWsdK6TFu1St0Q+
-6Ng+ofO0rwXMa3DbkDefIUpgEZ36UZf7
-wYNK0Hyz4EGkESnpc13eGEpgEZ36UZf7
-DH2VViKrbzm2+yNbFqeeuK6TFu1St0Q+
-nzpCfqAjtr7g3Myw7p6Prw==
-WaCq4CfQ+yTb4rzpiyZ/C0pgEZ36UZf7
-XN2oP/Cf/byIR37fpmmVAUpgEZ36UZf7
-O9XmBHNPJeYjjdY2e/M+17ps2XBWQXn5QsjDFyh0etI=
-UrVzAjnIcuBxOkPtc5YzsrATS+O+j2ux
-g0zbV1jZvRG46IiBV/Z8b7ATS+O+j2ux
-QoMoisX9FiUpCIXsJjYaMgySnYTRiwEn
-EpkhMubA/KU2uRhwSJ6d+dqvVpaA8iZGI35dkw7g5BTk4h18fP+2zkpgEZ36UZf7
-rgsSZho3pOcQbzZMuyy9fQ==
-qlK1wP+Ppb3c+KxpsRsDrA==
-YYMx7qtuo1ayk0jmTIrtlQ==
-WC5TBTK4DARt2LxFZRpKFhBvNky7LL19
-Nt6VZaeWqZy1QXPpBNd8kSwG0AwB1kzR
-BKa9L3k9bnLYAUGk75ryZK6TFu1St0Q+
-ycU0RK38xbDLdJNqyw1kxK6TFu1St0Q+
-ADGal0YE8X3q1KK8iguWI7ATS+O+j2ux
-G4j5jFyDtCleJ21yxIT3ba6TFu1St0Q+
-XQT3SHWafIA+AOWtZC88XFOlBV102mLpd6G1vctpYVk=
-APlTV8hL/UhD55v6CvxK1g==
-9U2iKDgg7A8Fwc85LPgI0JTAjlN+0rCKQsjDFyh0etI=
-REmCvUYOcA6ivb31KYUN5UpgEZ36UZf7
-IOQii0cLb7Ss+U6SBrCCGj4NnApZbtCrpHp904IlTO0=
-GGRFEPnaZJvp/jdmOjkFz0pgEZ36UZf7
-DPcCVqJqTP2yk0jmTIrtlQ==
-EhN8Yg/+42MhU63syh3o+wRlNLC4WkMM
-ycU0RK38xbAus6y5YmnJ8a6TFu1St0Q+
-NBBXNZCaNE99yZ92+zfrDQehUZ8S0w0KpaXovc0uc2MQbzZMuyy9fQ==
-XXIUiO8imQcnTs9sqqXWpRS4C2VAq+q+sYTug1WK1UI=
-kE9cXidvCFD+T/ECY74DJkpgEZ36UZf7
-gPP0pn4Vnj/v/hYXgto6YEpgEZ36UZf7
-xEHYC5PyimMLNP6gjPbd7qzdaNgRQ3k/QsjDFyh0etI=
-XXIUiO8imQfCgbjpU0Ib6a6TFu1St0Q+
-PnVlCCZAawOE0okSzHdyMg==
-6PWqwSU8wtoChNsaH8SehEpgEZ36UZf7
-wVGfnRNLTd6ckHJOYGTVjUpgEZ36UZf7
-Z/K1TrT35wRsU1ztgVtIuUpgEZ36UZf7
-6gl1PQtSPIRwKWxaQhVjhkpgEZ36UZf7
-r83+pje9TfVhDZurQlhANEpgEZ36UZf7
-1TVDxDeahUPei54lsZmaNkpgEZ36UZf7
-QqZvghyTZW1bnA9om6yqTUpgEZ36UZf7
-sdjtfGRtUulD55v6CvxK1g==
-+J4ENRSK/v0QbzZMuyy9fQ==
-GOs/j0/PHenRfjbPtNijZ2YAKjuUUIzqMUxkNOfOKBk=
-U4b/MQUlb1+5cHNI9bNUK0pgEZ36UZf7
-ZMi5Nqe3WHdbnA9om6yqTUpgEZ36UZf7
-zp7DEq21BTxsfhs2CFD2Nq6TFu1St0Q+
-w0f3DSSJVtQzU67SFkmiOUpgEZ36UZf7
-/LSatlr02UyHVHh44k6OK66TFu1St0Q+
-k0IDo2JFDLgMKLDT5UO58EpgEZ36UZf7
-mjpPHyZldWUKVV36DWVEmkpgEZ36UZf7
-0IZmYHFR3bCD+GOmOS1vb0pgEZ36UZf7
-7AFfCdxoVJZIg9VPXIESctFg2vq7ZIJOQsjDFyh0etI=
-lWtbv6NBWWK7uj6fRZvfAq6TFu1St0Q+
-ukqENW9NXFfz5+adBH/bupGjS9DLEMfDQsjDFyh0etI=
-yUBIpiXiGhsqqtObA+jC6a6TFu1St0Q+
-S/H21W+7xrT8LfyJUw8Qg66TFu1St0Q+
-BmPGbmcgdsLzFy1vvSdUb3RjEyS9gTVe
-kuRVsnRar1ayk0jmTIrtlQ==
-QoMoisX9FiUpCIXsJjYaMl2EZhEkUbbB
-ypYq0llNvxvDvSjELYSSGjUSEzY66ZUkQsjDFyh0etI=
-kMsfiffRfraGOny5ykosGoUXNaoO/BVx4nizU8ePnqM=
-IRtt90VsnuWvMEnx8xG5IkpgEZ36UZf7
-6SsNbr0oX/bjaqiJIciPrGKuktMEkyH2
-feu5o9+E3x01Teioz1asRWmZ459ubdRUYHykN73Wn+M=
-XsRueZvhAyrchbqz0R3o2dP6GEffIpvWQsjDFyh0etI=
-u0G+9wck7g3c+KxpsRsDrA==
-YcHRGNzXD26iXwDjUpDwTEDKk/bXBHJ0
-Y5dft0VB1PK90G9t5BpadWqArIkYA0eZMUxkNOfOKBk=
-LBjLIuMcxdWZpm/H5lv+OEpgEZ36UZf7
-UQx8DfENDTszloZYXxV8DZXnGNL8W2tusYTug1WK1UI=
-6+Di3CtUGFdoBFTju6IXzA==
-d54IL9u9Px8Xk5P89gJ9/kpgEZ36UZf7
-0D2aGEdKA2bUHS2CnvFBDkpgEZ36UZf7
-5+kriP2ZEgUdh+oZBnL0F0pgEZ36UZf7
-megPgZgZatklYvB1qywZ0w==
-nAXGI/L25SwZxzETtMYQQUpgEZ36UZf7
-5sZDUmzYHMTmON+KcZNNZ66TFu1St0Q+
-PHWmi2qt9kYQbzZMuyy9fQ==
-9K+PZ38Hd/1w5Y5BQVzk8EpgEZ36UZf7
-xjBOWYwtJQLNj3osZXWK/8Q6uk/WHcyfgH9y+1z98z4QbzZMuyy9fQ==
-EpkhMubA/KX4RzabTMUs2kpgEZ36UZf7
-Wd+9E2XPGaZxdPMtgdYxUw==
-w0pNO/G/ztlsUxVcnSbq+bATS+O+j2ux
-97Qtij5/dU4QbzZMuyy9fQ==
-SFNNbjNe+G+69RZQsnc3eg==
-P2k5Ue4Lv8yDxbJC8dg0Fa6TFu1St0Q+
-GxXLVwg10cxPWlb/4xs3x0pgEZ36UZf7
-PP6ZmRaZwXkQbzZMuyy9fQ==
-Nt6VZaeWqZzN5z6vOYv1dKWQNOM+Ds+D
-4GdIYYTCuHIjLd5G+EcdiUpgEZ36UZf7
-XsRueZvhAyoSM4JWt9br8q6TFu1St0Q+
-wfTaJKknaGYBXHGhpNz07+OkL5M3TCt9sYTug1WK1UI=
-KrM56b+7SE68GuwHHAe1F66TFu1St0Q+
-GxXLVwg10cz566BhBCpdryqM5g+G294FWodouMqHQLNfPoRRPWV/m78YanAimsg9
-TezaT9xFnR7mp7IaDYZewM+0qtH8fJbq
-YQQoYVTVvbIn+EUqolD7+K6TFu1St0Q+
-cVQry4wyUS4X/P21aNqIKEDKk/bXBHJ0
-36qcpqP+o0tD55v6CvxK1g==
-w2M0Wb/MKy/gTfzonbprqgAp8PPbpEi+bUHUXpSefpk=
-LPekO1Vw5khtd8WtUYdrl/znlgPCB6PWtNskfppU/NJD55v6CvxK1g==
-NJBbvvKkHtda94t2FvAzVK6TFu1St0Q+
-74DGLBbBBVnlQZ/5Ca6Djemquk3AdnJs
-KbKku7ucQ39uoije31Jd6KWz2PnvTBpZIF7qeEkmeBYS1JxwVsjrjRBvNky7LL19
-EpkhMubA/KUBsmPnXzrVPLSy3yYbdHE3pHp904IlTO0=
-vtDo+c8/v9K8I/xD/AcfOw==
-EpkhMubA/KWyxRijLCrWjq6TFu1St0Q+
-8GR+KuRP/IrWo4X+NB2VL4HPvk1suglidD7SSsTO9eReGKOsUZaao0pgEZ36UZf7
-eK6ybtdyXzbosWPRubTz9g==
-8F5Rffa3tXczU67SFkmiOUpgEZ36UZf7
-O+XExVGK6ypsU1ztgVtIuUpgEZ36UZf7
-HMpgmZFP2a26WyYbrmJeDzyh5iKxksd1SmARnfpRl/s=

+ 0 - 70
graph/src/main/resources/lexicon.dict

@@ -1,70 +0,0 @@
-s7W6RG6fbY4F7hCN+9GcDQ==
-BEwho/Vy3FcLGsZzyz/lrA==
-teL+mOFs+P5xK95yiefr1A==
-4WmmlIMFQw5dunQJNQOl9Mwy2IRdVfW7
-9n8MOrfpOzBse1YGr4PBqQ==
-bRdFLLf/QBQiAZd/xjyj2A==
-lSAF5F4PkDDgn5PMcGOHAQ==
-bI3YhExhf0ygnBv7GDMx4itzoMTPCpME
-9zvpXMKfsnfx3IKU2o+7zA==
-+BpdcftYCemAzuLCdJndHw==
-sqLl47cHFtetc3AdSoYwrQ==
-6BWOhrPv7J9Cj5vlDdVnBg==
-BXy7J2Qb4CXZhTO+q7f7Lf7jaz6wvHMH
-mrGmgHlOA2+2LlGVCW+2VQ==
-HkDJvzXre9AZ0B6jFd0rnw==
-BMjsBRH09HZlgTSR49CWoQ==
-K84K5InRTJH+1WlqU+tc90pgEZ36UZf7
-kJHwz4yDQvBKYBGd+lGX+w==
-+/iMWRrE/x++AlTuumOl8Q==
-yMIQPPgAnitefGaE90oS7A==
-DxBSa3FWWI0GI1/7VhWFVg==
-e5AUaAGRyItcJWT47mI/zw==
-TBEKZfNYdDAg4XtzH2iEsg==
-u0ELyb4t2lpWVlgi5Q4bKg==
-qHbaJZG3uf1NbYsDV8prZA==
-s5V0HutCSLYaBuBBF/Rq7rDyYRB1LPgT5opE3Fvtcpc=
-Iq7jb+VkzbVKYBGd+lGX+w==
-OsBp5KngCTRsQ1lgzfXoww==
-pg/hIoBF96D4FgUZuL7Odw==
-7vjnQx+bY41lsbwpSGyTBA==
-OqbB5fi11VfgcQlEe5DD+g==
-mmn7OCfRGCIEBLNEPwIttg==
-SRpf2O8GDiXbwAhKPF9MrZRs+QR/TraH
-lBMjruy+wjFKYBGd+lGX+w==
-ORpbdnw5IPSmtWtITrC/NQ==
-2soIQt/8ypDQGKRoU3BIkA==
-152PZYqH1ltlsbwpSGyTBA==
-cdavJOjogbpWVlgi5Q4bKg==
-LRN4dXCzoSUohhmaI9fLo2quUiUsJ2os/uGB4mDfi8Q=
-jb7cwm2aycBKYBGd+lGX+w==
-752lihMtImRtrXkjKvRwuQ==
-acfDmX94GIOMwEbR9wcFYg==
-QEGtWQkCHzxCj5vlDdVnBg==
-j6O2WShA+6xKYBGd+lGX+w==
-Om054uvU7T/J8AHLUkpbHg==
-cT0V76bKbStXYt7WbhcZXA==
-FbMgeI9IkO5LawQxODdEdpQbfNX9OvEj
-Qx1FtMXVFI1lf8WqY4kn6JQbfNX9OvEj
-4JmXbdcpagMbPUodBoCDFw==
-kjlisLDTfaNO2NL8TalLMg==
-dK/xyBvi7aP5XurM68XXvZQbfNX9OvEj
-WNOryxc9xnKTYO4WfhUMJ5Rs+QR/TraH
-JFdbafCC7S6fvvtXA3KqgQ==
-OefsKaBNTZj74WCSZlzDhQ47c03sgd0T
-qSj+i5YMSUDZKCVbszjsWSmuGyZkv2+0
-E4nTZm/cEARKYBGd+lGX+w==
-bBhhPMkI2shrAzg5abL/Xg==
-vC/g6hg25OE63hTezlzQHg==
-1P1mt9OJzQcORyCgk2k6ew==
-SdxW7VUIlOSW0Ig3/ZQrnQ==
-4AYbwy/G2ny/MOtJaBopwg==
-H8M+KMEP5AQh3ECueWip2w==
-TCyc2GYXyTOvZQhdm1P06w==
-2Sgj895/6q1KYBGd+lGX+w==
-YCDTg/uaEkbXe38IBCUIjQ==
-mFo8rO3m/XWvIrKw4P4pRg==
-ChZ5zGIydShKYBGd+lGX+w==
-eqlnQUtv63pKYBGd+lGX+w==
-4UDrddpEYJzRmL/ZWxBCEw==
-Q4Dnkx8QdKqTYO4WfhUMJ5Rs+QR/TraH

File diff suppressed because it is too large
+ 0 - 21308
graph/src/main/resources/sexAge.dict


+ 0 - 485
graph/src/main/resources/vital.dict

@@ -1,485 +0,0 @@
-liy2X+sq556+GdHmUIHnH1oamVOZ9Qmz4plAgbuYtIE5Rw3NtFh+7A==
-DE7pZV0HcrKTjsrYFaiDbjZPBVLDe6xWFreNtoJyFoq6+7a927Mlpw==
-7ddpONXhUU5s3AGUI6Ug28PZO4GQHK2ALfgmjOtfvHXtnQlJXK6cH2W1DC/mabkHlIVvKeMLJ0I=
-WH5Yk+VVQ9S4tr0LQSjdmMqtUJ0mpJv3
-YVPauoXAYupukYK8jnJ6oU8j7PTf9QOxiy48LWiKVlE=
-Vh3u8B4cYqFVUBWtn7yuMTKqZrCrtkpNHYbf0CEGMr4=
-/CIzubCbNzz6ZyQiRl+F52z4nZXHi5kcGZGBU24jYa5i3+/2fC3N6Q==
-j5OiVDB919Bivr+78427zU4Poqdwk7cX1DJL0Z/lW/Ni3+/2fC3N6Q==
-hA3gza1GG7gcTScttLEkfMjPdsjefYU+
-OHo9xsg9u+JRcHjII0+r0uRx9pwaAxfjx2HxBhizdbQ=
-Be1T87t+ge5nMREQnuXwiAXtU/O7foHuNjPIK43aG38=
-2hy8sQOSAg/pSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-3CVfppr0AHxBZsisDCIjB7ShkCOVwTpP0Zi/2VsQQhM=
-Eobp0wfgzTgxiodZAgieKHmLXlID04Lciy48LWiKVlE=
-VJduMhoX5dUNh6ylMRp9kLShkCOVwTpP0Zi/2VsQQhM=
-qgKo9TnGwm8luM2Oe2mKmJ/JLfUaDh8OLKfEtSxDdD2vsFqAZYBWaQ==
-p8rSijy4S/wq3JCA6Zkhyq4eWYTrjK6T
-QtUfg4T7hfJRcDhgAS3xpzhk/waTjgpz
-VnrAleiz9BccTScttLEkfMjPdsjefYU+
-jUfHA4NTa1PpSgcoVE4Lbf9DZ1ya9BijFreNtoJyFoq6+7a927Mlpw==
-GalX2/0vwo/8AfzlRMsKDR+nJNTPwd7E+CLPmA1ccPY=
-wGGpy7h8fWcwWU6jaieZ+IAlC1DdF+y+ekcrt/ixk8ivsFqAZYBWaQ==
-SYg0mp0qVlc4HCQN5GNxNXYx1cx5hG4Z29PyhLKx2/M=
-9K+PZ38Hd/2oCB1FTd1HF+Uxqhm8fDZFFreNtoJyFoq6+7a927Mlpw==
-+6KqKU8nKj72zrR7ylaDMmwKsNo4B6t5o4DQdse2eoM=
-OWXgXBuFsmYeCfyilvvtHkpgEZ36UZf7
-F/wdwwrSBqNUKTzJfTzWAcjPdsjefYU+
-MxwOgnyvIH0QeShVOAXsvHYx1cx5hG4Z29PyhLKx2/M=
-gymUzeBoiIQSmVi51alVLf1CIPowQycv8DqlBsEDrXmeL9kgB0JCLg==
-V8p/97BlQ1vWUtUuGXIJ7U8j7PTf9QOxiy48LWiKVlE=
-bAqw2jgHq3lcHMYselN0Sf2wj6PFLTE7gRelkWDtQcE=
-9K+PZ38Hd/0tjr1bJHaJDihngpsINtgr4plAgbuYtIE5Rw3NtFh+7A==
-ERbXbxZvj9wK/j8CZZyQGl9slLa3kKSRiy48LWiKVlE=
-eh0gnqWcoofyPnNB/FQv6zcdm/Z0Kpqo1DJL0Z/lW/Ni3+/2fC3N6Q==
-icgY8lfKy+oiUKE6xiqaGwVeznvoamkjBiNf+1YVhVY=
-ecNkHsCVFsr35Hwb53dH4BZHZKAB7ZN8XDYoCuF77rs=
-Ea1wKP55wICWHeBoZP38uKSYYgTEh/zVaiEsqO85sLgSnOIeWsmaHQ==
-pzOBdQfnE6XdGrp2Dnnee8XpEAWBlfaqROcxxZkPB1quDwPbNRe+BNXgp+T/6zES
-zVwyXyvT4lt3rK5Vyakj0rEIij1M2WDg4plAgbuYtIE5Rw3NtFh+7A==
-D4mYPp9JKbGKEgJTG9U8NtbauwGmF0lkmlz9qo1I1kIq3JCA6Zkhyq4eWYTrjK6T
-bAqw2jgHq3l2gaDiKwf8Gxp4gRGy0NSh2FyZ+WvEg8di3+/2fC3N6Q==
-4iLDmZahIz4xHaFFsSYvx2PArgiGN+TtvgJU7rpjpfE=
-d2QHwaHDrsQnCtesCZQ7b2WGisaCL88S4plAgbuYtIE5Rw3NtFh+7A==
-mHFe98NUmvf1rMlYntta71Uhezmi3LZB
-aEFLrAB9hgsvaWYe3sbu1G/1iPwJJBdoo4DQdse2eoM=
-vXieyS6VHlhCN0YDeNBBth+nJNTPwd7E+CLPmA1ccPY=
-Ny3IKPJiJQ4znep6PWTBz08j7PTf9QOxiy48LWiKVlE=
-9P80opfkm0nGXNkgSB0skzy5U+3fnLhtFreNtoJyFoq6+7a927Mlpw==
-UR0wjiL4IWfsTKsR/21p7TDWqe0g7SwLiy48LWiKVlE=
-TtKrGpFJaX+erOxmRt4zRR7mEd1pUS95
-gy67LWhA53451RZQwRplJapYHmJ6ehnfmzW9+qv9ZpkqvadXygJKutXgp+T/6zES
-9K+PZ38Hd/2kcrqjTBL39siEkif5w7Ir/q8HAwDYbMw=
-L4fv7s2vspT93JNqsUycwyv6f5Xex4IB
-xhWftWtq9ZuPrx8NHS+gCgIMwRMm1KO3/q8HAwDYbMw=
-yL62u6hDiEjsTKsR/21p7TDWqe0g7SwLiy48LWiKVlE=
-gFaMgk86HJJZSu7RjaQLUzDWqe0g7SwLiy48LWiKVlE=
-nA94feJa4S4feqYEhS3nmsiEkif5w7Ir/q8HAwDYbMw=
-mcWGcBsXlCptAP2yqZJWyXBQdOTdPYBcBiNf+1YVhVY=
-2gNWggIt2ATSpe0ijg2fyQFsDcrhWfuKh/UqQ9KfOqtKYBGd+lGX+w==
-9axLEgy7VQmvjLIz3A7KCdA/6eTRfnRu/q8HAwDYbMw=
-+U9Ejzp53BMwWU6jaieZ+O1N7iqO1Izd/2mxBEfNQnM=
-4olpCXCqvMQMjYluMc8k48qtUJ0mpJv3
-md7FgUY16RQzAyR5b6YP/zA+Tw4vW3nHx2HxBhizdbQ=
-T5D7BvnMG9z58tQAyW7t3REriM7/VK4bunOA9jJeWp6vsFqAZYBWaQ==
-T8CTnLFGSHwiWD+NTcQ07TDWqe0g7SwLiy48LWiKVlE=
-wKoqVXSJu6cKE7wia5SIwjDWqe0g7SwLiy48LWiKVlE=
-Be1T87t+ge4lbXqDMUOYsx6qXkiDFCgoEOk9yLlVVoU5Rw3NtFh+7A==
-IiJaC5PP46QxHaFFsSYvx2PArgiGN+TtvgJU7rpjpfE=
-cRo76jw+cGoKuRHPA4M6C3Yx1cx5hG4Z29PyhLKx2/M=
-8bdFZ5unPvepYj5/A+CA92PArgiGN+TtvgJU7rpjpfE=
-9K+PZ38Hd/1dAPI8a+4l4siEkif5w7Ir/q8HAwDYbMw=
-nA94feJa4S41RafYpJr9X8iEkif5w7Ir/q8HAwDYbMw=
-hXAxFoSBJPHaCXOmxtGRBg==
-E4xZHEkbCq2rBd1NlDBC8LYjuruxiI7d4k5gy35ynQH9N7jC7jEkig==
-aghYWkm63ABMc5rgp6XXUB7XxndCZTPS
-IbxcPvQYISOf89v0mpWYaDKqZrCrtkpNHYbf0CEGMr4=
-R5EuwxlTHhh+7TTaYLgfZ8jPdsjefYU+
-Be1T87t+ge6eKpuD11H1CgXtU/O7foHuNjPIK43aG38=
-X5EUk0URRKACcqS2p2Hbro3odKEFUGtW4plAgbuYtIE5Rw3NtFh+7A==
-pun1g50o8zhFfTJte1xCfejACNq5VqIzBV7Oe+hqaSMGI1/7VhWFVg==
-iWZDhaUiwIM8l6CfPpYLuZYcZjGmghr3x2HxBhizdbQ=
-d1AxPOpo2Cv93JNqsUycwyv6f5Xex4IB
-CriSCwqltGph0Qu8EnD+Ux7XxndCZTPS
-4cJtfDTTyElxMzOPB+U8kXYx1cx5hG4Z29PyhLKx2/M=
-GalX2/0vwo9sFPLTXAGE/6rHk0o9byPJ+CLPmA1ccPY=
-S40MCyYJDO7sVKey/9URaI8XAAdxNTjz
-p5aCK46PH5UtLIAZ0bEDUbMihk1tLAqJ
-W25Wr3BT9J0jgE9yK9TxNR+nJNTPwd7E+CLPmA1ccPY=
-EyqU/EW9b7/dMwuqnRFUGzDWqe0g7SwLiy48LWiKVlE=
-TPzd3BzerlfCVxlH59kChzTSbCqtQEGVkXS2vYCMEIY=
-MRVT8OqakW5CnP/jCSeOWVqtLc48eY2UoykPuw5Y1yE=
-9ON7f+cfbFIiWD+NTcQ07TDWqe0g7SwLiy48LWiKVlE=
-xPhLahM0n39pDkZNQNX7Ho8XAAdxNTjz
-GalX2/0vwo/n5XbWi7jZqbOcQT2OD2AF/A5dhyaRZVhi3+/2fC3N6Q==
-TD7hQyHHIqR58snWo/4AUImNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-D4mYPp9JKbH1jSTOWVMPF+U/FB8Rln7UWJR/aEzNaJK6+7a927Mlpw==
-R5EuwxlTHhjlIpKUKxt+wcjPdsjefYU+
-4XRbqc31zejpSgcoVE4LbXVZsMFBY4gmLKfEtSxDdD2vsFqAZYBWaQ==
-WVJ7+vV+e/C5aGsqg40yvvpw8tJNu+jGtgpvz4lxfiYq3JCA6Zkhyq4eWYTrjK6T
-/fSKdxUGy3viwEHOqbnxuHBQdOTdPYBcBiNf+1YVhVY=
-DwFKrxKuQo79H4hYhZhrnMs19Q6LXzhu29PyhLKx2/M=
-dnQFGCijxPtzlHT9IBeVvr27iwVAM/ldPfv0PzVWJkiqWeD6wHIkJQ==
-7qExzN5Z+3471FBmBjfwZXYx1cx5hG4Z29PyhLKx2/M=
-bAqw2jgHq3nGebmB6GHn/P2wj6PFLTE7gRelkWDtQcE=
-ZUV41LY+hoTHzqeEtARfwZpGIerGFslDBiNf+1YVhVY=
-uFg/Yxg9PLIeFZSOHSSEJzzmU+FOUsy4QWMtWu6hvHrInY/UZ5blfQ==
-Szylny1QdtlAhlBfqddKqv2wj6PFLTE7HtVCuogTSCQ=
-sPonp8kD0Pn1jSTOWVMPF5JCATZ++RNHUerl7q34sP9Pgl7MtiNUK0pgEZ36UZf7
-OjSxBuQenPTeJl1S7w4jIrMihk1tLAqJ
-l8TZ+M7i5cdX/rs9dklYkRGHpT+vaOHV/2mxBEfNQnM=
-OFGLo95aFNE8S1/Va4+5i5mM9vpTJNSm/q8HAwDYbMw=
-IQoKziC4bVNh0Qu8EnD+Ux7XxndCZTPS
-Alnp/naIVx96dkNPlHK0NGkOmMORM/tkBiNf+1YVhVY=
-WGn3qf3hpXhNM37bA6HHygFsDcrhWfuKNAbK+74+adtKYBGd+lGX+w==
-Di69Emq5oqf3E3TiguFlGppGIerGFslDBiNf+1YVhVY=
-D4mYPp9JKbEQaLRAdyg3Ow+/fAPNsiKU/2mxBEfNQnM=
-p82it9INd9l58snWo/4AUBFQyQTdByZqLuXjulrqh9Y=
-c3jiB/FYmp4sc6mXeOh/F/g2a+eAUIhpY4+qAzC0UbI=
-m77dxTVVhn4ifhnVtJp2DnKn/ShIAt8Cs+S3CU/UHrw=
-2CI3oLKne4kcTScttLEkfMjPdsjefYU+
-IMEemaM1RvBvcexlVWyehtlJZasWCk30qhMv2Ou59Rw=
-sPonp8kD0Pmk7ZL9YzYoOTzmU+FOUsy4QWMtWu6hvHrInY/UZ5blfQ==
-oSCE7XT2ckMhM1fzcBwZp3Yx1cx5hG4Z29PyhLKx2/M=
-md7FgUY16RRpHAHM1WsmQ83qakX12HuHx2HxBhizdbQ=
-LCGd0PQ2g+udsb1tHLoW6KVIBCi5UFmQqlng+sByJCU=
-hooQo1fvONujJuX2eeHASWLjfneHMX5WewBAwoVrDhg=
-IJnKMFPI4Kuk8IpOly+s4k2kckilPvYvJ3npHh7ywA8=
-Z72Pskl7QcPAFgyvYPUppi4WoEf83C4cqhMv2Ou59Rw=
-ZspN/3MJNpL6t8/htC5pDnKn/ShIAt8CaiEsqO85sLgSnOIeWsmaHQ==
-cJRBFev2iYbY8OT63r33g3Yx1cx5hG4Z29PyhLKx2/M=
-xEUfjPFZ/xabvFUHghK5OFQGu+oKue22h+/fw5Z6v7y6+7a927Mlpw==
-AYZg4FtyP4GtN7b+a7LftpapazewZatxX55rbyzT+KQgR8oMkdZi8A==
-0gGUhVPoq4GhrQbpzT9V9stfAD6BfS/xQHVQEV1o7GHpVH1M3PFHpkpgEZ36UZf7
-iUchhe2/rwn2H0K+T5yBU7ShkCOVwTpP0Zi/2VsQQhM=
-Oh2o+4fC+FQhM1fzcBwZp3Yx1cx5hG4Z29PyhLKx2/M=
-kx7Xe2/8dJrVok1I2mhs5XYx1cx5hG4Z29PyhLKx2/M=
-5LdbDpeR1jsFdKJcEKaDoU8j7PTf9QOxiy48LWiKVlE=
-D8Q6YC/Edz/UhMA7BbCz2i9RxhuJZj5J1DJL0Z/lW/Ni3+/2fC3N6Q==
-tPRVCz1/eMK39sBvtZyvEjKqZrCrtkpNHYbf0CEGMr4=
-Be1T87t+ge6ky0EpivhaSAXtU/O7foHuNjPIK43aG38=
-lWtbv6NBWWLas9wZSwzNPMqnsSvd/uU7fpYIRpijTOivsFqAZYBWaQ==
-sPonp8kD0PmLeM2sM2Ud5DKqZrCrtkpNHYbf0CEGMr4=
-aNMyGRnYU/NO4F1zysEr+7PKtEQ7jUMbGZGBU24jYa5i3+/2fC3N6Q==
-UNMVVx+jvGOfmVgrAcnbJKrHk0o9byPJ+CLPmA1ccPY=
-yNqfiBs27VPlgditptR1uk8j7PTf9QOxiy48LWiKVlE=
-1Ig3Fa1AtBMQME0TnX92gnZxll+rG9XW
-TmlLfIYsDjcbgnkDCytQg7Mihk1tLAqJ
-xZgtukLsG72rBx9snOXaOJmM9vpTJNSm/q8HAwDYbMw=
-hKf210RtIqbbBGzb7wCuTtA/6eTRfnRu/q8HAwDYbMw=
-gHsoP2gDJg4cTScttLEkfMjPdsjefYU+
-LesXilJbw1zV6n6wqdchz8jPdsjefYU+
-fjMCoG0jWP6bArET6Dsf2nBQdOTdPYBcBiNf+1YVhVY=
-39D7OQXxShCOAFyXVfy4UsjPdsjefYU+
-oOpib5u9j6pxg04WonUtPeC8A+h+4k6I/PAVqgpZ63Y5Rw3NtFh+7A==
-md7FgUY16RQpuFoz3AamQwVkj3cL0NhEJ+qEUdvQHYx0TYoodxQdd8iEkif5w7Ir/q8HAwDYbMw=
-vjhE1Tz40ysxHaFFsSYvx2PArgiGN+TtvgJU7rpjpfE=
-TYzR1uyjzOBav1p0rF4E2ebwAjNzoZVEQWMtWu6hvHrInY/UZ5blfQ==
-ILqwy9ounChghIXKuJVRroqI2AGG9Ten
-ubJtssZfZAT1rVxODnoPdTDWqe0g7SwLiy48LWiKVlE=
-IXkPFPlOVIcndSRaJsuqWWkOmMORM/tkBiNf+1YVhVY=
-NIjHCiR6mpi7ww4KdnIMJE8j7PTf9QOxiy48LWiKVlE=
-JoBvvwFexbU7I+B8XA4dzrShkCOVwTpP0Zi/2VsQQhM=
-D4mYPp9JKbGSiSZ15D5IgM7Uy/40ORXD/2mxBEfNQnM=
-nA94feJa4S4B0EG3Dm9GxMiEkif5w7Ir/q8HAwDYbMw=
-q84ZhyDgJ0Y70S5rw6x5bYAlC1DdF+y+ekcrt/ixk8ivsFqAZYBWaQ==
-X5EUk0URRKActSxz9mjnWnKDl/U3pdrDx2HxBhizdbQ=
-3i86xoLmOlJCtbgxFokxWePJtLd8VmcF/q8HAwDYbMw=
-s+yBun5leHscTScttLEkfMjPdsjefYU+
-RO8haUpxV+Hj/7G1Z2FtXDJJWVRQ5onqYXm6K1wforoHZxMdXMBIKkpgEZ36UZf7
-qlgeYnp6Gd+dsb1tHLoW6K+OyYuJd1WOlrlUg9+v96R3Zc88T6l0hf03uMLuMSSK
-3iCLkNt8RW5z0eb699eUvnYx1cx5hG4Z29PyhLKx2/M=
-gXbINISuyXbS1VeLOg53lA8e28bx3vwLls8q2H+02OE=
-OCfxhKX1TSwXjmg6MsH1sw==
-dfxXFVsnYEzS1VeLOg53lA8e28bx3vwLls8q2H+02OE=
-lWtbv6NBWWJz45eRhIsvSEdKaDZwK85PZwCBATzIRK7xMWtT7kk4uA==
-ERbXbxZvj9zbPmlRtahxul9slLa3kKSRiy48LWiKVlE=
-prH3Eknh9LFr+2vG8TqmrtnCa9kC1M1MJ6BYOapSwexkFpRsBRbBSEpgEZ36UZf7
-8RcrGBVzzI54JwVpzGTwivCzIgFCh00MeCcFacxk8IoZMFCTgucvGg==
-G/nHagFQgMQCnY9MyUDfFDpf5wVTkKkbWJR/aEzNaJK6+7a927Mlpw==
-uEm+zGdzejuZnF6DuRckiQFsDcrhWfuKeoq9VfP6bSNKYBGd+lGX+w==
-CsDKBKvWfT5bbRy49IYTt8qtUJ0mpJv3
-xEUfjPFZ/xY38KaZOGGsp5mM9vpTJNSm/q8HAwDYbMw=
-KGk3d8Zc/cymXrt7PNU/PQ==
-Be1T87t+ge5FyOha+mc0fgXtU/O7foHuNjPIK43aG38=
-SxcVLiotqD1QRjhN4jmgfHBQdOTdPYBcBiNf+1YVhVY=
-b+NA05reRqS87mt/jArteZpGIerGFslDBiNf+1YVhVY=
-Zz3SLgfjpSkxTJuMOzemxDKqZrCrtkpNHYbf0CEGMr4=
-VVuz6ufe7PM1qwa0zjOs78iEkif5w7Ir/q8HAwDYbMw=
-0gJJ4eT+QkobuzICqAOsYEpgEZ36UZf7
-H/rrVnWKMgTHm4uS0oF0S78h54ct0pGn/q8HAwDYbMw=
-MGJ/Suae8SN58snWo/4AUImNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-bz0EO9U6FxSJmA0bW0g0Gm4GvHhlTPYd9bgs1k0BSts=
-MGJ/Suae8SO+1a2XxvflnYmNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-6oVo0vCUNv2qJk5z7Z2eEcb54Z8fdyxfekcrt/ixk8ivsFqAZYBWaQ==
-d2QHwaHDrsTZ0yTC3EmvvNYzt61Pv+qiGZnKlTTRcRMMSChDUrbwhkpgEZ36UZf7
-AkSjawobNhv6LCWfEO8NXChngpsINtgrTA030IBQvHg5Rw3NtFh+7A==
-Yt9m5N1Xx+JHZc+FL6nelLMihk1tLAqJ
-a2xOOCKyTCh7VMDGnqwAtisU81yRKz/EY4+qAzC0UbI=
-hcYYUyVV8HEzKLBpBBIZ+LHon+VMNaOjG0TTeMdx8fmMLn8jfDldjEpgEZ36UZf7
-GJJwB9ox8BM8l6CfPpYLuRfy2tc0VWDG4plAgbuYtIE5Rw3NtFh+7A==
-M5tfhq3PVOXg7xLqDuc8pFGSJaWiZsDCskF4kESh+LM=
-O3P6K+AfRNxzG0Ibukrdt3Yx1cx5hG4Z29PyhLKx2/M=
-h6H8S6JOlFZtFfhhqHJCBWPArgiGN+TtvgJU7rpjpfE=
-WVJ7+vV+e/C5aGsqg40yvvpw8tJNu+jGHfWINvCPPOwq3JCA6Zkhyq4eWYTrjK6T
-tS4IBGYFq57pSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-v0Zdd1f8fbiI9O5Jg/sCFZFqo1DAshbtXi70v8dm5ZYr+n+V3seCAQ==
-ulezh66gy3b8/N1pnO8rakpgEZ36UZf7
-xxkgiJRbpKS04JKFXSQTco+o5Yk79DNuiBTMaun30a0i6GsYqOa/eQ==
-OmtCxLA4SExjyHRBiuxjer8h54ct0pGn/q8HAwDYbMw=
-UNMVVx+jvGOFOjcqTu37FbkwPs3YiPZS/A5dhyaRZVhi3+/2fC3N6Q==
-yfEeZnTGWqsT12JeuKySsFUhezmi3LZB
-vHARpE2h49bGXNkgSB0sk9g1+sEGVwr2WJR/aEzNaJK6+7a927Mlpw==
-h/yk1ntTGb8m/82LY6ohGU2kckilPvYvJ3npHh7ywA8=
-R8/awSyXntbp2WCSBfSUoE8j7PTf9QOxiy48LWiKVlE=
-Be1T87t+ge5ZGPPb5JQxvfgvjS9QCo+dHhlCaG6nY4jnUtjCXK71mK4eWYTrjK6T
-wZ5h+HPyyDP9D3PyfIJfchZHZKAB7ZN8XDYoCuF77rs=
-NlgeFYMEeBOeyq7yDfILerMihk1tLAqJ
-D4mYPp9JKbHzinxokFjCqW0QCq/KaYeWB1jjWBOdWDE5Rw3NtFh+7A==
-4XRbqc31zegluM2Oe2mKmJ/JLfUaDh8OLKfEtSxDdD2vsFqAZYBWaQ==
-liy2X+sq55529Gyq8HVEs8iEkif5w7Ir/q8HAwDYbMw=
-W+Y0SwEFQHi0cixT1VLdlm0uO+R3EHILh3BzZ8jy7CTSp9jYyhr/Y0pgEZ36UZf7
-Z8+G5B4yQAJtE73kVzlMgKf/VajdNg2L
-ORIlBfs4mLH9n1UW9E7fjXZxll+rG9XW
-2aYtQ0hii/k4EMwbVHBKLInqQcsK0ze3X22hixRRRBw=
-MCVPu99GbLzXf0bSyZFbRhZHZKAB7ZN8XDYoCuF77rs=
-doEgfQFJG4up441AXnjSuBZHZKAB7ZN8XDYoCuF77rs=
-kYcEavv27cr9ryF5erIj/jDWqe0g7SwLiy48LWiKVlE=
-O0t44HcnZDiE6EwvoDT97ZpGIerGFslDBiNf+1YVhVY=
-nrF6JY01jhBXGgamOQyxQCysyYX5HUA4
-OW2PVrqNbgtIkRc7oSI9s0XScPMdSYlCtVS5dZ9BXyE=
-a2xOOCKyTCgcbH/ab49Wryggl56gqsnUY4+qAzC0UbI=
-rTy1TX1+elplv4+j+hrzpgVeznvoamkjBiNf+1YVhVY=
-rn5ckvaM4iwYTc3BBlUL4R+nJNTPwd7E+CLPmA1ccPY=
-KBoYoWgOW3j2H0K+T5yBU7ShkCOVwTpP0Zi/2VsQQhM=
-SrG+Yr7rfYiIs5lPBdY6208j7PTf9QOxiy48LWiKVlE=
-+xe5CpUw1IYIayJ99X/P37J/FQZxcg3o/2mxBEfNQnM=
-6oVo0vCUNv3Bu+cSyH2HAC4WoEf83C4cXDYoCuF77rs=
-7hHMOqKQxsvvI7KZPcwmeZ7M7HpG/M39Zd6ek3iMCyaxIP2O2HY0XUpgEZ36UZf7
-UkldRKmIA6XTeO8h3KzbE/1CIPowQycv8DqlBsEDrXmeL9kgB0JCLg==
-ROtHs56FpZupJdZnlbHOk8qtUJ0mpJv3
-3Kqo7918AYjtfu2xG5jYRhdJKcSfiINGhhIf9q9UVx2vsFqAZYBWaQ==
-GO3DnHLOlj5UiVCawyi/v/IgAh6Sr9Iu/q8HAwDYbMw=
-agiO7Fn/S/mVPcdRQc4XttEwOlPaHSDUigJLQjVVhT49G2BrhRCxmEpgEZ36UZf7
-a2xOOCKyTCjDCk32bnIeyAkk8NY5RItQY4+qAzC0UbI=
-P2Wg2UfPUZ1L3sXFrmYMBGPArgiGN+TtvgJU7rpjpfE=
-d2QHwaHDrsTuUh+bBDdbYfu4U8ORjsP5x2HxBhizdbQ=
-oYGfXP4z6yAaJYZZvzCyHnYx1cx5hG4Z29PyhLKx2/M=
-VWEz/9FsuzEOV4V3OQ7U5F9slLa3kKSRiy48LWiKVlE=
-lWtbv6NBWWK2maLO1gAcDHanZgrXvA9nvXonR66nARkyvx+jyi9x8tXgp+T/6zES
-R5EuwxlTHhiyIy8uOmfnksjPdsjefYU+
-gzO8Cbg97CYUNA3Nm3TK0ciEkif5w7Ir/q8HAwDYbMw=
-kRhgvUdsqlTym7F+DfnexqrHk0o9byPJ+CLPmA1ccPY=
-TsPvcv3gnZHeQvSH0/daOUAeXPR4HvzoFreNtoJyFoq6+7a927Mlpw==
-QvyTJGQZeT78gg6PCUbj+U8j7PTf9QOxiy48LWiKVlE=
-GalX2/0vwo9uOnW1bzza2qrHk0o9byPJ+CLPmA1ccPY=
-iA/29DpQZisa8NC1qmD4gAVeznvoamkjBiNf+1YVhVY=
-TgiF5QvbXKMMxFkAFeVkUuUxqhm8fDZFFreNtoJyFoq6+7a927Mlpw==
-k7b31BY6KC9aeprc42wlvV9slLa3kKSRiy48LWiKVlE=
-tS4IBGYFq54luM2Oe2mKmFjLajL1b5kzLKfEtSxDdD2vsFqAZYBWaQ==
-7KnZQjxxQl7szZG+RjW23Za1Hq6blcr2X22hixRRRBw=
-/OtavoEDNHt5IQEulT+3ylUhezmi3LZB
-CAsWEMXjc0GCOzFp8xDQrQFsDcrhWfuKeoq9VfP6bSNKYBGd+lGX+w==
-Q9Wy7DuiiBkbuzICqAOsYEpgEZ36UZf7
-yBAlgt+1O12PH9XTov2LFMqtUJ0mpJv3
-XqLdn51y3CB58snWo/4AUImNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-xEUfjPFZ/xZ5lul2w6oIkdYKz5QXVL/Zh+/fw5Z6v7y6+7a927Mlpw==
-E4hT7N3ytDvTeO8h3KzbE/1CIPowQycv8DqlBsEDrXmeL9kgB0JCLg==
-B4tRjRVx7CrvdAgUEZZEsB+nJNTPwd7E+CLPmA1ccPY=
-CdapfqHb5u0Zser27k1kqL8h54ct0pGn/q8HAwDYbMw=
-Hju7DU5VfDVo6sMqvdZWu19slLa3kKSRiy48LWiKVlE=
-9qm//CcuKpLTo4sOYIqzPTgu2Xu3WjFYI+WBkTvH9+k=
-vjxj8kegtXj8AfzlRMsKDR+nJNTPwd7E+CLPmA1ccPY=
-QxXEVYGvcvOdsZBBHI2gn08j7PTf9QOxiy48LWiKVlE=
-wuAmLXM9TGtpDkZNQNX7Ho8XAAdxNTjz
-mHvOMzR1NhGp/n2ZAahqTcXpEAWBlfaqROcxxZkPB1quDwPbNRe+BNXgp+T/6zES
-GalX2/0vwo89T0iNr/Nlm6rHk0o9byPJ+CLPmA1ccPY=
-sPonp8kD0PkRcbOHSBVXPMsa/txUZM25QWMtWu6hvHrInY/UZ5blfQ==
-UdiGQ0+eDdULGgDokz8X3L3cfC1kbkS3h+/fw5Z6v7y6+7a927Mlpw==
-bnEFD7YrFDBDHsxWzgkV9E8j7PTf9QOxiy48LWiKVlE=
-c3jiB/FYmp6bUumNOZBvZy4WoEf83C4cXDYoCuF77rs=
-3zW3wLTwVyEX5lS8ROgP6jDWqe0g7SwLiy48LWiKVlE=
-xHrqVGIyuafJ2cPh6NodLk2kckilPvYvJ3npHh7ywA8=
-Vc9imXWIb08/qODmlpVOdXYx1cx5hG4Z29PyhLKx2/M=
-ptlalxjKqk41Xk8fp0jcVYGTx2c1ExnYtVS5dZ9BXyE=
-4e57L86IhfwbuzICqAOsYEpgEZ36UZf7
-YPrzFHs9pPqdSkrxQcfqxjKqZrCrtkpNHYbf0CEGMr4=
-V6WTkmfX/pBGEkXNT9x//NsV5wJHUoYY
-vxbYaB+VKJBsS5LUKBN7hyv6f5Xex4IB
-Yc5gJRFgVTwiWD+NTcQ07TDWqe0g7SwLiy48LWiKVlE=
-teXiWF5i953EeSAoaVSW+xDh2GLQdF6wQWMtWu6hvHrInY/UZ5blfQ==
-UNMVVx+jvGPH13wXjJQhgy4WoEf83C4cXDYoCuF77rs=
-9K+PZ38Hd/3MaXZxar9HyMiEkif5w7Ir/q8HAwDYbMw=
-N7mVXStCCLv7KB09p30rNtGA8uGuT/HHGZGBU24jYa5i3+/2fC3N6Q==
-ZU3MsVqiG8nWt3nuWDlna3Yx1cx5hG4Z29PyhLKx2/M=
-NGEpYBLmvVCC1LLc/WhjCgZ2e4iaJYzQZLQ38Q59fpIPB8ryFLhIVg==
-0ifNLkwDW+fsTKsR/21p7TDWqe0g7SwLiy48LWiKVlE=
-bz0EO9U6FxQVN9/lDCFFSLShkCOVwTpP0Zi/2VsQQhM=
-nW8CI9k62L1QgdPGLTCW/S4WoEf83C4cXDYoCuF77rs=
-a1TiT+Qmj/Hg7xLqDuc8pFGSJaWiZsDCskF4kESh+LM=
-uDiuO1PEQdDpSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-zp7DEq21BTymAe0SxKShz5dcJHZ0cBE4EpZVr26BDQ4MSChDUrbwhkpgEZ36UZf7
-Ju1m/18F4Tj2pU7QMgD/10llgmg/4ZPQgBu5T1L3sIZnIK0hH6mZQ+e1jwEe184229PyhLKx2/M=
-2s+Nci9wvweK3KXUbQsrtCv6f5Xex4IB
-kb80gvcxzap8cPh5H3HqCDDWqe0g7SwLiy48LWiKVlE=
-mZJ5WVQDGgqYWuJCZMnvvMs19Q6LXzhu29PyhLKx2/M=
-D4mYPp9JKbEPMoBE5JanZykCgTVLz0VH/2mxBEfNQnM=
-xHrqVGIyuaeoCB1FTd1HF/9DZ1ya9BijFreNtoJyFoq6+7a927Mlpw==
-8fdDAcYQ7vM0XKLw+5TFRYAlC1DdF+y+ekcrt/ixk8ivsFqAZYBWaQ==
-VcxQmeoIyVTUnAlh270+3AM7oB/AV+xgWJR/aEzNaJK6+7a927Mlpw==
-1Gho/8ykDXN87OfXv8VpMR+nJNTPwd7E+CLPmA1ccPY=
-PqBVy0f/x/VzlHT9IBeVvr27iwVAM/ldPfv0PzVWJkiqWeD6wHIkJQ==
-iWZDhaUiwIOj1xL2rjtZBZo2N5E+yCsIx2HxBhizdbQ=
-/6T2M3rdtPucNjzmsryP2E8j7PTf9QOxiy48LWiKVlE=
-JzOozCpfofXpSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-l0pv5x7liVyYBDQZ85N22zO8Gyb0hLSaiy48LWiKVlE=
-t6w+ISmiDJIvB77laEou908j7PTf9QOxiy48LWiKVlE=
-6oVo0vCUNv3+syIwn7R/N03SdFtvCuqTY4+qAzC0UbI=
-LhagR/zcLhzt4/RUZmmGCqtBnyFFU98OY4+qAzC0UbI=
-XS6UnVgzKGfK+Ug2cfSt9E2kckilPvYvJ3npHh7ywA8=
-2gjhNrDt+eeM+M1cH8jd/ppGIerGFslDBiNf+1YVhVY=
-ZJJbdTBzhFmCEWZeyyhCsl7WIC6IB+h5MklZVFDmiepheborXB+iugdnEx1cwEgqSmARnfpRl/s=
-eVSsbDAVea+oqcCSI0+FRbPvI78zAVWKtVS5dZ9BXyE=
-RnawZRGR68XP1h0sr6eK1tzhECCwrns2Rrj4KwaA2z1i3+/2fC3N6Q==
-ugVF8/ud1vfpSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-GwjNkWrksZTlk+KMjB6sdzKqZrCrtkpNHYbf0CEGMr4=
-xEUfjPFZ/xZ5lul2w6oIkWR46hIkuLlEeei1c5CKc1NkFpRsBRbBSEpgEZ36UZf7
-TsPvcv3gnZGam9uNjHoBaciEkif5w7Ir/q8HAwDYbMw=
-2hy8sQOSAg/pSgcoVE4LbRrlMPGKaJM9LKfEtSxDdD2vsFqAZYBWaQ==
-GwjNkWrksZQtQEqjyaSdszKqZrCrtkpNHYbf0CEGMr4=
-Nm4B4SLOBxpYhfae1n9fo1qtLc48eY2UQdGiXXojcIc=
-STHfzVIsUlRXeWdHW1k+jjhk/waTjgpz
-rV08K/rlRWKJV5FLJMNxCLM+zCQSyaxQX22hixRRRBw=
-pd6Dj8nJ7nPpm5Kfg7YPAcXpEAWBlfaqdsnVmLKdRlgi6GsYqOa/eQ==
-hhtiZ/MMWNhxp87yW9HahwFsDcrhWfuKTNJP9My5dGo=
-gzO8Cbg97CbMaXZxar9HyMiEkif5w7Ir/q8HAwDYbMw=
-yd3JtXxWDFA6URarhrI1YFqtLc48eY2UQdGiXXojcIc=
-pun1g50o8zhFfTJte1xCfZpDL7jLb9tEBV7Oe+hqaSMGI1/7VhWFVg==
-iWZDhaUiwIMpbigZ+f2N6U6ZkobvLvFy9l81u6Teh28MSChDUrbwhkpgEZ36UZf7
-gWaZQ+h6MBNTrQNnXrxNhaVIBCi5UFmQqlng+sByJCU=
-qlgeYnp6Gd8sF+dG3U5MNK+OyYuJd1WOlrlUg9+v96R3Zc88T6l0hf03uMLuMSSK
-Be1T87t+ge7ZjwBe3RSAygXtU/O7foHuNjPIK43aG38=
-G/nHagFQgMSdBPthNaYW178h54ct0pGn/q8HAwDYbMw=
-Be1T87t+ge6tc5EZVJ1itAXtU/O7foHuNjPIK43aG38=
-fdO5xoRtYI/pSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-0rL5ddju58MV0D3EX1rG55pGIerGFslDBiNf+1YVhVY=
-+9YAgXKwnnAxHaFFsSYvx2PArgiGN+TtvgJU7rpjpfE=
-Z3rdhVarkJEGCG6QjKDBHJYhFpPhsFFDDjkLaUVPMFBi3+/2fC3N6Q==
-0msdPD8LSLf9ryF5erIj/jDWqe0g7SwLiy48LWiKVlE=
-xWcse9g5MMWTTWbrbhHijCv6f5Xex4IB
-rJXrTUmEFUPqkOJN5fkit3Zxll+rG9XW
-rlyQeMLz7o9hEmSMVZVoMvdRXYZOpVMCECvuVRS770VkFpRsBRbBSEpgEZ36UZf7
-Be1T87t+ge5QFKyIZO+UyAXtU/O7foHuNjPIK43aG38=
-GJY7cDckFDlGEkXNT9x//B7mEd1pUS95
-FA6xglRNxGoaG6p72yIkRXBQdOTdPYBcBiNf+1YVhVY=
-qnP4keypBHL5b2Il8gl955mM9vpTJNSm/q8HAwDYbMw=
-IMEemaM1RvBAyutIwSlwZNlJZasWCk30qhMv2Ou59Rw=
-LDHmY9CxF4e75xBJQ3AG3oCe63E/36Nv32kQDgX44Ia5IbscCkv6s0S6FHPwV2d6
-5i4S6xm9ScocTScttLEkfMjPdsjefYU+
-wcHwb7eaIVOhUNkO7ED8YC4WoEf83C4cqhMv2Ou59Rw=
-b/WI/AkkF2hxxp2rruD9oVs4NJ7QRSoTgRelkWDtQcE=
-9K+PZ38Hd/0UNA3Nm3TK0ciEkif5w7Ir/q8HAwDYbMw=
-0WEkb4X35pqOIio880KURAVeznvoamkjBiNf+1YVhVY=
-Be1T87t+ge7v1lYJs9eWdS23RRUaR+4oVU920992xUnnUtjCXK71mK4eWYTrjK6T
-VcxQmeoIyVR9H7WEhFjtUAnW3C5Wg3qZB1jjWBOdWDE5Rw3NtFh+7A==
-SJa+FiJCadBkqxPNk6+V1kZqJaC3haW+/q8HAwDYbMw=
-lDc2WWI+Lt68bGm3RVUD2nGSc7YdBahSMouFUjzu3Ko=
-fuMa3fAFUd3KRYgO0tzJ7HBQdOTdPYBcBiNf+1YVhVY=
-Be1T87t+ge4R4XW7q0Cj+z6RH7B4aYNNEOk9yLlVVoU5Rw3NtFh+7A==
-cyoOESKkBUa5IESGfSKS6MXpEAWBlfaqROcxxZkPB1quDwPbNRe+BNXgp+T/6zES
-K8oTgWzW4sTUphU/V+8C0d0zEDXPVtiO/2mxBEfNQnM=
-prfJfRawKQVGEkXNT9x//B7mEd1pUS95
-TO0JBQ8mr8QxHaFFsSYvx2PArgiGN+TtvgJU7rpjpfE=
-iWZDhaUiwIMDwtK9Os4r17zGCrn1wkcIomuiOuvZKZwMSChDUrbwhkpgEZ36UZf7
-HhKLdqj0nV/7KB09p30rNtGA8uGuT/HHGZGBU24jYa5i3+/2fC3N6Q==
-B5DO9dw1D2YQpu36ll9bG/iR2Nh0tefTh3BzZ8jy7CTSp9jYyhr/Y0pgEZ36UZf7
-GIlb9jEX+KaRdLpgL4g3iZ1cVcldyPrU/2mxBEfNQnM=
-/DD79lLv1+zbBGzb7wCuTtA/6eTRfnRu/q8HAwDYbMw=
-f0IIhtVP0tbpAUXaWJzMP0mKQQuQ8uypkXS2vYCMEIY=
-41X1gwjKRwwXjmg6MsH1sw==
-Led3MhqcAt7YZ8qKJ/p9kd/mAa4Y2mkrn0TVR+lMGvzbZQmJGGuVHUpgEZ36UZf7
-9K+PZ38Hd/1X7xsjAslcLMiEkif5w7Ir/q8HAwDYbMw=
-iwVqR06CjKyYpM/bixm7up0furFVDHkPomuiOuvZKZwMSChDUrbwhkpgEZ36UZf7
-EQ0++UQ15V6yYb3mwQVJHomNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-aorTQWBaGOpSqSk/kqtp6k8j7PTf9QOxiy48LWiKVlE=
-TvA8CG8G4YAiWD+NTcQ07TDWqe0g7SwLiy48LWiKVlE=
-kYyZWfdCjQ31rVxODnoPdTDWqe0g7SwLiy48LWiKVlE=
-8CyinXcPGjUyuR8vSmCTWShngpsINtgrB1jjWBOdWDE5Rw3NtFh+7A==
-iUchhe2/rwlPQEM+dGBY+LShkCOVwTpP0Zi/2VsQQhM=
-MfpZ5926ns6YuMnqRi1p1ndh/Y/Ht6XJvXonR66nARkyvx+jyi9x8tXgp+T/6zES
-sPonp8kD0PkQaLRAdyg3O6///N9btsABQWMtWu6hvHrInY/UZ5blfQ==
-LjWUXrtaFBOqJk5z7Z2eEcHqS1AnapmZcV5MrErBhJ+Ze4hFGfYvcZUGJOqdwWOh29PyhLKx2/M=
-olBfBBlxWjycJfkSrHWjXx7XxndCZTPS
-xEUfjPFZ/xYbQMdRzGb6EZCtN3rbnl/eh+/fw5Z6v7y6+7a927Mlpw==
-zZuGMcTq1JHGp5vMrSXYNDBZTqNqJ5n4gCULUN0X7L56Ryu3+LGTyK+wWoBlgFZp
-uuyT96dmXFAa8NC1qmD4gAVeznvoamkjBiNf+1YVhVY=
-vdED0AXkFr9SaAKKkgC8a8XpEAWBlfaqROcxxZkPB1quDwPbNRe+BNXgp+T/6zES
-D4mYPp9JKbHzinxokFjCqV/jxvmRIApjB1jjWBOdWDE5Rw3NtFh+7A==
-qgKo9TnGwm/pSgcoVE4Lbab0TFIDFrR5LKfEtSxDdD2vsFqAZYBWaQ==
-Lib0vPfLPtxEpmEtu+VPzyOBwYHNoEZeskF4kESh+LM=
-a7/dhv2JebKmXrt7PNU/PQ==
-kaQzHdNszKO4nPopHgHulxUyIzrBR4/y/2mxBEfNQnM=
-Be1T87t+ge6dBPthNaYW1wXtU/O7foHuNjPIK43aG38=
-na3Rh7vOnQzHOvdJia6bA8jPdsjefYU+
-UybyAbqlRXJgQzinC9H3vwFsDcrhWfuKh/UqQ9KfOqtKYBGd+lGX+w==
-R5EuwxlTHhi3+OYOCFiTo8jPdsjefYU+
-YkMU4MC4qUuCLbAllbnuGXYx1cx5hG4Z29PyhLKx2/M=
-Be1T87t+ge6Js57Vyd6dUGDSxA6blrCJBDwYj7kpOJKR4r8e12CaU8qLPNXvoeOyiy48LWiKVlE=
-yvOBbTrbEUqK3KXUbQsrtCv6f5Xex4IB
-W+Y0SwEFQHg1Xk8fp0jcVYGTx2c1ExnYtVS5dZ9BXyE=
-nUNMGrDxFtg0XKLw+5TFRYAlC1DdF+y+ekcrt/ixk8ivsFqAZYBWaQ==
-0cjnbZ6aUewcTScttLEkfMjPdsjefYU+
-liy2X+sq5569wQKLGZD07MiEkif5w7Ir/q8HAwDYbMw=
-1581XgFcj1+i1SEXjmwEoZ4jhdISRgM1GZGBU24jYa5i3+/2fC3N6Q==
-B5DO9dw1D2YQpu36ll9bG20uO+R3EHILh3BzZ8jy7CTSp9jYyhr/Y0pgEZ36UZf7
-TYzR1uyjzODtHMmrFj9uzUMFMzBLT5aOQWMtWu6hvHrInY/UZ5blfQ==
-BYPGG+Rke8Y+jIg2vQkoa/O8tzir+T4U/2mxBEfNQnM=
-xCEoOyRVep4MTQiYXM8lr08j7PTf9QOxiy48LWiKVlE=
-hcYYUyVV8HEFrFqO7wPzIxZHZKAB7ZN8XDYoCuF77rs=
-Thq2mIfRTdjputPA6xcBYfLiJOS2Q8a6vq6D91PFIVFkFpRsBRbBSEpgEZ36UZf7
-gQ5NuUVPQj7KUr7j9edqtJeBOJp6ehDSskF4kESh+LM=
-4XRbqc31zejpSgcoVE4LbVlWmsB6bpa37xFjLYT6Rxy64ZXmt8itk9Xgp+T/6zES
-kDiWMe1LBSl8pDgZ9Qwy/kRUZutpSoMztVS5dZ9BXyE=
-rV08K/rlRWI+03JbZpPE8CgyfvKpg5y7X22hixRRRBw=
-bAqw2jgHq3m5i1D8TU6o0P2wj6PFLTE7gRelkWDtQcE=
-ueWzwnpHs3Ysu9VBkLGKtomNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-KWJC+jP3MmrrOXaV4RJsJNgU0qS8ySJzWJR/aEzNaJK6+7a927Mlpw==
-GJJwB9ox8BOiD8fePYLX6HrOo49ES6zCx2HxBhizdbQ=
-iWZDhaUiwIN9rgWENJ60Z/AOoVJ6bYZFx2HxBhizdbQ=
-D4mYPp9JKbH+4LYBQ6tfFmomUzzUhccT/2mxBEfNQnM=
-1cg7mRlV5xOpqJdb4SUpd6tBnyFFU98OY4+qAzC0UbI=
-93ZjDiJwkDG5HDCGj0QD1YQFg5ujYynq1DJL0Z/lW/Ni3+/2fC3N6Q==
-tgLfZiBNXVczoQ1EIwCMFxZHZKAB7ZN8XDYoCuF77rs=
-vryxtT6ncK9akQ9uv7yLYfCMbSWWxVxjX22hixRRRBw=
-TAeuC8oKKcBXGbeq1ZPeLy4WoEf83C4cXDYoCuF77rs=
-aEFLrAB9hgvFMBkrG3I+bPg2a+eAUIhpY4+qAzC0UbI=
-aEFLrAB9hguANGvQj7qKOkXScPMdSYlCY4+qAzC0UbI=
-oVkJFMUNKou/cHekBLxoihZHZKAB7ZN8XDYoCuF77rs=
-0gGUhVPoq4G6hnX53NjgLr4OMlJsKxmB961LXAj2Jtg=
-prIOL0EYgbKANGvQj7qKOkXScPMdSYlCY4+qAzC0UbI=
-aEFLrAB9hgtiHpImQyttJi4WoEf83C4cqhMv2Ou59Rw=
-mXZt2oZRcNVO1lcHVoQCpkK1awf8ITj2DSpMu2eqnX/e09AdZ5BMWfnKC8TK+XUUqlng+sByJCU=
-37t5EvcfQlNi2VwgYJhqA4d67GjYv/BW/A5dhyaRZVhi3+/2fC3N6Q==
-dHiJrsr8DsrzUeD6tkMeWgDgvoDAadiAhWiGZtLytLM=
-joB4IcA83AVaa5/qWiVrrStiIXHXj62gGZGBU24jYa5i3+/2fC3N6Q==
-vjxj8kegtXg9T0iNr/Nlmx+nJNTPwd7E+CLPmA1ccPY=
-bQJtjBvartdGEkXNT9x//B7mEd1pUS95
-KFvSChN/ZipeHhSKtpTDaRtE03jHcfH5jC5/I3w5XYxKYBGd+lGX+w==
-IFgTzpfVWNIzoQ1EIwCMFxZHZKAB7ZN8XDYoCuF77rs=
-QJKcgMh/i55eHhSKtpTDaRtE03jHcfH5jC5/I3w5XYxKYBGd+lGX+w==
-2gjhNrDt+efdlcvkMNg5Ki4WoEf83C4cXDYoCuF77rs=
-aEFLrAB9hgtXGbeq1ZPeLy4WoEf83C4cXDYoCuF77rs=
-joB4IcA83AWpqJdb4SUpd6tBnyFFU98OY4+qAzC0UbI=
-nW8CI9k62L3QjMenVPl3w0XScPMdSYlCY4+qAzC0UbI=
-ebTDNANnJLJeHhSKtpTDaRtE03jHcfH5jC5/I3w5XYxKYBGd+lGX+w==
-xhWftWtq9ZtXGbeq1ZPeLx+nJNTPwd7E+CLPmA1ccPY=
-joB4IcA83AUEmTmlLGQ2G6I+savOKorQtVS5dZ9BXyE=
-WhFqhJwqaF+puJ3an0tEWZmM9vpTJNSm/q8HAwDYbMw=
-0gGUhVPoq4FnOPr3BRZqtBp2R5vdHjDgn0TVR+lMGvzbZQmJGGuVHUpgEZ36UZf7
-woEsaznqCj+ea/dJHlg8gGii7M+D0+w2whrnXxVjMIv9N7jC7jEkig==
-woEsaznqCj8yR5odehcRjmii7M+D0+w2whrnXxVjMIv9N7jC7jEkig==
-NjzNjq0emHQgxpjuFWIItG9jx6N5wpQIEWtLgLSKG1oN3sJIAtQssOzSwRJA5gyR
-joB4IcA83AUPnMlE/V6IXcIJm2NzqGj2GZGBU24jYa5i3+/2fC3N6Q==
-GG71AOESABKea/dJHlg8gGii7M+D0+w2whrnXxVjMIv9N7jC7jEkig==
-lWtbv6NBWWJhmIhQrGtXPsqnsSvd/uU7fpYIRpijTOivsFqAZYBWaQ==
-hPnw6ZZmVUZXGbeq1ZPeLy4WoEf83C4cXDYoCuF77rs=
-GaEOqMDeIR/3Djts87F7+hZHZKAB7ZN8XDYoCuF77rs=
-ryRne62lVqBbuTjA+EAab/g2a+eAUIhpY4+qAzC0UbI=
-aEFLrAB9hgvsvE6g9Yp2ry4WoEf83C4cXDYoCuF77rs=
-XcJy0D6ZIblGEkXNT9x//B7mEd1pUS95
-joB4IcA83AVbuTjA+EAab/g2a+eAUIhpY4+qAzC0UbI=
-bAqw2jgHq3lxxp2rruD9of2wj6PFLTE7gRelkWDtQcE=
-wxSr1LqU3fGdsb1tHLoW6ImNQ8mcKCxKI7yCxnTScjzxMWtT7kk4uA==
-3lYEJRmTL05buTjA+EAab/g2a+eAUIhpY4+qAzC0UbI=
-4qgWEGO8fn1buTjA+EAab/g2a+eAUIhpY4+qAzC0UbI=
-1cg7mRlV5xNbuTjA+EAab/g2a+eAUIhpY4+qAzC0UbI=
-0LvT6/YvA1D3E3TiguFlGppGIerGFslDBiNf+1YVhVY=
-0QUL4nFKgdfG4Iy3FNYdwx3WwMABsQIr2FyZ+WvEg8di3+/2fC3N6Q==
-prIOL0EYgbJXGbeq1ZPeLy4WoEf83C4cXDYoCuF77rs=
-1cg7mRlV5xOibE48Z2DecMIJm2NzqGj2c4WP7ikXL7i6+7a927Mlpw==
-zWvRyp77zgVz0eb699eUvk8j7PTf9QOxiy48LWiKVlE=
-J3AU1QKXbRKoi/cZYkgfPnYx1cx5hG4Z29PyhLKx2/M=
-FbxVjjKSfx1z0eb699eUvnYx1cx5hG4Z29PyhLKx2/M=
-1qu/bF4qmMH6WijRbvch0nYx1cx5hG4Z29PyhLKx2/M=
-zm66Ok5YvbKqwMvVx+BrJb1D4ZxFUehOX22hixRRRBw=
-JEmb5xmY6tNf/ryxf5Rg1nYx1cx5hG4Z29PyhLKx2/M=

+ 86 - 2
graph/src/test/java/org/diagbot/graph/CacheFile.java

@@ -6,16 +6,76 @@ import org.diagbot.pub.utils.security.EncrypDES;
 import java.io.FileWriter;
 import java.sql.Connection;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.*;
 
 public class CacheFile {
     public static void main(String[] args) {
         CacheFile cacheFile = new CacheFile();
-        cacheFile.diagSort();
+        cacheFile.diagClassifyMaping();
+
+    }
+    //疾病 -- 科室
+    public void diagDepartMaping(){
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?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 k1.lib_name diag_name, k2.lib_name dept_name FROM kl_concept_common kcc, kl_concept k1, kl_concept k2 " +
+                    "where kcc.concept_id = k1.id and kcc.dept_id = k2.id " +
+                    "and k1.lib_type = 18 and kcc.dept_id  is not null";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            List<Map.Entry<String, String>> libaryList = rsToMap(rs, true);
+            FileWriter fw = new FileWriter(path + "src/main/resources/doc_result_mapping_diag.dict");
+            for (Map.Entry<String, String> entry : libaryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
+    }
+    //疾病分类归一
+    public void diagClassifyMaping(){
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "lantone", "jdbc:mysql://192.168.2.121:3306/med?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 g.diag_name,g.diag_bigName_classify,g.diag_subName_classify FROM `doc_bigsub_classify_diag` g ";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            FileWriter fw = new FileWriter(path + "src/main/resources/diagClassify.dict");
+            String  r1 ,r2,r3;
+            while (rs.next()) {
+                r1 = rs.getString(1);//本类名
+                r2 = rs.getString(2);//大类名
+                r3 = rs.getString(3);//小类名
+                fw.write(encrypDES.encrytor(r1+ "|" + r2+ "|" + r3));
+                fw.write("\n");
+            }
+            fw.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
     }
     //诊断大小类对应
     public void diagSort(){
-        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/bigdata-web?useUnicode=true&characterEncoding=UTF-8");
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
         Connection conn = nlpJdbc.connect();
         Statement st = null;
         ResultSet rs = null;
@@ -138,4 +198,28 @@ public class CacheFile {
             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;
+    }
 }

+ 10 - 0
graphdb/pom.xml

@@ -84,6 +84,16 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.diagbot</groupId>
+            <artifactId>public</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.diagbot</groupId>-->
+            <!--<artifactId>nlp</artifactId>-->
+            <!--<version>1.0.0</version>-->
+        <!--</dependency>-->
     </dependencies>
 
     <build>

+ 41 - 0
graphdb/src/main/java/org/diagbot/pub/Ciku.java

@@ -0,0 +1,41 @@
+package org.diagbot.pub;
+
+public enum Ciku {
+    SYMPTOM("1","1,70"),VITAL_RESULT("2","35,70"),BIGlIS("3","12"),SUBLIS("subLis","13")
+    ,RESULTLIS("resultLis","14,70"),PACS("4","16"),RESULTPACS("resultPacs","17,70"),DISEASE("5","18")
+    ,HISTORY("6","18,70"),CAUSE("7","5,70"),PROGNOSIS("8","70"),OTHER("9","70");
+    private String name;
+    private String label;
+
+    Ciku(String name, String label) {
+        this.name = name;
+        this.label = label;
+    }
+    public static Ciku getEnum(String name) {
+        for (Ciku item : Ciku.values()) {
+            if (item.name.equals(name) ) {
+                return item;
+            }
+        }
+        return null;
+    }
+    public static String getLabel(String name) {
+        Ciku item = getEnum(name);
+        return item != null ? item.label : null;
+    }
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+}

+ 44 - 0
graphdb/src/main/java/org/diagbot/pub/Label.java

@@ -0,0 +1,44 @@
+package org.diagbot.pub;
+
+public enum Label {
+    SYMPTOM("1","Symptom"),VITAL_RESULT("2","Vital"),LIS("3","LIS"),PACS("4","PACS"),
+    DISEASE("5","Disease"),HISTORY("6","History"),CAUSE("7","Cause"),PROGNOSIS("8","Other"),
+    OTHER("9","Other"),CONDITION("诊断依据","Condition"),NI("92","Condition"),QUE("91","Condition"),
+    HIGH("93","Condition"),DELETE("94","Condition"),
+    LISRESULT("化验结果","LISResult"),PACSRESULT("辅检结果","PACSResult");
+    private String name;
+    private String label;
+
+    Label(String name, String label) {
+        this.name = name;
+        this.label = label;
+    }
+    public static Label getEnum(String name) {
+        for (Label item : Label.values()) {
+            if (item.name.equals(name) ) {
+                return item;
+            }
+        }
+        return null;
+    }
+    public static String getLabel(String name) {
+        Label item = getEnum(name);
+        return item != null ? item.label : null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+}

+ 46 - 0
graphdb/src/main/java/org/diagbot/pub/Type.java

@@ -0,0 +1,46 @@
+package org.diagbot.pub;
+
+/**
+ * excel
+ * 类型(1:症状,2:体征,3:化验,4:辅检,5:鉴别诊断,6:病史,7:诱因,8:病程,9:其他,91:确诊,92:拟诊,93:警惕)
+ */
+public enum Type {
+    SYMPTOM(1,"症状"),VITAL_RESULT(2,"体征结果"),LIS(3,"化验"),PACS(4,"辅检"),
+    DISEASE(5,"鉴别诊断"),HISTORY(6,"病史"),CAUSE(7,"诱因"),PROGNOSIS(8,"病程"),
+    OTHER(9,"其他"),QUE(91,"确诊"),NI(92,"拟诊"),HIGH(93,"警惕"),DELETE(94,"删除条件");
+    private Integer key;
+    private String name;
+
+    Type(Integer key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+    public static Type getEnum(Integer key) {
+        for (Type item : Type.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+    public static String getName(Integer key) {
+        Type item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    public Integer getKey() {
+        return key;
+    }
+
+    public void setKey(Integer key) {
+        this.key = key;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 153 - 0
graphdb/src/main/java/org/diagbot/repository/DiseaseRepository.java

@@ -18,4 +18,157 @@ public interface DiseaseRepository extends Neo4jRepository<Disease, Long> {
     @Query("match(d:Disease) where d.name in {0} return d.name as name, d.high_risk as risk")
     List<Map<String, Object>> getHighRisk(List diagList);
 
+
+    //删除诊断依据
+    //删除关系1
+    @Query("match(d:Disease)<-[r:拟诊|:确诊|:警惕]-(c:Condition)<-[r1]-(k:Condition)<-[r2]-(h:Condition) where d.disId={0} detach delete c,k,h")
+    void deleteRelation1(Long disId);
+    //删除关系2
+    @Query("match(d:Disease)<-[r:拟诊|:确诊|:警惕]-(c:Condition)<-[r1]-(k:Condition) where d.disId={0} detach delete c,k")
+    void deleteRelation2(Long disId);
+    //删除关系3
+    @Query("match(d:Disease)<-[r:拟诊|:确诊|:警惕]-(c:Condition) where d.disId={0} detach delete r")
+    void deleteRelation3(Long disId);
+    //删除排除关系4
+    @Query("match(d:Disease)<-[r:排除]-(l) where d.disId={0} detach delete l")
+    void deleteRelation4(Long disId);
+    //删除排除关系5
+    @Query("match(d:Disease)-[r:表现]->(j)-[r1:属于]->(k) where d.disId={0} detach delete r")
+    void deleteRelation5(Long disId);
+    //删除排除关系6
+    @Query("match(d:Disease)-[r:表现]->(j) where d.disId={0} detach delete r")
+    void deleteRelation6(Long disId);
+    //删除排除关系7
+    @Query("match(d:Disease)-[r:推荐]->(j:LIS) where d.disId={0} detach delete r")
+    void deleteRelation7(Long disId);
+    //删除排除关系8
+    @Query("match(d:Disease)-[r:推荐]->(j:PACS) where d.disId={0} detach delete r")
+    void deleteRelation8(Long disId);
+    //删除排除关系9
+    @Query("match(d:Disease)-[r:鉴别诊断]->(b) where d.disId={0} detach delete r")
+    void deleteRelation9(Long disId);
+    //删除排除关系10
+    @Query("match(c:Condition) where c.name={0} detach delete c")
+    void deleteRelation10(String conditionName);
+    //删除诊断
+    @Query("match(c:Disease) where c.disId={0} detach delete c")
+    void deleteRelation11(Long disId);
+    //更新图谱
+    //存储疾病
+    @Query("merge(d:Disease{name:{0},disId:{1},emergency:{2}})")
+    void mergeDis(String name,Long disId,Integer emergency);
+    //存储确诊,拟诊,警惕
+    @Query( "merge(c:Condition{name:{0},path:{1}})")
+    void mergeCondition(String disName,Integer path);
+    @Query("match(c:Condition{name:{0}}),(d:Disease{disId:{1}})" +
+            " merge(c)-[:确诊]->(d)")
+    void mergeQueNiHigh(String conditionName,Long disId);
+    @Query("match(c:Condition{name:{0}}),(d:Disease{disId:{1}})" +
+            " merge(c)-[:拟诊]->(d)")
+    void mergeNiHigh(String conditionName,Long disId);
+    @Query("match(c:Condition{name:{0}}),(d:Disease{disId:{1}})" +
+            " merge(c)-[:警惕]->(d)")
+    void mergeHigh(String conditionName,Long disId);
+    //任几的condition
+    @Query("merge(c:Condition{name:{0},path:{1},relation:{2}})")
+    void mergeRenCondition(String conditionName,Integer path,String relation);
+    @Query("match(c:Condition{name:{0}}),(s:Condition{name:{1}}) merge(c)-[r:诊断依据]->(s)")
+    void mergeRenCondition(String c1,String c2);
+    //具体code Condition
+    @Query("merge(c:Condition{name:{0},path:1,relation:'任一'})")
+    void mergeNUMCondition(String disName);
+    @Query("match(c:Condition{name:{0}}),(s:Condition{name:{1}}) merge(c)-[r:诊断依据]->(s)")
+    void mergeNUMCondition(String c1,String c2);
+    //开始添加所有的词语
+    //添加症状标准词
+    @Query("merge(d:Symptom{name:{0}})")
+    void mergeStandardSymptom(String name);
+    //疾病表现症状标准词
+    @Query("match(d:Disease{disId:{0}}),(s:Symptom{name:{1}}) merge(d)-[r:表现]->(s)")
+    void mergeRelationStandard(Long disId,String name);
+    //属于症状标准词
+    @Query("match(d:Condition{name:{0}}),(s:Symptom{name:{1}}) merge(d)<-[r:属于]-(s)")
+    void mergeRelationStandardshuyu(String conditionName,String name);
+    //添加体征标准词
+    @Query("merge(d:Vital{name:{0}})")
+    void mergeStandardVital(String name);
+    //疾病表现体征标准词
+    @Query("match(d:Disease{disId:{0}}),(s:Vital{name:{1}}) merge(d)-[r:表现]->(s)")
+    void mergeRelationStandardVital(Long disId,String name);
+    //属于体征标准词
+    @Query("match(d:Condition{name:{0}}),(s:Vital{name:{1}}) merge(d)<-[r:属于]-(s)")
+    void mergeRelationStandardVitalshuyu(String conditionName,String name);
+    //添加病史标准词
+    @Query("merge(d:History{name:{0}})")
+    void mergeStandardHistory(String name);
+    //疾病表现病史标准词
+    @Query("match(d:Disease{disId:{0}}),(s:History{name:{1}}) merge(d)-[r:表现]->(s)")
+    void mergeRelationStandardHistory(Long disId,String name);
+    //属于病史标准词
+    @Query("match(d:Condition{name:{0}}),(s:History{name:{1}}) merge(d)<-[r:属于]-(s)")
+    void mergeRelationStandardHistoryshuyu(String conditionName,String name);
+    //添加诱因标准词
+    @Query("merge(d:Cause{name:{0}})")
+    void mergeStandardCause(String name);
+    //疾病表现诱因标准词
+    @Query("match(d:Disease{disId:{0}}),(s:Cause{name:{1}}) merge(d)-[r:表现]->(s)")
+    void mergeRelationStandardCause(Long disId,String name);
+    //属于诱因标准词
+    @Query("match(d:Condition{name:{0}}),(s:Cause{name:{1}}) merge(d)<-[r:属于]-(s)")
+    void mergeRelationStandardCauseshuyu(String conditionName,String name);
+    //添加病程标准词
+    @Query("merge(d:Prognosis{name:{0}})")
+    void mergeStandardPrognosis(String name);
+    //疾病表现病程标准词
+    @Query("match(d:Disease{disId:{0}}),(s:Prognosis{name:{1}}) merge(d)-[r:表现]->(s)")
+    void mergeRelationStandardPrognosis(Long disId,String name);
+    //属于病程标准词
+    @Query("match(d:Condition{name:{0}}),(s:Prognosis{name:{1}}) merge(d)<-[r:属于]-(s)")
+    void mergeRelationStandardPrognosisshuyu(String conditionName,String name);
+    //添加其他标准词
+    @Query("merge(d:Other{name:{0}})")
+    void mergeStandardOther(String name);
+    //疾病表现其他标准词
+    @Query("match(d:Disease{disId:{0}}),(s:Other{name:{1}}) merge(d)-[r:表现]->(s)")
+    void mergeRelationStandardOther(Long disId,String name);
+    //属于其他标准词
+    @Query("match(d:Condition{name:{0}}),(s:Other{name:{1}}) merge(d)<-[r:属于]-(s)")
+    void mergeRelationStandardOthershuyu(String conditionName,String name);
+    //添加鉴别诊断
+    @Query("merge(d:DifferentDis{name:{0}})")
+    void mergeDifferentDis(String disName);
+    //疾病和鉴别诊断创建关系
+    @Query("match(d:Disease{disId:{0}}),(s:DifferentDis{name:{1}}) merge(d)-[r:鉴别诊断]->(s)")
+    void mergeRelationDifferentDis(Long disId,String name);
+    //创建公表名
+    @Query("merge(l:LIS{name:{0}})")
+    void mergePublicLIS(String lisName);
+    //疾病和鉴别诊断创建关系
+    @Query("match(d:Disease{disId:{0}}),(s:LIS{name:{1}}) merge(d)-[r:推荐]->(s)")
+    void mergeRelationLIS(Long disId,String name);
+    //创建化验结果节点
+    @Query("merge(l:LISResult{name:{0}})")
+    void mergeLISRESULT(String name);
+    //公表名和化验结果创建关系
+    @Query("match(d:LIS{name:{0}}),(s:LISResult{name:{1}}) merge(d)-[r:结果]->(s)")
+    void mergeRelationPublicLIS(String publicLis,String lisResult);
+    //化验结果和对应的codeCondition创建关系
+    @Query("match(d:Condition{name:{0}}),(s:LISResult{name:{1}}) merge(d)<-[r:诊断依据]-(s)")
+    void mergeRelationCondiLisRes(String codeCondition,String lisRes);
+    //创建辅检项目
+    @Query("merge(p:PACS{name:{0}})")
+    void mergePacs(String pacsName);
+    //疾病推荐辅检
+    @Query("match(d:Disease{disId:{0}}),(s:PACS{name:{1}}) merge(d)-[r:推荐]->(s)")
+    void mergeRelationDis2Pacs(Long disId,String name);
+    //创建辅检结果节点
+    @Query("merge(p:PACSResult{name:{0}})")
+    void mergePacsResult(String name);
+    //创建辅检和辅检结果的关系
+    @Query("match(d:PACS{name:{0}}),(s:PACSResult{name:{1}}) merge(d)-[r:结果]->(s)")
+    void mergeRelationPacsResult(String pacs,String pacsResult);
+    //辅检结果和对应的codeCondition创建关系
+    @Query("match(d:Condition{name:{0}}),(s:PACSResult{name:{1}}) merge(d)<-[r:诊断依据]-(s)")
+    void mergeRelationCondiPacsRes(String codeCondition,String pacsRes);
 }
+

+ 8 - 3
graphdb/src/main/java/org/diagbot/service/KnowledgeService.java

@@ -5,9 +5,7 @@ import org.diagbot.entity.node.Symptom;
 import org.diagbot.vo.*;
 import org.diagbot.entity.node.Disease;
 import org.diagbot.entity.node.base.BaseNode;
-import org.diagbot.vo.domain.FeatureRate;
-import org.diagbot.vo.domain.ResponseData;
-import org.diagbot.vo.domain.SearchData;
+import org.diagbot.vo.domain.*;
 
 import java.util.List;
 import java.util.Map;
@@ -54,4 +52,11 @@ public interface KnowledgeService {
     List<Symptom> selectAllSymptom(PageVo pageVo);
     List<LIS> selectAllLIS(PageVo pageVo);
 
+    //更新图谱
+    RespDTO updateNeoDisease(NeoParamVO singleDisease);
+    //删除图谱
+    RespDTO deleteNeoDisease(NeoParamVO singleDisease);
+    //批量插入
+    RespDTO<Boolean> batchInsertDis();
+
 }

+ 801 - 4
graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java

@@ -6,6 +6,10 @@ import org.apache.commons.lang3.StringUtils;
 import org.diagbot.entity.node.LIS;
 import org.diagbot.entity.node.Symptom;
 import org.diagbot.mapper.KnowledgeMapper;
+import org.diagbot.pub.Ciku;
+import org.diagbot.pub.Label;
+import org.diagbot.pub.Type;
+import org.diagbot.pub.jdbc.MysqlJdbc;
 import org.diagbot.service.KnowledgeService;
 import org.diagbot.vo.*;
 import org.diagbot.entity.node.Disease;
@@ -24,12 +28,16 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.math.RoundingMode;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
 import java.text.NumberFormat;
 import java.util.*;
 
 
 @Service
-public class KnowledgeServiceImpl implements KnowledgeService {
+public class    KnowledgeServiceImpl implements KnowledgeService {
     Logger logger = LoggerFactory.getLogger(KnowledgeServiceImpl.class);
     @Autowired
     private SymptomRepository symptomRepository;
@@ -47,9 +55,10 @@ public class KnowledgeServiceImpl implements KnowledgeService {
     private KnowledgeMapper knowledgeMapper;
 
     private List<BaseNode> baseNodes;
-
+    private String user = "root";
+    private String password = "lantone";
+    private String url = "jdbc:mysql://192.168.2.241:3306/med?useUnicode=true&characterEncoding=UTF-8";
     private Pageable pageable;
-
     /**
      * 处理症状节点相关的申请
      */
@@ -378,7 +387,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
     @Override
     public Map<String, List<FeatureRate>> getLisPacs(SearchData searchData) {
         String[] featureArray = StringUtils.split(searchData.getFeatureType(), ",");
-        List<String> featureList = Arrays.asList(featureArray);
+        List<String> featureList = Arrays.asList(searchData.getFeatureTypes());
         Map<String, List<FeatureRate>> lisPacsFeature = new HashMap<>();
         String webDiag = searchData.getDiag();
         List<String> webDiagList = null;
@@ -1397,6 +1406,794 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         indicators1.setDetails(detailList1);
         return indicators1;
     }
+    //获取mysql链接
+    public Connection getConnect(){
+        MysqlJdbc mysqlJdbc = new MysqlJdbc(user, password, url);
+        Connection connect = mysqlJdbc.connect();
+        return connect;
+    }
+
+    /**
+     * 更新图谱
+     * @param singleDisease
+     * @return
+     * 类型(1:症状,2:体征,3:化验,4:辅检,5:鉴别诊断,6:病史,7:诱因,8:病程,9:其他,91:确诊,92:拟诊,93:警惕)
+     */
+    @Override
+    public RespDTO updateNeoDisease(NeoParamVO singleDisease) {
+        RespDTO respDTO = RespDTO.onSuc(true);
+        RespDTO respDTO1 = null;
+        try {
+        Connection connect = getConnect();
+        Long disId = singleDisease.getId();
+            //把数据库中的所有词读进map缓存
+        Map<String, Map<String, String>> ciKu = this.allStandWord2Map(connect);
+        respDTO1 = this.updateNeo(respDTO, disId,connect,ciKu);
+        connect.close();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return respDTO1;
+    }
+
+    public RespDTO updateNeo(RespDTO respDTO,Long disId,Connection connection, Map<String, Map<String, String>> ciKu){
+        //先删除
+        this.neo4jDelete(disId,connection);
+        String disName = this.getDisName(disId,connection);
+        if(StringUtils.isNotEmpty(disName)){
+            diseaseRepository.mergeDis(disName,disId,0);
+        }else {
+            respDTO = RespDTO.onError("在数据库中没有找到"+disId+"对应的疾病!!");
+        }
+
+        //获取每个诊断依据的全部数据
+        List<Map<String, String>> allData = this.getAllData(disId,connection);
+        //获取拟诊,确诊,警惕组合
+        Map<String, List<String>> allNiQueZhenCollection = this.getAllNiQueZhenCollection(disId,connection);
+        this.saveNiQue2Neo(allData,allNiQueZhenCollection,disName,disId);
+        this.saveData2Neo4j(allData,disId,disName,ciKu);
+        return respDTO;
+    }
+
+    /**
+     * 把一个完整的诊断依据封装到list中,list中存的是map,一行一个map
+     * @param disId
+     * @return
+     */
+    public List<Map<String,String>> getAllData(Long disId,Connection connection){
+        List<Map<String,String>> contentList = new ArrayList<>();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            String type, code ,standard,relation,result,formula,name;
+            String sql = "SELECT diagnose_id,dis_name,`type`,`code`,standard,relation,result,formula FROM `kl_diagnose_detail` where diagnose_id = "+disId+"  and is_deleted = 'N'";
+            st = connection.createStatement();
+            rs = st.executeQuery(sql);
+            while (rs.next()){
+                Map<String,String> content = new HashMap<>();
+                type = rs.getString(3);
+                code = rs.getString("code");
+                standard = rs.getString("standard");
+                relation = rs.getString("relation");
+                result = rs.getString("result");
+                formula = rs.getString("formula");
+                name = Type.getName(Integer.parseInt(type));
+                content.put("type",type);
+                content.put("typeName",name);
+                content.put("code",code);
+                content.put("standard",standard);
+                content.put("relation",relation);
+                content.put("result",result);
+                content.put("formula",formula);
+                contentList.add(content);
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return contentList;
+    }
+
+    /**
+     * 获取一个诊断依据的确诊,拟诊,警惕集合
+     * @param disId
+     * @return
+     */
+    public Map<String,List<String>> getAllNiQueZhenCollection(Long disId,Connection connection)  {
+        Map<String,List<String>> queNiMap = new HashMap<>();
+        Statement st = null;
+        ResultSet rs = null;
+        List<String> queList = new ArrayList<>();
+        List<String> niList = new ArrayList<>();
+        List<String> highList = new ArrayList<>();
+        try {
+            String type, formula,  label,name;
+            String sql = "SELECT type,formula FROM `kl_diagnose_detail` where diagnose_id = "+disId+" and type in (91,92,93)";
+            st = connection.createStatement();
+            rs = st.executeQuery(sql);
+            while (rs.next()) {
+                type = rs.getString(1);
+                formula = rs.getString(2);
+                name = Type.getName(Integer.parseInt(type));
+                if ("拟诊".equals(name)) {
+                    niList.add(formula);
+                } else if ("确诊".equals(name)) {
+                    queList.add(formula);
+                } else if ("警惕".equals(name)) {
+                    highList.add(formula);
+                }
+            }
+            List<String> newQueList = new ArrayList<>();
+            if(queList.size()>0){
+                for (String que:queList) {
+                    if(que.contains("拟诊")){
+                        for (String ni:niList
+                             ) {
+                            newQueList.add(que.replaceAll("拟诊",ni));
+                        }
+                    }else {
+                        newQueList.add(que);
+                    }
+                }
+            }
+            queNiMap.put("拟诊",niList);
+            queNiMap.put("确诊",newQueList);
+            queNiMap.put("警惕",highList);
+        }catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return queNiMap;
+    }
+
+    /**
+     * 加载所有词库
+     * @return
+     */
+    public  Map<String,Map<String,String>> allStandWord2Map(Connection connection){
+        Map<String,Map<String,String>> ciKu = new HashMap<>();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            String tongName, type,  isConcept,stand;
+            String sql = "SELECT name, type_id,is_concept,IF(is_concept=1,a.name,(select lib_name from kl_concept b where b.id = a.concept_id) ) lib_name \n" +
+                    "from kl_library_info a where  a.is_deleted = 'N'\n" +
+                    "and type_id in (1,5,12,13,14,16,17,18,35,70)";
+            st = connection.createStatement();
+            rs = st.executeQuery(sql);
+            Map<String,String> detail =null;
+            while (rs.next()) {
+                tongName = rs.getString(1);
+                type = rs.getString(2);
+                isConcept = rs.getString(3);
+                stand = rs.getString(4);
+                detail = new HashMap<>();
+                detail.put("isConcept",isConcept);
+                detail.put("stand",stand);
+                ciKu.put(tongName+","+type,detail);
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+            return ciKu;
+        }
+    }
+
+    /**
+     * 获取疾病名
+     * @param disId
+     * @return
+     */
+    public String getDisName(Long disId,Connection connection){
+        Statement st = null;
+        ResultSet rs = null;
+        String name="";
+        try {
+            String sql = "SELECT dis_name FROM `kl_diagnose_detail` where diagnose_id = "+disId+" and is_deleted = 'N'";
+            st = connection.createStatement();
+            rs = st.executeQuery(sql);
+            while (rs.next()) {
+                name = rs.getString(1);
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+            return name;
+        }
+    }
+    /**
+     * 把确诊,拟诊,警惕存入图谱
+     */
+    public void saveNiQue2Neo(List<Map<String, String>> allData,Map<String, List<String>> allNiQueZhenCollection,String disName,Long disId){
+        List<String> stringList =null;
+        String[] types = {"确诊","拟诊","警惕"};
+        Integer path = 1;
+        String[] nisplits;
+        for (String type:types) {
+            if("确诊".equals(type)){
+                stringList = allNiQueZhenCollection.get(type);
+                if(stringList != null){
+                    for(int i =0;i<stringList.size();i++){
+                        nisplits = stringList.get(i).split("\\+");
+                        path = nisplits.length;
+                        diseaseRepository.mergeCondition(disName+"-"+type+"组块"+(i+1),path);
+                        diseaseRepository.mergeQueNiHigh(disName+"-"+type+"组块"+(i+1),disId);
+                        this.splitConditionContent(nisplits,disName,disName+"-"+type+"组块"+(i+1),allData);
+                    }
+                }
+            }else if("拟诊".equals(type)){
+                stringList = allNiQueZhenCollection.get(type);
+                if(stringList != null){
+                    for(int i =0;i<stringList.size();i++){
+                        nisplits = stringList.get(i).split("\\+");
+                        path = nisplits.length;
+                        diseaseRepository.mergeCondition(disName+"-"+type+"组块"+(i+1),path);
+                        diseaseRepository.mergeNiHigh(disName+"-"+type+"组块"+(i+1),disId);
+                        this.splitConditionContent(nisplits,disName,disName+"-"+type+"组块"+(i+1),allData);
+                    }
+                }
+            }else if("警惕".equals(type)){
+                stringList = allNiQueZhenCollection.get(type);
+                if(stringList != null){
+                    for(int i =0;i<stringList.size();i++){
+                        nisplits = stringList.get(i).split("\\+");
+                        path = nisplits.length;
+                        diseaseRepository.mergeCondition(disName+"-"+type+"组块"+(i+1),path);
+                        diseaseRepository.mergeHigh(disName+"-"+type+"组块"+(i+1),disId);
+                        this.splitConditionContent(nisplits,disName,disName+"-"+type+"组块"+(i+1),allData);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理任几
+     * @param nisplits
+     * @param disName
+     * @param startNode
+     * @param allData
+     */
+    public void splitConditionContent(String[] nisplits,String disName,String startNode,List<Map<String, String>> allData){
+        Integer path = 1;
+        String rel = "";
+        for (String ni:nisplits) {
+
+            if(ni.contains("/")){
+                if(ni.contains("任一")){
+                    path = 1;
+                    rel = "任一";
+                }else if(ni.contains("任二")){
+                    path = 2;
+                    rel = "任二";
+                }else if(ni.contains("任三")){
+                    path = 3;
+                    rel = "任三";
+                }else if(ni.contains("任四")){
+                    path = 4;
+                    rel = "任四";
+                }else if(ni.contains("任五")){
+                    path = 5;
+                    rel = "任五";
+                }else if(ni.contains("任六")){
+                    path = 6;
+                    rel = "任六";
+                }else if(ni.contains("任七")){
+                    path = 7;
+                    rel = "任七";
+                }else {
+                    path = 1;
+                    rel = "任一";
+                }
+                diseaseRepository.mergeRenCondition(disName+ni,path,rel);
+                diseaseRepository.mergeRenCondition(disName+ni,startNode);
+                //获取这个任几集合的数字集合
+                List<String> numList = this.getNumList(ni);
+                if(numList != null && numList.size()>0){
+                    for (String num:numList
+                            ) {
+                        this.processDetailNum(disName,num,disName+ni,allData);
+                    }
+                }
+            }else {
+                this.processDetailNum(disName,ni,startNode,allData);
+            }
+        }
+    }
+
+    /**
+     * 获取任几集合的code列表
+     * @return
+     */
+    public List<String> getNumList(String renCondition){
+        List<String> numList = new ArrayList<>();
+        String[] numSplits = renCondition.split("/");
+        if(numSplits.length>0){
+            for (int i=0;i<numSplits.length;i++){
+                if(i == 0){
+                    numList.add(numSplits[i].replaceAll("\\(",""));
+                }else if(i == numSplits.length-1){
+                    String numSplit = numSplits[i];
+                    int i1 = numSplit.indexOf(")");
+                    System.out.println(numSplit+"\t"+i1);
+                    if(i1 >= 0){
+                        numList.add(numSplits[i].substring(0,numSplits[i].indexOf(")")));
+                    }else {
+                        numList.add(numSplit);
+                    }
+
+                }else {
+                    numList.add(numSplits[i]);
+                }
+            }
+        }
+        return numList;
+    }
+    public void processDetailNum(String disName,String num,String renCondition,List<Map<String, String>> allData){
+        String[] types = {"化验","辅检","排除条件"};
+        for (Map<String, String> row:allData) {
+            String code = row.get("code");//编码
+            String type = row.get("type");//类型
+            String typeName = row.get("typeName");//类型对应的中文名
+            String relation = row.get("relation");//关联词
+            String result = row.get("result");//结果
+            if(num.equals(code)){
+                if(Arrays.asList(types).indexOf(typeName) <0){
+                    diseaseRepository.mergeNUMCondition(disName+code);
+                    diseaseRepository.mergeNUMCondition(disName+code,renCondition);
+                }else if("化验".equals(typeName) && !"".equals(result)){
+                    diseaseRepository.mergeNUMCondition(disName+code);
+                    diseaseRepository.mergeNUMCondition(disName+code,renCondition);
+                }else if("辅检".equals(typeName) && !"".equals(relation)){
+                    diseaseRepository.mergeNUMCondition(disName+code);
+                    diseaseRepository.mergeNUMCondition(disName+code,renCondition);
+                }
+            }
+        }
+    }
+
+    /**
+     * 保存完整的诊断依据入知识图谱
+     * @param allData
+     * @param disId
+     * @param disName
+     */
+    public void saveData2Neo4j(List<Map<String, String>> allData,Long disId,String disName,Map<String, Map<String, String>> ciKu){
+        for (Map<String,String> row:allData) {
+            String code = row.get("code");//编码
+            String type = row.get("type");//类型
+            String typeName = row.get("typeName");//类型对应的中文名
+            String standard = row.get("standard");//标准词
+            String relation = row.get("relation");//关联词
+            String result = row.get("result");//结果
+            if(StringUtils.isNotEmpty(type)){
+                String[] split =null;
+                String[] lisResultSplit =null;
+                String[] pacsResultSplit =null;
+                String standWord = null;String lisResult = null,pacsResult=null;
+                if(!"3".equals(type) && !"4".equals(type) && !"5".equals(type)){
+                    //添加词语之前,要找标准词
+                    //添加standard
+                    switch (type){
+                        case "1": //症状
+                            standWord = searchStandWord(standard, type, ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardSymptom(standWord);
+                                diseaseRepository.mergeRelationStandard(disId,standWord);
+                                diseaseRepository.mergeRelationStandardshuyu(disName+code,standWord);
+                            }
+                            if(StringUtils.isNotEmpty(relation)){
+                                split = relation.split("、");
+                                if(split!=null && split.length>0){
+                                    for (String ci:split) {
+                                        if(StringUtils.isNotEmpty(ci)){
+                                            //找标准词
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardSymptom(standWord);
+                                                diseaseRepository.mergeRelationStandardshuyu(disName+code,standWord);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                        case "2"://体征结果
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardVital(standWord);
+                                diseaseRepository.mergeRelationStandardVital(disId,standWord);
+                                diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standWord);
+                            }
+                            if(StringUtils.isNotEmpty(relation)){
+                                split = relation.split("、");
+                                if(split!=null && split.length>0){
+                                    for (String ci:split) {
+                                        if(StringUtils.isNotEmpty(ci)){
+                                            //找标准词
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardVital(standWord);
+                                                diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standWord);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                        case "6"://病史
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardHistory(standWord);
+                                diseaseRepository.mergeRelationStandardHistory(disId,standWord);
+                                diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standWord);
+                            }
+                            if(StringUtils.isNotEmpty(relation)){
+                                split = relation.split("、");
+                                if(split!=null && split.length>0){
+                                    for (String ci:split) {
+                                        if(StringUtils.isNotEmpty(ci)){
+                                            //找标准词
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardHistory(standWord);
+                                                diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standWord);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                        case "7"://诱因
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardCause(standWord);
+                                diseaseRepository.mergeRelationStandardCause(disId,standWord);
+                                diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standWord);
+                            }
+                            if(StringUtils.isNotEmpty(relation)){
+                                split = relation.split("、");
+                                if(split!=null && split.length>0){
+                                    for (String ci:split) {
+                                        if(StringUtils.isNotEmpty(ci)){
+                                            //找标准词
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardCause(standWord);
+                                                diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standWord);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                        case "8"://病程
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardPrognosis(standWord);
+                                diseaseRepository.mergeRelationStandardPrognosis(disId,standWord);
+                                diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standWord);
+                            }
+                            if(StringUtils.isNotEmpty(relation)){
+                                split = relation.split("、");
+                                if(split!=null && split.length>0){
+                                    for (String ci:split) {
+                                        if(StringUtils.isNotEmpty(ci)){
+                                            //找标准词
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardPrognosis(standWord);
+                                                diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standWord);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                        case "9"://其他
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardOther(standard);
+                                diseaseRepository.mergeRelationStandardOther(disId,standard);
+                                diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standard);
+                            }
+                            if(StringUtils.isNotEmpty(relation)){
+                                split = relation.split("、");
+                                if(split!=null && split.length>0){
+                                    for (String ci:split) {
+                                        if(StringUtils.isNotEmpty(ci)){
+                                            //找标准词
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardOther(standWord);
+                                                diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standWord);
+                                            }
+
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                    }
+                }else if("5".equals(type)){   //鉴别诊断
+                    //找标准词
+                    diseaseRepository.mergeDifferentDis(standard);
+                    diseaseRepository.mergeRelationDifferentDis(disId,standard);
+                    if(StringUtils.isNotEmpty(relation)){
+                        split = relation.split("、");
+                        if(split !=null && split.length>0){
+                            for (String dis:split) {
+                                if(StringUtils.isNotEmpty(dis)){
+                                    //找标准词
+                                    diseaseRepository.mergeDifferentDis(dis);
+                                    diseaseRepository.mergeRelationDifferentDis(disId,dis);
+                                }
+                            }
+                        }
+                    }
+                } else if("3".equals(type)){ //处理化验
+                    String lis = "";
+                    //查找化验大项的标准词
+                    standWord = searchStandWord(standard,type,ciKu);
+                    if(StringUtils.isNotEmpty(standWord)){
+                        if(StringUtils.isNotEmpty(relation) && standard.equals(relation)){
+                            lis = standWord;
+                        }else if(StringUtils.isNotEmpty(standard) && StringUtils.isEmpty(relation)){
+                            lis = standWord;
+                        }else if(StringUtils.isNotEmpty(standard)&& StringUtils.isNotEmpty(relation)&&!standard.equals(relation)){
+                            type = "subLis";
+                            if(StringUtils.isNotEmpty(searchStandWord(relation,type,ciKu))){
+                                //查找化验小项的标准词
+                                lis = standWord+"--"+searchStandWord(relation,type,ciKu);
+                            }
+
+                        }
+                    }
+
+                    //创建公表名
+                    diseaseRepository.mergePublicLIS(lis);
+                    //疾病推荐化验公表名
+                    diseaseRepository.mergeRelationLIS(disId,lis);
+                    //处理化验结果
+                    if(StringUtils.isNotEmpty(result)){
+                        lisResultSplit = result.split("、");
+                        if(lisResultSplit != null && lisResultSplit.length>0){
+                            //化验结果找标准词
+                            for (String lisRs:lisResultSplit) {
+                                if(StringUtils.isNotEmpty(lisRs)){
+                                    lisResult = searchStandWord(lisRs,"resultLis",ciKu);
+                                    if(StringUtils.isNotEmpty(lisResult)){
+                                        //创建化验结果节点
+                                        diseaseRepository.mergeLISRESULT(lisResult);
+                                        //公表名和化验结果创建关系
+                                        diseaseRepository.mergeRelationPublicLIS(lis,lisResult);
+                                        //化验结果和对应的codeCondition创建关系
+                                        diseaseRepository.mergeRelationCondiLisRes(disName+code,lisResult);
+                                    }
+
+                                }
+                            }
+                        }
+                    }
+                }else if("4".equals(type)){ //辅检
+                    //查找辅检的标准词
+                    standWord = searchStandWord(standard,type,ciKu);
+                    if(StringUtils.isNotEmpty(standWord)){
+                        //创建辅检标准词的节点
+                        diseaseRepository.mergePacs(standWord);
+                        //疾病推荐辅检
+                        diseaseRepository.mergeRelationDis2Pacs(disId,standWord);
+                    }
+                    if(StringUtils.isNotEmpty(relation)){
+                        pacsResultSplit = relation.split("、");
+                        if(pacsResultSplit != null && pacsResultSplit.length>0){
+                            for (String pacs:pacsResultSplit) {
+                                //查找辅检结果的标准词
+                                if(StringUtils.isNotEmpty(pacs)){
+                                   pacsResult = searchStandWord(pacs,"resultPacs",ciKu);
+                                   if(StringUtils.isNotEmpty(pacsResult)){
+                                       diseaseRepository.mergePacsResult(pacsResult);
+                                       //创建辅检和辅检结果关系
+                                       diseaseRepository.mergeRelationPacsResult(standWord,pacsResult);
+                                       //创建辅检结果和对应的pacsCondition的关系
+                                       diseaseRepository.mergeRelationCondiPacsRes(disName+code,pacsResult);
+                                   }
+
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 查找标准词
+     * @param type
+     * @return
+     */
+    public String searchStandWord(String word,String type,Map<String, Map<String, String>> ciKu){
+        String stand = null;
+        Map<String, String> detaiMap =null;
+        String label = Ciku.getLabel(type);
+        String[] labelSplits = label.split(",");
+        if(labelSplits.length == 1){
+            detaiMap = ciKu.get(word + "," + label);
+            if(detaiMap != null){
+                stand = detaiMap.get("stand");
+            }
+        }else if(labelSplits.length == 2){
+            detaiMap = ciKu.get(word + "," + labelSplits[0]);
+            if(detaiMap == null){
+                detaiMap = ciKu.get(word + "," + labelSplits[1]);
+            }
+            if(detaiMap != null){
+                stand = detaiMap.get("stand");
+            }
+        }
+        return stand;
+    }
+    /**
+     * 在图谱中删除诊断依据
+     * @param singleDisease
+     * @return
+     */
+    @Override
+    public RespDTO deleteNeoDisease(NeoParamVO singleDisease) {
+        Long disId = singleDisease.getId();
+        RespDTO respDTO = null;
+        try {
+        Connection connect = getConnect();
+        if(disId != null){
+            this.neo4jDelete(disId,connect);
+            connect.close();
+            respDTO = RespDTO.onSuc(true);
+        }else {
+            respDTO = RespDTO.onError(disId +" 删除失败!!!");
+        }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return respDTO;
+    }
+    //删除
+    public void neo4jDelete(Long disId,Connection connection) {
+        if (disId != null) {
+            diseaseRepository.deleteRelation1(disId);
+            diseaseRepository.deleteRelation2(disId);
+            diseaseRepository.deleteRelation3(disId);
+            diseaseRepository.deleteRelation4(disId);
+//            diseaseRepository.deleteRelation5(disId);
+//            diseaseRepository.deleteRelation6(disId);
+//            diseaseRepository.deleteRelation7(disId);
+//            diseaseRepository.deleteRelation8(disId);
+//            diseaseRepository.deleteRelation9(disId);
+            //删除disId
+            diseaseRepository.deleteRelation11(disId);
+            List<String> allCode = this.getAllCode(disId,connection);
+            if(allCode.size()>0){
+                for (String conName:allCode) {
+                    diseaseRepository.deleteRelation10(conName);
+                }
+            }
+
+        }
+    }
+
+    /**
+     * 批量插入
+     *
+     * @return
+     */
+    @Override
+    public RespDTO<Boolean> batchInsertDis() {
+        //获取mysql链接
+        Connection connect = getConnect();
+        //把数据库中的所有词读进map缓存
+        Map<String, Map<String, String>> ciKu = this.allStandWord2Map(connect);
+        RespDTO<Boolean> respDTO = new RespDTO<>();
+        try {
+            List<Long> disList = getDisList(connect);
+            if(disList != null && disList.size()>0){
+                for (Long disId:disList) {
+                   respDTO = this.updateNeo(respDTO, disId, connect, ciKu);
+
+                }
+            }
+            connect.close();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+
+        return respDTO;
+    }
+    public void updateDate(Connection connection,Long disId){
+        String sql = "UPDATE `kl_diagnose` set neo_update='1970-01-01 12:00:00' where id="+disId+";";
+    }
+    public List<Long> getDisList(Connection connection){
+        List<Long> disIds = new ArrayList<>();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            Long id ;
+            String sql = "SELECT id FROM `kl_diagnose` where has_question=0 and is_deleted='N'";
+            st = connection.createStatement();
+            rs = st.executeQuery(sql);
+            while (rs.next()){
+                disIds.add(rs.getLong(1));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return disIds;
+    }
+
+    /**
+     * 获取一个诊断依据的全部code
+     * @param disId
+     * @return
+     */
+    public List<String> getAllCode(Long disId,Connection connection){
+        List<String> codeList = new ArrayList<>();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            String code ,name;
+            String sql = "SELECT dis_name,code FROM `kl_diagnose_detail` where diagnose_id="+disId+" and code != \"\"";
+            st = connection.createStatement();
+            rs = st.executeQuery(sql);
+            while (rs.next()){
+                name = rs.getString("dis_name");
+                code = rs.getString("code");
+                codeList.add(name+code);
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return codeList;
+    }
 
     @Override
     public List<Map<String, Object>> getRecommendItem(QueryVo queryVo) {

+ 22 - 0
graphdb/src/main/java/org/diagbot/vo/domain/NeoParamVO.java

@@ -0,0 +1,22 @@
+package org.diagbot.vo.domain;
+
+import java.io.Serializable;
+
+public class NeoParamVO implements Serializable {
+    private  Long id; //诊断依据id,是唯一的
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String toString() {
+        return "NeoParamVO{" +
+                "id=" + id +
+                '}';
+    }
+}

+ 38 - 0
graphdb/src/main/java/org/diagbot/vo/domain/RespDTO.java

@@ -0,0 +1,38 @@
+package org.diagbot.vo.domain;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 通用返回格式
+ * @author: gaodm
+ * @time: 2018/8/1 14:55
+ */
+public class RespDTO<T> implements Serializable {
+
+
+    public String code = "0";
+    public String msg = "";
+    public T data;
+
+    public static RespDTO onSuc(Object data) {
+        RespDTO resp = new RespDTO();
+        resp.data = data;
+        return resp;
+    }
+
+    public static RespDTO onError(String errMsg) {
+        RespDTO resp = new RespDTO();
+        resp.code = "-1";
+        resp.msg = errMsg;
+        return resp;
+    }
+
+    @Override
+    public String toString() {
+        return "RespDTO{" +
+                "code=" + code +
+                ", error='" + msg + '\'' +
+                ", data=" + data +
+                '}';
+    }
+}

+ 25 - 12
graphdb/src/main/java/org/diagbot/web/KnowledgeController.java

@@ -185,17 +185,30 @@ public class KnowledgeController {
         return knowledgeService.getScale(queryVo);
     }
 
-    /*
-    @RequestMapping("/actedIn/{personId}/{movieId}")
-    public TJ actedIn(@PathVariable("personId")String personId, @PathVariable("movieId")String movieId){
-        Person person=diseaseServer.findOnePerson(Long.parseLong(personId));
-        Disease disease =diseaseServer.findOneMovie(Long.parseLong(movieId));
-        TJ TJ =new TJ();
-        TJ.setRoles("龙套");
-        TJ.setStartNode(person);
-        TJ.setEndNode(disease);
-        return diseaseServer.actedIn(TJ);
-    }
-    */
+    /**
+     * 给定诊断依据的id,删除图谱中对应的诊断依据
+     * @param disease
+     * @return
+     */
+    @RequestMapping("/deleteDisease")
+    public RespDTO deleteDiseaseData(@Valid @RequestBody NeoParamVO disease){
+        RespDTO respDTO = knowledgeService.deleteNeoDisease(disease);
+        return respDTO;
+    }
 
+    /**
+     * 给定诊断依据的id,更新图谱中对应的诊断依据
+     * @param disease
+     * @return
+     */
+    @RequestMapping("/updateDisease")
+    public RespDTO updateDiseaseData(@Valid @RequestBody NeoParamVO disease){
+        RespDTO respDTO = knowledgeService.updateNeoDisease(disease);
+        return respDTO;
+    }
+    @RequestMapping("/init")
+    public RespDTO batchInsert( ){
+        RespDTO respDTO = knowledgeService.batchInsertDis();
+        return respDTO;
+    }
 }

+ 1 - 1
graphdb/src/main/resources/application.yml

@@ -13,7 +13,7 @@ spring:
 # 驱动配置信息
   datasource:
     driver-class-name: org.neo4j.jdbc.Driver
-    url: jdbc:neo4j:http://192.168.2.232:7474
+    url: jdbc:neo4j:http://192.168.2.233:7474
     username: neo4j
     password: root
     #定义初始连接数

+ 0 - 0
nlp-web/src/main/resources/application.yml


Some files were not shown because too many files changed in this diff