From e2b2d314296223cb8667833ef59134332398eb5d Mon Sep 17 00:00:00 2001 From: daikon <1059907724@qq.com> Date: Mon, 31 Jul 2023 11:09:58 +0800 Subject: [PATCH] [improvement][project] supersonic 0.7.0 version backend update (#20) Co-authored-by: kanedai --- CHANGELOG | 21 - CHANGELOG.md | 99 + README.md | 23 +- README_CN.md | 18 +- assembly/bin/build-ide.sh | 13 + .../authorization/request/QueryGroupReq.java | 2 +- .../application/UserServiceImpl.java | 8 - .../AuthenticationInterceptor.java | 2 +- .../DefaultAuthenticationInterceptor.java | 8 +- .../domain/utils/UserTokenUtils.java | 2 +- .../infrastructure/mapper/UserDOMapper.java | 31 +- .../application/AuthServiceImpl.java | 4 +- .../chat/api/component/SchemaMapper.java | 4 +- .../chat/api/component/SemanticLayer.java | 38 +- .../chat/api/component/SemanticParser.java | 4 +- .../chat/api/component/SemanticQuery.java | 5 +- .../chat/api/pojo/DomainSchema.java | 45 + .../chat/api/pojo/QueryContext.java | 20 + .../chat/api/pojo/QueryMatchInfo.java | 12 - .../chat/api/pojo/SchemaElement.java | 56 + .../chat/api/pojo/SchemaElementMatch.java | 8 +- .../chat/api/pojo/SchemaMapInfo.java | 15 +- .../chat/api/pojo/SemanticParseInfo.java | 43 +- .../chat/api/pojo/SemanticSchema.java | 54 + .../api/pojo/request}/PageQueryInfoReq.java | 2 +- .../chat/api/pojo/request/PluginQueryReq.java | 22 + .../api/pojo/request/QueryDataRequest.java | 24 + .../{Filter.java => request/QueryFilter.java} | 6 +- .../QueryFilters.java} | 9 +- .../chat/api/pojo/request/QueryRequest.java | 15 + .../api/pojo/request/RecommendedQuestion.java | 12 + .../chat/api/pojo/response/AggregateInfo.java | 10 + .../api/pojo/{ => response}/DataInfo.java | 2 +- .../api/pojo/{ => response}/DomainInfo.java | 2 +- .../api/pojo/{ => response}/EntityInfo.java | 2 +- .../chat/api/pojo/response/MetricInfo.java | 14 + .../api/pojo/response/QueryResponse.java} | 7 +- .../response/QueryResult.java} | 12 +- .../chat/api/pojo/response/QueryState.java | 8 + .../api/pojo/response/RecommendQuestion.java | 14 + .../api/pojo/response/RecommendResponse.java | 12 + .../api/pojo/response}/SearchResponse.java | 4 +- .../chat/api/pojo/response}/SearchResult.java | 23 +- .../chat/api/request/QueryContextReq.java | 23 - chat/core/pom.xml | 12 +- .../chat/application/DomainEntityService.java | 213 - .../chat/application/QueryServiceImpl.java | 93 - .../application/RecommendServiceImpl.java | 55 - .../knowledge/ApplicationStartedInit.java | 69 - .../application/knowledge/NatureHelper.java | 144 - .../knowledge/WordNatureService.java | 81 - .../mapper/DatabaseSchemaMapper.java | 143 - .../application/mapper/HanlpSchemaMapper.java | 103 - .../application/mapper/QueryFilterMapper.java | 66 - .../parser/AggregateSemanticParser.java | 102 - .../application/parser/DomainResolver.java | 19 - .../parser/DomainSemanticParser.java | 250 - .../parser/HeuristicDomainResolver.java | 147 - .../application/parser/LLMSemanticParser.java | 160 - .../parser/TimeSemanticParser.java | 144 - .../chat/application/query/EntityDetail.java | 33 - .../application/query/EntityListFilter.java | 128 - .../application/query/EntityListTopN.java | 35 - .../application/query/EntityMetricFilter.java | 35 - .../query/EntitySemanticQuery.java | 13 - .../application/query/LLMSemanticQuery.java | 71 - .../chat/application/query/MetricCompare.java | 120 - .../chat/application/query/MetricDomain.java | 35 - .../chat/application/query/MetricFilter.java | 37 - .../chat/application/query/MetricGroupBy.java | 35 - .../chat/application/query/MetricOrderBy.java | 32 - .../query/MetricSemanticQuery.java | 13 - .../application/query/RuleSemanticQuery.java | 89 - .../query/RuleSemanticQueryManager.java | 39 - .../pojo => }/config/ChatAggConfig.java | 2 +- .../pojo => }/config/ChatAggRichConfig.java | 2 +- .../{domain/pojo => }/config/ChatConfig.java | 14 +- .../pojo => }/config/ChatConfigBaseReq.java | 17 +- .../config/ChatConfigEditReqReq.java | 2 +- .../pojo => }/config/ChatConfigFilter.java | 4 +- .../config/ChatConfigFilterInternal.java | 2 +- .../pojo => }/config/ChatConfigResp.java | 10 +- .../ChatConfigRich.java} | 12 +- .../pojo => }/config/ChatDefaultConfig.java | 4 +- .../config/ChatDefaultRichConfig.java | 11 +- .../pojo => }/config/ChatDetailConfig.java | 2 +- .../config/ChatDetailRichConfig.java | 2 +- .../pojo => }/config/DefaultMetric.java | 2 +- .../pojo => }/config/DefaultMetricInfo.java | 4 +- .../{domain/pojo => }/config/Dim4Dict.java | 2 +- .../chat/{domain/pojo => }/config/Entity.java | 2 +- .../pojo => }/config/EntityDetailData.java | 2 +- .../chat/config/EntityInternalDetail.java | 14 + .../chat/config/EntityRichInfo.java | 16 + .../chat/config/FunctionCallConfig.java | 12 + .../pojo => }/config/ItemVisibility.java | 2 +- .../pojo => }/config/ItemVisibilityInfo.java | 2 +- .../config/KnowledgeAdvancedConfig.java | 2 +- .../pojo => }/config/KnowledgeInfo.java | 7 +- .../chat/{domain => }/config/LLMConfig.java | 2 +- .../chat/domain/pojo/chat/DomainInfos.java | 32 - .../chat/domain/pojo/chat/LLMReq.java | 11 - .../chat/domain/pojo/chat/LLMSchema.java | 13 - .../chat/domain/pojo/chat/QueryData.java | 29 - .../domain/pojo/chat/RecommendResponse.java | 48 - .../domain/pojo/chat/SchemaElementOption.java | 7 - .../pojo/config/EntityInternalDetail.java | 14 - .../domain/pojo/config/EntityRichInfo.java | 20 - .../chat/domain/pojo/search/NameNature.java | 22 - .../chat/domain/pojo/search/QueryState.java | 18 - .../repository/ChatQueryRepository.java | 20 - .../chat/domain/service/ConfigService.java | 26 - .../chat/domain/service/QueryService.java | 19 - .../chat/domain/service/RecommendService.java | 14 - .../chat/domain/service/SearchService.java | 14 - .../chat/domain/utils/ContextHelper.java | 263 - .../chat/domain/utils/DefaultMetricUtils.java | 439 -- .../chat/domain/utils/NatureConverter.java | 35 - .../domain/utils/SchemaInfoConverter.java | 227 - .../utils/SemanticSatisfactionChecker.java | 93 - .../mapper/ChatQueryDOMapper.java | 32 - .../semantic/LocalSemanticLayerImpl.java | 254 - .../search => mapper}/DomainInfoStat.java | 7 +- .../DomainWithSemanticType.java | 6 +- .../chat/mapper/FuzzyNameMapper.java | 172 + .../chat/mapper/HanlpDictMapper.java | 113 + .../mapper/MapperHelper.java | 7 +- .../mapper/MatchStrategy.java | 8 +- .../pojo/search => mapper}/MatchText.java | 17 +- .../chat/mapper/QueryFilterMapper.java | 32 + .../mapper/QueryMatchStrategy.java | 33 +- .../mapper/SearchMatchStrategy.java | 30 +- .../supersonic/chat/parser/ParseMode.java | 9 + .../chat/parser/SatisfactionChecker.java | 112 + .../embedding/EmbeddingBasedParser.java | 181 + .../parser/embedding/EmbeddingConfig.java | 26 + .../embedding/EmbeddingEntityResolver.java | 110 + .../chat/parser/embedding/EmbeddingResp.java | 16 + .../parser/embedding/RecallRetrieval.java | 17 + .../parser/function/DomainMatchResult.java | 9 + .../chat/parser/function/DomainResolver.java | 11 + .../parser/function/FunctionBasedParser.java | 132 + .../chat/parser/function/FunctionReq.java | 15 + .../chat/parser/function/FunctionResp.java | 10 + .../function/HeuristicDomainResolver.java | 166 + .../chat/parser/rule/AggregateTypeParser.java | 64 + .../parser/rule/ContextInheritParser.java | 78 + .../chat/parser/rule/QueryModeParser.java | 31 + .../chat/parser/rule/TimeRangeParser.java | 188 + .../dataobject/ChatConfigDO.java | 5 +- .../dataobject/ChatContextDO.java | 2 +- .../dataobject/ChatDO.java | 2 +- .../dataobject/ChatQueryDO.java | 12 +- .../dataobject/ChatQueryDOExample.java | 2 +- .../dataobject/DimValueDO.java | 7 +- .../chat/persistence/dataobject/PluginDO.java | 236 + .../dataobject/PluginDOExample.java | 975 ++++ .../dataobject/QueryDO.java | 2 +- .../mapper/ChatConfigMapper.java | 6 +- .../mapper/ChatContextMapper.java | 4 +- .../mapper/ChatMapper.java | 9 +- .../persistence/mapper/ChatQueryDOMapper.java | 18 + .../persistence/mapper/PluginDOMapper.java | 70 + .../repository/ChatConfigRepository.java | 10 +- .../repository/ChatContextRepository.java | 2 +- .../repository/ChatQueryRepository.java | 20 + .../repository/ChatRepository.java | 6 +- .../repository/PluginRepository.java | 22 + .../impl}/ChatConfigRepositoryImpl.java | 32 +- .../impl}/ChatContextRepositoryImpl.java | 18 +- .../impl}/ChatQueryRepositoryImpl.java | 58 +- .../repository/impl}/ChatRepositoryImpl.java | 10 +- .../repository/impl/PluginRepositoryImpl.java | 80 + .../supersonic/chat/plugin/Plugin.java | 37 + .../supersonic/chat/plugin/PluginManager.java | 176 + .../chat/plugin/PluginParseResult.java | 11 + .../chat/plugin/event/PluginAddEvent.java | 18 + .../chat/plugin/event/PluginDelEvent.java | 18 + .../chat/plugin/event/PluginUpdateEvent.java | 26 + .../query/HeuristicQuerySelector.java | 16 +- .../supersonic/chat/query/QueryManager.java | 64 + .../query/QuerySelector.java | 2 +- .../query/plugin/PluginSemanticQuery.java | 21 + .../supersonic/chat/query/plugin/WebBase.java | 22 + .../plugin/dsl/DSLBuilder.java} | 66 +- .../chat/query/plugin/dsl/DSLQuery.java | 205 + .../chat/query/plugin/dsl/LLMReq.java | 32 + .../chat => query/plugin/dsl}/LLMResp.java | 2 +- .../query/plugin/webpage/WebPageQuery.java | 108 + .../query/plugin/webpage/WebPageResponse.java | 22 + .../plugin/webservice/WebServiceQuery.java | 85 + .../plugin/webservice/WebServiceResponse.java | 15 + .../rule}/QueryMatchOption.java | 14 +- .../query => query/rule}/QueryMatcher.java | 58 +- .../chat/query/rule/RuleSemanticQuery.java | 233 + .../query/rule/entity/EntityDetailQuery.java | 25 + .../query/rule/entity/EntityFilterQuery.java | 27 + .../query/rule/entity/EntityListQuery.java | 53 + .../rule/entity/EntitySemanticQuery.java | 105 + .../query/rule/entity/EntityTopNQuery.java | 25 + .../query/rule/metric/MetricDomainQuery.java | 45 + .../query/rule/metric/MetricFilterQuery.java | 97 + .../query/rule/metric/MetricGroupByQuery.java | 26 + .../rule/metric/MetricSemanticQuery.java | 105 + .../query/rule/metric/MetricTopNQuery.java | 64 + .../chat/rest/ChatConfigController.java | 42 +- .../supersonic/chat/rest/ChatController.java | 21 +- .../chat/rest/ChatQueryController.java | 20 +- ...troller.java => DictionaryController.java} | 19 +- .../chat/rest/PluginController.java | 57 + .../chat/rest/RecommendController.java | 43 +- .../{domain => }/service/ChatService.java | 20 +- .../chat/service/ConfigService.java | 22 + .../chat/service/DictionaryService.java | 21 + .../chat/service/PluginService.java | 28 + .../supersonic/chat/service/QueryService.java | 20 + .../chat/service/RecommendService.java | 20 + .../chat/service/SearchService.java | 14 + .../chat/service/SemanticService.java | 430 ++ .../impl}/ChatServiceImpl.java | 40 +- .../impl}/ConfigServiceImpl.java | 164 +- .../impl/DictionaryServiceImpl.java} | 66 +- .../chat/service/impl/PluginServiceImpl.java | 175 + .../chat/service/impl/QueryServiceImpl.java | 94 + .../service/impl/RecommendServiceImpl.java | 131 + .../impl}/SearchServiceImpl.java | 212 +- .../supersonic/chat/utils/CacheUtils.java | 24 + .../ChatConfigHelper.java} | 83 +- .../{domain => }/utils/ComponentFactory.java | 6 +- .../DictMetaHelper.java} | 76 +- .../DictQueryHelper.java} | 34 +- .../supersonic/chat/utils/NatureHelper.java | 166 + .../chat/utils/QueryReqBuilder.java | 178 + .../llm/few_shot_example/sql_exampler.py | 147 - .../resources/mapper/ChatConfigMapper.xml | 14 +- .../resources/mapper/ChatContextMapper.xml | 6 +- .../src/main/resources/mapper/ChatMapper.xml | 12 +- .../resources/mapper/ChatQueryDOMapper.xml | 38 +- .../main/resources/mapper/PluginDOMapper.xml | 252 + .../mapper/HanlpSchemaMapperTest.java | 21 - ...rserTest.java => TimeRangeParserTest.java} | 22 +- ...Test.java => AggregateTypeParserTest.java} | 8 +- .../chat/mapper/HanlpDictMapperTest.java | 22 + .../mapper/match/QueryMatchStrategyTest.java | 2 +- .../chat/test/context/ContextTest.java | 19 +- .../test/context/MockBeansConfiguration.java | 47 +- .../test/context/QueryServiceImplTest.java | 177 - .../context/SemanticParseObjectHelper.java | 29 +- chat/knowledge/pom.xml | 10 + .../collection/trie/bintrie/BaseNode.java | 2 +- .../com/hankcs/hanlp/seg/common/Term.java | 2 +- .../knowledge/ApplicationStartedInit.java | 69 + .../application/online/BaseWordNature.java | 52 - .../online/DimensionWordNature.java | 49 - .../application/online/DomainWordNature.java | 30 - .../application/online/EntityWordNature.java | 31 - .../application/online/MetricWordNature.java | 48 - .../online/OnlineKnowledgeServiceImpl.java | 60 - .../application/online/ValueWordNature.java | 30 - .../online/WordNatureStrategyFactory.java | 28 - .../pojo => dictionary}/DictConfig.java | 3 +- .../pojo => dictionary}/DictTaskFilter.java | 2 +- .../pojo => dictionary}/DictUpdateMode.java | 2 +- .../knowledge/dictionary/DictWord.java | 8 +- .../knowledge/dictionary/DictWordType.java | 25 +- .../DictionaryAttributeUtil.java | 2 +- .../DimValue2DictCommand.java | 4 +- .../pojo => dictionary}/DimValueDictInfo.java | 4 +- .../pojo => dictionary}/DimValueInfo.java | 6 +- .../{domain => dictionary}/FileHandler.java | 11 +- .../HadoopFileIOAdapter.java | 13 +- .../LocalFileConfig.java | 4 +- .../LocalFileHandler.java | 16 +- .../knowledge/dictionary}/MapResult.java | 2 +- .../MultiCustomDictionary.java | 48 +- .../dictionary/builder/BaseWordBuilder.java | 49 + .../builder/DimensionWordBuilder.java | 51 + .../dictionary/builder/DomainWordBuilder.java | 32 + .../dictionary/builder/EntityWordBuilder.java | 33 + .../dictionary/builder/MetricWordBuilder.java | 50 + .../dictionary/builder/ValueWordBuilder.java | 41 + .../builder/WordBuilderFactory.java | 28 + .../domain/converter/DictTaskConverter.java | 59 - .../domain/repository/DictRepository.java | 25 - .../service/OnlineKnowledgeService.java | 17 - .../infrastructure/custom/DictConfMapper.java | 17 - .../infrastructure/custom/DictTaskMapper.java | 16 - .../repository/DictRepositoryImpl.java | 93 - .../dataobject/DictConfDO.java} | 4 +- .../dataobject/DictTaskDO.java} | 4 +- .../persistence/mapper/DictConfMapper.java | 17 + .../persistence/mapper/DictTaskMapper.java | 16 + .../repository/DictRepository.java | 19 + .../repository/DictRepositoryImpl.java | 77 + .../knowledge/semantic/BaseSemanticLayer.java | 106 + .../semantic/DefaultSemanticConfig.java | 11 +- .../semantic/DomainSchemaBuilder.java | 119 + .../semantic/LocalSemanticLayer.java | 116 + .../semantic/RemoteSemanticLayer.java} | 222 +- .../knowledge/service/KnowledgeService.java | 15 + .../service/KnowledgeServiceImpl.java | 55 + .../knowledge/service/SchemaService.java | 47 + .../SearchService.java} | 26 +- .../knowledge/service/WordService.java | 52 + .../knowledge/utils/ComponentFactory.java | 34 + .../knowledge/utils/DictTaskConverter.java | 47 + .../nlp => utils}/FileHelper.java | 16 +- .../nlp => utils}/HanlpHelper.java | 37 +- .../nlp => utils}/HdfsFileHelper.java | 32 +- .../main/resources/META-INF/spring.factories | 4 +- .../main/resources/mapper/DictConfMapper.xml | 4 +- .../main/resources/mapper/DictTaskMapper.xml | 4 +- checkstyle/checkstyle.xml | 351 ++ common/pom.xml | 4 + .../tencent/supersonic/common/nlp/ItemDO.java | 49 - .../supersonic/common/pojo/Aggregator.java | 2 +- .../common/{constant => pojo}/Constants.java | 11 +- .../supersonic/common}/pojo/DataFormat.java | 2 +- .../supersonic/common/pojo/DateConf.java | 12 +- .../tencent/supersonic/common/pojo/Order.java | 2 +- .../common/{request => pojo}/PageBaseReq.java | 2 +- .../common}/pojo/QueryAuthorization.java | 2 +- .../supersonic/common}/pojo/QueryColumn.java | 2 +- .../common/{util => pojo}/RecordInfo.java | 2 +- .../common/{result => pojo}/ResultData.java | 2 +- .../common/{result => pojo}/ReturnCode.java | 2 +- .../{ => pojo}/enums/AggOperatorEnum.java | 8 +- .../{ => pojo}/enums/AggregateTypeEnum.java | 2 +- .../common/{ => pojo}/enums/ConfigMode.java | 2 +- .../common/{ => pojo}/enums/ErrorCode.java | 2 +- .../common/pojo/enums/RatioOverType.java | 21 + .../{ => pojo}/enums/SensitiveLevelEnum.java | 2 +- .../common/{ => pojo}/enums/SinkDbEnum.java | 2 +- .../common/{ => pojo}/enums/StatusEnum.java | 2 +- .../{ => pojo}/enums/TaskStatusEnum.java | 2 +- .../common/{ => pojo}/enums/TypeEnums.java | 2 +- .../{ => pojo}/exception/AccessException.java | 2 +- .../{ => pojo}/exception/CommonException.java | 2 +- .../exception/InvalidArgumentException.java | 2 +- .../exception/InvalidPermissionException.java | 2 +- .../common/util/{mapper => }/BeanMapper.java | 2 +- .../util/{context => }/ContextUtils.java | 2 +- .../supersonic/common/util/DateUtils.java | 43 + .../util/{http => }/HttpClientResult.java | 2 +- .../util/{http => }/HttpClientUtils.java | 16 +- .../common/util/{json => }/JsonUtil.java | 6 +- .../common/util/{coder => }/MD5Util.java | 2 +- .../common/util/{mybatis => }/PageUtils.java | 2 +- .../common/util/{retry => }/RetryUtils.java | 2 +- .../util/{context => }/S2ThreadContext.java | 2 +- .../util/{context => }/ThreadContext.java | 4 +- .../{context => }/ThreadContextConfig.java | 2 +- .../common/util/{yaml => }/YamlUtils.java | 2 +- .../common/util/calcite/SqlParseUtils.java | 47 +- .../util/calcite/SqlParseUtilsTest.java | 48 +- docs/images/chat_config.png | Bin 0 -> 36003 bytes docs/images/database.png | Bin 0 -> 213644 bytes docs/images/datasource_base_info.png | Bin 0 -> 225595 bytes docs/images/datasource_create.png | Bin 0 -> 347368 bytes docs/images/datasource_extend_info.png | Bin 0 -> 266677 bytes docs/images/datasource_list.png | Bin 0 -> 269758 bytes docs/images/datasource_sql.png | Bin 0 -> 177278 bytes docs/images/detail_default.png | Bin 0 -> 28427 bytes docs/images/detail_entity.png | Bin 0 -> 15923 bytes docs/images/dimension_create.png | Bin 0 -> 329169 bytes docs/images/dimension_list.png | Bin 0 -> 304791 bytes docs/images/domain.png | Bin 0 -> 31531 bytes docs/images/metric_base_info.png | Bin 0 -> 304105 bytes docs/images/metric_default.png | Bin 0 -> 29188 bytes docs/images/metric_list.png | Bin 0 -> 262534 bytes docs/images/metric_sql_info.png | Bin 0 -> 302099 bytes docs/images/visibility_dim_value.png | Bin 0 -> 70575 bytes docs/images/visibility_dim_value_show.png | Bin 0 -> 48939 bytes docs/images/visibility_item.png | Bin 0 -> 70191 bytes docs/userguides/chat_config_cn.md | 67 + docs/userguides/semantic_user_guide_cn.md | 108 + .../main/resources/META-INF/spring.factories | 25 +- .../src/main/resources/db/chat-data-h2.sql | 11 +- .../src/main/resources/db/chat-schema-h2.sql | 17 +- .../supersonic/advice/ResponseAdvice.java | 2 +- .../advice/RestExceptionHandler.java | 10 +- launchers/semantic/pom.xml | 2 +- .../main/resources/db/semantic-schema-h2.sql | 3 + launchers/standalone/pom.xml | 2 +- .../com/tencent/supersonic/ConfigureDemo.java | 63 + .../supersonic/StandaloneLauncher.java | 3 - .../main/resources/META-INF/spring.factories | 26 +- .../data/dictionary/custom/DimValue_2_7.txt | 9 + .../src/main/resources/db/data-h2.sql | 50 +- .../src/main/resources/db/schema-h2.sql | 21 + .../src/main/resources/db/schema-mysql.sql | 301 ++ .../src/main/resources/db/sql-update.sql | 1 + .../src/main/resources/docker/Dockerfile | 8 + .../supersonic/integration/BaseQueryTest.java | 112 + .../integration/EntityQueryTest.java | 42 + .../integration/MetricQueryTest.java | 220 + .../integration/MultiTurnQueryTest.java | 444 -- .../integration/MultiTurnsTest.java | 154 + .../supersonic/integration/QueryTest.java | 567 --- .../integration/plugin/BasePluginTest.java | 34 + .../plugin/PluginMockConfiguration.java | 32 + .../plugin/PluginRecognizeTest.java | 52 + .../tencent/supersonic/util/DataUtils.java | 78 +- .../test/resources/META-INF/spring.factories | 17 +- .../src/test/resources/db/data-h2.sql | 6 +- .../src/test/resources/db/schema-h2.sql | 20 + pom.xml | 36 +- semantic/api/pom.xml | 9 +- .../semantic/api/core/pojo/RecordInfo.java | 23 - .../api/core/request/MetricBaseReq.java | 15 - .../api/core/response/DatasourceResp.java | 17 - .../{core => model}/enums/DataTypeEnum.java | 4 +- .../enums/DimensionTypeEnum.java | 2 +- .../{core => model}/enums/MetricTypeEnum.java | 2 +- .../{core => model}/enums/OperatorEnum.java | 2 +- .../enums/QueryTypeBackEnum.java | 2 +- .../{core => model}/enums/QueryTypeEnum.java | 2 +- .../enums/TimeDimensionEnum.java | 2 +- .../pojo/DatasourceDetail.java | 2 +- .../{core => model}/pojo/DatasourceType.java | 4 +- .../api/{core => model}/pojo/Dim.java | 4 +- .../semantic/api/model/pojo/DimValueMap.java | 30 + .../pojo/DimensionTimeTypeParams.java | 2 +- .../semantic/api/model/pojo/Entity.java | 26 + .../api/{core => model}/pojo/Identify.java | 2 +- .../{core => model}/pojo/ItemDateFilter.java | 2 +- .../api/{core => model}/pojo/Measure.java | 2 +- .../pojo/MetricTypeParams.java | 2 +- .../api/{core => model}/pojo/QueryResult.java | 2 +- .../api/{core => model}/pojo/QueryStat.java | 2 +- .../semantic/api/model}/pojo/SchemaItem.java | 12 +- .../{core => model}/request/DatabaseReq.java | 6 +- .../request/DatasourceRelaReq.java | 2 +- .../request/DatasourceReq.java | 10 +- .../{core => model}/request/DateInfoReq.java | 2 +- .../{core => model}/request/DimensionReq.java | 10 +- .../{core => model}/request/DomainReq.java | 9 +- .../request/DomainSchemaFilterReq.java | 2 +- .../request/DomainUpdateReq.java | 2 +- .../api/model/request/MetricBaseReq.java | 20 + .../{core => model}/request/MetricReq.java | 8 +- .../request/PageDimensionReq.java | 2 +- .../request/PageMetricReq.java | 2 +- .../request/PageSchemaItemReq.java | 4 +- .../request/SqlExecuteReq.java | 6 +- .../{core => model}/request/ViewInfoReq.java | 2 +- .../response/DatabaseResp.java | 4 +- .../response/DatasourceRelaResp.java | 2 +- .../api/model/response/DatasourceResp.java | 17 + .../response/DimSchemaResp.java | 4 +- .../response/DimensionResp.java | 12 +- .../{core => model}/response/DomainResp.java | 8 +- .../response/DomainSchemaRelaResp.java | 2 +- .../response/DomainSchemaResp.java | 2 +- .../response/ItemDateResp.java | 2 +- .../{core => model}/response/MeasureResp.java | 2 +- .../{core => model}/response/MetricResp.java | 10 +- .../response/MetricSchemaResp.java | 4 +- .../response/QueryResultWithSchemaResp.java | 8 +- .../response/SqlParserResp.java | 2 +- .../yaml/DatasourceYamlTpl.java | 2 +- .../yaml/DimensionTimeTypeParamsTpl.java | 2 +- .../pojo => model}/yaml/DimensionYamlTpl.java | 2 +- .../pojo => model}/yaml/IdentifyYamlTpl.java | 2 +- .../pojo => model}/yaml/MeasureYamlTpl.java | 2 +- .../yaml/MetricTypeParamsYamlTpl.java | 2 +- .../pojo => model}/yaml/MetricYamlTpl.java | 2 +- .../api/query/request/ParseSqlReq.java | 1 + .../{QuerySqlReq.java => QueryDslReq.java} | 2 +- .../query/request/QueryMultiStructReq.java | 4 +- .../semantic/core/domain/Catalog.java | 38 - .../semantic/core/domain/pojo/Datasource.java | 19 - .../domain/repository/DateInfoRepository.java | 16 - semantic/{core => model}/pom.xml | 7 +- .../model}/application/CatalogImpl.java | 47 +- .../application/DatabaseServiceImpl.java | 28 +- .../application/DatasourceServiceImpl.java | 76 +- .../application/DimensionServiceImpl.java | 28 +- .../model}/application/DomainServiceImpl.java | 50 +- .../model}/application/MetricServiceImpl.java | 41 +- .../application/ViewInfoServiceImpl.java | 22 +- .../semantic/model/domain/Catalog.java | 39 + .../model}/domain/DatabaseService.java | 10 +- .../model}/domain/DatasourceService.java | 24 +- .../model}/domain/DimensionService.java | 8 +- .../semantic/model}/domain/DomainService.java | 12 +- .../semantic/model}/domain/MetricService.java | 8 +- .../engineadapter/ClickHouseAdaptor.java | 6 +- .../adaptor/engineadapter/EngineAdaptor.java | 2 +- .../engineadapter/EngineAdaptorFactory.java | 6 +- .../adaptor/engineadapter/H2Adaptor.java | 45 + .../adaptor/engineadapter/MysqlAdaptor.java | 10 +- .../model}/domain/config/YamlConfig.java | 2 +- .../model}/domain/dataobject/DatabaseDO.java | 19 +- .../domain/dataobject/DatabaseDOExample.java | 2 +- .../domain/dataobject/DatasourceDO.java | 2 +- .../dataobject/DatasourceDOExample.java | 2 +- .../domain/dataobject/DatasourceRelaDO.java | 2 +- .../dataobject/DatasourceRelaDOExample.java | 2 +- .../model}/domain/dataobject/DateInfoDO.java | 2 +- .../domain/dataobject/DictionaryDO.java | 2 +- .../dataobject/DictionaryDOExample.java | 2 +- .../domain/dataobject/DictionaryTaskDO.java | 2 +- .../dataobject/DictionaryTaskDOExample.java | 2 +- .../model}/domain/dataobject/DimensionDO.java | 15 +- .../domain/dataobject/DimensionDOExample.java | 2 +- .../dataobject/DimensionDOWithDictInfo.java | 2 +- .../model}/domain/dataobject/DomainDO.java | 16 +- .../domain/dataobject/DomainDOExample.java | 2 +- .../domain/dataobject/DomainExtendDO.java | 2 +- .../dataobject/DomainExtendDOExample.java | 2 +- .../model}/domain/dataobject/MetricDO.java | 2 +- .../domain/dataobject/MetricDOExample.java | 2 +- .../dataobject/UpdateDimValueDictBatchDO.java | 2 +- .../model}/domain/dataobject/ViewInfoDO.java | 2 +- .../domain/dataobject/ViewInfoDOExample.java | 2 +- .../domain/manager/DatasourceYamlManager.java | 32 +- .../domain/manager/DimensionYamlManager.java | 12 +- .../domain/manager/MetricYamlManager.java | 8 +- .../model}/domain/pojo/ConnectInfo.java | 2 +- .../semantic/model}/domain/pojo/Database.java | 6 +- .../model/domain/pojo/Datasource.java | 19 + .../domain/pojo/DatasourceQueryEnum.java | 2 +- .../model}/domain/pojo/Dimension.java | 7 +- .../model}/domain/pojo/DimensionFilter.java | 2 +- .../semantic/model}/domain/pojo/Domain.java | 11 +- .../model}/domain/pojo/EngineTypeEnum.java | 2 +- .../model}/domain/pojo/JdbcDataSource.java | 10 +- .../model}/domain/pojo/MetaFilter.java | 2 +- .../semantic/model}/domain/pojo/Metric.java | 8 +- .../model}/domain/pojo/MetricFilter.java | 2 +- .../domain/repository/DatabaseRepository.java | 4 +- .../repository/DatasourceRepository.java | 6 +- .../domain/repository/DateInfoRepository.java | 16 + .../repository/DimensionRepository.java | 6 +- .../domain/repository/DomainRepository.java | 4 +- .../domain/repository/MetricRepository.java | 6 +- .../domain/repository/ViewInfoRepository.java | 4 +- .../domain/utils/DatabaseConverter.java | 13 +- .../domain/utils/DatasourceConverter.java | 36 +- .../domain/utils/DimensionConverter.java | 33 +- .../model}/domain/utils/DomainConvert.java | 24 +- .../domain/utils/JdbcDataSourceUtils.java | 28 +- .../model}/domain/utils/MetricConverter.java | 27 +- .../model}/domain/utils/SqlUtils.java | 14 +- .../domain/utils/SysTimeDimensionBuilder.java | 13 +- .../mapper/DatabaseDOMapper.java | 6 +- .../mapper/DatasourceDOMapper.java | 6 +- .../mapper/DatasourceRelaDOMapper.java | 6 +- .../infrastructure/mapper/DateInfoMapper.java | 6 +- .../mapper/DimensionDOCustomMapper.java | 4 +- .../mapper/DimensionDOMapper.java | 6 +- .../infrastructure/mapper/DomainDOMapper.java | 6 +- .../mapper/MetricDOCustomMapper.java | 4 +- .../infrastructure/mapper/MetricDOMapper.java | 6 +- .../mapper/ViewInfoDOMapper.java | 6 +- .../repository/DatabaseRepositoryImpl.java | 10 +- .../repository/DatasourceRepositoryImpl.java | 16 +- .../repository/DateInfoRepositoryImpl.java | 14 +- .../repository/DimensionRepositoryImpl.java | 14 +- .../repository/DomainRepositoryImpl.java | 10 +- .../repository/MetricRepositoryImpl.java | 14 +- .../repository/ViewInfoRepositoryImpl.java | 10 +- .../model}/rest/DatabaseController.java | 12 +- .../model}/rest/DatasourceController.java | 14 +- .../model}/rest/DimensionController.java | 10 +- .../model}/rest/DomainController.java | 14 +- .../model}/rest/MetricController.java | 10 +- .../model}/rest/ViewInfoController.java | 10 +- .../resources/mapper/DatabaseDOMapper.xml | 40 +- .../resources/mapper/DatasourceDOMapper.xml | 22 +- .../mapper/DatasourceRelaDOMapper.xml | 16 +- .../resources/mapper/DimensionDOMapper.xml | 44 +- .../main/resources/mapper/DomainDOMapper.xml | 35 +- .../main/resources/mapper/MetricDOMapper.xml | 22 +- .../resources/mapper/ViewInfoDOMapper.xml | 22 +- .../mapper/custom/DateInfoMapper.xml | 4 +- .../mapper/custom/DimensionDOCustomMapper.xml | 4 +- .../mapper/custom/MetricDOCustomMapper.xml | 6 +- .../main/resources/sql.ddl/s2_database.sql | 1 + .../main/resources/sql.ddl/s2_datasource.sql | 0 .../main/resources/sql.ddl/s2_dimension.sql | 0 .../src/main/resources/sql.ddl/s2_domain.sql | 0 .../resources/sql.ddl/s2_domain_extend.sql | 0 .../src/main/resources/sql.ddl/s2_metric.sql | 0 .../DatabaseApplicationServiceTest.java | 0 .../DatasourceApplicationServiceTest.java | 0 .../DomainApplicationServiceTest.java | 0 semantic/pom.xml | 2 +- semantic/query/pom.xml | 2 +- .../application/executor/QueryExecutor.java | 12 - .../application/optimizer/QueryOptimizer.java | 9 - .../parser/calcite/schema/SemanticItem.java | 6 - .../parser/calcite/sql/Optimization.java | 9 - .../parser/convert/CalculateConverterAgg.java | 344 -- .../semantic/query/domain/SchemaService.java | 26 - .../executor/JdbcExecutor.java | 12 +- .../query/executor/QueryExecutor.java | 12 + .../optimizer/DetailQuery.java | 4 +- .../query/optimizer/QueryOptimizer.java | 8 + .../{application => }/parser/QueryParser.java | 25 +- .../parser/SemanticConverter.java | 4 +- .../{application => }/parser/SqlParser.java | 6 +- .../parser/calcite/CalciteSqlParser.java | 15 +- .../parser/calcite/Configuration.java | 6 +- .../parser/calcite/SemanticSchemaManager.java | 42 +- .../parser/calcite/dsl/Constants.java | 2 +- .../parser/calcite/dsl/DataSource.java | 2 +- .../parser/calcite/dsl/Dimension.java | 4 +- .../calcite/dsl/DimensionTimeTypeParams.java | 2 +- .../parser/calcite/dsl/Identify.java | 2 +- .../parser/calcite/dsl/Measure.java | 2 +- .../parser/calcite/dsl/Metric.java | 4 +- .../parser/calcite/dsl/MetricTypeParams.java | 2 +- .../parser/calcite/dsl/SemanticModel.java | 2 +- .../parser/calcite/planner/AggPlanner.java | 22 +- .../parser/calcite/planner/Planner.java | 2 +- .../calcite/schema/DataSourceTable.java | 2 +- .../parser/calcite/schema/SchemaBuilder.java | 6 +- .../parser/calcite/schema/SemanticItem.java | 6 + .../parser/calcite/schema/SemanticSchema.java | 10 +- .../schema/SemanticSqlConformance.java | 2 +- .../calcite/schema/SemanticSqlDialect.java | 9 +- .../calcite/sql/DSLSqlValidatorImpl.java | 2 +- .../parser/calcite/sql/Optimization.java | 9 + .../parser/calcite/sql/Renderer.java | 20 +- .../parser/calcite/sql/TableView.java | 2 +- .../calcite/sql/node/AggFunctionNode.java | 2 +- .../calcite/sql/node/DataSourceNode.java | 33 +- .../calcite/sql/node/DimensionNode.java | 4 +- .../parser/calcite/sql/node/FilterNode.java | 2 +- .../parser/calcite/sql/node/IdentifyNode.java | 4 +- .../parser/calcite/sql/node/JoinNode.java | 2 +- .../parser/calcite/sql/node/MeasureNode.java | 4 +- .../parser/calcite/sql/node/MetricNode.java | 4 +- .../parser/calcite/sql/node/SemanticNode.java | 8 +- .../calcite/sql/render/FilterRender.java | 20 +- .../parser/calcite/sql/render/JoinRender.java | 33 +- .../calcite/sql/render/OutputRender.java | 12 +- .../calcite/sql/render/SourceRender.java | 41 +- .../parser/convert/CalculateAggConverter.java | 478 ++ .../convert/DefaultDimValueConverter.java | 8 +- .../parser/convert/MultiSourceJoin.java | 18 +- .../convert/ParserDefaultConverter.java | 16 +- .../mapper/StatMapper.java | 4 +- .../pojo/ParserSvrResponse.java | 2 +- .../pojo/QueryStatement.java | 3 +- .../repository/StatRepository.java | 4 +- .../repository/StatRepositoryImpl.java | 11 +- .../semantic/query/rest/QueryController.java | 12 +- .../semantic/query/rest/SchemaController.java | 16 +- .../DataPermission.java | 2 +- .../{domain => service}/QueryService.java | 10 +- .../QueryServiceImpl.java | 59 +- .../semantic/query/service/SchemaService.java | 26 + .../SchemaServiceImpl.java | 34 +- .../SemanticQueryEngine.java | 8 +- .../SemanticQueryEngineImpl.java | 19 +- .../{domain => }/utils/ComponentFactory.java | 28 +- .../{domain => }/utils/DataPermissionAOP.java | 32 +- .../query/{domain => }/utils/DateUtils.java | 52 +- .../semantic/query/utils/DimValueAspect.java | 178 + .../{domain => }/utils/QueryReqConverter.java | 20 +- .../{domain => }/utils/QueryStructUtils.java | 30 +- .../query/{domain => }/utils/QueryUtils.java | 27 +- .../{domain => }/utils/SqlFilterUtils.java | 12 +- .../{domain => }/utils/SqlGenerateUtils.java | 10 +- .../query/{domain => }/utils/StatUtils.java | 12 +- .../src/main/resources/mapper/StatMapper.xml | 6 +- .../calcite/SemanticParserServiceTest.java | 22 +- .../supersonic-webapp/asset-manifest.json | 4 +- .../supersonic-webapp/index.html | 6 +- .../supersonic-webapp/umi.70e4115f.js | 4312 ----------------- .../supersonic-webapp/umi.97f57065.css | 2 - .../supersonic-webapp/version.js | 4 +- 675 files changed, 13089 insertions(+), 13536 deletions(-) delete mode 100644 CHANGELOG create mode 100644 CHANGELOG.md create mode 100755 assembly/bin/build-ide.sh create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java delete mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryMatchInfo.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java rename chat/{core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat => api/src/main/java/com/tencent/supersonic/chat/api/pojo/request}/PageQueryInfoReq.java (91%) create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataRequest.java rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/{Filter.java => request/QueryFilter.java} (88%) rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/{QueryFilter.java => request/QueryFilters.java} (57%) create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryRequest.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestion.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/{ => response}/DataInfo.java (74%) rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/{ => response}/DomainInfo.java (80%) rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/{ => response}/EntityInfo.java (84%) create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/MetricInfo.java rename chat/{core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/ChatQueryVO.java => api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResponse.java} (54%) rename chat/api/src/main/java/com/tencent/supersonic/chat/api/{response/QueryResultResp.java => pojo/response/QueryResult.java} (61%) create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryState.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestion.java create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResponse.java rename chat/{core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search => api/src/main/java/com/tencent/supersonic/chat/api/pojo/response}/SearchResponse.java (79%) rename chat/{core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search => api/src/main/java/com/tencent/supersonic/chat/api/pojo/response}/SearchResult.java (54%) delete mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/request/QueryContextReq.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/ApplicationStartedInit.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/NatureHelper.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/WordNatureService.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/AggregateSemanticParser.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainResolver.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/HeuristicDomainResolver.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityDetail.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityMetricFilter.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntitySemanticQuery.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/LLMSemanticQuery.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricDomain.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricFilter.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricGroupBy.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricOrderBy.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricSemanticQuery.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQueryManager.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatAggConfig.java (87%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatAggRichConfig.java (88%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatConfig.java (67%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatConfigBaseReq.java (61%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatConfigEditReqReq.java (67%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatConfigFilter.java (65%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatConfigFilterInternal.java (72%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatConfigResp.java (61%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo/config/ChatConfigRichResp.java => config/ChatConfigRich.java} (64%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatDefaultConfig.java (78%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatDefaultRichConfig.java (54%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatDetailConfig.java (89%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ChatDetailRichConfig.java (90%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/DefaultMetric.java (93%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/DefaultMetricInfo.java (78%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/Dim4Dict.java (87%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/Entity.java (88%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/EntityDetailData.java (80%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityInternalDetail.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityRichInfo.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallConfig.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ItemVisibility.java (86%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/ItemVisibilityInfo.java (81%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/KnowledgeAdvancedConfig.java (85%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo => }/config/KnowledgeInfo.java (82%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => }/config/LLMConfig.java (86%) delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/DomainInfos.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMReq.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMSchema.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/QueryData.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/RecommendResponse.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/SchemaElementOption.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityInternalDetail.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/NameNature.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/QueryState.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatQueryRepository.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/QueryService.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/RecommendService.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/SearchService.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/NatureConverter.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SchemaInfoConverter.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SemanticSatisfactionChecker.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatQueryDOMapper.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo/search => mapper}/DomainInfoStat.java (78%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo/search => mapper}/DomainWithSemanticType.java (66%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => }/mapper/MapperHelper.java (92%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => }/mapper/MatchStrategy.java (51%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo/search => mapper}/MatchText.java (68%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => }/mapper/QueryMatchStrategy.java (84%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => }/mapper/SearchMatchStrategy.java (76%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/ParseMode.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/ChatConfigDO.java (82%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/ChatContextDO.java (82%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/ChatDO.java (82%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/ChatQueryDO.java (89%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/ChatQueryDOExample.java (99%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/DimValueDO.java (79%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/dataobject/QueryDO.java (92%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure => persistence}/mapper/ChatConfigMapper.java (62%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure => persistence}/mapper/ChatContextMapper.java (65%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure => persistence}/mapper/ChatMapper.java (65%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/repository/ChatConfigRepository.java (51%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/repository/ChatContextRepository.java (76%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => persistence}/repository/ChatRepository.java (71%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure/repository => persistence/repository/impl}/ChatConfigRepositoryImpl.java (58%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure/repository => persistence/repository/impl}/ChatContextRepositoryImpl.java (78%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure/repository => persistence/repository/impl}/ChatQueryRepositoryImpl.java (56%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{infrastructure/repository => persistence/repository/impl}/ChatRepositoryImpl.java (80%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseResult.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginAddEvent.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginDelEvent.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginUpdateEvent.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => }/query/HeuristicQuerySelector.java (84%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => }/query/QuerySelector.java (84%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/utils/DslToSemanticInfo.java => query/plugin/dsl/DSLBuilder.java} (53%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/pojo/chat => query/plugin/dsl}/LLMResp.java (83%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application/query => query/rule}/QueryMatchOption.java (73%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{application/query => query/rule}/QueryMatcher.java (58%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityTopNQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java rename chat/core/src/main/java/com/tencent/supersonic/chat/rest/{DictController.java => DictionaryController.java} (80%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => }/service/ChatService.java (59%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/SearchService.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => service/impl}/ChatServiceImpl.java (76%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => service/impl}/ConfigServiceImpl.java (55%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{application/knowledge/DictApplicationService.java => service/impl/DictionaryServiceImpl.java} (63%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{application => service/impl}/SearchServiceImpl.java (54%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/utils/ChatConfigUtils.java => utils/ChatConfigHelper.java} (57%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain => }/utils/ComponentFactory.java (92%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/utils/DictMetaUtils.java => utils/DictMetaHelper.java} (72%) rename chat/core/src/main/java/com/tencent/supersonic/chat/{domain/utils/DictQueryUtils.java => utils/DictQueryHelper.java} (89%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java delete mode 100644 chat/core/src/main/python/llm/few_shot_example/sql_exampler.py create mode 100644 chat/core/src/main/resources/mapper/PluginDOMapper.xml delete mode 100644 chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapperTest.java rename chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/{TimeSemanticParserTest.java => TimeRangeParserTest.java} (54%) rename chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/{AggregateSemanticParserTest.java => AggregateTypeParserTest.java} (85%) create mode 100644 chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java rename chat/core/src/test/java/com/tencent/supersonic/chat/{application => }/mapper/match/QueryMatchStrategyTest.java (80%) delete mode 100644 chat/core/src/test/java/com/tencent/supersonic/chat/test/context/QueryServiceImplTest.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/BaseWordNature.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DimensionWordNature.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DomainWordNature.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/EntityWordNature.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/MetricWordNature.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/OnlineKnowledgeServiceImpl.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/ValueWordNature.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/WordNatureStrategyFactory.java rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/pojo => dictionary}/DictConfig.java (74%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/pojo => dictionary}/DictTaskFilter.java (76%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/pojo => dictionary}/DictUpdateMode.java (92%) rename common/src/main/java/com/tencent/supersonic/common/nlp/WordNature.java => chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWord.java (84%) rename common/src/main/java/com/tencent/supersonic/common/nlp/NatureType.java => chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java (63%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp => dictionary}/DictionaryAttributeUtil.java (96%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/pojo => dictionary}/DimValue2DictCommand.java (70%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/pojo => dictionary}/DimValueDictInfo.java (73%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/pojo => dictionary}/DimValueInfo.java (81%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain => dictionary}/FileHandler.java (80%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp => dictionary}/HadoopFileIOAdapter.java (73%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain => dictionary}/LocalFileConfig.java (88%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain => dictionary}/LocalFileHandler.java (88%) rename {common/src/main/java/com/tencent/supersonic/common/nlp => chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary}/MapResult.java (95%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp => dictionary}/MultiCustomDictionary.java (97%) create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/converter/DictTaskConverter.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/repository/DictRepository.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/service/OnlineKnowledgeService.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictConfMapper.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictTaskMapper.java delete mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/repository/DictRepositoryImpl.java rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/dataobject/DictConfPO.java => persistence/dataobject/DictConfDO.java} (73%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{domain/dataobject/DimValueDictTaskPO.java => persistence/dataobject/DictTaskDO.java} (84%) create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java rename chat/{core/src/main/java/com/tencent/supersonic/chat/infrastructure => knowledge/src/main/java/com/tencent/supersonic/knowledge}/semantic/DefaultSemanticConfig.java (83%) create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java rename chat/{core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java => knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java} (54%) create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp/Suggester.java => service/SearchService.java} (89%) create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java create mode 100644 chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp => utils}/FileHelper.java (81%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp => utils}/HanlpHelper.java (86%) rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/{infrastructure/nlp => utils}/HdfsFileHelper.java (74%) create mode 100644 checkstyle/checkstyle.xml delete mode 100644 common/src/main/java/com/tencent/supersonic/common/nlp/ItemDO.java rename common/src/main/java/com/tencent/supersonic/common/{constant => pojo}/Constants.java (82%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core => common/src/main/java/com/tencent/supersonic/common}/pojo/DataFormat.java (70%) rename common/src/main/java/com/tencent/supersonic/common/{request => pojo}/PageBaseReq.java (89%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core => common/src/main/java/com/tencent/supersonic/common}/pojo/QueryAuthorization.java (87%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core => common/src/main/java/com/tencent/supersonic/common}/pojo/QueryColumn.java (91%) rename common/src/main/java/com/tencent/supersonic/common/{util => pojo}/RecordInfo.java (96%) rename common/src/main/java/com/tencent/supersonic/common/{result => pojo}/ResultData.java (94%) rename common/src/main/java/com/tencent/supersonic/common/{result => pojo}/ReturnCode.java (91%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/AggOperatorEnum.java (86%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/AggregateTypeEnum.java (88%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/ConfigMode.java (91%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/ErrorCode.java (83%) create mode 100644 common/src/main/java/com/tencent/supersonic/common/pojo/enums/RatioOverType.java rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/SensitiveLevelEnum.java (82%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/SinkDbEnum.java (91%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/StatusEnum.java (95%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/TaskStatusEnum.java (95%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/enums/TypeEnums.java (92%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/exception/AccessException.java (75%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/exception/CommonException.java (78%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/exception/InvalidArgumentException.java (77%) rename common/src/main/java/com/tencent/supersonic/common/{ => pojo}/exception/InvalidPermissionException.java (77%) rename common/src/main/java/com/tencent/supersonic/common/util/{mapper => }/BeanMapper.java (95%) rename common/src/main/java/com/tencent/supersonic/common/util/{context => }/ContextUtils.java (97%) create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java rename common/src/main/java/com/tencent/supersonic/common/util/{http => }/HttpClientResult.java (95%) rename common/src/main/java/com/tencent/supersonic/common/util/{http => }/HttpClientUtils.java (99%) rename common/src/main/java/com/tencent/supersonic/common/util/{json => }/JsonUtil.java (99%) rename common/src/main/java/com/tencent/supersonic/common/util/{coder => }/MD5Util.java (97%) rename common/src/main/java/com/tencent/supersonic/common/util/{mybatis => }/PageUtils.java (88%) rename common/src/main/java/com/tencent/supersonic/common/util/{retry => }/RetryUtils.java (95%) rename common/src/main/java/com/tencent/supersonic/common/util/{context => }/S2ThreadContext.java (88%) rename common/src/main/java/com/tencent/supersonic/common/util/{context => }/ThreadContext.java (78%) rename common/src/main/java/com/tencent/supersonic/common/util/{context => }/ThreadContextConfig.java (83%) rename common/src/main/java/com/tencent/supersonic/common/util/{yaml => }/YamlUtils.java (98%) create mode 100644 docs/images/chat_config.png create mode 100644 docs/images/database.png create mode 100644 docs/images/datasource_base_info.png create mode 100644 docs/images/datasource_create.png create mode 100644 docs/images/datasource_extend_info.png create mode 100644 docs/images/datasource_list.png create mode 100644 docs/images/datasource_sql.png create mode 100644 docs/images/detail_default.png create mode 100644 docs/images/detail_entity.png create mode 100644 docs/images/dimension_create.png create mode 100644 docs/images/dimension_list.png create mode 100644 docs/images/domain.png create mode 100644 docs/images/metric_base_info.png create mode 100644 docs/images/metric_default.png create mode 100644 docs/images/metric_list.png create mode 100644 docs/images/metric_sql_info.png create mode 100644 docs/images/visibility_dim_value.png create mode 100644 docs/images/visibility_dim_value_show.png create mode 100644 docs/images/visibility_item.png create mode 100644 docs/userguides/chat_config_cn.md create mode 100644 docs/userguides/semantic_user_guide_cn.md create mode 100644 launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java create mode 100644 launchers/standalone/src/main/resources/data/dictionary/custom/DimValue_2_7.txt create mode 100644 launchers/standalone/src/main/resources/db/schema-mysql.sql create mode 100644 launchers/standalone/src/main/resources/db/sql-update.sql create mode 100644 launchers/standalone/src/main/resources/docker/Dockerfile create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/BaseQueryTest.java create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/EntityQueryTest.java create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricQueryTest.java delete mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnQueryTest.java create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnsTest.java delete mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/QueryTest.java create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/BasePluginTest.java create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginMockConfiguration.java create mode 100644 launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginRecognizeTest.java delete mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/RecordInfo.java delete mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/request/MetricBaseReq.java delete mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/response/DatasourceResp.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/DataTypeEnum.java (96%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/DimensionTypeEnum.java (53%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/MetricTypeEnum.java (50%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/OperatorEnum.java (86%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/QueryTypeBackEnum.java (92%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/QueryTypeEnum.java (89%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/enums/TimeDimensionEnum.java (90%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/DatasourceDetail.java (84%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/DatasourceType.java (77%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/Dim.java (85%) create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/DimValueMap.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/DimensionTimeTypeParams.java (81%) create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Entity.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/Identify.java (83%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/ItemDateFilter.java (82%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/Measure.java (88%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/MetricTypeParams.java (79%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/QueryResult.java (86%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/pojo/QueryStat.java (98%) rename {common/src/main/java/com/tencent/supersonic/common => semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model}/pojo/SchemaItem.java (77%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DatabaseReq.java (83%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DatasourceRelaReq.java (88%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DatasourceReq.java (54%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DateInfoReq.java (95%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DimensionReq.java (65%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DomainReq.java (65%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DomainSchemaFilterReq.java (76%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/DomainUpdateReq.java (63%) create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/MetricReq.java (72%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/PageDimensionReq.java (60%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/PageMetricReq.java (65%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/PageSchemaItemReq.java (70%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/SqlExecuteReq.java (63%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/request/ViewInfoReq.java (83%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DatabaseResp.java (91%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DatasourceRelaResp.java (85%) create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DimSchemaResp.java (50%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DimensionResp.java (60%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DomainResp.java (66%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DomainSchemaRelaResp.java (80%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/DomainSchemaResp.java (84%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/ItemDateResp.java (87%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/MeasureResp.java (85%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/MetricResp.java (54%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/MetricSchemaResp.java (50%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/QueryResultWithSchemaResp.java (51%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core => model}/response/SqlParserResp.java (89%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/DatasourceYamlTpl.java (85%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/DimensionTimeTypeParamsTpl.java (70%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/DimensionYamlTpl.java (78%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/IdentifyYamlTpl.java (82%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/MeasureYamlTpl.java (84%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/MetricTypeParamsYamlTpl.java (73%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/{core/pojo => model}/yaml/MetricYamlTpl.java (78%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/{QuerySqlReq.java => QueryDslReq.java} (90%) delete mode 100644 semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/Catalog.java delete mode 100644 semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/pojo/Datasource.java delete mode 100644 semantic/core/src/main/java/com/tencent/supersonic/semantic/core/domain/repository/DateInfoRepository.java rename semantic/{core => model}/pom.xml (93%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/CatalogImpl.java (58%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/DatabaseServiceImpl.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/DatasourceServiceImpl.java (84%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/DimensionServiceImpl.java (90%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/DomainServiceImpl.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/MetricServiceImpl.java (87%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/application/ViewInfoServiceImpl.java (79%) create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/Catalog.java rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/DatabaseService.java (69%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/DatasourceService.java (59%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/DimensionService.java (78%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/DomainService.java (66%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/MetricService.java (77%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/adaptor/engineadapter/ClickHouseAdaptor.java (89%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/adaptor/engineadapter/EngineAdaptor.java (79%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/adaptor/engineadapter/EngineAdaptorFactory.java (69%) create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/H2Adaptor.java rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/adaptor/engineadapter/MysqlAdaptor.java (78%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/config/YamlConfig.java (84%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DatabaseDO.java (92%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DatabaseDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DatasourceDO.java (98%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DatasourceDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DatasourceRelaDO.java (97%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DatasourceRelaDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DateInfoDO.java (84%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DictionaryDO.java (98%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DictionaryDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DictionaryTaskDO.java (98%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DictionaryTaskDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DimensionDO.java (95%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DimensionDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DimensionDOWithDictInfo.java (65%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DomainDO.java (95%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DomainDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DomainExtendDO.java (98%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/DomainExtendDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/MetricDO.java (98%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/MetricDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/UpdateDimValueDictBatchDO.java (82%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/ViewInfoDO.java (97%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/dataobject/ViewInfoDOExample.java (99%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/manager/DatasourceYamlManager.java (75%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/manager/DimensionYamlManager.java (63%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/manager/MetricYamlManager.java (67%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/ConnectInfo.java (71%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/Database.java (67%) create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Datasource.java rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/DatasourceQueryEnum.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/Dimension.java (58%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/DimensionFilter.java (58%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/Domain.java (62%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/EngineTypeEnum.java (88%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/JdbcDataSource.java (96%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/MetaFilter.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/Metric.java (55%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/pojo/MetricFilter.java (63%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/repository/DatabaseRepository.java (65%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/repository/DatasourceRepository.java (74%) create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DateInfoRepository.java rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/repository/DimensionRepository.java (75%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/repository/DomainRepository.java (66%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/repository/MetricRepository.java (71%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/repository/ViewInfoRepository.java (67%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/DatabaseConverter.java (80%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/DatasourceConverter.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/DimensionConverter.java (66%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/DomainConvert.java (73%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/JdbcDataSourceUtils.java (85%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/MetricConverter.java (79%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/SqlUtils.java (93%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/domain/utils/SysTimeDimensionBuilder.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DatabaseDOMapper.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DatasourceDOMapper.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DatasourceRelaDOMapper.java (78%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DateInfoMapper.java (52%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DimensionDOCustomMapper.java (61%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DimensionDOMapper.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/DomainDOMapper.java (78%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/MetricDOCustomMapper.java (60%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/MetricDOMapper.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/mapper/ViewInfoDOMapper.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/DatabaseRepositoryImpl.java (72%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/DatasourceRepositoryImpl.java (79%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/DateInfoRepositoryImpl.java (81%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/DimensionRepositoryImpl.java (87%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/DomainRepositoryImpl.java (72%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/MetricRepositoryImpl.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/infrastructure/repository/ViewInfoRepositoryImpl.java (74%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/rest/DatabaseController.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/rest/DatasourceController.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/rest/DimensionController.java (89%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/rest/DomainController.java (86%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/rest/MetricController.java (88%) rename semantic/{core/src/main/java/com/tencent/supersonic/semantic/core => model/src/main/java/com/tencent/supersonic/semantic/model}/rest/ViewInfoController.java (84%) rename semantic/{core => model}/src/main/resources/mapper/DatabaseDOMapper.xml (84%) rename semantic/{core => model}/src/main/resources/mapper/DatasourceDOMapper.xml (90%) rename semantic/{core => model}/src/main/resources/mapper/DatasourceRelaDOMapper.xml (90%) rename semantic/{core => model}/src/main/resources/mapper/DimensionDOMapper.xml (89%) rename semantic/{core => model}/src/main/resources/mapper/DomainDOMapper.xml (88%) rename semantic/{core => model}/src/main/resources/mapper/MetricDOMapper.xml (93%) rename semantic/{core => model}/src/main/resources/mapper/ViewInfoDOMapper.xml (89%) rename semantic/{core => model}/src/main/resources/mapper/custom/DateInfoMapper.xml (92%) rename semantic/{core => model}/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml (96%) rename semantic/{core => model}/src/main/resources/mapper/custom/MetricDOCustomMapper.xml (94%) rename semantic/{core => model}/src/main/resources/sql.ddl/s2_database.sql (92%) rename semantic/{core => model}/src/main/resources/sql.ddl/s2_datasource.sql (100%) rename semantic/{core => model}/src/main/resources/sql.ddl/s2_dimension.sql (100%) rename semantic/{core => model}/src/main/resources/sql.ddl/s2_domain.sql (100%) rename semantic/{core => model}/src/main/resources/sql.ddl/s2_domain_extend.sql (100%) rename semantic/{core => model}/src/main/resources/sql.ddl/s2_metric.sql (100%) rename semantic/{core => model}/src/test/java/com/tencent/supersonic/semantic/model/application/DatabaseApplicationServiceTest.java (100%) rename semantic/{core => model}/src/test/java/com/tencent/supersonic/semantic/model/application/DatasourceApplicationServiceTest.java (100%) rename semantic/{core => model}/src/test/java/com/tencent/supersonic/semantic/model/application/DomainApplicationServiceTest.java (100%) delete mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/application/executor/QueryExecutor.java delete mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/application/optimizer/QueryOptimizer.java delete mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/application/parser/calcite/schema/SemanticItem.java delete mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/application/parser/calcite/sql/Optimization.java delete mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/application/parser/convert/CalculateConverterAgg.java delete mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/domain/SchemaService.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/executor/JdbcExecutor.java (73%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/executor/QueryExecutor.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/optimizer/DetailQuery.java (91%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/optimizer/QueryOptimizer.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/QueryParser.java (79%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/SemanticConverter.java (78%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/SqlParser.java (50%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/CalciteSqlParser.java (72%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/Configuration.java (91%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/SemanticSchemaManager.java (87%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/Constants.java (86%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/DataSource.java (80%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/Dimension.java (64%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/DimensionTimeTypeParams.java (63%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/Identify.java (75%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/Measure.java (82%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/Metric.java (64%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/MetricTypeParams.java (65%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/dsl/SemanticModel.java (83%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/planner/AggPlanner.java (74%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/planner/Planner.java (75%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/schema/DataSourceTable.java (98%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/schema/SchemaBuilder.java (82%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/schema/SemanticItem.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/schema/SemanticSchema.java (85%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/schema/SemanticSqlConformance.java (97%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/schema/SemanticSqlDialect.java (90%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/DSLSqlValidatorImpl.java (86%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/Optimization.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/Renderer.java (83%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/TableView.java (95%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/AggFunctionNode.java (88%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/DataSourceNode.java (83%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/DimensionNode.java (87%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/FilterNode.java (91%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/IdentifyNode.java (64%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/JoinNode.java (72%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/MeasureNode.java (92%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/MetricNode.java (85%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/node/SemanticNode.java (92%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/render/FilterRender.java (74%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/render/JoinRender.java (89%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/render/OutputRender.java (78%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/calcite/sql/render/SourceRender.java (89%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/convert/DefaultDimValueConverter.java (88%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/convert/MultiSourceJoin.java (89%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => }/parser/convert/ParserDefaultConverter.java (87%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{infrastructure => persistence}/mapper/StatMapper.java (68%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => persistence}/pojo/ParserSvrResponse.java (88%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => persistence}/pojo/QueryStatement.java (76%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => persistence}/repository/StatRepository.java (74%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{infrastructure => persistence}/repository/StatRepositoryImpl.java (89%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain/annotation => service}/DataPermission.java (81%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => service}/QueryService.java (74%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => service}/QueryServiceImpl.java (79%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaService.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => service}/SchemaServiceImpl.java (78%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => service}/SemanticQueryEngine.java (61%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{application => service}/SemanticQueryEngineImpl.java (77%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/ComponentFactory.java (64%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/DataPermissionAOP.java (94%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/DateUtils.java (86%) create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DimValueAspect.java rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/QueryReqConverter.java (77%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/QueryStructUtils.java (85%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/QueryUtils.java (89%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/SqlFilterUtils.java (95%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/SqlGenerateUtils.java (88%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/{domain => }/utils/StatUtils.java (91%) delete mode 100644 webapp/packages/supersonic-fe/supersonic-webapp/umi.70e4115f.js delete mode 100644 webapp/packages/supersonic-fe/supersonic-webapp/umi.97f57065.css diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 88e9053ba..000000000 --- a/CHANGELOG +++ /dev/null @@ -1,21 +0,0 @@ -davinci 0.3.0 change log -1) add data portal -2) add metric trend chart -3) add feedback component -4) add tab component -5) add page setting -6) modify permission process -7) optimize css style -8) optimize filter -9) delete view module - - -supersonic 0.6.0 change log -1) add llm parser and llm api server -2) support fuzzy mapping -3) support query filter and domain filter in query and search -4) support standalone mode -5) add dsl query in semantic -6) code architecture adjustment in semantic and chat -7) add unit testing and integration testing -8) support dimension and metric alias \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..5ad4db1e5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,99 @@ +# SuperSonic Changelog + +- All notable changes to this project will be documented in this file. +- "Breaking Changes" describes any changes that may break existing functionality or cause + compatibility issues with previous versions. + + +## SuperSonic [0.7.0] - 2023-07-30 + +### Added + +- Add function call parser and embedding recall parser +- Add plugin management +- Add web page query and web service query +- Metric filter query support querying metrics and comparing them in different dimensions +- Support dimension value mapping +- Support dimension/metric invisible, chat filter related data +- Add user guide docs + + +### Fixed + +- Fix the data problem of getDomainList interface in standalone mode + +## SuperSonic [0.6.0] - 2023-07-16 + +### Added + +- Support llm parser and llm api server - users can query data through complex natural language. +- Support fuzzy query dimension and metric name - users can set the 'metric.dimension.threshold' + parameter to control the fuzzy threshold. +- Support query filter and domain filter in query and search - users can specify domainId and query + filter to filter the results in search and query. +- Support standalone mode - users can integrate semantic and chat services in one process for easy + management and debugging. +- Support dsl query in semantic - users can specify DSL language to query data in Semantic. In the + past, data querying was limited to struct language. +- Add unit and integration testing - add integration tests for single-turn and multi-turn + conversations, to efficiently validate the code. +- Support dimension and metric alias - users can specify one or multiple aliases to expand search + and query. +- Add scheduled semantic metadata update functionality in chat. +- Support create datasource by table name in the web page. +- Add the ability to set permissions for domain. +- Add a local/Remote implementation to the SemanticLayer interface. + +### Updated + +- Code architecture adjustment in chat. + +1) Abstracting into three modules, namely api, core, and knowledge. Providing four core interfaces: + SchemaMapper, SemanticLayer, SemanticParser, and SemanticQuery. +2) Add RuleSemanticQuery and LLMSemanticQuery implement to SemanticQuery. +3) Add all possible queries to the candidate queries, and then select the most suitable query from + the candidate queries. + +- Code architecture adjustment in semantic. + +1) Refactor semantic layer SQL parsing code through Calcite. +2) Add QueryOptimizer interface. + +- Chat config subdivided into detailed and metric scenarios - users can set different parameters in these two scenarios. + +### Fixed + +- Resolved last word not be recognized in SchemaMapper. +- Fix context inheritance problem. +- Fix the error of querying H2 database by month unit. +- Set faker user to context when authentication disable. + +## SuperSonic [0.5.0] - 2023-06-15 + +### Added +- Add the search and query feature in chat according to rules in an extensible way. +- Add semantic/chat independent service for users. +- Add Modeling Interface - users can visually define and maintain semantic models in the web page. +- Add a unified semantic parsing layer - user can query data by struct language. + +# Davinci Changelog + +## Davinci [0.3.0] - 2023-06-15 + +### Added + +- add data portal +- add metric trend chart +- add feedback component +- add tab component +- add page setting + +### Updated + +- modify permission process +- optimize css style +- optimize filter + +### Removed + +- delete view module \ No newline at end of file diff --git a/README.md b/README.md index d8ce42237..ad7ed42b7 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,9 @@ English | [中文](README_CN.md) # SuperSonic (超音数) -**SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to define logical semantic models (metrics, dimensions, relationships, etc) on top of physical data models, and no data modification or copying is required. Meanwhile SuperSonic is designed to be plugable, allowing new functionalities to be added through plugins and core components to be integrated into other systems. +**SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to define logical semantic models (metrics, dimensions, aliases, relationships, etc) on top of physical data models, and no data modification or copying is required. Meanwhile SuperSonic is designed to be plugable, allowing new functionalities to be added through plugins and core components to be integrated into other systems. - - + ## Motivation @@ -13,9 +12,9 @@ The emergence of Large Language Models (LLMs) like ChatGPT is reshaping the way From our perspective, the key to filling the real-world gap lies in two aspects: 1. Utilize a combination of rule-based and model-based semantic parsers to deal with different scenarios -2. Introduce a semantic model layer to encapsulate underlying complexity thus simplify the semantic parsers +2. Introduce a semantic model layer to encapsulate underlying complexity thus simplify the semantic parsers -With these ideas in mind, we developed SuperSonic as a reference implementation and used it to power our real-world products. Additionally, to encourage further development of data chatbots, we decided to open source SuperSonic as an extensible framework. +With these ideas in mind, we developed SuperSonic as a practical reference implementation and used it to power our real-world products. Additionally, to encourage further development of data chatbots, we decided to open source SuperSonic as an extensible framework. ## Out-of-the-box Features @@ -29,9 +28,7 @@ With these ideas in mind, we developed SuperSonic as a reference implementation SuperSonic is composed of two layers: supersonic-chat and supersonic-semantic. The chat layer is responsible for converting **natural language query** into semantic query (also known as DSL query), whereas the semantic layer is responsible for converting DSL query into **SQL query**. The high-level architecture and main process flow is shown in below diagram: - - - + ### Chat Layer @@ -67,4 +64,12 @@ SuperSonic comes with sample semantic models as well as chat conversations that ## How to Build -Pull the source code and run script "assembly/bin/build-standalone.sh" to build packages in the standalone mode. +SuperSonic can be deployed in two modes: standalone (intended for quick demo) and distributed (intended for production). + +### Build for Standalone Mode + +Pull the source code and run script "assembly/bin/build-standalone.sh" to build a single packages. + +### Build for Distributed Mode + +Pull the source code and run scripts "assembly/bin/build-chat.sh" and "assembly/bin/build-semantic.sh" separately to build packages. diff --git a/README_CN.md b/README_CN.md index 3a4bdf4a5..f2b6e2606 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,8 +1,8 @@ # 超音数(SuperSonic) -**超音数是一个开箱即用且易于扩展的数据问答对话框架**。通过超音数的问答对话界面,用户能够使用自然语言查询数据,系统会选择合适的可视化图表呈现结果。超音数不需要修改或复制数据,只需要在物理数据库之上构建逻辑语义模型(定义指标、维度、相互间关系等),即可开启数据问答体验。与此同时,超音数被设计为可插拔式框架,允许以插件形式来扩展新功能,或者将核心组件与其他系统集成。 +**超音数是一个开箱即用且易于扩展的数据问答对话框架**。通过超音数的问答对话界面,用户能够使用自然语言查询数据,系统会选择合适的可视化图表呈现结果。超音数不需要修改或复制数据,只需要在物理数据库之上构建逻辑语义模型(定义指标、维度、别名、相互间关系等),即可开启数据问答体验。与此同时,超音数被设计为可插拔式框架,允许以插件形式来扩展新功能,或者将核心组件与其他系统集成。 - + ## 项目动机 @@ -12,7 +12,7 @@ 1. 将基于规则和基于模型的语义解析器相结合,发挥各自优势,以便处理不同的场景 2. 引入语义模型层来封装数据底层的复杂性,从而简化语义解析器的问题求解空间 -为了验证上述想法,我们开发了超音数项目,并将其应用在实际的内部产品中。与此同时,我们决定将超音数作为一个可扩展的框架开源,希望能够促进数据问答对话领域的进一步发展。 +为了落地上述想法,我们开发了超音数项目,并将其应用在实际的内部产品中。与此同时,我们决定将超音数作为一个可扩展的框架开源,希望能够促进数据问答对话领域的进一步发展。 ## 开箱即用的特性 @@ -26,7 +26,7 @@ 超音数主要分为两层:supersonic-chat and supersonic-semantic。问答层负责将自然语言查询转换为语义查询(也称为DSL查询),而语义层负责将DSL查询转换为SQL查询。超音数的整体架构和主流程如下图所示: - + ### 问答层 @@ -62,4 +62,12 @@ ## 如何构建 -下载源码包,运行脚本"assembly/bin/build-standalone.sh",将所有服务一起编译打包 \ No newline at end of file +超音数可以运行在两个模式:standalone(一般用于快速演示)和distributed(一般用于生产环境)。 + +### Standalone模式构建 + +下载源码包,运行脚本"assembly/bin/build-standalone.sh",将所有服务一起编译打包 + +### Distributed模式构建 + +下载源码包,分别运行脚本"assembly/bin/build-chat.sh"、"assembly/bin/build-semantic.sh",为问答层服务和语义层服务编译打包 \ No newline at end of file diff --git a/assembly/bin/build-ide.sh b/assembly/bin/build-ide.sh new file mode 100755 index 000000000..b2bcd0ca3 --- /dev/null +++ b/assembly/bin/build-ide.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +sbinDir=$(cd "$(dirname "$0")"; pwd) +baseDir=$(readlink -f $sbinDir/../) +buildDir=$baseDir/build + +cd $baseDir/bin +sh build-standalone.sh + +cd $buildDir +tar xvf supersonic-webapp.tar.gz +mv supersonic-webapp webapp +mv webapp ../../launchers/standalone/target/classes \ No newline at end of file diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryGroupReq.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryGroupReq.java index e4134274f..0940fcb5b 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryGroupReq.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryGroupReq.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.auth.api.authorization.request; -import com.tencent.supersonic.common.request.PageBaseReq; +import com.tencent.supersonic.common.pojo.PageBaseReq; import java.util.List; import lombok.Data; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/application/UserServiceImpl.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/application/UserServiceImpl.java index 65f01a222..b8c4d6fb1 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/application/UserServiceImpl.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/application/UserServiceImpl.java @@ -33,14 +33,6 @@ public class UserServiceImpl implements UserService { return userRepository.getUser(name); } - public boolean checkExist(UserWithPassword user) { - UserDO userDO = getUser(user.getName()); - if (userDO == null) { - return false; - } - return userDO.getPassword().equals(user.getPassword()); - } - @Override public List getUserNames() { return getUserDOList().stream().map(UserDO::getName).collect(Collectors.toList()); diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/AuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/AuthenticationInterceptor.java index 2f0e12424..433a0ddd1 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/AuthenticationInterceptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/AuthenticationInterceptor.java @@ -4,7 +4,7 @@ import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfi import com.tencent.supersonic.auth.api.authentication.constant.UserConstants; import com.tencent.supersonic.auth.authentication.application.UserServiceImpl; import com.tencent.supersonic.auth.authentication.domain.utils.UserTokenUtils; -import com.tencent.supersonic.common.util.context.S2ThreadContext; +import com.tencent.supersonic.common.util.S2ThreadContext; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java index c925b21bd..23a72cf49 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/interceptor/DefaultAuthenticationInterceptor.java @@ -6,10 +6,10 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword; import com.tencent.supersonic.auth.authentication.application.UserServiceImpl; import com.tencent.supersonic.auth.authentication.domain.utils.UserTokenUtils; -import com.tencent.supersonic.common.exception.AccessException; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.common.util.context.S2ThreadContext; -import com.tencent.supersonic.common.util.context.ThreadContext; +import com.tencent.supersonic.common.pojo.exception.AccessException; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.S2ThreadContext; +import com.tencent.supersonic.common.util.ThreadContext; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/utils/UserTokenUtils.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/utils/UserTokenUtils.java index f25788d14..94f76b91c 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/utils/UserTokenUtils.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/domain/utils/UserTokenUtils.java @@ -13,7 +13,7 @@ import static com.tencent.supersonic.auth.api.authentication.constant.UserConsta import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword; -import com.tencent.supersonic.common.exception.AccessException; +import com.tencent.supersonic.common.pojo.exception.AccessException; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/infrastructure/mapper/UserDOMapper.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/infrastructure/mapper/UserDOMapper.java index 8f3cf6b58..c3b5dc43e 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/infrastructure/mapper/UserDOMapper.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/infrastructure/mapper/UserDOMapper.java @@ -9,43 +9,14 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserDOMapper { - /** - * @mbg.generated - */ - long countByExample(UserDOExample example); - - /** - * @mbg.generated - */ - int deleteByPrimaryKey(Long id); - /** * @mbg.generated */ int insert(UserDO record); - /** - * @mbg.generated - */ - int insertSelective(UserDO record); - /** * @mbg.generated */ List selectByExample(UserDOExample example); - /** - * @mbg.generated - */ - UserDO selectByPrimaryKey(Long id); - - /** - * @mbg.generated - */ - int updateByPrimaryKeySelective(UserDO record); - - /** - * @mbg.generated - */ - int updateByPrimaryKey(UserDO record); -} \ No newline at end of file +} diff --git a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java index 9e7797b9f..d797b2f1e 100644 --- a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java +++ b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java @@ -124,8 +124,8 @@ public class AuthServiceImpl implements AuthService { } private List getAuthGroups(QueryAuthResReq req) { - List groups = load().stream(). - filter(group -> { + List groups = load().stream() + .filter(group -> { if (!Objects.equals(group.getDomainId(), req.getDomainId())) { return false; } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SchemaMapper.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SchemaMapper.java index caf15515c..79c62f75f 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SchemaMapper.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SchemaMapper.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.chat.api.component; -import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.chat.api.pojo.QueryContext; /** * This interface defines the contract for a schema mapper that identifies references to schema @@ -11,5 +11,5 @@ import com.tencent.supersonic.chat.api.request.QueryContextReq; */ public interface SchemaMapper { - void map(QueryContextReq queryContext); + void map(QueryContext queryContext); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java index f3c2566f1..011a7d244 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java @@ -2,10 +2,15 @@ package com.tencent.supersonic.chat.api.component; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; -import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.core.response.*; -import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import java.util.List; @@ -25,27 +30,16 @@ import java.util.List; public interface SemanticLayer { QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user); + QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user); + QueryResultWithSchemaResp queryByDsl(QueryDslReq queryDslReq, User user); - QueryResultWithSchemaResp queryBySql(QuerySqlReq querySqlReq, User user); - - DomainSchemaResp getDomainSchemaInfo(Long domain, Boolean cacheEnable); - - List getDomainSchemaInfo(List ids); + List getDomainSchema(); + List getDomainSchema(List ids); + DomainSchema getDomainSchema(Long domain, Boolean cacheEnable); + PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd); + PageInfo getMetricPage(PageMetricReq pageMetricCmd); List getDomainListForViewer(); - List getDomainListForAdmin(); - PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd); - - PageInfo queryMetricPage(PageMetricReq pageMetricCmd); - -// PageInfo queryMetricPage(PageMetricReq pageMetricCmd); -// -// PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd); -// -// List getDomainListForAdmin(); -// -// List getDomainListForViewer(); - } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticParser.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticParser.java index 218537502..198c9ec1b 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticParser.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticParser.java @@ -2,7 +2,7 @@ package com.tencent.supersonic.chat.api.component; import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.chat.api.pojo.QueryContext; /** * This interface defines the contract for a semantic parser that can analyze natural language query @@ -13,5 +13,5 @@ import com.tencent.supersonic.chat.api.request.QueryContextReq; */ public interface SemanticParser { - void parse(QueryContextReq queryContext, ChatContext chatContext); + void parse(QueryContext queryContext, ChatContext chatContext); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticQuery.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticQuery.java index 88429f69e..f8ddf147a 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticQuery.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticQuery.java @@ -2,7 +2,8 @@ package com.tencent.supersonic.chat.api.component; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.response.QueryResultResp; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import org.apache.calcite.sql.parser.SqlParseException; /** * This class defines the contract for a semantic query that executes specific type of @@ -12,7 +13,7 @@ public interface SemanticQuery { String getQueryMode(); - QueryResultResp execute(User user); + QueryResult execute(User user) throws SqlParseException; SemanticParseInfo getParseInfo(); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java new file mode 100644 index 000000000..d1aeb1855 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java @@ -0,0 +1,45 @@ +package com.tencent.supersonic.chat.api.pojo; + +import lombok.Data; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +@Data +public class DomainSchema { + + private SchemaElement domain; + private Set metrics = new HashSet<>(); + private Set dimensions = new HashSet<>(); + private Set dimensionValues = new HashSet<>(); + private Set entities = new HashSet<>(); + + public SchemaElement getElement(SchemaElementType elementType, long elementID) { + Optional element = Optional.empty(); + switch (elementType) { + case DOMAIN: + element = Optional.of(domain); + break; + case METRIC: + element = metrics.stream().filter(e -> e.getId() == elementID).findFirst(); + break; + case DIMENSION: + element = dimensions.stream().filter(e -> e.getId() == elementID).findFirst(); + break; + case ENTITY: + element = entities.stream().filter(e -> e.getId() == elementID).findFirst(); + break; + case VALUE: + element = dimensionValues.stream().filter(e -> e.getId() == elementID).findFirst(); + default: + } + + if (element.isPresent()) { + return element.get(); + } else { + return null; + } + } + +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java new file mode 100644 index 000000000..ba92177af --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java @@ -0,0 +1,20 @@ +package com.tencent.supersonic.chat.api.pojo; + +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class QueryContext { + + private QueryRequest request; + private List candidateQueries = new ArrayList<>(); + private SchemaMapInfo mapInfo = new SchemaMapInfo(); + + public QueryContext(QueryRequest request) { + this.request = request; + } +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryMatchInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryMatchInfo.java deleted file mode 100644 index 7e866f050..000000000 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryMatchInfo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.tencent.supersonic.chat.api.pojo; - -import lombok.Data; - -@Data -public class QueryMatchInfo { - - SchemaElementType elementType; - String detectWord; - private Integer count = 0; - private double maxSimilarity; -} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java new file mode 100644 index 000000000..0907c25c9 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java @@ -0,0 +1,56 @@ +package com.tencent.supersonic.chat.api.pojo; + +import com.google.common.base.Objects; + +import java.io.Serializable; +import java.util.List; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class SchemaElement implements Serializable { + + private Long domain; + private Long id; + private String name; + private String bizName; + private Long useCnt; + private SchemaElementType type; + private List alias; + + public SchemaElement() { + } + + public SchemaElement(Long domain, Long id, String name, String bizName, + Long useCnt, SchemaElementType type, List alias) { + this.domain = domain; + this.id = id; + this.name = name; + this.bizName = bizName; + this.useCnt = useCnt; + this.type = type; + this.alias = alias; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SchemaElement schemaElement = (SchemaElement) o; + return Objects.equal(domain, schemaElement.domain) && Objects.equal(id, + schemaElement.id) && Objects.equal(name, schemaElement.name) + && Objects.equal(bizName, schemaElement.bizName) && Objects.equal( + useCnt, schemaElement.useCnt) && Objects.equal(type, schemaElement.type); + } + + @Override + public int hashCode() { + return Objects.hashCode(domain, id, name, bizName, useCnt, type); + } +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java index 592ee3bbe..605023199 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java @@ -13,15 +13,9 @@ import lombok.ToString; @NoArgsConstructor public class SchemaElementMatch { - SchemaElementType elementType; - - int elementID; - + SchemaElement element; double similarity; - String detectWord; - String word; - Long frequency; } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java index 66f8c2ca3..588d93f02 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java @@ -7,26 +7,21 @@ import java.util.Set; public class SchemaMapInfo { - private Map> domainElementMatches = new HashMap<>(); + private Map> domainElementMatches = new HashMap<>(); - public Set getMatchedDomains() { + public Set getMatchedDomains() { return domainElementMatches.keySet(); } - public List getMatchedElements(Integer domain) { + public List getMatchedElements(Long domain) { return domainElementMatches.get(domain); } - public Map> getDomainElementMatches() { + public Map> getDomainElementMatches() { return domainElementMatches; } - public void setDomainElementMatches( - Map> domainElementMatches) { - this.domainElementMatches = domainElementMatches; - } - - public void setMatchedElements(Integer domain, List elementMatches) { + public void setMatchedElements(Long domain, List elementMatches) { domainElementMatches.put(domain, elementMatches); } } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java index 03adf3897..b0059cfc7 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java @@ -1,34 +1,55 @@ package com.tencent.supersonic.chat.api.pojo; -import com.tencent.supersonic.common.enums.AggregateTypeEnum; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Order; -import com.tencent.supersonic.common.pojo.SchemaItem; - +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import lombok.Data; @Data public class SemanticParseInfo { String queryMode; - AggregateTypeEnum aggType = AggregateTypeEnum.NONE; - Long domainId = 0L; - String domainName; + SchemaElement domain; + Set metrics = new LinkedHashSet(); + Set dimensions = new LinkedHashSet(); Long entity = 0L; - Set metrics = new LinkedHashSet(); - Set dimensions = new LinkedHashSet(); - Set dimensionFilters = new LinkedHashSet(); - Set metricFilters = new LinkedHashSet(); + AggregateTypeEnum aggType = AggregateTypeEnum.NONE; + Set dimensionFilters = new LinkedHashSet(); + Set metricFilters = new LinkedHashSet(); private Set orders = new LinkedHashSet(); private DateConf dateInfo; private Long limit; private Boolean nativeQuery = false; private Double bonus = 0d; private List elementMatches = new ArrayList<>(); - private Object info; + private Map properties; + + public Long getDomainId() { + return domain != null ? domain.getId() : 0L; + } + + public String getDomainName() { + return domain != null ? domain.getName() : "null"; + } + + public Set getMetrics() { + this.metrics = this.metrics.stream().sorted((o1, o2) -> { + int len1 = o1.getName().length(); + int len2 = o2.getName().length(); + if (len1 != len2) { + return len1 - len2; + } else { + return o1.getName().compareTo(o2.getName()); + } + }).collect(Collectors.toCollection(LinkedHashSet::new)); + return this.metrics; + } } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java new file mode 100644 index 000000000..7e199f00d --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java @@ -0,0 +1,54 @@ +package com.tencent.supersonic.chat.api.pojo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class SemanticSchema implements Serializable { + private List domainSchemaList; + + public SemanticSchema(List domainSchemaList) { + this.domainSchemaList = domainSchemaList; + } + + public void add(DomainSchema schema) { + domainSchemaList.add(schema); + } + + public Map getDomainIdToName() { + return domainSchemaList.stream() + .collect(Collectors.toMap(a -> a.getDomain().getId(), a -> a.getDomain().getName(), (k1, k2) -> k1)); + } + + public List getDimensionValues() { + List dimensionValues = new ArrayList<>(); + domainSchemaList.stream().forEach(d -> dimensionValues.addAll(d.getDimensionValues())); + return dimensionValues; + } + + public List getDimensions() { + List dimensions = new ArrayList<>(); + domainSchemaList.stream().forEach(d -> dimensions.addAll(d.getDimensions())); + return dimensions; + } + + public List getMetrics() { + List metrics = new ArrayList<>(); + domainSchemaList.stream().forEach(d -> metrics.addAll(d.getMetrics())); + return metrics; + } + + public List getDomains() { + List domains = new ArrayList<>(); + domainSchemaList.stream().forEach(d -> domains.add(d.getDomain())); + return domains; + } + + public List getEntities() { + List entities = new ArrayList<>(); + domainSchemaList.stream().forEach(d -> entities.addAll(d.getEntities())); + return entities; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/PageQueryInfoReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PageQueryInfoReq.java similarity index 91% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/PageQueryInfoReq.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PageQueryInfoReq.java index a6b092ae1..873c9cfd6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/PageQueryInfoReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PageQueryInfoReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; +package com.tencent.supersonic.chat.api.pojo.request; import lombok.Data; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java new file mode 100644 index 000000000..f3ba04966 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java @@ -0,0 +1,22 @@ +package com.tencent.supersonic.chat.api.pojo.request; + + +import lombok.Data; + +@Data +public class PluginQueryReq { + + + private String showElementId; + + //DASHBOARD WIDGET + private String showType; + + private String type; + + private String domain; + + private String pattern; + + +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataRequest.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataRequest.java new file mode 100644 index 000000000..73ef07130 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataRequest.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.chat.api.pojo.request; + + +import java.util.HashSet; +import java.util.Set; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.Order; +import lombok.Data; + +@Data +public class QueryDataRequest { + String queryMode; + SchemaElement domain; + Set metrics = new HashSet<>(); + Set dimensions = new HashSet<>(); + Set dimensionFilters = new HashSet<>(); + Set metricFilters = new HashSet<>(); + private Set orders = new HashSet<>(); + private DateConf dateInfo; + private Long limit; + private Boolean nativeQuery = false; +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/Filter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java similarity index 88% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/Filter.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java index 5b5d7a8aa..8a2054b95 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/Filter.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.api.pojo; +package com.tencent.supersonic.chat.api.pojo.request; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import java.util.Objects; @@ -7,7 +7,7 @@ import lombok.ToString; @Data @ToString(callSuper = true) -public class Filter { +public class QueryFilter { private String bizName; @@ -27,7 +27,7 @@ public class Filter { if (o == null || getClass() != o.getClass()) { return false; } - Filter filter = (Filter) o; + QueryFilter filter = (QueryFilter) o; return Objects.equals(bizName, filter.bizName) && Objects.equals(name, filter.name) && operator == filter.operator && Objects.equals(value, filter.value) && Objects.equals( elementID, filter.elementID); diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryFilter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java similarity index 57% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryFilter.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java index c1bb4c4ac..903288cd1 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryFilter.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.api.pojo; +package com.tencent.supersonic.chat.api.pojo.request; import lombok.Data; import java.util.ArrayList; @@ -7,10 +7,7 @@ import java.util.List; import java.util.Map; @Data -public class QueryFilter { - - private List filters = new ArrayList<>(); - +public class QueryFilters { + private List filters = new ArrayList<>(); private Map params = new HashMap<>(); - } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryRequest.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryRequest.java new file mode 100644 index 000000000..d51ccee2f --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryRequest.java @@ -0,0 +1,15 @@ +package com.tencent.supersonic.chat.api.pojo.request; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import lombok.Data; + +@Data +public class QueryRequest { + + private String queryText; + private Integer chatId; + private Long domainId = 0L; + private User user; + private QueryFilters queryFilters; + private boolean saveAnswer = true; +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestion.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestion.java new file mode 100644 index 000000000..0aa8a6bdf --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestion.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.chat.api.pojo.request; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class RecommendedQuestion { + + private String question; + +} \ No newline at end of file diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java new file mode 100644 index 000000000..96cb05e13 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java @@ -0,0 +1,10 @@ +package com.tencent.supersonic.chat.api.pojo.response; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; + +@Data +public class AggregateInfo { + private List metricInfos = new ArrayList<>(); +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DataInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DataInfo.java similarity index 74% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DataInfo.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DataInfo.java index 07a452f9d..7b22daf73 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DataInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DataInfo.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.api.pojo; +package com.tencent.supersonic.chat.api.pojo.response; import lombok.Data; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java similarity index 80% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainInfo.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java index 36073cf9c..2be895e86 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.api.pojo; +package com.tencent.supersonic.chat.api.pojo.response; import java.io.Serializable; import java.util.List; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/EntityInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java similarity index 84% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/EntityInfo.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java index 329704688..0f0039380 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/EntityInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.api.pojo; +package com.tencent.supersonic.chat.api.pojo.response; import java.util.ArrayList; import java.util.List; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/MetricInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/MetricInfo.java new file mode 100644 index 000000000..ef9264145 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/MetricInfo.java @@ -0,0 +1,14 @@ +package com.tencent.supersonic.chat.api.pojo.response; + +import java.util.Map; +import lombok.Data; + +@Data +public class MetricInfo { + + private String name; + private String value; + private String date; + private Map statistics; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/ChatQueryVO.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResponse.java similarity index 54% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/ChatQueryVO.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResponse.java index d32120313..2ab39fb93 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/ChatQueryVO.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResponse.java @@ -1,11 +1,10 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; +package com.tencent.supersonic.chat.api.pojo.response; -import com.tencent.supersonic.chat.api.response.QueryResultResp; import java.util.Date; import lombok.Data; @Data -public class ChatQueryVO { +public class QueryResponse { private Long questionId; private Date createTime; @@ -13,5 +12,5 @@ public class ChatQueryVO { private Integer score; private String feedback; private String queryText; - private QueryResultResp queryResponse; + private QueryResult queryResult; } \ No newline at end of file diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/response/QueryResultResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java similarity index 61% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/response/QueryResultResp.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java index 6ed1fc587..3858f64f2 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/response/QueryResultResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryResult.java @@ -1,21 +1,21 @@ -package com.tencent.supersonic.chat.api.response; +package com.tencent.supersonic.chat.api.pojo.response; -import com.tencent.supersonic.chat.api.pojo.EntityInfo; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.semantic.api.core.pojo.QueryAuthorization; -import com.tencent.supersonic.semantic.api.core.pojo.QueryColumn; +import com.tencent.supersonic.common.pojo.QueryAuthorization; +import com.tencent.supersonic.common.pojo.QueryColumn; import java.util.List; import java.util.Map; import lombok.Data; @Data -public class QueryResultResp { +public class QueryResult { public EntityInfo entityInfo; + public AggregateInfo aggregateInfo; private Long queryId; private String queryMode; private String querySql; - private int queryState; + private QueryState queryState = QueryState.EMPTY; private List queryColumns; private QueryAuthorization queryAuthorization; private SemanticParseInfo chatContext; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryState.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryState.java new file mode 100644 index 000000000..30ecc1e2c --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/QueryState.java @@ -0,0 +1,8 @@ +package com.tencent.supersonic.chat.api.pojo.response; + +public enum QueryState { + SUCCESS, + SEARCH_EXCEPTION, + EMPTY, + INVALID; +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestion.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestion.java new file mode 100644 index 000000000..67cec7302 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestion.java @@ -0,0 +1,14 @@ +package com.tencent.supersonic.chat.api.pojo.response; + +import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestion; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@Data +@AllArgsConstructor +public class RecommendQuestion { + private Long domainId; + private List recommendedQuestions; +} diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResponse.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResponse.java new file mode 100644 index 000000000..89fd38a34 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResponse.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.chat.api.pojo.response; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import lombok.Data; + +import java.util.List; + +@Data +public class RecommendResponse { + private List dimensions; + private List metrics; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/SearchResponse.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResponse.java similarity index 79% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/SearchResponse.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResponse.java index 7da6c4092..5f6b406ee 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/SearchResponse.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResponse.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.search; +package com.tencent.supersonic.chat.api.pojo.response; import java.util.List; import lombok.Data; @@ -6,8 +6,6 @@ import lombok.Getter; import lombok.Setter; @Data -@Setter -@Getter public class SearchResponse { private List searchResults; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/SearchResult.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java similarity index 54% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/SearchResult.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java index cd0641073..3c0c6a7a1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/SearchResult.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java @@ -1,7 +1,8 @@ -package com.tencent.supersonic.chat.domain.pojo.search; +package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import java.util.Objects; +import lombok.Builder; import lombok.Data; import lombok.Getter; import lombok.Setter; @@ -9,6 +10,7 @@ import lombok.Setter; @Data @Setter @Getter +@Builder public class SearchResult { private String recommend; @@ -17,29 +19,12 @@ public class SearchResult { private String domainName; - private Integer domainId; + private Long domainId; private SchemaElementType schemaElementType; private boolean isComplete = true; - public SearchResult(String recommend, String subRecommend, String className, Integer domainId, - SchemaElementType schemaElementType) { - this.recommend = recommend; - this.subRecommend = subRecommend; - this.domainName = className; - this.domainId = domainId; - this.schemaElementType = schemaElementType; - } - - public SearchResult(String recommend, String subRecommend, String className, Integer domainId, boolean isComplete) { - this.recommend = recommend; - this.subRecommend = subRecommend; - this.domainName = className; - this.domainId = domainId; - this.isComplete = isComplete; - } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/request/QueryContextReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/request/QueryContextReq.java deleted file mode 100644 index 87622822f..000000000 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/request/QueryContextReq.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tencent.supersonic.chat.api.request; - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.QueryFilter; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -@Data -public class QueryContextReq { - - private String queryText; - private Integer chatId; - private Integer domainId = 0; - private User user; - private QueryFilter queryFilter; - private List candidateQueries = new ArrayList<>(); - private SchemaMapInfo mapInfo = new SchemaMapInfo(); - private boolean saveAnswer = true; -} diff --git a/chat/core/pom.xml b/chat/core/pom.xml index 63369ba78..f30672455 100644 --- a/chat/core/pom.xml +++ b/chat/core/pom.xml @@ -113,12 +113,6 @@ semantic-api ${project.version} - - - - - - com.tencent.supersonic semantic-query @@ -137,6 +131,12 @@ ${project.version} compile + + + com.github.xkzhangsan + xk-time + ${xk.time.version} + diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java deleted file mode 100644 index 41cc10d6a..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/DomainEntityService.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.tencent.supersonic.chat.application; - - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.DataInfo; -import com.tencent.supersonic.chat.api.pojo.DomainInfo; -import com.tencent.supersonic.chat.api.pojo.EntityInfo; -import com.tencent.supersonic.chat.api.pojo.Filter; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatDefaultRichConfig; -import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -@Service -@Slf4j -public class DomainEntityService { - - private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - @Autowired - private ConfigServiceImpl configService; - - public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, User user) { - if (parseInfo != null && parseInfo.getDomainId() > 0) { - EntityInfo entityInfo = getEntityInfo(parseInfo.getDomainId()); - if (parseInfo.getDimensionFilters().size() <= 0) { - entityInfo.setMetrics(null); - entityInfo.setDimensions(null); - return entityInfo; - } - if (entityInfo.getDomainInfo() != null && entityInfo.getDomainInfo().getPrimaryEntityBizName() != null) { - String domainInfoPrimaryName = entityInfo.getDomainInfo().getPrimaryEntityBizName(); - String domainInfoId = ""; - for (Filter chatFilter : parseInfo.getDimensionFilters()) { - if (chatFilter != null && chatFilter.getBizName() != null && chatFilter.getBizName() - .equals(domainInfoPrimaryName)) { - if (chatFilter.getOperator().equals(FilterOperatorEnum.EQUALS)) { - domainInfoId = chatFilter.getValue().toString(); - } - if (chatFilter.getOperator().equals(FilterOperatorEnum.IN)) { - domainInfoId = ((List) chatFilter.getValue()).get(0); - } - } - } - if (!"".equals(domainInfoId)) { - try { - setMainDomain(entityInfo, parseInfo.getDomainId(), - domainInfoId, user); - - return entityInfo; - } catch (Exception e) { - log.error("setMaintDomain error {}", e); - } - } - } - } - return null; - } - - public EntityInfo getEntityInfo(Long domain) { - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domain); - if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatDetailRichConfig())) { - return new EntityInfo(); - } - return getEntityInfo(chaConfigRichDesc); - } - - private EntityInfo getEntityInfo(ChatConfigRichResp chaConfigRichDesc) { - - EntityInfo entityInfo = new EntityInfo(); - EntityRichInfo entityDesc = chaConfigRichDesc.getChatDetailRichConfig().getEntity(); - if (entityDesc != null && Objects.nonNull(chaConfigRichDesc.getDomainId())) { - DomainInfo domainInfo = new DomainInfo(); - domainInfo.setItemId(Integer.valueOf(chaConfigRichDesc.getDomainId().intValue())); - domainInfo.setName(chaConfigRichDesc.getDomainName()); - domainInfo.setWords(entityDesc.getNames()); - domainInfo.setBizName(chaConfigRichDesc.getBizName()); - if (Objects.nonNull(entityDesc.getDimItem())) { - domainInfo.setPrimaryEntityBizName(entityDesc.getDimItem().getBizName()); - } - - entityInfo.setDomainInfo(domainInfo); - List dimensions = new ArrayList<>(); - List metrics = new ArrayList<>(); - - if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig()) - && Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig())) { - ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); - if(!CollectionUtils.isEmpty(chatDefaultConfig.getDimensions())){ - for (SchemaItem dimensionDesc : chatDefaultConfig.getDimensions()) { - DataInfo mainEntityDimension = new DataInfo(); - mainEntityDimension.setItemId(dimensionDesc.getId().intValue()); - mainEntityDimension.setName(dimensionDesc.getName()); - mainEntityDimension.setBizName(dimensionDesc.getBizName()); - dimensions.add(mainEntityDimension); - } - entityInfo.setDimensions(dimensions); - } - - if(!CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())){ - for (SchemaItem metricDesc : chatDefaultConfig.getMetrics()) { - DataInfo dataInfo = new DataInfo(); - dataInfo.setName(metricDesc.getName()); - dataInfo.setBizName(metricDesc.getBizName()); - dataInfo.setItemId(metricDesc.getId().intValue()); - metrics.add(dataInfo); - } - entityInfo.setMetrics(metrics); - } - } - } - return entityInfo; - } - - public void setMainDomain(EntityInfo domainInfo, Long domain, String entity, User user) { - domainInfo.setEntityId(entity); - SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); - semanticParseInfo.setDomainId(Long.valueOf(domain)); - semanticParseInfo.setNativeQuery(true); - semanticParseInfo.setMetrics(getMetrics(domainInfo)); - semanticParseInfo.setDimensions(getDimensions(domainInfo)); - DateConf dateInfo = new DateConf(); - dateInfo.setUnit(1); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - semanticParseInfo.setDateInfo(dateInfo); - - // add filter - Filter chatFilter = new Filter(); - chatFilter.setValue(String.valueOf(entity)); - chatFilter.setOperator(FilterOperatorEnum.EQUALS); - chatFilter.setBizName(getEntityPrimaryName(domainInfo)); - Set chatFilters = new LinkedHashSet(); - chatFilters.add(chatFilter); - semanticParseInfo.setDimensionFilters(chatFilters); - - QueryResultWithSchemaResp queryResultWithColumns = null; - try { - queryResultWithColumns = semanticLayer.queryByStruct(SchemaInfoConverter.convertTo(semanticParseInfo), - user); - } catch (Exception e) { - log.warn("setMainDomain queryByStruct error, e:", e); - } - - if (queryResultWithColumns != null) { - if (!CollectionUtils.isEmpty(queryResultWithColumns.getResultList()) - && queryResultWithColumns.getResultList().size() > 0) { - Map result = queryResultWithColumns.getResultList().get(0); - for (Map.Entry entry : result.entrySet()) { - String entryKey = getEntryKey(entry); - if (entry.getValue() == null || entryKey == null) { - continue; - } - domainInfo.getDimensions().stream().filter(i -> entryKey.equals(i.getBizName())) - .forEach(i -> i.setValue(entry.getValue().toString())); - domainInfo.getMetrics().stream().filter(i -> entryKey.equals(i.getBizName())) - .forEach(i -> i.setValue(entry.getValue().toString())); - } - } - } - } - - private Set getDimensions(EntityInfo domainInfo) { - Set dimensions = new LinkedHashSet(); - for (DataInfo mainEntityDimension : domainInfo.getDimensions()) { - SchemaItem dimension = new SchemaItem(); - dimension.setBizName(mainEntityDimension.getBizName()); - dimensions.add(dimension); - } - return dimensions; - } - - private String getEntryKey(Map.Entry entry) { - // metric parser special handle, TODO delete - String entryKey = entry.getKey(); - if (entryKey.contains("__")) { - entryKey = entryKey.split("__")[1]; - } - return entryKey; - } - - private Set getMetrics(EntityInfo domainInfo) { - Set metrics = new LinkedHashSet(); - for (DataInfo metricValue : domainInfo.getMetrics()) { - SchemaItem metric = new SchemaItem(); - metric.setBizName(metricValue.getBizName()); - metrics.add(metric); - } - return metrics; - } - - private String getEntityPrimaryName(EntityInfo domainInfo) { - return domainInfo.getDomainInfo().getPrimaryEntityBizName(); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java deleted file mode 100644 index 4fdde6e91..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/QueryServiceImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tencent.supersonic.chat.application; - - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.*; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.application.query.QuerySelector; -import com.tencent.supersonic.chat.domain.pojo.chat.QueryData; -import com.tencent.supersonic.chat.domain.pojo.search.QueryState; -import com.tencent.supersonic.chat.domain.service.QueryService; -import com.tencent.supersonic.chat.domain.service.ChatService; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.common.util.json.JsonUtil; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; -import java.util.List; -import java.util.stream.Collectors; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; - -@Service -@Component("chatQueryService") -@Primary -@Slf4j -public class QueryServiceImpl implements QueryService { - - @Autowired - private ChatService chatService; - - private List schemaMappers = ComponentFactory.getSchemaMappers(); - private List semanticParsers = ComponentFactory.getSemanticParsers(); - private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - private QuerySelector querySelector = ComponentFactory.getQuerySelector(); - - @Override - public QueryResultResp executeQuery(QueryContextReq queryCtx) throws Exception { - schemaMappers.stream().forEach(s -> s.map(queryCtx)); - - // in order to support multi-turn conversation, we need to consider chat context - ChatContext chatCtx = chatService.getOrCreateContext(queryCtx.getChatId()); - - for (SemanticParser semanticParser : semanticParsers) { - log.info("semanticParser processing:[{}]", semanticParser.getClass().getName()); - semanticParser.parse(queryCtx, chatCtx); - } - if (queryCtx.getCandidateQueries().size() > 0) { - log.info("pick before [{}]", queryCtx.getCandidateQueries().stream().collect( - Collectors.toList())); - SemanticQuery semanticQuery = querySelector.select(queryCtx.getCandidateQueries()); - log.info("pick after [{}]", semanticQuery); - - QueryResultResp queryResponse = semanticQuery.execute(queryCtx.getUser()); - if (queryResponse != null) { - // update chat context after a successful semantic query - if (queryCtx.isSaveAnswer() && queryResponse.getQueryState() == QueryState.NORMAL.getState()) { - chatService.updateContext(chatCtx, queryCtx, semanticQuery.getParseInfo()); - } - queryResponse.setChatContext(chatCtx.getParseInfo()); - chatService.addQuery(queryResponse, queryCtx, chatCtx); - return queryResponse; - } - } - - return null; - } - - @Override - public SemanticParseInfo queryContext(QueryContextReq queryCtx) { - ChatContext context = chatService.getOrCreateContext(queryCtx.getChatId()); - return context.getParseInfo(); - } - - @Override - public QueryResultResp executeDirectQuery(QueryData queryData, User user) throws Exception { - SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); - QueryResultResp queryResponse = new QueryResultResp(); - BeanUtils.copyProperties(queryData, semanticParseInfo); - QueryResultWithSchemaResp resultWithColumns = semanticLayer.queryByStruct( - SchemaInfoConverter.convertTo(semanticParseInfo), user); - queryResponse.setQueryColumns(resultWithColumns.getColumns()); - queryResponse.setQueryResults(resultWithColumns.getResultList()); - return queryResponse; - } -} - diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java deleted file mode 100644 index b88ce07e4..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/RecommendServiceImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tencent.supersonic.chat.application; - - -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.chat.domain.pojo.chat.RecommendResponse; -import com.tencent.supersonic.chat.domain.service.RecommendService; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import org.springframework.stereotype.Service; - -/*** - * Recommend Service impl - */ -@Service -public class RecommendServiceImpl implements RecommendService { - - private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - @Override - public RecommendResponse recommend(QueryContextReq queryCtx) { - Integer domainId = queryCtx.getDomainId(); - if (Objects.isNull(domainId)) { - return new RecommendResponse(); - } - - DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo( - Long.valueOf(domainId), true); - - List dimensions = domainSchemaDesc.getDimensions().stream().map(dimSchemaDesc -> { - RecommendResponse.Item item = new RecommendResponse.Item(); - item.setDomain(domainId); - item.setName(dimSchemaDesc.getName()); - item.setBizName(dimSchemaDesc.getBizName()); - return item; - }).collect(Collectors.toList()); - - List metrics = domainSchemaDesc.getMetrics().stream().map(metricSchemaDesc -> { - RecommendResponse.Item item = new RecommendResponse.Item(); - item.setDomain(domainId); - item.setName(metricSchemaDesc.getName()); - item.setBizName(metricSchemaDesc.getBizName()); - return item; - }).collect(Collectors.toList()); - - RecommendResponse response = new RecommendResponse(); - response.setDimensions(dimensions); - response.setMetrics(metrics); - return response; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/ApplicationStartedInit.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/ApplicationStartedInit.java deleted file mode 100644 index 517851ed0..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/ApplicationStartedInit.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.tencent.supersonic.chat.application.knowledge; - -import com.tencent.supersonic.common.nlp.WordNature; -import com.tencent.supersonic.knowledge.domain.service.OnlineKnowledgeService; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Slf4j -@Component -public class ApplicationStartedInit implements ApplicationListener { - - @Autowired - private OnlineKnowledgeService onlineKnowledgeService; - - @Autowired - private WordNatureService wordNatureService; - - - @Override - public void onApplicationEvent(ApplicationStartedEvent event) { - try { - log.info("ApplicationStartedInit start"); - - List wordNatures = wordNatureService.getAllWordNature(); - - wordNatureService.setPreWordNatures(wordNatures); - - onlineKnowledgeService.reloadAllData(wordNatures); - - log.info("ApplicationStartedInit end"); - } catch (Exception e) { - log.error("ApplicationStartedInit error", e); - } - } - - /*** - * reload knowledge task - */ - @Scheduled(cron = "${reload.knowledge.corn:0 0/1 * * * ?}") - public void reloadKnowledge() { - log.info("reloadKnowledge start"); - - try { - List wordNatures = wordNatureService.getAllWordNature(); - List preWordNatures = wordNatureService.getPreWordNatures(); - - if (CollectionUtils.isEqualCollection(wordNatures, preWordNatures)) { - log.debug("wordNatures is not change, reloadKnowledge end"); - return; - } - log.info("wordNatures is change"); - wordNatureService.setPreWordNatures(wordNatures); - onlineKnowledgeService.updateOnlineKnowledge(wordNatureService.getAllWordNature()); - wordNatureService.getCache().refresh(""); - - } catch (Exception e) { - log.error("reloadKnowledge error", e); - } - - log.info("reloadKnowledge end"); - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/NatureHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/NatureHelper.java deleted file mode 100644 index c01c8a08b..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/NatureHelper.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.tencent.supersonic.chat.application.knowledge; - -import com.hankcs.hanlp.corpus.tag.Nature; -import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.application.mapper.HanlpSchemaMapper; -import com.tencent.supersonic.chat.domain.pojo.search.DomainInfoStat; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.knowledge.application.online.BaseWordNature; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * nature parse helper - */ -@Slf4j -public class NatureHelper { - - private static boolean isDomainOrEntity(Term term, Integer domain) { - return (NatureType.NATURE_SPILT + domain).equals(term.nature.toString()) || term.nature.toString() - .endsWith(NatureType.ENTITY.getType()); - } - - public static Integer getDomainByNature(Nature nature) { - if (nature.startsWith(NatureType.NATURE_SPILT)) { - String[] dimensionValues = nature.toString().split(NatureType.NATURE_SPILT); - if (StringUtils.isNumeric(dimensionValues[1])) { - return Integer.valueOf(dimensionValues[1]); - } - } - return 0; - } - - public static Integer getDomain(String nature) { - try { - String[] split = nature.split(NatureType.NATURE_SPILT); - if (split.length <= 1) { - return null; - } - return Integer.valueOf(split[1]); - } catch (NumberFormatException e) { - log.error("", e); - } - return null; - } - - public static boolean isDimensionValueClassId(String nature) { - if (StringUtils.isEmpty(nature)) { - return false; - } - if (!nature.startsWith(NatureType.NATURE_SPILT)) { - return false; - } - String[] split = nature.split(NatureType.NATURE_SPILT); - if (split.length <= 1) { - return false; - } - return !nature.endsWith(NatureType.METRIC.getType()) && !nature.endsWith(NatureType.DIMENSION.getType()) - && StringUtils.isNumeric(split[1]); - } - - public static DomainInfoStat getDomainStat(List terms) { - DomainInfoStat stat = new DomainInfoStat(); - stat.setDimensionDomainCount(getDimensionCount(terms)); - stat.setMetricDomainCount(getMetricCount(terms)); - stat.setDomainCount(getDomainCount(terms)); - stat.setDimensionValueDomainCount(getDimensionValueCount(terms)); - return stat; - } - - - private static long getDomainCount(List terms) { - return terms.stream().filter(term -> isDomainOrEntity(term, getDomainByNature(term.nature))).count(); - } - - private static long getDimensionValueCount(List terms) { - return terms.stream().filter(term -> isDimensionValueClassId(term.nature.toString())).count(); - } - - private static long getDimensionCount(List terms) { - return terms.stream().filter(term -> term.nature.startsWith(NatureType.NATURE_SPILT) && term.nature.toString() - .endsWith(NatureType.DIMENSION.getType())).count(); - } - - private static long getMetricCount(List terms) { - return terms.stream().filter(term -> term.nature.startsWith(NatureType.NATURE_SPILT) && term.nature.toString() - .endsWith(NatureType.METRIC.getType())).count(); - } - - /** - * Get the number of types of class parts of speech - * domainId -> (nature , natureCount) - * - * @param terms - * @return - */ - public static Map> getDomainToNatureStat(List terms) { - Map> domainToNature = new HashMap<>(); - terms.stream().filter( - term -> term.nature.startsWith(NatureType.NATURE_SPILT) - ).forEach(term -> { - NatureType natureType = NatureType.getNatureType(String.valueOf(term.nature)); - Integer domain = getDomain(String.valueOf(term.nature)); - - Map natureTypeMap = new HashMap<>(); - natureTypeMap.put(natureType, 1); - - Map original = domainToNature.get(domain); - if (Objects.isNull(original)) { - domainToNature.put(domain, natureTypeMap); - } else { - Integer count = original.get(natureType); - if (Objects.isNull(count)) { - count = 1; - } else { - count = count + 1; - } - original.put(natureType, count); - } - }); - return domainToNature; - } - - public static List selectPossibleDomains(List terms) { - Map> domainToNatureStat = getDomainToNatureStat(terms); - Integer maxDomainTypeSize = domainToNatureStat.entrySet().stream() - .max(Comparator.comparingInt(o -> o.getValue().size())).map(entry -> entry.getValue().size()) - .orElse(null); - if (Objects.isNull(maxDomainTypeSize) || maxDomainTypeSize == 0) { - return new ArrayList<>(); - } - return domainToNatureStat.entrySet().stream().filter(entry -> entry.getValue().size() == maxDomainTypeSize) - .map(entry -> entry.getKey()).collect(Collectors.toList()); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/WordNatureService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/WordNatureService.java deleted file mode 100644 index c24805448..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/WordNatureService.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.tencent.supersonic.chat.application.knowledge; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import com.tencent.supersonic.knowledge.application.online.WordNatureStrategyFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - - -/** - * word nature service - **/ -@Service -@Slf4j -public class WordNatureService { - - private static final Integer META_CACHE_TIME = 5; - private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - private List preWordNatures = new ArrayList<>(); - - private LoadingCache cache = CacheBuilder.newBuilder() - .expireAfterWrite(META_CACHE_TIME, TimeUnit.MINUTES) - .build( - new CacheLoader() { - @Override - public DomainInfos load(String key) { - log.info("load getDomainSchemaInfo cache [{}]", key); - return SchemaInfoConverter.convert(semanticLayer.getDomainSchemaInfo(new ArrayList<>())); - } - } - ); - - public List getAllWordNature() { - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - DomainInfos domainInfos = SchemaInfoConverter.convert(semanticLayer.getDomainSchemaInfo(new ArrayList<>())); - - List natures = new ArrayList<>(); - - addNatureToResult(NatureType.DIMENSION, domainInfos.getDimensions(), natures); - - addNatureToResult(NatureType.METRIC, domainInfos.getMetrics(), natures); - - addNatureToResult(NatureType.DOMAIN, domainInfos.getDomains(), natures); - - addNatureToResult(NatureType.ENTITY, domainInfos.getEntities(), natures); - - return natures; - } - - private void addNatureToResult(NatureType value, List metas, List natures) { - List natureList = WordNatureStrategyFactory.get(value).getWordNatureList(metas); - log.debug("nature type:{} , nature size:{}", value.name(), natureList.size()); - natures.addAll(natureList); - } - - public List getPreWordNatures() { - return preWordNatures; - } - - public void setPreWordNatures(List preWordNatures) { - this.preWordNatures = preWordNatures; - } - - public LoadingCache getCache() { - return cache; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java deleted file mode 100644 index f22f1ac2c..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/DatabaseSchemaMapper.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.tencent.supersonic.chat.application.mapper; - -import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.api.component.SchemaMapper; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.knowledge.WordNatureService; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; - -@Slf4j -public class DatabaseSchemaMapper implements SchemaMapper { - - @Override - public void map(QueryContextReq queryContext) { - - log.debug("before db mapper,mapInfo:{}", queryContext.getMapInfo()); - - List terms = HanlpHelper.getTerms(queryContext.getQueryText()); - - WordNatureService wordNatureService = ContextUtils.getBean(WordNatureService.class); - - DomainInfos domainInfos = wordNatureService.getCache().getUnchecked(""); - - detectAndAddToSchema(queryContext, terms, domainInfos.getDimensions(), - SchemaElementType.DIMENSION); - detectAndAddToSchema(queryContext, terms, domainInfos.getMetrics(), SchemaElementType.METRIC); - - log.debug("after db mapper,mapInfo:{}", queryContext.getMapInfo()); - } - - private void detectAndAddToSchema(QueryContextReq queryContext, List terms, List domains, - SchemaElementType schemaElementType) { - try { - String queryText = queryContext.getQueryText(); - - Map> domainResultSet = getResultSet(queryText, terms, domains); - - addToSchemaMapInfo(domainResultSet, queryContext.getMapInfo(), schemaElementType); - - } catch (Exception e) { - log.error("detectAndAddToSchema error", e); - } - } - - private Map> getResultSet(String queryText, List terms, List domains) { - - MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); - - Map> nameToItems = getNameToItems(domains); - - Map regOffsetToLength = terms.stream().sorted(Comparator.comparing(Term::length)) - .collect(Collectors.toMap(Term::getOffset, term -> term.word.length(), (value1, value2) -> value2)); - - Map> domainResultSet = new HashMap<>(); - for (Integer index = 0; index <= queryText.length() - 1; ) { - for (Integer i = index; i <= queryText.length(); ) { - i = mapperHelper.getStepIndex(regOffsetToLength, i); - if (i <= queryText.length()) { - String detectSegment = queryText.substring(index, i); - nameToItems.forEach( - (name, newItemDOs) -> { - if (name.contains(detectSegment) - && mapperHelper.getSimilarity(detectSegment, name) - >= mapperHelper.getMetricDimensionThresholdConfig()) { - Set preItemDOS = domainResultSet.putIfAbsent(detectSegment, newItemDOs); - if (Objects.nonNull(preItemDOS)) { - preItemDOS.addAll(newItemDOs); - } - } - } - ); - } - } - index = mapperHelper.getStepIndex(regOffsetToLength, index); - } - return domainResultSet; - } - - private Map> getNameToItems(List domains) { - return domains.stream() - .collect(Collectors.toMap(ItemDO::getName, a -> { - Set result = new HashSet<>(); - result.add(a); - return result; - }, (k1, k2) -> { - k1.addAll(k2); - return k1; - })); - } - - private void addToSchemaMapInfo(Map> mapResultRowSet, SchemaMapInfo schemaMap, - SchemaElementType schemaElementType) { - if (Objects.isNull(mapResultRowSet) || mapResultRowSet.size() <= 0) { - return; - } - MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); - - for (Map.Entry> entry : mapResultRowSet.entrySet()) { - String detectWord = entry.getKey(); - Set itemDOS = entry.getValue(); - for (ItemDO itemDO : itemDOS) { - - List elements = schemaMap.getMatchedElements(itemDO.getDomain()); - if (CollectionUtils.isEmpty(elements)) { - elements = new ArrayList<>(); - schemaMap.setMatchedElements(itemDO.getDomain(), elements); - } - Set regElementSet = elements.stream() - .filter(elementMatch -> schemaElementType.equals(elementMatch.getElementType())) - .map(elementMatch -> elementMatch.getElementID()) - .collect(Collectors.toSet()); - - if (regElementSet.contains(itemDO.getItemId())) { - continue; - } - SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() - .elementID(itemDO.getItemId()).word(itemDO.getName()).frequency(10000L) - .elementType(schemaElementType).detectWord(detectWord) - .similarity(mapperHelper.getSimilarity(detectWord, itemDO.getName())) - .build(); - log.info("schemaElementType:{},add to schema, elementMatch {}", schemaElementType, schemaElementMatch); - elements.add(schemaElementMatch); - } - } - - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java deleted file mode 100644 index 13f1709b4..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapper.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.tencent.supersonic.chat.application.mapper; - -import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.api.component.SchemaMapper; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.knowledge.NatureHelper; -import com.tencent.supersonic.chat.domain.pojo.search.MatchText; -import com.tencent.supersonic.chat.domain.utils.NatureConverter; -import com.tencent.supersonic.common.nlp.MapResult; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.knowledge.application.online.BaseWordNature; -import com.tencent.supersonic.knowledge.application.online.WordNatureStrategyFactory; -import com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; - -@Slf4j -public class HanlpSchemaMapper implements SchemaMapper { - - @Override - public void map(QueryContextReq queryContext) { - - List terms = HanlpHelper.getTerms(queryContext.getQueryText()); - - terms.forEach( - item -> log.info("word:{},nature:{},frequency:{}", item.word, item.nature.toString(), - item.getFrequency()) - ); - QueryMatchStrategy matchStrategy = ContextUtils.getBean(QueryMatchStrategy.class); - - Map> matchResult = matchStrategy.match(queryContext.getQueryText(), terms, - queryContext.getDomainId()); - List matches = new ArrayList<>(); - if (Objects.nonNull(matchResult)) { - Optional> first = matchResult.entrySet().stream() - .filter(entry -> CollectionUtils.isNotEmpty(entry.getValue())) - .map(entry -> entry.getValue()).findFirst(); - if (first.isPresent()) { - matches = first.get(); - } - } - HanlpHelper.transLetterOriginal(matches); - log.info("queryContext:{},matches:{}", queryContext, matches); - - convertTermsToSchemaMapInfo(matches, queryContext.getMapInfo(), terms); - } - - - - private void convertTermsToSchemaMapInfo(List mapResults, SchemaMapInfo schemaMap, List terms) { - if (CollectionUtils.isEmpty(mapResults)) { - return; - } - - Map wordNatureToFrequency = terms.stream().collect( - Collectors.toMap(entry -> entry.getWord() + entry.getNature(), - term -> Long.valueOf(term.getFrequency()), (value1, value2) -> value2)); - - for (MapResult mapResult : mapResults) { - for (String nature : mapResult.getNatures()) { - Integer domain = NatureHelper.getDomain(nature); - if (Objects.isNull(domain)) { - continue; - } - SchemaElementType elementType = NatureConverter.convertTo(nature); - if (Objects.isNull(elementType)) { - continue; - } - - BaseWordNature baseWordNature = WordNatureStrategyFactory.get(NatureType.getNatureType(nature)); - Integer elementID = baseWordNature.getElementID(nature); - Long frequency = wordNatureToFrequency.get(mapResult.getName() + nature); - SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() - .elementType(elementType) - .elementID(elementID) - .frequency(frequency) - .word(mapResult.getName()) - .similarity(mapResult.getSimilarity()) - .detectWord(mapResult.getDetectWord()) - .build(); - - Map> domainElementMatches = schemaMap.getDomainElementMatches(); - List schemaElementMatches = domainElementMatches.putIfAbsent(domain, - new ArrayList<>()); - if (schemaElementMatches == null) { - schemaElementMatches = domainElementMatches.get(domain); - } - schemaElementMatches.add(schemaElementMatch); - } - } - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java deleted file mode 100644 index 5d4977a65..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryFilterMapper.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.tencent.supersonic.chat.application.mapper; - -import com.google.common.collect.Lists; -import com.tencent.supersonic.chat.api.component.SchemaMapper; -import com.tencent.supersonic.chat.api.pojo.*; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.common.constant.Constants; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -@Slf4j -public class QueryFilterMapper implements SchemaMapper { - - private Long FREQUENCY = 9999999L; - - private double SIMILARITY = 1.0; - - @Override - public void map(QueryContextReq queryContext) { - Integer domainId = queryContext.getDomainId(); - if (domainId == null || domainId <= 0 || queryContext.getQueryFilter() == null) { - return; - } - QueryFilter queryFilter = queryContext.getQueryFilter(); - SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); - List schemaElementMatches = schemaMapInfo.getMatchedElements(domainId); - clearOtherSchemaElementMatch(domainId, schemaMapInfo); - convertFilterToSchemaMapInfo(queryFilter.getFilters(), schemaElementMatches); - } - - private void convertFilterToSchemaMapInfo(List filters, List schemaElementMatches) { - log.info("schemaElementMatches before queryFilerMapper:{}", schemaElementMatches); - if (CollectionUtils.isEmpty(schemaElementMatches)) { - schemaElementMatches = Lists.newArrayList(); - } - List words = schemaElementMatches.stream().map(SchemaElementMatch::getWord).collect(Collectors.toList()); - for (Filter filter : filters) { - SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() - .elementType(SchemaElementType.VALUE) - .elementID(filter.getElementID().intValue()) - .frequency(FREQUENCY) - .word(String.valueOf(filter.getValue())) - .similarity(SIMILARITY) - .detectWord(Constants.EMPTY) - .build(); - if (words.contains(schemaElementMatch.getWord())) { - continue; - } - schemaElementMatches.add(schemaElementMatch); - } - log.info("schemaElementMatches after queryFilerMapper:{}", schemaElementMatches); - } - - private void clearOtherSchemaElementMatch(Integer domainId, SchemaMapInfo schemaMapInfo) { - for (Map.Entry> entry : schemaMapInfo.getDomainElementMatches().entrySet()) { - if (!entry.getKey().equals(domainId)) { - entry.getValue().clear(); - } - } - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/AggregateSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/AggregateSemanticParser.java deleted file mode 100644 index 9a9940c45..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/AggregateSemanticParser.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.tencent.supersonic.chat.application.parser; - -import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.query.EntityListFilter; -import com.tencent.supersonic.chat.application.query.MetricGroupBy; -import com.tencent.supersonic.chat.application.query.MetricOrderBy; -import com.tencent.supersonic.common.enums.AggregateTypeEnum; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class AggregateSemanticParser implements SemanticParser { - - public static final Integer TOPN_LIMIT = 1000; - - private static Map aggregateRegexMap = new HashMap<>(); - - static { - aggregateRegexMap.put(AggregateTypeEnum.MAX, Pattern.compile("(?i)(最大值|最大|max|峰值|最高|最多)")); - aggregateRegexMap.put(AggregateTypeEnum.MIN, Pattern.compile("(?i)(最小值|最小|min|最低|最少)")); - aggregateRegexMap.put(AggregateTypeEnum.SUM, Pattern.compile("(?i)(汇总|总和|sum)")); - aggregateRegexMap.put(AggregateTypeEnum.AVG, Pattern.compile("(?i)(平均值|日均|平均|avg)")); - aggregateRegexMap.put(AggregateTypeEnum.TOPN, Pattern.compile("(?i)(top)")); - aggregateRegexMap.put(AggregateTypeEnum.DISTINCT, Pattern.compile("(?i)(uv)")); - aggregateRegexMap.put(AggregateTypeEnum.COUNT, Pattern.compile("(?i)(总数|pv)")); - aggregateRegexMap.put(AggregateTypeEnum.NONE, Pattern.compile("(?i)(明细)")); - } - - public static AggregateTypeEnum resolveAggregateType(String queryText) { - - Map aggregateCount = new HashMap<>(aggregateRegexMap.size()); - for (Map.Entry entry : aggregateRegexMap.entrySet()) { - Matcher matcher = entry.getValue().matcher(queryText); - int count = 0; - while (matcher.find()) { - count++; - } - if (count > 0) { - aggregateCount.put(entry.getKey(), count); - } - } - - return aggregateCount.entrySet().stream().max(Map.Entry.comparingByValue()).map(entry -> entry.getKey()) - .orElse(null); - } - - @Override - public void parse(QueryContextReq queryContext, ChatContext chatContext) { - AggregateTypeEnum aggregateType = resolveAggregateType(queryContext.getQueryText()); - - for (SemanticQuery semanticQuery : queryContext.getCandidateQueries()) { - SemanticParseInfo semanticParse = semanticQuery.getParseInfo(); - - semanticParse.setNativeQuery(getNativeQuery(aggregateType, semanticParse)); - semanticParse.setAggType(aggregateType); - if (Objects.isNull(semanticParse.getLimit()) || semanticParse.getLimit() <= 0) { - semanticParse.setLimit(Long.valueOf(TOPN_LIMIT)); - } - resetQueryModeByAggregateType(semanticParse, aggregateType); - } - } - - /** - * query mode reset by the AggregateType - * - * @param parseInfo - * @param aggregateType - */ - private void resetQueryModeByAggregateType(SemanticParseInfo parseInfo, - AggregateTypeEnum aggregateType) { - - String queryMode = parseInfo.getQueryMode(); - if (MetricGroupBy.QUERY_MODE.equals(queryMode) || MetricGroupBy.QUERY_MODE.equals(queryMode)) { - if (AggregateTypeEnum.MAX.equals(aggregateType) || AggregateTypeEnum.MIN.equals(aggregateType) - || AggregateTypeEnum.TOPN.equals(aggregateType)) { - parseInfo.setQueryMode(MetricOrderBy.QUERY_MODE); - } else { - parseInfo.setQueryMode(MetricGroupBy.QUERY_MODE); - } - log.info("queryMode mode [{}]->[{}]", queryMode, parseInfo.getQueryMode()); - } - } - - private boolean getNativeQuery(AggregateTypeEnum aggregateType, SemanticParseInfo semanticParse) { - if (AggregateTypeEnum.TOPN.equals(aggregateType)) { - return true; - } - if (EntityListFilter.QUERY_MODE.equals(semanticParse.getQueryMode()) && (semanticParse.getMetrics() == null - || semanticParse.getMetrics().isEmpty())) { - return true; - } - return semanticParse.getNativeQuery(); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainResolver.java deleted file mode 100644 index b3ca4e295..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainResolver.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tencent.supersonic.chat.application.parser; - - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.component.SemanticQuery; - -import java.util.Map; - -public interface DomainResolver { - - Integer resolve(Map domainQueryModes, QueryContextReq queryCtx, ChatContext chatCtx, - SchemaMapInfo schemaMap); - - boolean isDomainSwitch(ChatContext chatCtx, SemanticParseInfo semanticParseInfo); - -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java deleted file mode 100644 index b24be50fc..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/DomainSemanticParser.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.tencent.supersonic.chat.application.parser; - -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.query.EntitySemanticQuery; -import com.tencent.supersonic.chat.application.query.MetricSemanticQuery; -import com.tencent.supersonic.chat.application.query.RuleSemanticQuery; -import com.tencent.supersonic.chat.application.query.RuleSemanticQueryManager; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; -import com.tencent.supersonic.chat.domain.service.ConfigService; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import com.tencent.supersonic.chat.domain.utils.DefaultMetricUtils; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.common.util.context.ContextUtils; - -import java.util.*; -import java.util.stream.Collectors; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; - -@Slf4j -public class DomainSemanticParser implements SemanticParser { - - private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - @Override - public void parse(QueryContextReq queryContext, ChatContext chatContext) { - DomainInfos domainInfosDb = SchemaInfoConverter.convert(semanticLayer.getDomainSchemaInfo(new ArrayList<>())); - Map domainToName = domainInfosDb.getDomainToName(); - SchemaMapInfo mapInfo = queryContext.getMapInfo(); - - // iterate all schemaElementMatches to resolve semantic query - for (Integer domainId : mapInfo.getMatchedDomains()) { - List elementMatches = mapInfo.getMatchedElements(domainId); - List queries = resolveQuery(elementMatches, queryContext); - for (RuleSemanticQuery query : queries) { - - if (useBlackItem(query, domainId)) { - log.info("useBlackItem, skip query:{}", query); - continue; - } - addCandidateQuery(queryContext, chatContext, domainId.longValue(), - domainToName.get(domainId), query); - } - } - - // if no candidates have been found yet, count in chat context and try again - if (queryContext.getCandidateQueries().size() <= 0) { - if (chatContext.getParseInfo() != null && chatContext.getParseInfo().getDomainId() > 0) { - Integer chatDomainId = Integer.valueOf(chatContext.getParseInfo().getDomainId().intValue()); - if (mapInfo.getMatchedDomains().contains(chatDomainId)) { - List elementMatches = mapInfo.getMatchedElements(chatDomainId); - - List queries = tryParseByContext(elementMatches, chatContext, queryContext); - for (RuleSemanticQuery query : queries) { - addCandidateQuery(queryContext, chatContext, chatDomainId.longValue(), - domainToName.get(chatDomainId), query); - } - } - } - } - } - - private boolean useBlackItem(RuleSemanticQuery query, Integer domainId) { - if (Objects.isNull(domainId)) { - return false; - } - ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigResp chatConfigResp = configService.fetchConfigByDomainId(domainId.longValue()); - if (Objects.nonNull(chatConfigResp) && Objects.nonNull(query) && Objects.nonNull(query.getParseInfo())) { - List elementMatches = query.getParseInfo().getElementMatches(); - if (!CollectionUtils.isEmpty(elementMatches)) { - return useBlackItemInternal(elementMatches, chatConfigResp, query); - - } - } - return false; - } - - private boolean useBlackItemInternal(List elementMatches, ChatConfigResp chatConfigResp, RuleSemanticQuery query) { - if (Objects.isNull(chatConfigResp)) { - return false; - } - List blackDimIdList = new ArrayList<>(); - List blackMetricIdList = new ArrayList<>(); - if (query instanceof EntitySemanticQuery - && Objects.nonNull(chatConfigResp.getChatDetailConfig()) - && Objects.nonNull(chatConfigResp.getChatDetailConfig().getVisibility())) { - log.info("useBlackItem, handle EntitySemanticQuery blackList logic"); - blackDimIdList = chatConfigResp.getChatDetailConfig().getVisibility().getBlackDimIdList(); - blackMetricIdList = chatConfigResp.getChatDetailConfig().getVisibility().getBlackMetricIdList(); - } - - if (query instanceof MetricSemanticQuery - && Objects.nonNull(chatConfigResp.getChatAggConfig()) - && Objects.nonNull(chatConfigResp.getChatAggConfig().getVisibility())) { - log.info("useBlackItem, handle MetricSemanticQuery blackList logic"); - blackDimIdList = chatConfigResp.getChatAggConfig().getVisibility().getBlackDimIdList(); - blackMetricIdList = chatConfigResp.getChatAggConfig().getVisibility().getBlackMetricIdList(); - } - return useBlackItemWithElementMatches(elementMatches, blackDimIdList, blackMetricIdList); - } - - private boolean useBlackItemWithElementMatches(List elementMatches, List blackDimIdList, List blackMetricIdList) { - - Set dimIds = elementMatches.stream() - .filter(element -> SchemaElementType.VALUE.equals(element.getElementType()) || SchemaElementType.DIMENSION.equals(element.getElementType())) - .map(element -> Long.valueOf(element.getElementID())).collect(Collectors.toSet()); - - Set metricIds = elementMatches.stream() - .filter(element -> SchemaElementType.METRIC.equals(element.getElementType())) - .map(element -> Long.valueOf(element.getElementID())).collect(Collectors.toSet()); - - - return useBlackItemWithIds(dimIds, metricIds, blackDimIdList, blackMetricIdList); - } - - private boolean useBlackItemWithIds(Set dimIds, Set metricIds, List blackDimIdList, List blackMetricIdList) { - - if (!CollectionUtils.isEmpty(blackDimIdList) && !CollectionUtils.isEmpty(dimIds)) { - if (blackDimIdList.stream().anyMatch(dimIds::contains)) { - log.info("useBlackItem, blackDimIdList:{}", blackDimIdList.stream().filter(dimIds::contains).collect(Collectors.toList())); - return true; - } - } - if (!CollectionUtils.isEmpty(blackMetricIdList) && !CollectionUtils.isEmpty(metricIds)) { - if (blackMetricIdList.stream().anyMatch(metricIds::contains)) { - log.info("useBlackItem, blackMetricIdList:{}", blackMetricIdList.stream().filter(metricIds::contains).collect(Collectors.toList())); - return true; - } - } - return false; - } - - private void addCandidateQuery(QueryContextReq queryContext, ChatContext chatContext, - Long domainId, String domainName, RuleSemanticQuery semanticQuery) { - if (semanticQuery != null) { - DefaultMetricUtils defaultMetricUtils = ContextUtils.getBean(DefaultMetricUtils.class); - defaultMetricUtils.fillParseInfo(semanticQuery, domainId, domainName); - inheritContext(semanticQuery, chatContext); - defaultMetricUtils.fillDefaultMetric(semanticQuery.getParseInfo(), queryContext, chatContext); - queryContext.getCandidateQueries().add(semanticQuery); - } - } - - protected void inheritContext(RuleSemanticQuery semanticQuery, ChatContext chatContext) { - // is domain switch - SemanticParseInfo semanticParse = semanticQuery.getParseInfo(); - DomainResolver domainResolver = ComponentFactory.getDomainResolver(); - if (!domainResolver.isDomainSwitch(chatContext, semanticParse)) { - semanticQuery.inheritContext(chatContext); - } - } - - /** - * try to add ChatContext to SchemaMatch and look if match QueryMode - * - * @param elementMatches - * @param chatCtx - * @return - */ - private List tryParseByContext(List elementMatches, - ChatContext chatCtx, QueryContextReq queryCtx) { - if (chatCtx.getParseInfo() != null && chatCtx.getParseInfo().getEntity() > 0) { - Long entityCount = elementMatches.stream().filter(i -> SchemaElementType.ENTITY.equals(i.getElementType())) - .count(); - Long metricCount = elementMatches.stream().filter(i -> SchemaElementType.METRIC.equals(i.getElementType())) - .count(); - if (entityCount <= 0 && metricCount <= 0 && ContextHelper.hasEntityId(chatCtx)) { - // try entity parse - SchemaElementMatch entityElementMatch = SchemaElementMatch.builder() - .elementType(SchemaElementType.ENTITY).build(); - List newSchemaMatches = new ArrayList<>(); - if (!CollectionUtils.isEmpty(elementMatches)) { - newSchemaMatches.addAll(elementMatches); - } - newSchemaMatches.add(entityElementMatch); - List queries = doParseByContext(newSchemaMatches, chatCtx, queryCtx); - if (queries.size() > 0) { - return queries; - } - } - } - return doParseByContext(elementMatches, chatCtx, queryCtx); - } - - - private List doParseByContext(List elementMatches, - ChatContext chatCtx, QueryContextReq queryContext) { - SemanticParseInfo contextSemanticParse = chatCtx.getParseInfo(); - if (contextSemanticParse != null) { - List newElementMatches = new ArrayList<>(); - List> trySchemaElementTypes = new LinkedList<>(); - // try DIMENSION+METRIC+VALUE - // try DIMENSION+METRIC METRIC+VALUE DIMENSION+VALUE - // try DIMENSION METRIC VALUE single - trySchemaElementTypes.add(new ArrayList<>( - Arrays.asList(SchemaElementType.DIMENSION, SchemaElementType.METRIC, SchemaElementType.VALUE))); - trySchemaElementTypes.add( - new ArrayList<>(Arrays.asList(SchemaElementType.METRIC, SchemaElementType.VALUE))); - trySchemaElementTypes.add( - new ArrayList<>(Arrays.asList(SchemaElementType.DIMENSION, SchemaElementType.METRIC))); - trySchemaElementTypes.add( - new ArrayList<>(Arrays.asList(SchemaElementType.DIMENSION, SchemaElementType.VALUE))); - trySchemaElementTypes.add(new ArrayList<>(Arrays.asList(SchemaElementType.METRIC))); - trySchemaElementTypes.add(new ArrayList<>(Arrays.asList(SchemaElementType.VALUE))); - trySchemaElementTypes.add(new ArrayList<>(Arrays.asList(SchemaElementType.DIMENSION))); - - for (List schemaTypes : trySchemaElementTypes) { - newElementMatches.clear(); - if (!CollectionUtils.isEmpty(elementMatches)) { - newElementMatches.addAll(elementMatches); - } - ContextHelper.mergeContextSchemaElementMatch(newElementMatches, elementMatches, schemaTypes, - contextSemanticParse); - List queries = resolveQuery(newElementMatches, queryContext); - if (queries.size() > 0) { - return queries; - } - } - } - return new ArrayList<>(); - } - - private List resolveQuery(List candidateElementMatches, - QueryContextReq queryContext) { - List matchedQueries = new ArrayList<>(); - for (RuleSemanticQuery semanticQuery : RuleSemanticQueryManager.getSemanticQueries()) { - List matches = semanticQuery.match(candidateElementMatches, queryContext); - - if (matches.size() > 0) { - log.info("resolve match [{}:{}] ", semanticQuery.getQueryMode(), matches.size()); - RuleSemanticQuery query = RuleSemanticQueryManager.create(semanticQuery.getQueryMode()); - query.getParseInfo().getElementMatches().addAll(matches); - matchedQueries.add(query); - } - } - - return matchedQueries; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/HeuristicDomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/HeuristicDomainResolver.java deleted file mode 100644 index 1b781be17..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/HeuristicDomainResolver.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.tencent.supersonic.chat.application.parser; - -import com.tencent.supersonic.chat.api.pojo.*; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import lombok.extern.slf4j.Slf4j; - -import java.util.*; -import java.util.stream.Collectors; - -@Slf4j -public class HeuristicDomainResolver implements DomainResolver { - - protected static Integer selectDomainBySchemaElementCount(Map domainQueryModes, - SchemaMapInfo schemaMap) { - Map domainTypeMap = getDomainTypeMap(schemaMap); - if (domainTypeMap.size() == 1) { - Integer domainSelect = domainTypeMap.entrySet().stream().collect(Collectors.toList()).get(0).getKey(); - if (domainQueryModes.containsKey(domainSelect)) { - log.info("selectDomain from domainTypeMap not order [{}]", domainSelect); - return domainSelect; - } - } else { - Map.Entry maxDomain = domainTypeMap.entrySet().stream() - .filter(entry -> domainQueryModes.containsKey(entry.getKey())) - .sorted(ContextHelper.DomainStatComparator).findFirst().orElse(null); - if (maxDomain != null) { - log.info("selectDomain from domainTypeMap order [{}]", maxDomain.getKey()); - return maxDomain.getKey(); - } - } - return 0; - } - - /** - * to check can switch domain if context exit domain - * - * @return false will use context domain, true will use other domain , maybe include context domain - */ - protected static boolean isAllowSwitch(Map domainQueryModes, SchemaMapInfo schemaMap, - ChatContext chatCtx, QueryContextReq searchCtx, Integer domainId) { - if (!Objects.nonNull(domainId) || domainId <= 0) { - return true; - } - // except content domain, calculate the number of types for each domain, if numbers<=1 will not switch - Map domainTypeMap = getDomainTypeMap(schemaMap); - log.info("isAllowSwitch domainTypeMap [{}]", domainTypeMap); - long otherDomainTypeNumBigOneCount = domainTypeMap.entrySet().stream() - .filter(entry -> domainQueryModes.containsKey(entry.getKey()) && !entry.getKey().equals(domainId)) - .filter(entry -> entry.getValue().getCount() > 1).count(); - if (otherDomainTypeNumBigOneCount >= 1) { - return true; - } - // if query text only contain time , will not switch - for (SemanticQuery semanticQuery : domainQueryModes.values()) { - SemanticParseInfo semanticParseInfo = semanticQuery.getParseInfo(); - if (semanticParseInfo == null) { - continue; - } - if (searchCtx.getQueryText() != null && semanticParseInfo.getDateInfo() != null) { - if (semanticParseInfo.getDateInfo().getText() != null) { - if (semanticParseInfo.getDateInfo().getText().equalsIgnoreCase(searchCtx.getQueryText())) { - log.info("timeParseResults is not null , can not switch context , timeParseResults:{},", - semanticParseInfo.getDateInfo()); - return false; - } - } - } - } - - // if context domain not in schemaMap , will switch - if (schemaMap.getMatchedElements(domainId) == null || schemaMap.getMatchedElements(domainId).size() <= 0) { - log.info("domainId not in schemaMap "); - return true; - } - // other will not switch - return false; - } - - public static Map getDomainTypeMap(SchemaMapInfo schemaMap) { - Map domainCount = new HashMap<>(); - for (Map.Entry> entry : schemaMap.getDomainElementMatches().entrySet()) { - List schemaElementMatches = schemaMap.getMatchedElements(entry.getKey()); - if (schemaElementMatches != null && schemaElementMatches.size() > 0) { - if (!domainCount.containsKey(entry.getKey())) { - domainCount.put(entry.getKey(), new QueryMatchInfo()); - } - QueryMatchInfo queryMatchInfo = domainCount.get(entry.getKey()); - Set schemaElementTypes = new HashSet<>(); - schemaElementMatches.stream() - .forEach(schemaElementMatch -> schemaElementTypes.add(schemaElementMatch.getElementType())); - SchemaElementMatch schemaElementMatchMax = schemaElementMatches.stream() - .sorted(ContextHelper.schemaElementMatchComparatorBySimilarity).findFirst().orElse(null); - if (schemaElementMatchMax != null) { - queryMatchInfo.setMaxSimilarity(schemaElementMatchMax.getSimilarity()); - } - queryMatchInfo.setCount(schemaElementTypes.size()); - - } - } - return domainCount; - } - - @Override - public boolean isDomainSwitch(ChatContext chatCtx, SemanticParseInfo semanticParseInfo) { - Long contextDomain = chatCtx.getParseInfo().getDomainId(); - Long currentDomain = semanticParseInfo.getDomainId(); - boolean noSwitch = - currentDomain == null || contextDomain == null || contextDomain.equals(currentDomain); - log.debug("ChatContext isDomainSwitch [{}] [{}]", - semanticParseInfo.getQueryMode(), !noSwitch); - return !noSwitch; - } - - @Override - public Integer resolve(Map domainQueryModes, QueryContextReq searchCtx, - ChatContext chatCtx, SchemaMapInfo schemaMap) { - Integer selectDomain = selectDomain(domainQueryModes, searchCtx, chatCtx, schemaMap); - if (selectDomain > 0) { - log.info("selectDomain {} ", selectDomain); - return selectDomain; - } - // get the max SchemaElementType number - return selectDomainBySchemaElementCount(domainQueryModes, schemaMap); - } - - public Integer selectDomain(Map domainQueryModes, QueryContextReq searchCtx, - ChatContext chatCtx, - SchemaMapInfo schemaMap) { - // if QueryContext has domainId and in domainQueryModes - if (domainQueryModes.containsKey(searchCtx.getDomainId())) { - log.info("selectDomain from QueryContext [{}]", searchCtx.getDomainId()); - return searchCtx.getDomainId(); - } - // if ChatContext has domainId and in domainQueryModes - if (chatCtx.getParseInfo().getDomainId() > 0) { - Integer domainId = Integer.valueOf(chatCtx.getParseInfo().getDomainId().intValue()); - if (!isAllowSwitch(domainQueryModes, schemaMap, chatCtx, searchCtx, domainId)) { - log.info("selectDomain from ChatContext [{}]", domainId); - return domainId; - } - } - // default 0 - return 0; - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java deleted file mode 100644 index b3aa00471..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/LLMSemanticParser.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.tencent.supersonic.chat.application.parser; - -import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.knowledge.WordNatureService; -import com.tencent.supersonic.chat.application.query.LLMSemanticQuery; -import com.tencent.supersonic.chat.domain.config.LLMConfig; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.pojo.chat.LLMReq; -import com.tencent.supersonic.chat.domain.pojo.chat.LLMResp; -import com.tencent.supersonic.chat.domain.pojo.chat.LLMSchema; -import com.tencent.supersonic.chat.domain.utils.DslToSemanticInfo; -import com.tencent.supersonic.chat.domain.utils.SemanticSatisfactionChecker; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.common.util.json.JsonUtil; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.apache.calcite.sql.parser.SqlParseException; -import org.apache.commons.lang3.StringUtils; -import org.springframework.core.io.support.SpringFactoriesLoader; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; - -@Slf4j -public class LLMSemanticParser implements SemanticParser { - - private DslToSemanticInfo dslToSemanticInfo = new DslToSemanticInfo(); - - @Override - public void parse(QueryContextReq queryContext, ChatContext chatCtx) { - String queryText = queryContext.getQueryText(); - - if (SemanticSatisfactionChecker.check(queryContext)) { - log.info("There is no need parse by llm , queryText:{}", queryText); - return; - } - - try { - Integer domainId = getDomainId(queryContext, chatCtx); - LLMResp llmResp = requestLLM(queryContext, domainId); - if (Objects.isNull(llmResp)) { - return; - } - LLMSemanticQuery semanticQuery = new LLMSemanticQuery(); - SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); - String sql = convertToSql(llmResp, parseInfo, domainId); - - parseInfo.setInfo(sql); - parseInfo.setDomainId(Long.valueOf(domainId)); - parseInfo.setBonus(queryText.length() * 1.0); - parseInfo.setQueryMode(LLMSemanticQuery.QUERY_MODE); - queryContext.getCandidateQueries().add(semanticQuery); - return; - } catch (Exception e) { - log.error("llm parse error , skip the parser. error:", e); - } - } - - protected String convertToSql(LLMResp llmResp, SemanticParseInfo parseInfo, Integer domainId) - throws SqlParseException { - return dslToSemanticInfo.convert(parseInfo, llmResp, domainId); - } - - protected LLMResp requestLLM(QueryContextReq queryContext, Integer domainId) { - final LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); - - if (StringUtils.isEmpty(llmConfig.getUrl())) { - log.warn("llmConfig url is null, skip llm parser"); - return null; - } - - DomainInfos domainInfos = ContextUtils.getBean(WordNatureService.class).getCache().getUnchecked(""); - - Map domainIdToName = domainInfos.getDomains().stream() - .collect(Collectors.toMap(ItemDO::getDomain, a -> a.getName(), (k1, k2) -> k1)); - - Map itemIdToName = domainInfos.getDimensions().stream() - .filter(entry -> domainId.equals(entry.getDomain())) - .collect(Collectors.toMap(ItemDO::getItemId, ItemDO::getName, (value1, value2) -> value2)); - - String domainName = domainIdToName.get(domainId); - LLMReq llmReq = new LLMReq(); - llmReq.setQueryText(queryContext.getQueryText()); - - List matchedElements = queryContext.getMapInfo().getMatchedElements(domainId); - - Set fieldNameList = matchedElements.stream() - .filter(schemaElementMatch -> - SchemaElementType.METRIC.equals(schemaElementMatch.getElementType()) || - SchemaElementType.DIMENSION.equals(schemaElementMatch.getElementType()) || - SchemaElementType.VALUE.equals(schemaElementMatch.getElementType())) - .map(schemaElementMatch -> { - if (!SchemaElementType.VALUE.equals(schemaElementMatch.getElementType())) { - return schemaElementMatch.getWord(); - } - return itemIdToName.get(schemaElementMatch.getElementID()); - }) - .filter(name -> StringUtils.isNotEmpty(name) && !name.contains("%")) - .collect(Collectors.toSet()); - - LLMSchema llmSchema = new LLMSchema(); - llmSchema.setDomainName(domainName); - llmSchema.setFieldNameList(new ArrayList<>(fieldNameList)); - llmReq.setSchema(llmSchema); - - log.info("requestLLM request, domainId:{},llmReq:{}", domainId, llmReq); - String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); - - RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(JsonUtil.toString(llmReq), headers); - - ResponseEntity responseEntity = restTemplate.exchange(questUrl, HttpMethod.POST, entity, - LLMResp.class); - - log.info("requestLLM response, questUrl:{} \n entity:{} \n body:{}", questUrl, entity, - responseEntity.getBody()); - return responseEntity.getBody(); - } - - protected Integer getDomainId(QueryContextReq queryContext, ChatContext chatCtx) { - SchemaMapInfo mapInfo = queryContext.getMapInfo(); - Set matchedDomains = mapInfo.getMatchedDomains(); - Map domainQueryModes = new HashMap<>(); - for (Integer matchedDomain : matchedDomains) { - domainQueryModes.put(matchedDomain, new LLMSemanticQuery()); - } - List domainResolverList = SpringFactoriesLoader.loadFactories(DomainResolver.class, - Thread.currentThread().getContextClassLoader()); - Optional domainId = domainResolverList.stream() - .map(domainResolver -> domainResolver.resolve(domainQueryModes, queryContext, chatCtx, - queryContext.getMapInfo())).filter(d -> d > 0).findFirst(); - if (domainId.isPresent()) { - return domainId.get(); - } - return 0; - } -} - - diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java deleted file mode 100644 index 4190c7012..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParser.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.tencent.supersonic.chat.application.parser; - -import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.query.MetricSemanticQuery; -import com.tencent.supersonic.chat.application.query.RuleSemanticQuery; -import com.tencent.supersonic.chat.application.query.RuleSemanticQueryManager; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.enums.TimeDimensionEnum; -import java.time.LocalDate; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.Stack; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.collections.CollectionUtils; -import org.apache.logging.log4j.util.Strings; - -public class TimeSemanticParser implements SemanticParser { - - private static final Pattern recentPeriodPattern = Pattern.compile( - ".*(?(近|过去)((?\\d+)|(?[一二三四五六七八九十百千万亿]+))个?(?[天周月年])).*"); - - private int zhNumParse(String zhNumStr) { - Stack stack = new Stack<>(); - String numStr = "一二三四五六七八九"; - String unitStr = "十百千万亿"; - - String[] ssArr = zhNumStr.split(""); - for (String e : ssArr) { - int numIndex = numStr.indexOf(e); - int unitIndex = unitStr.indexOf(e); - if (numIndex != -1) { - stack.push(numIndex + 1); - } else if (unitIndex != -1) { - int unitNum = (int) Math.pow(10, unitIndex + 1); - if (stack.isEmpty()) { - stack.push(unitNum); - } else { - stack.push(stack.pop() * unitNum); - } - } - } - - return stack.stream().mapToInt(s -> s).sum(); - } - - @Override - public void parse(QueryContextReq queryContext, ChatContext chatContext) { - Matcher m = recentPeriodPattern.matcher(queryContext.getQueryText()); - if (m.matches()) { - int num = 0; - String enNum = m.group("enNum"); - String zhNum = m.group("zhNum"); - if (enNum != null) { - num = Integer.parseInt(enNum); - } else if (zhNum != null) { - num = zhNumParse(zhNum); - } - if (num > 0) { - DateConf info = new DateConf(); - String zhPeriod = m.group("zhPeriod"); - int days; - switch (zhPeriod) { - case "周": - days = 7; - info.setPeriod(Constants.WEEK); - break; - case "月": - days = 30; - info.setPeriod(Constants.MONTH); - break; - case "年": - days = 365; - info.setPeriod(Constants.YEAR); - break; - default: - days = 1; - info.setPeriod(Constants.DAY); - } - days = days * num; - info.setDateMode(DateConf.DateMode.RECENT_UNITS); - String text = "近" + num + zhPeriod; - if (Strings.isNotEmpty(m.group("periodStr"))) { - text = m.group("periodStr"); - } - info.setText(text); - info.setStartDate(LocalDate.now().minusDays(days).toString()); - info.setUnit(num); - //queryContext.getParseInfo().setDateInfo(info); - for (SemanticQuery query : queryContext.getCandidateQueries()) { - if (query instanceof MetricSemanticQuery) { - query.getParseInfo().setDateInfo(info); - } - } - doParseOnlyTime(queryContext, chatContext, info); - } - } - } - - protected void doParseOnlyTime(QueryContextReq queryContext, ChatContext chatContext, DateConf info) { - if (!queryContext.getCandidateQueries().isEmpty() || chatContext.getParseInfo() == null || Objects.isNull( - info.getText())) { - return; - } - if (info.getText().equals(queryContext.getQueryText()) && queryContext.getMapInfo().getDomainElementMatches() - .isEmpty() - ) { - if (Objects.nonNull(chatContext.getParseInfo().getQueryMode()) && Objects.nonNull( - chatContext.getParseInfo().getDomainId()) && chatContext.getParseInfo().getDomainId() > 0) { - if (Objects.nonNull(chatContext.getParseInfo().getDateInfo()) && !chatContext.getParseInfo() - .getDateInfo().getPeriod().equals(info.getPeriod())) { - if (!CollectionUtils.isEmpty(chatContext.getParseInfo().getDimensions())) { - String dateField = TimeDimensionEnum.DAY.getName(); - if (Constants.MONTH.equals(chatContext.getParseInfo().getDateInfo().getPeriod())) { - dateField = TimeDimensionEnum.MONTH.getName(); - } - if (Constants.WEEK.equals(chatContext.getParseInfo().getDateInfo().getPeriod())) { - dateField = TimeDimensionEnum.WEEK.getName(); - } - Set dimensions = new HashSet<>(); - for (SchemaItem schemaItem : chatContext.getParseInfo().getDimensions()) { - if (schemaItem.getBizName().equals(dateField)) { - continue; - } - dimensions.add(schemaItem); - } - chatContext.getParseInfo().setDimensions(dimensions); - } - } - chatContext.getParseInfo().setDateInfo(info); - RuleSemanticQuery semanticQuery = RuleSemanticQueryManager.create( - chatContext.getParseInfo().getQueryMode()); - semanticQuery.setParseInfo(chatContext.getParseInfo()); - queryContext.getCandidateQueries().add(semanticQuery); - } - } - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityDetail.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityDetail.java deleted file mode 100644 index db626d7af..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityDetail.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -@Component -public class EntityDetail extends EntitySemanticQuery { - - public static String QUERY_MODE = "ENTITY_DETAIL"; - - public EntityDetail() { - super(); - queryMatcher.addOption(DIMENSION, REQUIRED, AT_LEAST, 1) - .addOption(VALUE, REQUIRED, AT_LEAST, 1); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - ContextHelper.addIfEmpty(chatContext.getParseInfo().getDimensionFilters(), - parseInfo.getDimensionFilters()); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java deleted file mode 100644 index aadc64412..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListFilter.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.*; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.*; -import static com.tencent.supersonic.common.constant.Constants.DAY; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatDefaultRichConfig; -import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; -import com.tencent.supersonic.chat.domain.service.ConfigService; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.Order; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; - -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.Objects; -import java.util.Set; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Component; - - -@Slf4j -@Component -public class EntityListFilter extends EntitySemanticQuery { - - public static String QUERY_MODE = "ENTITY_LIST_FILTER"; - private static Long entityListLimit = 200L; - - - public EntityListFilter() { - super(); - queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 1) - .addOption(ENTITY, REQUIRED, AT_LEAST, 1); - } - - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.addIfEmpty(chatParseInfo.getDimensionFilters(), parseInfo.getDimensionFilters()); - parseInfo.setLimit(entityListLimit); - this.fillDateEntityFilter(parseInfo); - this.addEntityDetailAndOrderByMetric(parseInfo); - this.dealNativeQuery(parseInfo, true); - } - - - private void fillDateEntityFilter(SemanticParseInfo semanticParseInfo) { - DateConf dateInfo = new DateConf(); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setUnit(1); - dateInfo.setPeriod(DAY); - dateInfo.setText(String.format("近1天")); - semanticParseInfo.setDateInfo(dateInfo); - } - - private void addEntityDetailAndOrderByMetric(SemanticParseInfo semanticParseInfo) { - if (semanticParseInfo.getDomainId() > 0L) { - ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo( - semanticParseInfo.getDomainId()); - if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null - && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { -// SemanticParseInfo semanticParseInfo = queryContext.getParseInfo(); -// EntityRichInfo entity = chaConfigRichDesc.getChatDetailRichConfig().getEntity(); - Set dimensions = new LinkedHashSet(); -// Set primaryDimensions = this.addPrimaryDimension(entity, dimensions); - Set metrics = new LinkedHashSet(); - Set orders = new LinkedHashSet(); - ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); - if (chatDefaultConfig != null) { - chatDefaultConfig.getMetrics().stream() - .forEach(metric -> { - metrics.add(metric); - orders.add(new Order(metric.getBizName(), Constants.DESC_UPPER)); - }); - chatDefaultConfig.getDimensions().stream() -// .filter((m) -> !primaryDimensions.contains(m.getBizName())) - .forEach(dimension -> dimensions.add(dimension)); - - } - - semanticParseInfo.setDimensions(dimensions); - semanticParseInfo.setMetrics(metrics); - semanticParseInfo.setOrders(orders); - } - } - - } - - private Set addPrimaryDimension(EntityRichInfo entity, Set dimensions) { - Set primaryDimensions = new HashSet(); - DimSchemaResp dimItem = entity.getDimItem(); - if (Objects.nonNull(entity) && Objects.nonNull(dimItem)) { - SchemaItem dimension = new SchemaItem(); - BeanUtils.copyProperties(dimItem, dimension); - dimensions.add(dimension); - primaryDimensions.add(dimItem.getBizName()); - return primaryDimensions; - } else { - return primaryDimensions; - } - } - - private void dealNativeQuery(SemanticParseInfo semanticParseInfo, boolean isNativeQuery) { - if (Objects.nonNull(semanticParseInfo)) { - semanticParseInfo.setNativeQuery(isNativeQuery); - } - - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java deleted file mode 100644 index aba98b7a5..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityListTopN.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -@Component -public class EntityListTopN extends EntitySemanticQuery { - - public static String QUERY_MODE = "ENTITY_LIST_TOPN"; - - public EntityListTopN() { - super(); - queryMatcher.addOption(METRIC, REQUIRED, AT_LEAST, 1) - .setSupportOrderBy(true); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.updateTimeIfEmpty(chatParseInfo, parseInfo); - ContextHelper.addIfEmpty(chatParseInfo.getMetrics(), parseInfo.getMetrics()); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityMetricFilter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityMetricFilter.java deleted file mode 100644 index 4139f83ea..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntityMetricFilter.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.METRIC; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -@Component -public class EntityMetricFilter extends EntitySemanticQuery { - - public static String QUERY_MODE = "ENTITY_METRIC_FILTER"; - - public EntityMetricFilter() { - super(); - queryMatcher.addOption(METRIC, REQUIRED, AT_LEAST, 1) - .addOption(VALUE, REQUIRED, AT_LEAST, 1); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.addIfEmpty(chatParseInfo.getDimensionFilters(), parseInfo.getDimensionFilters()); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntitySemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntitySemanticQuery.java deleted file mode 100644 index 416af0244..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/EntitySemanticQuery.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; - -public abstract class EntitySemanticQuery extends RuleSemanticQuery { - - public EntitySemanticQuery() { - super(); - queryMatcher.addOption(ENTITY, REQUIRED, AT_LEAST, 1); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/LLMSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/LLMSemanticQuery.java deleted file mode 100644 index d7a7fbbdc..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/LLMSemanticQuery.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.EntityInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.application.DomainEntityService; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.semantic.api.core.pojo.QueryColumn; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -@Slf4j -public class LLMSemanticQuery implements SemanticQuery { - - public static String QUERY_MODE = "DSL"; - - private SemanticParseInfo semanticParse = new SemanticParseInfo(); - private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public QueryResultResp execute(User user) { - String queryMode = semanticParse.getQueryMode(); - - if (semanticParse.getDomainId() < 0 || StringUtils.isEmpty(queryMode)) { - // reach here some error may happen - log.error("not find QueryMode"); - throw new RuntimeException("not find QueryMode"); - } - QueryResultResp queryResponse = new QueryResultResp(); - QueryResultWithSchemaResp queryResult = semanticLayer.queryBySql( - SchemaInfoConverter.convertToQuerySqlReq(semanticParse), user); - - if (queryResult != null) { - queryResponse.setQueryAuthorization(queryResult.getQueryAuthorization()); - } - String sql = queryResult == null ? null : queryResult.getSql(); - List> resultList = queryResult == null ? new ArrayList<>() - : queryResult.getResultList(); - List columns = queryResult == null ? new ArrayList<>() : queryResult.getColumns(); - queryResponse.setQuerySql(sql); - queryResponse.setQueryResults(resultList); - queryResponse.setQueryColumns(columns); - queryResponse.setQueryMode(queryMode); - - // add domain info - EntityInfo entityInfo = ContextUtils.getBean(DomainEntityService.class) - .getEntityInfo(semanticParse, user); - queryResponse.setEntityInfo(entityInfo); - return queryResponse; - } - - @Override - public SemanticParseInfo getParseInfo() { - return semanticParse; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java deleted file mode 100644 index 927b4e2c9..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricCompare.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_MOST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.OPTIONAL; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.Filter; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -public class MetricCompare extends MetricSemanticQuery { - - public static String QUERY_MODE = "METRIC_COMPARE"; - public static Pattern intentWordPattern = Pattern.compile("(?i)(比较|对比)"); - - public MetricCompare() { - super(); - queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 2) - .addOption(ENTITY, OPTIONAL, AT_MOST, 1); - - queryMatcher.setSupportCompare(true); - queryMatcher.setSupportOrderBy(true); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public List match(List candidateElementMatches, QueryContextReq queryCtx) { - if (intentWordPattern.matcher(queryCtx.getQueryText()).find()) { - return super.match(candidateElementMatches, queryCtx); - } else { - return new ArrayList<>(); - } - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.updateTimeIfEmpty(chatParseInfo, parseInfo); - ContextHelper.addIfEmpty(chatParseInfo.getMetrics(), parseInfo.getMetrics()); - mergeAppend(chatParseInfo.getDimensionFilters(), parseInfo.getDimensionFilters()); - addCompareDimension(parseInfo); - parseInfo.setBonus(2 * 1.0); - } - - private void addCompareDimension(SemanticParseInfo semanticParseInfo) { - if (!semanticParseInfo.getDimensionFilters().isEmpty()) { - Set dimensions = semanticParseInfo.getDimensions().stream().map(d -> d.getBizName()).collect( - Collectors.toSet()); - log.info("addCompareDimension before [{}]", dimensions); - semanticParseInfo.getDimensionFilters().stream().filter(d -> d.getOperator().equals(FilterOperatorEnum.IN)) - .forEach( - d -> { - if (!dimensions.contains(d.getBizName())) { - SchemaItem schemaItem = new SchemaItem(); - schemaItem.setBizName(d.getBizName()); - schemaItem.setId(d.getElementID()); - semanticParseInfo.getDimensions().add(schemaItem); - dimensions.add(d.getBizName()); - } - } - ); - log.info("addCompareDimension after [{}]", dimensions); - } - } - - private void mergeAppend(Set from, Set to) { - if (!from.isEmpty()) { - for (Filter filter : from) { - if (FilterOperatorEnum.EQUALS.equals(filter.getOperator()) || FilterOperatorEnum.IN.equals( - filter.getOperator())) { - Optional toAdd = to.stream() - .filter(t -> t.getBizName().equalsIgnoreCase(filter.getBizName())).findFirst(); - if (toAdd.isPresent()) { - if (FilterOperatorEnum.EQUALS.equals(toAdd.get().getOperator()) || FilterOperatorEnum.IN.equals( - toAdd.get().getOperator())) { - Set vals = new HashSet<>(); - if (toAdd.get().getOperator().equals(FilterOperatorEnum.IN)) { - vals.addAll((List) (toAdd.get().getValue())); - } else { - vals.add(toAdd.get().getValue()); - } - if (filter.getOperator().equals(FilterOperatorEnum.IN)) { - vals.addAll((List) (filter.getValue())); - } else { - vals.add(filter.getValue()); - } - toAdd.get().setValue(new ArrayList<>(vals)); - toAdd.get().setOperator(FilterOperatorEnum.IN); - continue; - } - } - } - to.add(filter); - } - } - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricDomain.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricDomain.java deleted file mode 100644 index ed38701dc..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricDomain.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.*; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.*; - -@Component -public class MetricDomain extends MetricSemanticQuery { - - public static String QUERY_MODE = "METRIC_DOMAIN"; - - public MetricDomain() { - super(); - queryMatcher.addOption(DOMAIN, REQUIRED, AT_LEAST, 1); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.updateTimeIfEmpty(chatParseInfo, parseInfo); - ContextHelper.addIfEmpty(chatParseInfo.getMetrics(), parseInfo.getMetrics()); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricFilter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricFilter.java deleted file mode 100644 index a1ccd7975..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.*; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.*; - -@Component -public class MetricFilter extends MetricSemanticQuery { - - public static String QUERY_MODE = "METRIC_FILTER"; - - public MetricFilter() { - super(); - queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 1) - .addOption(ENTITY, OPTIONAL, AT_MOST, 1); - - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.updateTimeIfEmpty(chatParseInfo, parseInfo); - ContextHelper.addIfEmpty(chatParseInfo.getMetrics(), parseInfo.getMetrics()); - ContextHelper.addIfEmpty(chatParseInfo.getDimensionFilters(), parseInfo.getDimensionFilters()); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricGroupBy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricGroupBy.java deleted file mode 100644 index b65909e64..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricGroupBy.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.*; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.*; - -@Component -public class MetricGroupBy extends MetricSemanticQuery { - - public static String QUERY_MODE = "METRIC_GROUPBY"; - - public MetricGroupBy() { - super(); - queryMatcher.addOption(DIMENSION, REQUIRED, AT_LEAST, 1); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.updateTimeIfEmpty(chatParseInfo, parseInfo); - ContextHelper.addIfEmpty(chatParseInfo.getMetrics(), parseInfo.getMetrics()); - ContextHelper.addIfEmpty(chatParseInfo.getDimensions(), parseInfo.getDimensions()); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricOrderBy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricOrderBy.java deleted file mode 100644 index 9eb671d21..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricOrderBy.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.utils.ContextHelper; -import org.springframework.stereotype.Component; - -@Component -public class MetricOrderBy extends RuleSemanticQuery { - - public static String QUERY_MODE = "METRIC_ORDERBY"; - - public MetricOrderBy() { - super(); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public void inheritContext(ChatContext chatContext) { - SemanticParseInfo chatParseInfo = chatContext.getParseInfo(); - ContextHelper.updateTimeIfEmpty(chatParseInfo, parseInfo); - ContextHelper.addIfEmpty(chatParseInfo.getMetrics(), parseInfo.getMetrics()); - ContextHelper.addIfEmpty(chatParseInfo.getDimensions(), parseInfo.getDimensions()); - ContextHelper.addIfEmpty(chatParseInfo.getDimensionFilters(), parseInfo.getDimensionFilters()); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricSemanticQuery.java deleted file mode 100644 index 95797c2d7..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/MetricSemanticQuery.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.METRIC; -import static com.tencent.supersonic.chat.application.query.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption.REQUIRED; - -public abstract class MetricSemanticQuery extends RuleSemanticQuery { - - public MetricSemanticQuery() { - super(); - queryMatcher.addOption(METRIC, REQUIRED, AT_LEAST, 1); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java deleted file mode 100644 index 93888dd12..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQuery.java +++ /dev/null @@ -1,89 +0,0 @@ - -package com.tencent.supersonic.chat.application.query; - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.*; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.application.DomainEntityService; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.semantic.api.core.pojo.QueryColumn; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; -import lombok.ToString; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -import java.io.Serializable; -import java.util.*; - -@Slf4j -@ToString -public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { - - protected SemanticParseInfo parseInfo = new SemanticParseInfo(); - protected QueryMatcher queryMatcher = new QueryMatcher(); - protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - public RuleSemanticQuery() { - RuleSemanticQueryManager.register(this); - } - - public List match(List candidateElementMatches, - QueryContextReq queryCtx) { - return queryMatcher.match(candidateElementMatches); - } - - public abstract void inheritContext(ChatContext chatContext); - - @Override - public QueryResultResp execute(User user) { - String queryMode = parseInfo.getQueryMode(); - - if (parseInfo.getDomainId() < 0 || StringUtils.isEmpty(queryMode)) { - // reach here some error may happen - log.error("not find QueryMode"); - throw new RuntimeException("not find QueryMode"); - } - - List semanticQueryModes = RuleSemanticQueryManager.getSemanticQueryModes(); - if (!semanticQueryModes.contains(parseInfo.getQueryMode())) { - return null; - } - - QueryResultResp queryResponse = new QueryResultResp(); - QueryResultWithSchemaResp queryResult = semanticLayer.queryByStruct( - SchemaInfoConverter.convertTo(parseInfo), user); - - - if (queryResult != null) { - queryResponse.setQueryAuthorization(queryResult.getQueryAuthorization()); - } - String sql = queryResult == null ? null : queryResult.getSql(); - List> resultList = queryResult == null ? new ArrayList<>() - : queryResult.getResultList(); - List columns = queryResult == null ? new ArrayList<>() : queryResult.getColumns(); - queryResponse.setQuerySql(sql); - queryResponse.setQueryResults(resultList); - queryResponse.setQueryColumns(columns); - queryResponse.setQueryMode(queryMode); - - // add domain info - EntityInfo entityInfo = ContextUtils.getBean(DomainEntityService.class) - .getEntityInfo(parseInfo, user); - queryResponse.setEntityInfo(entityInfo); - return queryResponse; - } - - @Override - public SemanticParseInfo getParseInfo() { - return parseInfo; - } - - public void setParseInfo(SemanticParseInfo parseInfo) { - this.parseInfo = parseInfo; - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQueryManager.java b/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQueryManager.java deleted file mode 100644 index 74c608dec..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/RuleSemanticQueryManager.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tencent.supersonic.chat.application.query; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; - -/** - * RuleSemanticQueryManager - */ -public class RuleSemanticQueryManager { - - private static Map semanticQueryMap = new ConcurrentHashMap<>(); - - public static RuleSemanticQuery create(String queryMode) { - RuleSemanticQuery semanticQuery = semanticQueryMap.get(queryMode); - if (Objects.isNull(semanticQuery)) { - throw new RuntimeException("no supported queryMode :" + queryMode); - } - try { - return semanticQuery.getClass().getDeclaredConstructor().newInstance(); - } catch (Exception e) { - throw new RuntimeException("no supported queryMode :" + queryMode); - } - } - - public static void register(RuleSemanticQuery query) { - semanticQueryMap.put(query.getQueryMode(), query); - } - - public static List getSemanticQueries() { - return new ArrayList<>(semanticQueryMap.values()); - } - - public static List getSemanticQueryModes() { - return new ArrayList<>(semanticQueryMap.keySet()); - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatAggConfig.java similarity index 87% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatAggConfig.java index 329dc910f..32f3ba11c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatAggConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggRichConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatAggRichConfig.java similarity index 88% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggRichConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatAggRichConfig.java index 66b91be47..fbe4b6f96 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatAggRichConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatAggRichConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java similarity index 67% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java index e26fb41f6..c41c08960 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java @@ -1,11 +1,13 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.enums.StatusEnum; -import com.tencent.supersonic.common.util.RecordInfo; -import java.util.List; +import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestion; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.RecordInfo; import lombok.Data; import lombok.ToString; +import java.util.List; + @Data @ToString public class ChatConfig { @@ -27,6 +29,8 @@ public class ChatConfig { */ private ChatAggConfig chatAggConfig; + private List recommendedQuestions; + /** * available status */ @@ -37,4 +41,4 @@ public class ChatConfig { */ private RecordInfo recordInfo; -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBaseReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigBaseReq.java similarity index 61% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBaseReq.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigBaseReq.java index 4f0b1b1e3..c172bf8b4 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigBaseReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigBaseReq.java @@ -1,12 +1,13 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.enums.StatusEnum; - -import java.util.List; +import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestion; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; import lombok.Data; import lombok.ToString; +import java.util.List; + /** * extended information command about domain */ @@ -26,9 +27,15 @@ public class ChatConfigBaseReq { */ private ChatAggConfig chatAggConfig; + + /** + * the recommended questions about the domain + */ + private List recommendedQuestions; + /** * available status */ private StatusEnum status; -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReqReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigEditReqReq.java similarity index 67% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReqReq.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigEditReqReq.java index 6557385c4..441e8f59d 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigEditReqReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigEditReqReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigFilter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilter.java similarity index 65% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigFilter.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilter.java index 252e3dc62..721bd4ce0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigFilter.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilter.java @@ -1,6 +1,6 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigFilterInternal.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java similarity index 72% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigFilterInternal.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java index c7ce5ed30..d6c634ca5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigFilterInternal.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigResp.java similarity index 61% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigResp.java index acd1c40a5..6c7ecba88 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigResp.java @@ -1,7 +1,11 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; + +import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestion; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; -import com.tencent.supersonic.common.enums.StatusEnum; import java.util.Date; +import java.util.List; + import lombok.Data; @Data @@ -15,6 +19,8 @@ public class ChatConfigResp { private ChatAggConfig chatAggConfig; + private List recommendedQuestions; + /** * available status */ diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigRich.java similarity index 64% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigRich.java index 84f271e23..f2913012b 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatConfigRichResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigRich.java @@ -1,12 +1,14 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.enums.StatusEnum; +import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestion; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; import java.util.Date; import java.util.List; + import lombok.Data; @Data -public class ChatConfigRichResp { +public class ChatConfigRich { private Long id; @@ -19,6 +21,8 @@ public class ChatConfigRichResp { private ChatDetailRichConfig chatDetailRichConfig; + private List recommendedQuestions; + /** * available status */ @@ -28,4 +32,4 @@ public class ChatConfigRichResp { private String updatedBy; private Date createdAt; private Date updatedAt; -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDefaultConfig.java similarity index 78% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDefaultConfig.java index f25601e3a..c69eeade3 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDefaultConfig.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.constant.Constants; +import com.tencent.supersonic.common.pojo.Constants; import lombok.Data; import java.util.ArrayList; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultRichConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDefaultRichConfig.java similarity index 54% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultRichConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDefaultRichConfig.java index 079ab0c92..5b63e9ee7 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDefaultRichConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDefaultRichConfig.java @@ -1,8 +1,8 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.pojo.SchemaItem; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.common.pojo.Constants; import lombok.Data; import java.util.List; @@ -10,8 +10,9 @@ import java.util.List; @Data public class ChatDefaultRichConfig { - private List dimensions; - private List metrics; + private List dimensions; + private List metrics; + /** * default time span unit diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDetailConfig.java similarity index 89% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDetailConfig.java index a85a1f85d..42b6f7d98 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDetailConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailRichConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDetailRichConfig.java similarity index 90% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailRichConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDetailRichConfig.java index 35263cdd1..e7f372baf 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ChatDetailRichConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatDetailRichConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/DefaultMetric.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetric.java similarity index 93% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/DefaultMetric.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetric.java index 753087740..e00e36fe5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/DefaultMetric.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetric.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/DefaultMetricInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java similarity index 78% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/DefaultMetricInfo.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java index 4ba686464..227f3f679 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/DefaultMetricInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java @@ -1,6 +1,6 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.constant.Constants; +import com.tencent.supersonic.common.pojo.Constants; import lombok.Data; import lombok.ToString; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/Dim4Dict.java similarity index 87% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/Dim4Dict.java index de36c3994..48f364070 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Dim4Dict.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/Dim4Dict.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import java.util.List; import lombok.AllArgsConstructor; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/Entity.java similarity index 88% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/Entity.java index d5ca4508a..26a1d415c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/Entity.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/Entity.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import java.util.List; import lombok.AllArgsConstructor; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityDetailData.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityDetailData.java similarity index 80% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityDetailData.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityDetailData.java index 4e8ef93b6..f76cfcb97 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityDetailData.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityDetailData.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import java.util.List; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityInternalDetail.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityInternalDetail.java new file mode 100644 index 000000000..0c2935a36 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityInternalDetail.java @@ -0,0 +1,14 @@ +package com.tencent.supersonic.chat.config; + + +import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import java.util.List; +import lombok.Data; + +@Data +public class EntityInternalDetail { + + List dimensionList; + List metricList; +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityRichInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityRichInfo.java new file mode 100644 index 000000000..023b6e770 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/EntityRichInfo.java @@ -0,0 +1,16 @@ +package com.tencent.supersonic.chat.config; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; + +import java.util.List; +import lombok.Data; + +@Data +public class EntityRichInfo { + /** + * entity alias + */ + private List names; + + private SchemaElement dimItem; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallConfig.java new file mode 100644 index 000000000..1fd4a4083 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallConfig.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.chat.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Data +public class FunctionCallConfig { + @Value("${functionCall.url:}") + private String url; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ItemVisibility.java similarity index 86% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ItemVisibility.java index b6bd242a6..e554e92ed 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibility.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ItemVisibility.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import java.util.ArrayList; import java.util.List; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibilityInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ItemVisibilityInfo.java similarity index 81% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibilityInfo.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/ItemVisibilityInfo.java index a4364a0d9..7a66b15df 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/ItemVisibilityInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ItemVisibilityInfo.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import java.util.List; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeAdvancedConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/KnowledgeAdvancedConfig.java similarity index 85% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeAdvancedConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/KnowledgeAdvancedConfig.java index 931ed7de3..8ba0dabf1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeAdvancedConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/KnowledgeAdvancedConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/KnowledgeInfo.java similarity index 82% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/KnowledgeInfo.java index 9481228d5..7a0686ed0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/KnowledgeInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/KnowledgeInfo.java @@ -1,8 +1,7 @@ -package com.tencent.supersonic.chat.domain.pojo.config; +package com.tencent.supersonic.chat.config; -import com.tencent.supersonic.common.enums.TypeEnums; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; -import java.util.List; import javax.validation.constraints.NotNull; import lombok.Data; @@ -35,4 +34,4 @@ public class KnowledgeInfo { private KnowledgeAdvancedConfig knowledgeAdvancedConfig; -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/LLMConfig.java similarity index 86% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/config/LLMConfig.java index fc22c872d..c73743545 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/config/LLMConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/LLMConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.config; +package com.tencent.supersonic.chat.config; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/DomainInfos.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/DomainInfos.java deleted file mode 100644 index d6936d1c5..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/DomainInfos.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; - -import com.tencent.supersonic.common.nlp.ItemDO; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import lombok.Data; -import org.apache.commons.collections.CollectionUtils; - -/** - * DomainInfos - */ -@Data -public class DomainInfos implements Serializable { - - private List domains = new ArrayList<>(); - private List dimensions = new ArrayList<>(); - private List metrics = new ArrayList<>(); - private List entities = new ArrayList<>(); - - public Map getDomainToName() { - if (CollectionUtils.isEmpty(domains)) { - return new HashMap(); - } - return domains.stream().collect( - Collectors.toMap(ItemDO::getDomain, ItemDO::getName, (value1, value2) -> value2) - ); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMReq.java deleted file mode 100644 index a656d69c9..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMReq.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; - -import lombok.Data; - -@Data -public class LLMReq { - - private String queryText; - private LLMSchema schema; - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMSchema.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMSchema.java deleted file mode 100644 index a94141bcc..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMSchema.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; - -import java.util.List; -import lombok.Data; - -@Data -public class LLMSchema { - - private String domainName; - - private List fieldNameList; - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/QueryData.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/QueryData.java deleted file mode 100644 index 792e1bde9..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/QueryData.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; - - -import com.tencent.supersonic.chat.api.pojo.Filter; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.Order; -import com.tencent.supersonic.common.pojo.SchemaItem; -import lombok.Data; - -@Data -public class QueryData { - - Long domainId = 0L; - Set metrics = new HashSet<>(); - Set dimensions = new HashSet<>(); - Set dimensionFilters = new HashSet<>(); - Set metricFilters = new HashSet<>(); - private Set orders = new HashSet<>(); - private DateConf dateInfo; - private Long limit; - private Boolean nativeQuery = false; - - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/RecommendResponse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/RecommendResponse.java deleted file mode 100644 index 37365692e..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/RecommendResponse.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; - -import java.io.Serializable; -import java.util.List; -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -@Data -@Setter -@Getter -public class RecommendResponse { - - private List dimensions; - private List metrics; - - - public static class Item implements Serializable { - - private Integer domain; - private String name; - private String bizName; - - public Integer getDomain() { - return domain; - } - - public void setDomain(Integer domain) { - this.domain = domain; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getBizName() { - return bizName; - } - - public void setBizName(String bizName) { - this.bizName = bizName; - } - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/SchemaElementOption.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/SchemaElementOption.java deleted file mode 100644 index 9f1e39b8b..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/SchemaElementOption.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; - -public enum SchemaElementOption { - REQUIRED, - OPTIONAL, - UNUSED -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityInternalDetail.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityInternalDetail.java deleted file mode 100644 index 3926703a7..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityInternalDetail.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.config; - - -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import java.util.List; -import lombok.Data; - -@Data -public class EntityInternalDetail { - - List dimensionList; - List metricList; -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java deleted file mode 100644 index 4cbf8cc60..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/config/EntityRichInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.config; - -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import java.util.List; -import lombok.Data; - -@Data -public class EntityRichInfo { - -// private Long domainId; -// private String domainName; -// private String domainBizName; - - /** - * entity alias - */ - private List names; - - private DimSchemaResp dimItem; -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/NameNature.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/NameNature.java deleted file mode 100644 index fe45d8060..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/NameNature.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.search; - -import java.io.Serializable; -import java.util.List; -import lombok.Data; -import lombok.ToString; - -@Data -@ToString -public class NameNature implements Serializable { - - private String name; - private List natures; - - public NameNature() { - } - - public NameNature(String name, List natures) { - this.name = name; - this.natures = natures; - } -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/QueryState.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/QueryState.java deleted file mode 100644 index 257c10416..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/QueryState.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tencent.supersonic.chat.domain.pojo.search; - -public enum QueryState { - NORMAL(0), - SEARCH_EXCEPTION(1), - EMPTY(2), - INVALID(3); - - private int state; - - QueryState(int state) { - this.state = state; - } - - public int getState() { - return state; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatQueryRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatQueryRepository.java deleted file mode 100644 index cb5b9b4b3..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatQueryRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tencent.supersonic.chat.domain.repository; - -import com.github.pagehelper.PageInfo; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDO; -import com.tencent.supersonic.chat.domain.pojo.chat.ChatQueryVO; -import com.tencent.supersonic.chat.domain.pojo.chat.PageQueryInfoReq; - -public interface ChatQueryRepository { - - PageInfo getChatQuery(PageQueryInfoReq pageQueryInfoCommend, long chatId); - - void createChatQuery(QueryResultResp queryResponse, QueryContextReq queryContext, ChatContext chatCtx); - - ChatQueryDO getLastChatQuery(long chatId); - - int updateChatQuery(ChatQueryDO chatQueryDO); -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java deleted file mode 100644 index 1b1a14c66..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ConfigService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tencent.supersonic.chat.domain.service; - - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBaseReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReqReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; - -import java.util.List; - -public interface ConfigService { - - Long addConfig(ChatConfigBaseReq extendBaseCmd, User user); - - Long editConfig(ChatConfigEditReqReq extendEditCmd, User user); - - List search(ChatConfigFilter filter, User user); - - ChatConfigRichResp getConfigRichInfo(Long domainId); - - ChatConfigResp fetchConfigByDomainId(Long domainId); - - List getAllChatRichConfig(); -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/QueryService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/QueryService.java deleted file mode 100644 index f80be7fb7..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/QueryService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tencent.supersonic.chat.domain.service; - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.domain.pojo.chat.QueryData; - -/*** - * QueryService for query and search - */ -public interface QueryService { - - QueryResultResp executeQuery(QueryContextReq queryCtx) throws Exception; - - SemanticParseInfo queryContext(QueryContextReq queryCtx); - - QueryResultResp executeDirectQuery(QueryData queryData, User user) throws Exception; -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/RecommendService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/RecommendService.java deleted file mode 100644 index 245f82c0a..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/RecommendService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tencent.supersonic.chat.domain.service; - - -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.domain.pojo.chat.RecommendResponse; - -/*** - * Recommend Service - */ -public interface RecommendService { - - RecommendResponse recommend(QueryContextReq queryCtx); - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/SearchService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/SearchService.java deleted file mode 100644 index d99f276ed..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/SearchService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tencent.supersonic.chat.domain.service; - -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.domain.pojo.search.SearchResult; -import java.util.List; - -/** - * search service - */ -public interface SearchService { - - List search(QueryContextReq queryCtx); - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java deleted file mode 100644 index bc5190667..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ContextHelper.java +++ /dev/null @@ -1,263 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.Filter; -import com.tencent.supersonic.chat.api.pojo.QueryMatchInfo; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - -public class ContextHelper { - - public static Comparator> DomainStatComparator - = (o1, o2) -> domainSchemaElementCountComparator(o1.getValue(), o2.getValue()); - public static Comparator> SemanticQueryStatComparator - = (o1, o2) -> domainSchemaElementCountComparator(o1.getValue(), o2.getValue()); - /** - * similarity desc - */ - public static Comparator schemaElementMatchComparatorBySimilarity - = new Comparator() { - @Override - public int compare(SchemaElementMatch o1, SchemaElementMatch o2) { - return (int) ((o2.getSimilarity() - o1.getSimilarity()) * 100); - } - }; - - public static void updateDomain(SemanticParseInfo from, SemanticParseInfo to) { - if (from != null && from.getDomainId() != null) { - to.setDomainId(from.getDomainId()); - } - if (from != null && from.getDomainName() != null) { - to.setDomainName(from.getDomainName()); - } - } - - public static void updateEntity(SemanticParseInfo from, SemanticParseInfo to) { - if (from != null && from.getEntity() != null && from.getEntity() > 0) { - to.setEntity(from.getEntity()); - } - } - - public static void updateSemanticQuery(SemanticParseInfo from, SemanticParseInfo to) { - to.setQueryMode(from.getQueryMode()); - } - - /** - * update time if from is not null - * - * @param from - * @param to - */ - public static void updateTime(SemanticParseInfo from, SemanticParseInfo to) { - if (from != null && from.getDateInfo() != null) { - to.setDateInfo(from.getDateInfo()); - } - } - - /** - * update time if time is null and from is not null - * - * @param from - * @param to - */ - public static void updateTimeIfEmpty(SemanticParseInfo from, SemanticParseInfo to) { - if (from != null && from.getDateInfo() != null && to.getDateInfo() == null) { - to.setDateInfo(from.getDateInfo()); - } - } - - public static void updateDomainIfEmpty(SemanticParseInfo from, SemanticParseInfo to) { - if (from != null && from.getDomainId() != null && to.getDomainId() == null) { - to.setDomainId(from.getDomainId()); - } - - if (from != null && from.getDomainName() != null && to.getDomainName() == null) { - to.setDomainName(from.getDomainName()); - } - } - - /** - * add from to list if list is empty and from is not empty - * - * @param from - * @param to - */ - public static void addIfEmpty(Set from, Set to) { - if (to.isEmpty() && !from.isEmpty()) { - to.addAll(from); - } - } - - /*** - * append from to list if from is not empty - * @param from - * @param to - */ - public static void appendList(Set from, Set to) { - if (!from.isEmpty()) { - to.addAll(from); - } - } - - /** - * update list if from is not empty - * - * @param from - * @param to - */ - public static void updateList(Set from, Set to) { - if (!from.isEmpty()) { - to.clear(); - to.addAll(from); - } - } - - /** - * count desc > similarity desc - */ - public static int domainSchemaElementCountComparator(QueryMatchInfo o1, QueryMatchInfo o2) { - int difference = o1.getCount() - o2.getCount(); - if (difference == 0) { - return (int) ((o1.getMaxSimilarity() - o2.getMaxSimilarity()) * 100); - } - return difference; - } - - public static void setEntityId(Long dimensionId, String value, ChatConfigRichResp chaConfigRichDesc, - SemanticParseInfo semanticParseInfo) { - if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null - && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { - DimSchemaResp dimSchemaResp = chaConfigRichDesc.getChatDetailRichConfig().getEntity().getDimItem(); - if (Objects.nonNull(dimSchemaResp) && StringUtils.isNumeric(value)) { - semanticParseInfo.setEntity(Long.valueOf(value)); - } - } - } - - - public static boolean hasEntityId(ChatContext chatCtx) { - if (chatCtx != null && chatCtx.getParseInfo() != null) { - return chatCtx.getParseInfo().getEntity() > 0; - } - return false; - } - - /*** - * merge Context SchemaElementMatch - * @param toSchemaElementMatch - * @param elementMatches - * @param schemaElementTypes - * @param contextSemanticParse - */ - public static void mergeContextSchemaElementMatch(List toSchemaElementMatch, - List elementMatches, List schemaElementTypes, - SemanticParseInfo contextSemanticParse) { - - SchemaElementMatch domainMatch = SchemaElementMatch.builder() - .elementType(SchemaElementType.DOMAIN) - .elementID(contextSemanticParse.getDomainId().intValue()) - .similarity(1.0) - .word(contextSemanticParse.getDomainName()) - .detectWord(contextSemanticParse.getDomainName()) - .build(); - toSchemaElementMatch.add(domainMatch); - - for (SchemaElementType schemaElementType : schemaElementTypes) { - switch (schemaElementType) { - case DIMENSION: - if (contextSemanticParse.getDimensions().size() > 0) { - for (SchemaItem dimension : contextSemanticParse.getDimensions()) { - addSchemaElementMatch(toSchemaElementMatch, elementMatches, SchemaElementType.DIMENSION, - dimension); - } - } - break; - case METRIC: - if (contextSemanticParse.getMetrics().size() > 0) { - for (SchemaItem metric : contextSemanticParse.getMetrics()) { - addSchemaElementMatch(toSchemaElementMatch, elementMatches, SchemaElementType.METRIC, - metric); - } - } - break; - case VALUE: - if (contextSemanticParse.getDimensionFilters().size() > 0) { - for (Filter chatFilter : contextSemanticParse.getDimensionFilters()) { - if (!isInSchemaElementMatchList(elementMatches, SchemaElementType.VALUE, - chatFilter.getValue().toString())) { - List values = new ArrayList<>(); - if (chatFilter.getOperator().equals(FilterOperatorEnum.IN)) { - values.addAll((List) chatFilter.getValue()); - } else { - values.add(chatFilter.getValue().toString()); - } - for (String value : values) { - toSchemaElementMatch.add( - getSchemaElementMatchByContext(chatFilter.getElementID().intValue(), - value, SchemaElementType.VALUE)); - } - } - } - } - break; - default: - } - } - } - - /** - * is that SchemaElementType and word in SchemaElementMatch list - * - * @param elementMatches - * @param schemaElementType - * @param word - * @return - */ - private static boolean isInSchemaElementMatchList(List elementMatches, - SchemaElementType schemaElementType, String word) { - if (CollectionUtils.isEmpty(elementMatches)) { - return false; - } - Long num = elementMatches.stream() - .filter(element -> element != null && element.getElementType().equals(schemaElementType)).count(); - return num > 0; - } - - private static void addSchemaElementMatch(List toAddSchemaElementMatch, - List elementMatches, SchemaElementType schemaElementType, SchemaItem schemaItem) { - if (Objects.isNull(schemaItem) || Objects.isNull(schemaItem.getId()) || Objects.isNull(schemaItem.getName())) { - return; - } - if (!isInSchemaElementMatchList(elementMatches, schemaElementType, schemaItem.getName())) { - toAddSchemaElementMatch.add( - getSchemaElementMatchByContext(schemaItem.getId().intValue(), schemaItem.getName(), - schemaElementType)); - } - } - - private static SchemaElementMatch getSchemaElementMatchByContext(int id, String word, - SchemaElementType schemaElementType) { - return SchemaElementMatch.builder() - .elementID(id) - .elementType(schemaElementType) - .word(word) - .detectWord(word) - .similarity(0.5) - .build(); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java deleted file mode 100644 index 7146d95fe..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DefaultMetricUtils.java +++ /dev/null @@ -1,439 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - -import static java.time.LocalDate.now; - -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.*; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.application.parser.DomainResolver; -import com.tencent.supersonic.chat.application.query.*; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatDefaultRichConfig; -import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -@Slf4j -@Component -public class DefaultMetricUtils { - - @Autowired - private ConfigServiceImpl configService; - - /** - * supplementary default metric date dimension - */ - public void fillDefaultMetric(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, - ChatContext chatContext) { - String queryMode = semanticParseInfo.getQueryMode(); - if (StringUtils.isNotEmpty(queryMode)) { - Map semanticQuery = RuleSemanticQueryManager.getSemanticQueries().stream().collect(Collectors.toMap(RuleSemanticQuery::getQueryMode, Function.identity())); - RuleSemanticQuery ruleSemanticQuery = semanticQuery.get(queryMode); - if (semanticParseInfo == null) { - return; - } -// if (!EntityListFilter.QUERY_MODE.equals(queryMode)) { - boolean isFillAggDefaultMetricLogic = false; - boolean isFillDetailDimensionMetric = false; - Integer domainId = queryContext.getDomainId().intValue(); - ChatDefaultRichConfig chatDefaultConfig = null; - Boolean isDetailMode = false; - List matchedElements = queryContext.getMapInfo().getMatchedElements(domainId); - ChatConfigRichResp chaConfigRichDesc = getChatConfigRichInfo(semanticParseInfo.getDomainId()); - if (Objects.isNull(chaConfigRichDesc)) { - return; - } - if (ruleSemanticQuery instanceof MetricSemanticQuery) { - if (!CollectionUtils.isEmpty(matchedElements)) { - long metricCount = matchedElements.stream() - .filter(schemaElementMatch -> schemaElementMatch.getElementType() - .equals(SchemaElementType.METRIC)).count(); - - if (metricCount <= 0) { - if (chatContext.getParseInfo() == null - || chatContext.getParseInfo().getMetrics() == null - || chatContext.getParseInfo().getMetrics().size() <= 0) { - - log.info("isFillAggDefaultMetricLogic is true"); - isFillAggDefaultMetricLogic = true; - - } - } - } - if (Objects.nonNull(chaConfigRichDesc.getChatAggRichConfig())) { - chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); - } - - } else if (ruleSemanticQuery instanceof EntitySemanticQuery) { - log.info("fillThemeDefaultMetricLogic for empty matchedElements "); - isFillDetailDimensionMetric = true; - dealNativeQuery(semanticParseInfo, queryContext, true); - isDetailMode = true; - if (Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig())) { - chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); - } - } - - - if (isFillAggDefaultMetricLogic) { - fillDefaultMetricAggLogic(semanticParseInfo, chaConfigRichDesc, queryContext); - } - - if (isFillDetailDimensionMetric) { - addEntityDetailDimensionMetric(semanticParseInfo, chaConfigRichDesc, queryContext, chatContext); - } - - fillDateDomain(semanticParseInfo, chatContext, chaConfigRichDesc, chatDefaultConfig, isDetailMode); -// } - defaultQueryMode(semanticParseInfo, queryContext, chatContext); - addEntityTopDimension(semanticParseInfo, chaConfigRichDesc); - } - } - - public void dealNativeQuery(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, - boolean isNativeQuery) { - if (Objects.nonNull(queryContext) && Objects.nonNull(semanticParseInfo)) { - semanticParseInfo.setNativeQuery(isNativeQuery); - } - } - - public Set addPrimaryDimension(EntityRichInfo entity, List dimensions) { - Set primaryDimensions = new HashSet<>(); - if (Objects.isNull(entity) || Objects.isNull(entity.getDimItem())) { - return primaryDimensions; - } - DimSchemaResp dimItem = entity.getDimItem(); - SchemaItem dimension = new SchemaItem(); - BeanUtils.copyProperties(dimItem, dimension); - dimensions.add(dimension); - primaryDimensions.add(dimItem.getBizName()); - return primaryDimensions; - } - - public void addEntityTopDimension(SemanticParseInfo semanticParseInfo, ChatConfigRichResp chaConfigRichDesc) { - if (!semanticParseInfo.getQueryMode().equals(EntityListTopN.QUERY_MODE) || !semanticParseInfo.getDimensions() - .isEmpty()) { - return; - } - if (semanticParseInfo.getDomainId() > 0) { - Long domainId = semanticParseInfo.getDomainId(); - if (chaConfigRichDesc == null) { - chaConfigRichDesc = getChatConfigRichInfo(domainId); - } - if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null - && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { - List dimensions = new ArrayList<>(); - addPrimaryDimension(chaConfigRichDesc.getChatDetailRichConfig().getEntity(), dimensions); - semanticParseInfo.setDimensions(new HashSet<>(dimensions)); - semanticParseInfo.setLimit(1L); - } - } - } - - public void addEntityDetailDimensionMetric(SemanticParseInfo semanticParseInfo, ChatConfigRichResp chaConfigRichDesc, QueryContextReq queryContext, - ChatContext chatCtx) { - if (semanticParseInfo.getDomainId() > 0) { - Long domainId = semanticParseInfo.getDomainId(); - - if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null) { - if (chaConfigRichDesc.getChatDetailRichConfig().getEntity() == null - || chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig() == null) { - return; - } - - List schemaElementMatches = queryContext.getMapInfo() - .getMatchedElements(domainId.intValue()); - if (CollectionUtils.isEmpty(schemaElementMatches) - || schemaElementMatches.stream().filter(s -> SchemaElementType.DIMENSION.equals(s.getElementType())).count() <= 0) { - log.info("addEntityDetailDimensionMetric catch"); - if (CollectionUtils.isEmpty(semanticParseInfo.getDimensions())) { - Set dimensions = new LinkedHashSet(); - List dimensionsConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig().getDimensions(); - if (!CollectionUtils.isEmpty(dimensionsConfig)) { - dimensionsConfig.stream().forEach(m -> dimensions.add(m)); - } - semanticParseInfo.setDimensions(dimensions); - } - - if (CollectionUtils.isEmpty(semanticParseInfo.getMetrics())) { - Set metrics = new LinkedHashSet(); - List metricsConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig().getMetrics(); - if (!CollectionUtils.isEmpty(metricsConfig)) { - metricsConfig.stream().forEach(m -> metrics.add(m)); - } - semanticParseInfo.setMetrics(metrics); - } - } - } - } - } - - public void defaultQueryMode(SemanticParseInfo semanticParseInfo, QueryContextReq queryContext, - ChatContext chatCtx) { - SchemaMapInfo schemaMap = queryContext.getMapInfo(); - if (StringUtils.isEmpty(semanticParseInfo.getQueryMode())) { - if (chatCtx.getParseInfo() != null && chatCtx.getParseInfo().getDomainId() > 0) { - // - Long domain = chatCtx.getParseInfo().getDomainId(); - String queryMode = chatCtx.getParseInfo().getQueryMode(); - if (!CollectionUtils.isEmpty(schemaMap.getMatchedDomains()) && schemaMap.getMatchedDomains() - .contains(domain.intValue())) { - List elementMatches = schemaMap.getMatchedElements(domain.intValue()); - Long filterNUm = elementMatches.stream() - .filter(e -> e.getElementType().equals(SchemaElementType.VALUE) || e.getElementType() - .equals(SchemaElementType.ID)).count(); - Long dimensionNUm = elementMatches.stream() - .filter(e -> e.getElementType().equals(SchemaElementType.DIMENSION)).count(); - Long metricrNUm = elementMatches.stream() - .filter(e -> e.getElementType().equals(SchemaElementType.METRIC)).count(); - if (filterNUm > 0 && dimensionNUm > 0 && metricrNUm > 0) { - // default as entity detail queryMode - log.info("defaultQueryMode [{}]", EntityDetail.QUERY_MODE); - semanticParseInfo.setQueryMode(EntityDetail.QUERY_MODE); - semanticParseInfo.setDomainId(domain); - return; - } - Long entityNUm = elementMatches.stream() - .filter(e -> e.getElementType().equals(SchemaElementType.ENTITY)).count(); - if (filterNUm <= 0 && dimensionNUm <= 0 && entityNUm <= 0) { - // default as metric domain - if (metricrNUm > 0 || MetricDomain.QUERY_MODE.equals(queryMode)) { - // default as entity detail queryMode - log.info("defaultQueryMode [{}]", MetricDomain.QUERY_MODE); - semanticParseInfo.setQueryMode(MetricDomain.QUERY_MODE); - semanticParseInfo.setDomainId(domain); - return; - } - } - } - if (CollectionUtils.isEmpty(schemaMap.getMatchedDomains()) && semanticParseInfo != null - && semanticParseInfo.getDateInfo() != null) { - // only query time - if (MetricDomain.QUERY_MODE.equals(queryMode)) { - // METRIC_DOMAIN context - log.info("defaultQueryMode [{}]", MetricDomain.QUERY_MODE); - semanticParseInfo.setQueryMode(MetricDomain.QUERY_MODE); - semanticParseInfo.setDomainId(domain); - return; - } - } - } - } - } - - public void fillParseInfo(SemanticQuery query, Long domainId, String domainName) { - SemanticParseInfo parseInfo = query.getParseInfo(); - parseInfo.setDomainId(domainId); - parseInfo.setDomainName(domainName); - parseInfo.setQueryMode(query.getQueryMode()); - - - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - DomainSchemaResp domainSchemaDesc = semanticLayer.getDomainSchemaInfo(parseInfo.getDomainId(), true); - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(parseInfo.getDomainId()); - Map dimensionDescMap = domainSchemaDesc.getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); - Map metricDescMap = domainSchemaDesc.getMetrics().stream() - .collect(Collectors.toMap(MetricSchemaResp::getId, Function.identity())); - Map> dim2Values = new HashMap<>(); - - List elementMatches = query.getParseInfo().getElementMatches(); - for (SchemaElementMatch schemaMatch : elementMatches) { - Long elementID = Long.valueOf(schemaMatch.getElementID()); - switch (schemaMatch.getElementType()) { - case ID: - case VALUE: - if (dimensionDescMap.containsKey(elementID)) { - if (dim2Values.containsKey(elementID)) { - dim2Values.get(elementID).add(schemaMatch); - } else { - dim2Values.put(elementID, new ArrayList<>(Arrays.asList(schemaMatch))); - } - } - break; - case DIMENSION: - DimSchemaResp dimensionDesc = dimensionDescMap.get(elementID); - if (dimensionDesc != null) { - SchemaItem dimensionParseInfo = new SchemaItem(); - dimensionParseInfo.setBizName(dimensionDesc.getBizName()); - dimensionParseInfo.setName(dimensionDesc.getName()); - dimensionParseInfo.setId(dimensionDesc.getId()); - parseInfo.getDimensions().add(dimensionParseInfo); - } - break; - case METRIC: - MetricSchemaResp metricDesc = metricDescMap.get(elementID); - if (metricDesc != null) { - SchemaItem metricItem = new SchemaItem(); - metricItem.setBizName(metricDesc.getBizName()); - metricItem.setName(metricDesc.getName()); - metricItem.setId(metricDesc.getId()); - metricItem.setCreatedAt(null); - metricItem.setUpdatedAt(null); - parseInfo.getMetrics().add(metricItem); - } - break; - default: - } - } - - if (!dim2Values.isEmpty()) { - for (Map.Entry> entry : dim2Values.entrySet()) { - DimSchemaResp dimensionDesc = dimensionDescMap.get(entry.getKey()); - if (entry.getValue().size() == 1) { - SchemaElementMatch schemaMatch = entry.getValue().get(0); - Filter dimensionFilter = new Filter(); - dimensionFilter.setValue(schemaMatch.getWord()); - dimensionFilter.setBizName(dimensionDesc.getBizName()); - dimensionFilter.setName(dimensionDesc.getName()); - dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); - dimensionFilter.setElementID(Long.valueOf(schemaMatch.getElementID())); - parseInfo.getDimensionFilters().add(dimensionFilter); - ContextHelper.setEntityId(entry.getKey(), schemaMatch.getWord(), chaConfigRichDesc, - parseInfo); - } else { - Filter dimensionFilter = new Filter(); - List vals = new ArrayList<>(); - entry.getValue().stream().forEach(i -> vals.add(i.getWord())); - dimensionFilter.setValue(vals); - dimensionFilter.setBizName(dimensionDesc.getBizName()); - dimensionFilter.setName(dimensionDesc.getName()); - dimensionFilter.setOperator(FilterOperatorEnum.IN); - dimensionFilter.setElementID(entry.getKey()); - parseInfo.getDimensionFilters().add(dimensionFilter); - } - } - } - } - - public void fillDateDomain(SemanticParseInfo parseInfo, ChatContext chatCtx, ChatConfigRichResp chaConfigRichDesc, - ChatDefaultRichConfig chatDefaultConfig, Boolean isDetailMode) { - //SemanticParseInfo parseInfo = queryContext.getParseInfo(); - - if (parseInfo == null || parseInfo.getDateInfo() == null) { - DomainResolver selectStrategy = ComponentFactory.getDomainResolver(); - boolean isUpdateTime = false; - if (selectStrategy.isDomainSwitch(chatCtx, parseInfo)) { - isUpdateTime = true; - } - if (chatCtx.getParseInfo() == null - || chatCtx.getParseInfo().getDateInfo() == null) { - isUpdateTime = true; - } - if (isUpdateTime && parseInfo != null && parseInfo.getDomainId() > 0) { - - fillThemeDefaultTime(chaConfigRichDesc, parseInfo, chatDefaultConfig, isDetailMode); - } - } - } - - public void fillDefaultMetricAggLogic(SemanticParseInfo semanticParseInfo, ChatConfigRichResp chaConfigRichDesc, QueryContextReq queryContext) { - //SemanticParseInfo semanticParseInfo = queryContext.getParseInfo(); - - if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatAggRichConfig()) - || Objects.isNull(chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig()) - || CollectionUtils.isEmpty(chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig().getMetrics())) { - log.info("there is no defaultMetricIds info"); - return; - } - - if (queryContext.getMapInfo() == null || !queryContext.getMapInfo().getMatchedDomains() - .contains(chaConfigRichDesc.getDomainId().intValue())) { - return; - } - List schemaElementMatches = queryContext.getMapInfo() - .getMatchedElements(chaConfigRichDesc.getDomainId().intValue()); - long metricNum = schemaElementMatches.stream().filter(e -> e.getElementType().equals(SchemaElementType.METRIC)) - .count(); - long dimensionNum = schemaElementMatches.stream() - .filter(e -> e.getElementType().equals(SchemaElementType.DIMENSION)).count(); - if (metricNum <= 0 && dimensionNum <= 0) { - Set metrics = new LinkedHashSet(); - chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig().getMetrics().stream().forEach(metric -> { - SchemaItem metricTmp = new SchemaItem(); - metricTmp.setId(metric.getId()); - metricTmp.setBizName(metric.getBizName()); - metrics.add(metricTmp); - }); - semanticParseInfo.setMetrics(metrics); - } - - if (Objects.isNull(semanticParseInfo.getDateInfo()) || Objects.isNull( - semanticParseInfo.getDateInfo().getDateMode())) { - ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); - DateConf dateInfo = new DateConf(); - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setUnit(chatDefaultConfig.getUnit()); - dateInfo.setPeriod(chatDefaultConfig.getPeriod()); - semanticParseInfo.setDateInfo(dateInfo); - } - - } - - public void fillThemeDefaultTime(ChatConfigRichResp chaConfigRichDesc, SemanticParseInfo semanticParseInfo, ChatDefaultRichConfig chatDefaultConfig, Boolean isDetailMode) { - if (!Objects.isNull(semanticParseInfo.getDateInfo()) && !Objects.isNull( - semanticParseInfo.getDateInfo().getDateMode())) { - return; - } - if (chaConfigRichDesc == null) { - chaConfigRichDesc = getChatConfigRichInfo(semanticParseInfo.getDomainId()); - } - if (!Objects.isNull(chaConfigRichDesc) && Objects.nonNull(chatDefaultConfig) && !CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())) { - DateConf dateInfo = new DateConf(); - if (isDetailMode) { - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setUnit(1); - dateInfo.setPeriod(Constants.DAY); - } else { - dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); - dateInfo.setUnit(chatDefaultConfig.getUnit()); - dateInfo.setPeriod(chatDefaultConfig.getPeriod()); - } - - - semanticParseInfo.setDateInfo(dateInfo); - log.info("fillThemeDefaultTime"); - } - } - - public ChatConfigRichResp getChatConfigRichInfo(Long domain) { - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domain); - return chaConfigRichDesc; - } - - private SchemaItem getMetric(MetricSchemaResp metricSchemaDesc) { - SchemaItem queryMeta = new SchemaItem(); - queryMeta.setId(metricSchemaDesc.getId()); - queryMeta.setBizName(metricSchemaDesc.getBizName()); - queryMeta.setName(metricSchemaDesc.getName()); - return queryMeta; - } - - private SchemaItem getDimension(DimSchemaResp dimSchemaDesc) { - SchemaItem queryMeta = new SchemaItem(); - queryMeta.setId(dimSchemaDesc.getId()); - queryMeta.setBizName(dimSchemaDesc.getBizName()); - queryMeta.setName(dimSchemaDesc.getName()); - return queryMeta; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/NatureConverter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/NatureConverter.java deleted file mode 100644 index b71e0d01f..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/NatureConverter.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.common.nlp.NatureType; - -/*** - * nature type to schemaType converter - */ -public class NatureConverter { - - public static SchemaElementType convertTo(String nature) { - NatureType natureType = NatureType.getNatureType(nature); - SchemaElementType result = null; - switch (natureType) { - case METRIC: - result = SchemaElementType.METRIC; - break; - case DIMENSION: - result = SchemaElementType.DIMENSION; - break; - case ENTITY: - result = SchemaElementType.ENTITY; - break; - case DOMAIN: - result = SchemaElementType.DOMAIN; - break; - case VALUE: - result = SchemaElementType.VALUE; - break; - default: - break; - } - return result; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SchemaInfoConverter.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SchemaInfoConverter.java deleted file mode 100644 index a6b013cbe..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SchemaInfoConverter.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.application.query.MetricCompare; -import com.tencent.supersonic.chat.application.query.MetricDomain; -import com.tencent.supersonic.chat.application.query.MetricFilter; -import com.tencent.supersonic.chat.application.query.MetricGroupBy; -import com.tencent.supersonic.chat.application.query.MetricOrderBy; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.enums.AggOperatorEnum; -import com.tencent.supersonic.common.enums.AggregateTypeEnum; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.pojo.Aggregator; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.Order; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.enums.TimeDimensionEnum; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; -import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; -import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.util.Strings; -import org.springframework.beans.BeanUtils; -import org.springframework.util.CollectionUtils; - -public class SchemaInfoConverter { - - /*** - * convert to queryStructReq - * @param parseInfo - * @return - */ - public static QueryStructReq convertTo(SemanticParseInfo parseInfo) { - QueryStructReq queryStructCmd = new QueryStructReq(); - queryStructCmd.setDomainId(parseInfo.getDomainId()); - queryStructCmd.setNativeQuery(parseInfo.getNativeQuery()); - queryStructCmd.setDateInfo(parseInfo.getDateInfo()); - - List dimensionFilters = parseInfo.getDimensionFilters().stream() - .filter(chatFilter -> Strings.isNotEmpty(chatFilter.getBizName())) - .map(chatFilter -> new Filter(chatFilter.getBizName(), chatFilter.getOperator(), chatFilter.getValue())) - .collect(Collectors.toList()); - queryStructCmd.setDimensionFilters(dimensionFilters); - - List metricFilters = parseInfo.getMetricFilters().stream() - .map(chatFilter -> new Filter(chatFilter.getBizName(), chatFilter.getOperator(), chatFilter.getValue())) - .collect(Collectors.toList()); - queryStructCmd.setMetricFilters(metricFilters); - - addDateDimension(parseInfo); - List dimensions = parseInfo.getDimensions().stream().map(entry -> entry.getBizName()) - .collect(Collectors.toList()); - queryStructCmd.setGroups(dimensions); - queryStructCmd.setLimit(parseInfo.getLimit()); - Set order = getOrder(parseInfo.getOrders(), parseInfo.getAggType(), parseInfo.getMetrics()); - queryStructCmd.setOrders(new ArrayList<>(order)); - queryStructCmd.setAggregators(getAggregatorByMetric(parseInfo.getMetrics(), parseInfo.getAggType())); - return queryStructCmd; - } - - - /*** - * convert to QuerySqlReq - * @param parseInfo - * @return - */ - public static QuerySqlReq convertToQuerySqlReq(SemanticParseInfo parseInfo) { - QuerySqlReq querySqlReq = new QuerySqlReq(); - Object info = parseInfo.getInfo(); - if (Objects.nonNull(info)) { - querySqlReq.setSql(info.toString()); - } - querySqlReq.setDomainId(parseInfo.getDomainId()); - return querySqlReq; - } - - - private static List getAggregatorByMetric(Set metrics, AggregateTypeEnum aggregateType) { - List aggregators = new ArrayList<>(); - String agg = (aggregateType == null || aggregateType.equals(AggregateTypeEnum.NONE)) ? "" - : aggregateType.name(); - for (SchemaItem metric : metrics) { - aggregators.add(new Aggregator(metric.getBizName(), AggOperatorEnum.of(agg))); - } - return aggregators; - } - - private static void addDateDimension(SemanticParseInfo parseInfo) { - if (parseInfo != null) { - String queryMode = parseInfo.getQueryMode(); - if (parseInfo.getDateInfo() == null) { - return; - } - if (MetricCompare.QUERY_MODE.equals(queryMode)) { - if (parseInfo.getAggType() != null && !parseInfo.getAggType().equals(AggregateTypeEnum.NONE)) { - return; - } - } - if (parseInfo.getAggType() != null && (parseInfo.getAggType().equals(AggregateTypeEnum.MAX) - || parseInfo.getAggType().equals(AggregateTypeEnum.MIN)) && !CollectionUtils.isEmpty( - parseInfo.getDimensions())) { - return; - } - DateConf dateInfo = parseInfo.getDateInfo(); - String dateField = TimeDimensionEnum.DAY.getName(); - if (Constants.MONTH.equals(dateInfo.getPeriod())) { - dateField = TimeDimensionEnum.MONTH.getName(); - } - if (Constants.WEEK.equals(dateInfo.getPeriod())) { - dateField = TimeDimensionEnum.WEEK.getName(); - } - for (SchemaItem dimension : parseInfo.getDimensions()) { - if (dimension.getBizName().equalsIgnoreCase(dateField)) { - return; - } - } - SchemaItem dimension = new SchemaItem(); - dimension.setBizName(dateField); - - if (MetricDomain.QUERY_MODE.equals(queryMode) - || MetricGroupBy.QUERY_MODE.equals(queryMode) - || MetricFilter.QUERY_MODE.equals(queryMode) - || MetricCompare.QUERY_MODE.equals(queryMode) - || MetricOrderBy.QUERY_MODE.equals(queryMode)) { - parseInfo.getDimensions().add(dimension); - } - } - } - - public static DomainInfos convert(List domainSchemaInfos) { - DomainInfos result = new DomainInfos(); - if (CollectionUtils.isEmpty(domainSchemaInfos)) { - return result; - } - for (DomainSchemaResp domainSchemaDesc : domainSchemaInfos) { - int domain = Math.toIntExact(domainSchemaDesc.getId()); - // domain - ItemDO domainDO = new ItemDO(); - domainDO.setDomain(domain); - domainDO.setName(domainSchemaDesc.getName()); - domainDO.setItemId(domain); - result.getDomains().add(domainDO); - domainDO.setBizName(domainSchemaDesc.getBizName()); - // entity - List entityNames = domainSchemaDesc.getEntityNames(); - if (!CollectionUtils.isEmpty(entityNames)) { - for (String entityName : entityNames) { - ItemDO entity = new ItemDO(); - entity.setDomain(domain); - entity.setName(entityName); - entity.setItemId(domain); - result.getEntities().add(entity); - } - } - // metric - for (MetricSchemaResp metric : domainSchemaDesc.getMetrics()) { - ItemDO metricDO = new ItemDO(); - metricDO.setDomain(domain); - metricDO.setName(metric.getName()); - metricDO.setItemId(Math.toIntExact(metric.getId())); - metricDO.setUseCnt(metric.getUseCnt()); - metricDO.setBizName(metric.getBizName()); - result.getMetrics().add(metricDO); - - String metricAlias = metric.getAlias(); - if (StringUtils.isNotEmpty(metricAlias)) { - ItemDO aliasMetricDO = new ItemDO(); - BeanUtils.copyProperties(metricDO, aliasMetricDO); - aliasMetricDO.setName(metricAlias); - result.getMetrics().add(aliasMetricDO); - } - } - // dimension - for (DimSchemaResp dimension : domainSchemaDesc.getDimensions()) { - ItemDO dimensionDO = new ItemDO(); - dimensionDO.setDomain(domain); - dimensionDO.setName(dimension.getName()); - dimensionDO.setItemId(Math.toIntExact(dimension.getId())); - dimensionDO.setUseCnt(dimension.getUseCnt()); - dimensionDO.setBizName(dimension.getBizName()); - result.getDimensions().add(dimensionDO); - - String dimensionAlias = dimension.getAlias(); - if (StringUtils.isNotEmpty(dimensionAlias)) { - ItemDO aliasDimensionDO = new ItemDO(); - BeanUtils.copyProperties(dimensionDO, aliasDimensionDO); - aliasDimensionDO.setName(dimensionAlias); - result.getDimensions().add(aliasDimensionDO); - } - } - } - return result; - } - - public static Set getOrder(Set parseOrder, AggregateTypeEnum aggregator, Set metrics) { - if (!CollectionUtils.isEmpty(parseOrder)) { - return parseOrder; - } - Set orders = new LinkedHashSet(); - if (CollectionUtils.isEmpty(metrics)) { - return orders; - } - if ((AggregateTypeEnum.TOPN.equals(aggregator) || AggregateTypeEnum.MAX.equals(aggregator) - || AggregateTypeEnum.MIN.equals( - aggregator))) { - for (SchemaItem metric : metrics) { - Order order = new Order(); - order.setColumn(metric.getBizName()); - order.setDirection("desc"); - orders.add(order); - } - } - return orders; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SemanticSatisfactionChecker.java b/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SemanticSatisfactionChecker.java deleted file mode 100644 index 336eb7556..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/SemanticSatisfactionChecker.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tencent.supersonic.chat.domain.utils; - - -import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.Filter; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.common.pojo.SchemaItem; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.compress.utils.Lists; -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * utils to check current parse info is enough to query result - */ -@Slf4j -public class SemanticSatisfactionChecker { - - private static final double THRESHOLD = 0.8; - - // check all the parse info in candidate - public static boolean check(QueryContextReq queryCtx) { - for (SemanticQuery query : queryCtx.getCandidateQueries()) { - SemanticParseInfo semanticParseInfo = query.getParseInfo(); - Long domainId = semanticParseInfo.getDomainId(); - List schemaElementMatches = queryCtx.getMapInfo() - .getMatchedElements(domainId.intValue()); - if (check(queryCtx.getQueryText(), semanticParseInfo, schemaElementMatches)) { - return true; - } - } - return false; - } - - //check single parse info - private static boolean check(String text, SemanticParseInfo semanticParseInfo, - List schemaElementMatches) { - if (CollectionUtils.isEmpty(schemaElementMatches)) { - return false; - } - List detectWords = Lists.newArrayList(); - Map detectWordMap = schemaElementMatches.stream() - .collect(Collectors.toMap(SchemaElementMatch::getElementID, SchemaElementMatch::getDetectWord, - (id1, id2) -> id1)); - // get detect word in text by element id in semantic layer - Long domainId = semanticParseInfo.getDomainId(); - if (domainId != null && domainId > 0) { - for (SchemaElementMatch schemaElementMatch : schemaElementMatches) { - if (SchemaElementType.DOMAIN.equals(schemaElementMatch.getElementType())) { - detectWords.add(schemaElementMatch.getDetectWord()); - } - } - } - - for (Filter filter : semanticParseInfo.getDimensionFilters()) { - detectWords.add( - detectWordMap.getOrDefault(Optional.ofNullable(filter.getElementID()).orElse(0L).intValue(), "")); - } - for (SchemaItem schemaItem : semanticParseInfo.getMetrics()) { - detectWords.add( - detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L).intValue(), "")); - // only first metric - break; - } - for (SchemaItem schemaItem : semanticParseInfo.getDimensions()) { - detectWords.add( - detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L).intValue(), "")); - // only first dimension - break; - } - //compare the length between detect words and query text - String detectWordsDistinct = StringUtils.join(new HashSet<>(detectWords), ""); - int detectWordsLength = detectWordsDistinct.length(); - int queryTextLength = text.length(); - double degree = detectWordsLength * 1.0 / queryTextLength; - if (degree > THRESHOLD) { - log.info("queryMode:{} has satisfied semantic check, degree:{}, detectWords:{}, parse info:{}", - semanticParseInfo.getQueryMode(), degree, detectWordsDistinct, semanticParseInfo); - return true; - } - return false; - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatQueryDOMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatQueryDOMapper.java deleted file mode 100644 index c4c19da03..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatQueryDOMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tencent.supersonic.chat.infrastructure.mapper; - -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDO; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDOExample; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ChatQueryDOMapper { - - long countByExample(ChatQueryDOExample example); - - int deleteByPrimaryKey(Long questionId); - - - int insert(ChatQueryDO record); - - int insertSelective(ChatQueryDO record); - - List selectByExampleWithBLOBs(ChatQueryDOExample example); - - List selectByExample(ChatQueryDOExample example); - - ChatQueryDO selectByPrimaryKey(Long questionId); - - int updateByPrimaryKeySelective(ChatQueryDO record); - - int updateByPrimaryKeyWithBLOBs(ChatQueryDO record); - - int updateByPrimaryKey(ChatQueryDO record); -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java deleted file mode 100644 index a3938e7e8..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/LocalSemanticLayerImpl.java +++ /dev/null @@ -1,254 +0,0 @@ -package com.tencent.supersonic.chat.infrastructure.semantic; - -import com.github.pagehelper.PageInfo; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.pojo.config.ChatAggConfig; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatDetailConfig; -import com.tencent.supersonic.chat.domain.pojo.config.ItemVisibility; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.common.util.context.S2ThreadContext; -import com.tencent.supersonic.common.util.context.ThreadContext; -import com.tencent.supersonic.common.util.json.JsonUtil; -import com.tencent.supersonic.semantic.api.core.request.DomainSchemaFilterReq; -import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; -import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.core.response.*; -import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; -import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; -import com.tencent.supersonic.semantic.core.domain.DimensionService; -import com.tencent.supersonic.semantic.core.domain.DomainService; -import com.tencent.supersonic.semantic.core.domain.MetricService; -import com.tencent.supersonic.semantic.query.domain.SchemaService; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; -import com.tencent.supersonic.semantic.query.domain.QueryService; - -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -@Slf4j -public class LocalSemanticLayerImpl implements SemanticLayer { - - private static final Cache> domainSchemaCache = - CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); - - private SchemaService schemaService; - - private S2ThreadContext s2ThreadContext; - - private DomainService domainService; - - private DimensionService dimensionService; - - private MetricService metricService; - -// public LocalSemanticLayerImpl(DomainService domainService){ -// this.domainService=domainService; -// } - - @Override - public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user) { - deletionDuplicated(queryStructReq); - onlyQueryFirstMetric(queryStructReq); - try { - QueryService queryService = ContextUtils.getBean(QueryService.class); - QueryResultWithSchemaResp queryResultWithSchemaResp = queryService.queryByStruct(queryStructReq, user); - return queryResultWithSchemaResp; - } catch (Exception e) { - log.info("queryByStruct has an exception:{}", e.toString()); - } - return null; - } - - @Override - public QueryResultWithSchemaResp queryBySql(QuerySqlReq querySqlReq, User user) { - try { - QueryService queryService = ContextUtils.getBean(QueryService.class); - Object object = queryService.queryBySql(querySqlReq, user); - QueryResultWithSchemaResp queryResultWithSchemaResp = JsonUtil.toObject(JsonUtil.toString(object), - QueryResultWithSchemaResp.class); - return queryResultWithSchemaResp; - } catch (Exception e) { - log.info("queryByStruct has an exception:{}", e.toString()); - } - return null; - } - - - public List fetchDomainSchemaAll(List ids) { - - DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); - filter.setDomainIds(ids); - User user = new User(1L, "admin", "admin", "admin@email"); - schemaService = ContextUtils.getBean(SchemaService.class); - return schemaService.fetchDomainSchema(filter, user); - } - - - @SneakyThrows - public List fetchDomainSchema(List ids, Boolean cacheEnable) { - if (cacheEnable) { - return domainSchemaCache.get(String.valueOf(ids), () -> { - List data = fetchDomainSchemaAll(ids); - fillEntityNameAndFilterBlackElement(data); - return data; - }); - } - List data = fetchDomainSchemaAll(ids); - fillEntityNameAndFilterBlackElement(data); - return data; - } - - public DomainSchemaResp getDomainSchemaInfo(Long domain, Boolean cacheEnable) { - List ids = new ArrayList<>(); - ids.add(domain); - List domainSchemaResps = fetchDomainSchema(ids, cacheEnable); - if (!CollectionUtils.isEmpty(domainSchemaResps)) { - Optional domainSchemaResp = domainSchemaResps.stream() - .filter(d -> d.getId().equals(domain)).findFirst(); - if (domainSchemaResp.isPresent()) { - DomainSchemaResp domainSchema = domainSchemaResp.get(); - return domainSchema; - } - } - return null; - } - - @Override - public List getDomainSchemaInfo(List ids) { - return fetchDomainSchema(ids, true); - } - - public DomainSchemaResp fillEntityNameAndFilterBlackElement(DomainSchemaResp domainSchemaResp) { - if (Objects.isNull(domainSchemaResp) || Objects.isNull(domainSchemaResp.getId())) { - return domainSchemaResp; - } - ChatConfigResp chatConfigResp = getConfigBaseInfo(domainSchemaResp.getId()); - - // fill entity names - fillEntityNamesInfo(domainSchemaResp, chatConfigResp); - - // filter black element - filterBlackDim(domainSchemaResp, chatConfigResp); - filterBlackMetric(domainSchemaResp, chatConfigResp); - return domainSchemaResp; - } - - public void fillEntityNameAndFilterBlackElement(List domainSchemaRespList) { - if (!CollectionUtils.isEmpty(domainSchemaRespList)) { - domainSchemaRespList.stream() - .forEach(domainSchemaResp -> fillEntityNameAndFilterBlackElement(domainSchemaResp)); - } - } - - private void filterBlackMetric(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigResp) { - ItemVisibility visibility = generateFinalVisibility(chatConfigResp); - if (Objects.nonNull(chatConfigResp) && Objects.nonNull(visibility) - && !CollectionUtils.isEmpty(visibility.getBlackMetricIdList()) - && !CollectionUtils.isEmpty(domainSchemaResp.getMetrics())) { - List metric4Chat = domainSchemaResp.getMetrics().stream() - .filter(metric -> !visibility.getBlackMetricIdList().contains(metric.getId())) - .collect(Collectors.toList()); - domainSchemaResp.setMetrics(metric4Chat); - } - } - - private ItemVisibility generateFinalVisibility(ChatConfigResp chatConfigInfo) { - ItemVisibility visibility = new ItemVisibility(); - - ChatAggConfig chatAggConfig = chatConfigInfo.getChatAggConfig(); - ChatDetailConfig chatDetailConfig = chatConfigInfo.getChatDetailConfig(); - - // both black is exist - if (Objects.nonNull(chatAggConfig) && Objects.nonNull(chatAggConfig.getVisibility()) - && Objects.nonNull(chatDetailConfig) && Objects.nonNull(chatDetailConfig.getVisibility())) { - List blackDimIdList = new ArrayList<>(); - blackDimIdList.addAll(chatAggConfig.getVisibility().getBlackDimIdList()); - blackDimIdList.retainAll(chatDetailConfig.getVisibility().getBlackDimIdList()); - List blackMetricIdList = new ArrayList<>(); - - blackMetricIdList.addAll(chatAggConfig.getVisibility().getBlackMetricIdList()); - blackMetricIdList.retainAll(chatDetailConfig.getVisibility().getBlackMetricIdList()); - - visibility.setBlackDimIdList(blackDimIdList); - visibility.setBlackMetricIdList(blackMetricIdList); - } - return visibility; - } - - private void filterBlackDim(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigResp) { - ItemVisibility visibility = generateFinalVisibility(chatConfigResp); - if (Objects.nonNull(chatConfigResp) && Objects.nonNull(visibility) - && !CollectionUtils.isEmpty(visibility.getBlackDimIdList()) - && !CollectionUtils.isEmpty(domainSchemaResp.getDimensions())) { - List dim4Chat = domainSchemaResp.getDimensions().stream() - .filter(dim -> !visibility.getBlackDimIdList().contains(dim.getId())) - .collect(Collectors.toList()); - domainSchemaResp.setDimensions(dim4Chat); - } - } - - private void fillEntityNamesInfo(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigResp) { - if (Objects.nonNull(chatConfigResp) && Objects.nonNull(chatConfigResp.getChatDetailConfig()) - && Objects.nonNull(chatConfigResp.getChatDetailConfig().getEntity()) - && !CollectionUtils.isEmpty(chatConfigResp.getChatDetailConfig().getEntity().getNames())) { - domainSchemaResp.setEntityNames(chatConfigResp.getChatDetailConfig().getEntity().getNames()); - } - } - - private void deletionDuplicated(QueryStructReq queryStructReq) { - if (!CollectionUtils.isEmpty(queryStructReq.getGroups()) && queryStructReq.getGroups().size() > 1) { - Set groups = new HashSet<>(); - groups.addAll(queryStructReq.getGroups()); - queryStructReq.getGroups().clear(); - queryStructReq.getGroups().addAll(groups); - } - } - - private void onlyQueryFirstMetric(QueryStructReq queryStructReq) { - if (!CollectionUtils.isEmpty(queryStructReq.getAggregators()) && queryStructReq.getAggregators().size() > 1) { - log.info("multi metric in aggregators:{} , only query first one", queryStructReq.getAggregators()); - queryStructReq.setAggregators(queryStructReq.getAggregators().subList(0, 1)); - } - } - - public ChatConfigResp getConfigBaseInfo(Long domain) { - DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - return defaultSemanticConfig.getConfigService().fetchConfigByDomainId(domain); - } - - @Override - public List getDomainListForViewer() { - s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); - ThreadContext threadContext = s2ThreadContext.get(); - domainService = ContextUtils.getBean(DomainService.class); - return domainService.getDomainListForViewer(threadContext.getUserName()); - } - - @Override - public List getDomainListForAdmin() { - domainService = ContextUtils.getBean(DomainService.class); - s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); - ThreadContext threadContext = s2ThreadContext.get(); - return domainService.getDomainListForAdmin(threadContext.getUserName()); - } - - @Override - public PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd) { - dimensionService = ContextUtils.getBean(DimensionService.class); - return dimensionService.queryDimension(pageDimensionCmd); - } - - @Override - public PageInfo queryMetricPage(PageMetricReq pageMetricCmd) { - metricService = ContextUtils.getBean(MetricService.class); - return metricService.queryMetric(pageMetricCmd); - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/DomainInfoStat.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java similarity index 78% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/DomainInfoStat.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java index ba861c1a9..f65f29bef 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/DomainInfoStat.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java @@ -1,16 +1,21 @@ -package com.tencent.supersonic.chat.domain.pojo.search; +package com.tencent.supersonic.chat.mapper; import java.io.Serializable; +import lombok.Builder; import lombok.Data; import lombok.ToString; @Data @ToString +@Builder public class DomainInfoStat implements Serializable { private long domainCount; + private long metricDomainCount; + private long dimensionDomainCount; + private long dimensionValueDomainCount; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/DomainWithSemanticType.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java similarity index 66% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/DomainWithSemanticType.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java index 31a115bdf..78777b937 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/DomainWithSemanticType.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.search; +package com.tencent.supersonic.chat.mapper; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import java.io.Serializable; @@ -9,10 +9,10 @@ import lombok.ToString; @ToString public class DomainWithSemanticType implements Serializable { - private Integer domain; + private Long domain; private SchemaElementType semanticType; - public DomainWithSemanticType(Integer domain, SchemaElementType semanticType) { + public DomainWithSemanticType(Long domain, SchemaElementType semanticType) { this.domain = domain; this.semanticType = semanticType; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java new file mode 100644 index 000000000..cf3a6129e --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java @@ -0,0 +1,172 @@ +package com.tencent.supersonic.chat.mapper; + +import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.component.SchemaMapper; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +@Slf4j +public class FuzzyNameMapper implements SchemaMapper { + + @Override + public void map(QueryContext queryContext) { + + log.debug("before db mapper,mapInfo:{}", queryContext.getMapInfo()); + + List terms = HanlpHelper.getTerms(queryContext.getRequest().getQueryText()); + + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + + detectAndAddToSchema(queryContext, terms, semanticSchema.getDimensions(), SchemaElementType.DIMENSION); + + detectAndAddToSchema(queryContext, terms, semanticSchema.getMetrics(), SchemaElementType.METRIC); + + log.debug("after db mapper,mapInfo:{}", queryContext.getMapInfo()); + } + + private void detectAndAddToSchema(QueryContext queryContext, List terms, List domains, + SchemaElementType schemaElementType) { + try { + + Map> domainResultSet = getResultSet(queryContext, terms, domains); + + addToSchemaMapInfo(domainResultSet, queryContext.getMapInfo(), schemaElementType); + + } catch (Exception e) { + log.error("detectAndAddToSchema error", e); + } + } + + private Map> getResultSet(QueryContext queryContext, List terms, + List domains) { + + String queryText = queryContext.getRequest().getQueryText(); + + MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); + + Double metricDimensionThresholdConfig = getThreshold(queryContext, mapperHelper); + + Map> nameToItems = getNameToItems(domains); + + Map regOffsetToLength = terms.stream().sorted(Comparator.comparing(Term::length)) + .collect(Collectors.toMap(Term::getOffset, term -> term.word.length(), (value1, value2) -> value2)); + + Map> domainResultSet = new HashMap<>(); + for (Integer startIndex = 0; startIndex <= queryText.length() - 1; ) { + for (Integer endIndex = startIndex; endIndex <= queryText.length(); ) { + endIndex = mapperHelper.getStepIndex(regOffsetToLength, endIndex); + if (endIndex > queryText.length()) { + continue; + } + String detectSegment = queryText.substring(startIndex, endIndex); + + for (Entry> entry : nameToItems.entrySet()) { + String name = entry.getKey(); + Set schemaElements = entry.getValue(); + if (!name.contains(detectSegment) + || mapperHelper.getSimilarity(detectSegment, name) < metricDimensionThresholdConfig) { + continue; + } + Set preSchemaElements = domainResultSet.putIfAbsent(detectSegment, + schemaElements); + if (Objects.nonNull(preSchemaElements)) { + preSchemaElements.addAll(schemaElements); + } + } + } + startIndex = mapperHelper.getStepIndex(regOffsetToLength, startIndex); + } + return domainResultSet; + } + + private Double getThreshold(QueryContext queryContext, MapperHelper mapperHelper) { + + Double metricDimensionThresholdConfig = mapperHelper.getMetricDimensionThresholdConfig(); + Double metricDimensionMinThresholdConfig = mapperHelper.getMetricDimensionMinThresholdConfig(); + + Map> domainElementMatches = queryContext.getMapInfo() + .getDomainElementMatches(); + boolean existElement = domainElementMatches.entrySet().stream() + .anyMatch(entry -> entry.getValue().size() >= 1); + + if (!existElement) { + double halfThreshold = metricDimensionThresholdConfig / 2; + + metricDimensionThresholdConfig = halfThreshold >= metricDimensionMinThresholdConfig ? halfThreshold + : metricDimensionMinThresholdConfig; + log.info("domainElementMatches:{} , not exist Element metricDimensionThresholdConfig reduce by half:{}", + domainElementMatches, metricDimensionThresholdConfig); + } + return metricDimensionThresholdConfig; + } + + private Map> getNameToItems(List domains) { + return domains.stream().collect( + Collectors.toMap(SchemaElement::getName, a -> { + Set result = new HashSet<>(); + result.add(a); + return result; + }, (k1, k2) -> { + k1.addAll(k2); + return k1; + })); + } + + private void addToSchemaMapInfo(Map> mapResultRowSet, SchemaMapInfo schemaMap, + SchemaElementType schemaElementType) { + if (Objects.isNull(mapResultRowSet) || mapResultRowSet.size() <= 0) { + return; + } + MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); + + for (Map.Entry> entry : mapResultRowSet.entrySet()) { + String detectWord = entry.getKey(); + Set schemaElements = entry.getValue(); + for (SchemaElement schemaElement : schemaElements) { + + List elements = schemaMap.getMatchedElements(schemaElement.getDomain()); + if (CollectionUtils.isEmpty(elements)) { + elements = new ArrayList<>(); + schemaMap.setMatchedElements(schemaElement.getDomain(), elements); + } + Set regElementSet = elements.stream() + .filter(elementMatch -> schemaElementType.equals(elementMatch.getElement().getType())) + .map(elementMatch -> elementMatch.getElement().getId()) + .collect(Collectors.toSet()); + + if (regElementSet.contains(schemaElement.getId())) { + continue; + } + SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() + .element(schemaElement) + .word(schemaElement.getName()) + .detectWord(detectWord) + .frequency(10000L) + .similarity(mapperHelper.getSimilarity(detectWord, schemaElement.getName())) + .build(); + log.info("schemaElementType:{},add to schema, elementMatch {}", schemaElementType, schemaElementMatch); + elements.add(schemaElementMatch); + } + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java new file mode 100644 index 000000000..fb9c94d36 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java @@ -0,0 +1,113 @@ +package com.tencent.supersonic.chat.mapper; + +import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.component.SchemaMapper; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.chat.utils.NatureHelper; +import com.tencent.supersonic.knowledge.dictionary.builder.BaseWordBuilder; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.dictionary.builder.WordBuilderFactory; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; + +@Slf4j +public class HanlpDictMapper implements SchemaMapper { + + @Override + public void map(QueryContext queryContext) { + + String queryText = queryContext.getRequest().getQueryText(); + List terms = HanlpHelper.getTerms(queryText); + + for (Term term : terms) { + log.info("word:{},nature:{},frequency:{}", term.word, term.nature.toString(), term.getFrequency()); + } + Long domainId = queryContext.getRequest().getDomainId(); + + QueryMatchStrategy matchStrategy = ContextUtils.getBean(QueryMatchStrategy.class); + Map> matchResult = matchStrategy.match(queryText, terms, domainId); + + List matches = getMatches(matchResult); + + HanlpHelper.transLetterOriginal(matches); + + log.info("queryContext:{},matches:{}", queryContext, matches); + + convertTermsToSchemaMapInfo(matches, queryContext.getMapInfo(), terms); + } + + private void convertTermsToSchemaMapInfo(List mapResults, SchemaMapInfo schemaMap, List terms) { + if (CollectionUtils.isEmpty(mapResults)) { + return; + } + + Map wordNatureToFrequency = terms.stream().collect( + Collectors.toMap(entry -> entry.getWord() + entry.getNature(), + term -> Long.valueOf(term.getFrequency()), (value1, value2) -> value2)); + + for (MapResult mapResult : mapResults) { + for (String nature : mapResult.getNatures()) { + Long domainId = NatureHelper.getDomainId(nature); + if (Objects.isNull(domainId)) { + continue; + } + SchemaElementType elementType = NatureHelper.convertToElementType(nature); + if (Objects.isNull(elementType)) { + continue; + } + + SemanticService schemaService = ContextUtils.getBean(SemanticService.class); + DomainSchema domainSchema = schemaService.getDomainSchema(domainId); + + BaseWordBuilder baseWordBuilder = WordBuilderFactory.get(DictWordType.getNatureType(nature)); + Long elementID = baseWordBuilder.getElementID(nature); + Long frequency = wordNatureToFrequency.get(mapResult.getName() + nature); + + SchemaElement element = domainSchema.getElement(elementType, elementID); + if (element.getType().equals(SchemaElementType.VALUE)) { + element.setName(mapResult.getName()); + } + SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() + .element(element) + .frequency(frequency) + .word(mapResult.getName()) + .similarity(mapResult.getSimilarity()) + .detectWord(mapResult.getDetectWord()) + .build(); + + Map> domainElementMatches = schemaMap.getDomainElementMatches(); + List schemaElementMatches = domainElementMatches.putIfAbsent(domainId, + new ArrayList<>()); + if (schemaElementMatches == null) { + schemaElementMatches = domainElementMatches.get(domainId); + } + schemaElementMatches.add(schemaElementMatch); + } + } + } + + private List getMatches(Map> matchResult) { + List matches = new ArrayList<>(); + if (Objects.isNull(matchResult)) { + return matches; + } + Optional> first = matchResult.entrySet().stream() + .filter(entry -> CollectionUtils.isNotEmpty(entry.getValue())) + .map(entry -> entry.getValue()).findFirst(); + + if (first.isPresent()) { + matches = first.get(); + } + return matches; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/MapperHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java similarity index 92% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/MapperHelper.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java index 55309da3d..7fc691404 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/MapperHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.chat.application.mapper; +package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.algorithm.EditDistance; -import com.tencent.supersonic.chat.application.knowledge.NatureHelper; +import com.tencent.supersonic.chat.utils.NatureHelper; import java.util.List; import java.util.Map; import java.util.Objects; @@ -25,6 +25,9 @@ public class MapperHelper { private Integer oneDetectionMaxSize; @Value("${metric.dimension.threshold:0.3}") private Double metricDimensionThresholdConfig; + + @Value("${metric.dimension.min.threshold:0.3}") + private Double metricDimensionMinThresholdConfig; @Value("${dimension.value.threshold:0.5}") private Double dimensionValueThresholdConfig; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/MatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java similarity index 51% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/MatchStrategy.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java index 9b98f9d60..ea9db99f3 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/MatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java @@ -1,8 +1,8 @@ -package com.tencent.supersonic.chat.application.mapper; +package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.domain.pojo.search.MatchText; -import com.tencent.supersonic.common.nlp.MapResult; +import com.tencent.supersonic.knowledge.dictionary.MapResult; + import java.util.List; import java.util.Map; @@ -11,6 +11,6 @@ import java.util.Map; */ public interface MatchStrategy { - Map> match(String text, List terms, Integer detectDomainId); + Map> match(String text, List terms, Long detectDomainId); } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/MatchText.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchText.java similarity index 68% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/MatchText.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchText.java index b4142fc20..fe5d8bdca 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/search/MatchText.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchText.java @@ -1,30 +1,19 @@ -package com.tencent.supersonic.chat.domain.pojo.search; +package com.tencent.supersonic.chat.mapper; import java.util.Objects; +import lombok.Builder; import lombok.Data; -import lombok.Getter; -import lombok.Setter; import lombok.ToString; @Data -@Setter -@Getter @ToString +@Builder public class MatchText { private String regText; private String detectSegment; - public MatchText() { - } - - - public MatchText(String regText, String detectSegment) { - this.regText = regText; - this.detectSegment = detectSegment; - } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java new file mode 100644 index 000000000..74f785f30 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java @@ -0,0 +1,32 @@ +package com.tencent.supersonic.chat.mapper; + +import com.tencent.supersonic.chat.api.component.SchemaMapper; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; + +@Slf4j +public class QueryFilterMapper implements SchemaMapper { + + @Override + public void map(QueryContext queryContext) { + QueryRequest queryReq = queryContext.getRequest(); + Long domainId = queryReq.getDomainId(); + if (domainId == null || domainId <= 0) { + return; + } + SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); + clearOtherSchemaElementMatch(domainId, schemaMapInfo); + } + + private void clearOtherSchemaElementMatch(Long domainId, SchemaMapInfo schemaMapInfo) { + for (Map.Entry> entry : schemaMapInfo.getDomainElementMatches().entrySet()) { + if (!entry.getKey().equals(domainId)) { + entry.getValue().clear(); + } + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java similarity index 84% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryMatchStrategy.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java index 86a389a2f..a04ee3edd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/QueryMatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java @@ -1,10 +1,10 @@ -package com.tencent.supersonic.chat.application.mapper; +package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.domain.pojo.search.MatchText; -import com.tencent.supersonic.common.nlp.MapResult; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.knowledge.infrastructure.nlp.Suggester; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.service.SearchService; + import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -32,10 +32,11 @@ public class QueryMatchStrategy implements MatchStrategy { private MapperHelper mapperHelper; @Override - public Map> match(String text, List terms, Integer detectDomainId) { - if (CollectionUtils.isEmpty(terms) || StringUtils.isEmpty(text)) { + public Map> match(String text, List terms, Long detectDomainId) { + if (Objects.isNull(terms) || StringUtils.isEmpty(text)) { return null; } + Map regOffsetToLength = terms.stream().sorted(Comparator.comparing(Term::length)) .collect(Collectors.toMap(Term::getOffset, term -> term.word.length(), (value1, value2) -> value2)); @@ -47,13 +48,17 @@ public class QueryMatchStrategy implements MatchStrategy { List detects = detect(text, regOffsetToLength, offsetList, detectDomainId); Map> result = new HashMap<>(); - MatchText matchText = new MatchText(text, text); + + MatchText matchText = MatchText.builder() + .regText(text) + .detectSegment(text) + .build(); result.put(matchText, detects); return result; } private List detect(String text, Map regOffsetToLength, List offsetList, - Integer detectDomainId) { + Long detectDomainId) { List results = Lists.newArrayList(); for (Integer index = 0; index <= text.length() - 1; ) { @@ -75,15 +80,15 @@ public class QueryMatchStrategy implements MatchStrategy { return results; } - private List detectByStep(String text, Integer detectDomainId, Integer index, Integer i, int offset) { + private List detectByStep(String text, Long detectDomainId, Integer index, Integer i, int offset) { String detectSegment = text.substring(index, i); Integer oneDetectionSize = mapperHelper.getOneDetectionSize(); // step1. pre search - LinkedHashSet mapResults = Suggester.prefixSearch(detectSegment, + LinkedHashSet mapResults = SearchService.prefixSearch(detectSegment, mapperHelper.getOneDetectionMaxSize()) .stream().collect(Collectors.toCollection(LinkedHashSet::new)); // step2. suffix search - LinkedHashSet suffixMapResults = Suggester.suffixSearch(detectSegment, oneDetectionSize) + LinkedHashSet suffixMapResults = SearchService.suffixSearch(detectSegment, oneDetectionSize) .stream().collect(Collectors.toCollection(LinkedHashSet::new)); mapResults.addAll(suffixMapResults); @@ -99,8 +104,8 @@ public class QueryMatchStrategy implements MatchStrategy { log.debug("detectDomainId:{}, before parseResults:{}", mapResults); mapResults = mapResults.stream().map(entry -> { List natures = entry.getNatures().stream().filter( - nature -> nature.startsWith(NatureType.NATURE_SPILT + detectDomainId) || (nature.startsWith( - NatureType.NATURE_SPILT)) + nature -> nature.startsWith(DictWordType.NATURE_SPILT + detectDomainId) || (nature.startsWith( + DictWordType.NATURE_SPILT)) ).collect(Collectors.toList()); entry.setNatures(natures); return entry; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/SearchMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java similarity index 76% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/SearchMatchStrategy.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java index 38c449a8e..91c7be09b 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/mapper/SearchMatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java @@ -1,11 +1,11 @@ -package com.tencent.supersonic.chat.application.mapper; +package com.tencent.supersonic.chat.mapper; import com.google.common.collect.Lists; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.domain.pojo.search.MatchText; -import com.tencent.supersonic.common.nlp.MapResult; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.knowledge.infrastructure.nlp.Suggester; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.service.SearchService; + import java.util.List; import java.util.Map; import java.util.Objects; @@ -25,10 +25,10 @@ public class SearchMatchStrategy implements MatchStrategy { @Override public Map> match(String text, List originals, - Integer detectDomainId) { + Long detectDomainId) { Map regOffsetToLength = originals.stream() - .filter(entry -> !entry.nature.toString().startsWith(NatureType.NATURE_SPILT)) + .filter(entry -> !entry.nature.toString().startsWith(DictWordType.NATURE_SPILT)) .collect(Collectors.toMap(Term::getOffset, value -> value.word.length(), (value1, value2) -> value2)); @@ -52,19 +52,19 @@ public class SearchMatchStrategy implements MatchStrategy { String detectSegment = text.substring(detectIndex); if (StringUtils.isNotEmpty(detectSegment)) { - List mapResults = Suggester.prefixSearch(detectSegment); - List suffixMapResults = Suggester.suffixSearch(detectSegment, SEARCH_SIZE); + List mapResults = SearchService.prefixSearch(detectSegment); + List suffixMapResults = SearchService.suffixSearch(detectSegment, SEARCH_SIZE); mapResults.addAll(suffixMapResults); // remove entity name where search mapResults = mapResults.stream().filter(entry -> { List natures = entry.getNatures().stream() - .filter(nature -> !nature.endsWith(NatureType.ENTITY.getType())) + .filter(nature -> !nature.endsWith(DictWordType.ENTITY.getType())) .filter(nature -> { if (Objects.isNull(detectDomainId) || detectDomainId <= 0) { return true; } - if (nature.startsWith(NatureType.NATURE_SPILT + detectDomainId) - && nature.startsWith(NatureType.NATURE_SPILT)) { + if (nature.startsWith(DictWordType.NATURE_SPILT + detectDomainId) + && nature.startsWith(DictWordType.NATURE_SPILT)) { return true; } return false; @@ -75,7 +75,11 @@ public class SearchMatchStrategy implements MatchStrategy { } return true; }).collect(Collectors.toList()); - regTextMap.put(new MatchText(regText, detectSegment), mapResults); + MatchText matchText = MatchText.builder() + .regText(regText) + .detectSegment(detectSegment) + .build(); + regTextMap.put(matchText, mapResults); } } ); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/ParseMode.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/ParseMode.java new file mode 100644 index 000000000..d40c3d86f --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/ParseMode.java @@ -0,0 +1,9 @@ +package com.tencent.supersonic.chat.parser; + +public enum ParseMode { + + RULE, + EMBEDDING_RECALL, + FUNCTION_CALL; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java new file mode 100644 index 000000000..495a73597 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java @@ -0,0 +1,112 @@ +package com.tencent.supersonic.chat.parser; + + +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * This checker can be used by semantic parsers to check if query intent + * has already been satisfied by current candidate queries. If so, current + * parser could be skipped. + */ +@Slf4j +public class SatisfactionChecker { + + private static final double LONG_TEXT_THRESHOLD = 0.8; + private static final double SHORT_TEXT_THRESHOLD = 0.6; + private static final int QUERY_TEXT_LENGTH_THRESHOLD = 10; + + public static final double BONUS_THRESHOLD = 100; + + // check all the parse info in candidate + public static boolean check(QueryContext queryCtx) { + for (SemanticQuery query : queryCtx.getCandidateQueries()) { + SemanticParseInfo semanticParseInfo = query.getParseInfo(); + Long domainId = semanticParseInfo.getDomainId(); + List schemaElementMatches = queryCtx.getMapInfo() + .getMatchedElements(domainId); + if (check(queryCtx.getRequest().getQueryText(), semanticParseInfo, schemaElementMatches)) { + return true; + } + } + return false; + } + + //check single parse info + private static boolean check(String text, SemanticParseInfo semanticParseInfo, + List schemaElementMatches) { + if (semanticParseInfo.getBonus() != null && semanticParseInfo.getBonus() >= BONUS_THRESHOLD) { + return true; + } + if (CollectionUtils.isEmpty(schemaElementMatches)) { + return false; + } + List detectWords = Lists.newArrayList(); + Map detectWordMap = schemaElementMatches.stream() + .collect(Collectors.toMap(m -> m.getElement().getId(), SchemaElementMatch::getDetectWord, + (id1, id2) -> id1)); + // get detect word in text by element id in semantic layer + Long domainId = semanticParseInfo.getDomainId(); + if (domainId != null && domainId > 0) { + for (SchemaElementMatch schemaElementMatch : schemaElementMatches) { + if (SchemaElementType.DOMAIN.equals(schemaElementMatch.getElement().getType())) { + detectWords.add(schemaElementMatch.getDetectWord()); + } + } + } + for (SchemaElementMatch schemaElementMatch : schemaElementMatches) { + if (SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) { + detectWords.add(schemaElementMatch.getDetectWord()); + } + } + for (SchemaElement schemaItem : semanticParseInfo.getMetrics()) { + detectWords.add( + detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L), "")); + // only first metric + break; + } + for (SchemaElement schemaItem : semanticParseInfo.getDimensions()) { + detectWords.add( + detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L), "")); + // only first dimension + break; + } + String dateText = Optional.ofNullable(semanticParseInfo.getDateInfo()).orElse(new DateConf()).getText(); + if (StringUtils.isNotBlank(dateText) && !dateText.equalsIgnoreCase(Constants.NULL)) { + detectWords.add(dateText); + } + detectWords.removeIf(word -> !text.contains(word)); + //compare the length between detect words and query text + return checkThreshold(text, detectWords, semanticParseInfo); + } + + private static boolean checkThreshold(String queryText, List detectWords, SemanticParseInfo semanticParseInfo) { + String detectWordsDistinct = StringUtils.join(new HashSet<>(detectWords), ""); + int detectWordsLength = detectWordsDistinct.length(); + int queryTextLength = queryText.length(); + double degree = detectWordsLength * 1.0 / queryTextLength; + if (queryTextLength > QUERY_TEXT_LENGTH_THRESHOLD) { + if (degree < LONG_TEXT_THRESHOLD) { + return false; + } + } else if (degree < SHORT_TEXT_THRESHOLD) { + return false; + } + log.info("queryMode:{}, degree:{}, detectWords:{}, parse info:{}", + semanticParseInfo.getQueryMode(), degree, detectWordsDistinct, semanticParseInfo); + return true; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java new file mode 100644 index 000000000..6bbdf299f --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java @@ -0,0 +1,181 @@ +package com.tencent.supersonic.chat.parser.embedding; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.config.EntityRichInfo; +import com.tencent.supersonic.chat.parser.SatisfactionChecker; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.plugin.PluginManager; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.PluginService; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.util.ContextUtils; +import java.util.*; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +@Slf4j +public class EmbeddingBasedParser implements SemanticParser { + + private final static double THRESHOLD = 0.2d; + + @Override + public void parse(QueryContext queryContext, ChatContext chatContext) { + EmbeddingConfig embeddingConfig = ContextUtils.getBean(EmbeddingConfig.class); + if (SatisfactionChecker.check(queryContext) || StringUtils.isBlank(embeddingConfig.getUrl())) { + return; + } + log.info("EmbeddingBasedParser parser query ctx: {}, chat ctx: {}", queryContext, chatContext); + for (Long domainId : getDomainMatched(queryContext)) { + String text = replaceText(queryContext, domainId); + List embeddingRetrievals = recallResult(text, hasCandidateQuery(queryContext)); + Optional pluginOptional = choosePlugin(embeddingRetrievals, domainId); + if (pluginOptional.isPresent()) { + Map embeddingRetrievalMap = embeddingRetrievals.stream() + .collect(Collectors.toMap(RecallRetrieval::getId, e -> e, (value1, value2) -> value1)); + Plugin plugin = pluginOptional.get(); + log.info("EmbeddingBasedParser text: {} domain: {} choose plugin: [{} {}]", + text, domainId, plugin.getId(), plugin.getName()); + PluginSemanticQuery pluginQuery = QueryManager.createPluginQuery(plugin.getType()); + SemanticParseInfo semanticParseInfo = buildSemanticParseInfo(queryContext, domainId, + plugin, embeddingRetrievalMap); + semanticParseInfo.setQueryMode(pluginQuery.getQueryMode()); + pluginQuery.setParseInfo(semanticParseInfo); + queryContext.getCandidateQueries().add(pluginQuery); + } + } + } + + private Set getDomainMatched(QueryContext queryContext) { + Long queryDomainId = queryContext.getRequest().getDomainId(); + if (queryDomainId != null && queryDomainId > 0) { + return Sets.newHashSet(queryDomainId); + } + return queryContext.getMapInfo().getMatchedDomains(); + } + + private SemanticParseInfo buildSemanticParseInfo(QueryContext queryContext, Long domainId, Plugin plugin, + Map embeddingRetrievalMap) { + SchemaElement schemaElement = new SchemaElement(); + schemaElement.setDomain(domainId); + schemaElement.setId(domainId); + SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); + semanticParseInfo.setDomain(schemaElement); + SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); + if (Double.parseDouble(embeddingRetrievalMap.get(plugin.getId().toString()).getDistance()) < THRESHOLD) { + semanticParseInfo.setBonus(SatisfactionChecker.BONUS_THRESHOLD); + } + Map properties = new HashMap<>(); + properties.put(Constants.CONTEXT, plugin); + semanticParseInfo.setProperties(properties); + semanticParseInfo.setElementMatches(schemaMapInfo.getMatchedElements(domainId)); + fillSemanticParseInfo(queryContext, semanticParseInfo); + setEntityId(domainId, semanticParseInfo); + return semanticParseInfo; + } + + private Optional getEntityElementId(Long domainId) { + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigRich chatConfigRich = configService.getConfigRichInfo(domainId); + EntityRichInfo entityRichInfo = chatConfigRich.getChatDetailRichConfig().getEntity(); + if (entityRichInfo != null) { + SchemaElement schemaElement = entityRichInfo.getDimItem(); + if (schemaElement != null) { + return Optional.of(schemaElement.getId()); + } + } + return Optional.empty(); + } + + private void setEntityId(Long domainId, SemanticParseInfo semanticParseInfo) { + Optional entityElementIdOptional = getEntityElementId(domainId); + if (entityElementIdOptional.isPresent()) { + Long entityElementId = entityElementIdOptional.get(); + for (QueryFilter filter : semanticParseInfo.getDimensionFilters()) { + if (entityElementId.equals(filter.getElementID())) { + String value = String.valueOf(filter.getValue()); + if (StringUtils.isNumeric(value)) { + semanticParseInfo.setEntity(Long.parseLong(value)); + } + } + } + } + } + + private Optional choosePlugin(List embeddingRetrievals, + Long domainId) { + if (CollectionUtils.isEmpty(embeddingRetrievals)) { + return Optional.empty(); + } + PluginService pluginService = ContextUtils.getBean(PluginService.class); + List plugins = pluginService.getPluginList(); + Map pluginMap = plugins.stream().collect(Collectors.toMap(Plugin::getId, p -> p)); + for (RecallRetrieval embeddingRetrieval : embeddingRetrievals) { + Plugin plugin = pluginMap.get(Long.parseLong(embeddingRetrieval.getId())); + if (!CollectionUtils.isEmpty(plugin.getDomainList()) && plugin.getDomainList().contains(domainId)) { + return Optional.of(plugin); + } + } + return Optional.empty(); + } + + public List recallResult(String embeddingText, boolean hasCandidateQuery) { + try { + PluginManager pluginManager = ContextUtils.getBean(PluginManager.class); + EmbeddingResp embeddingResp = pluginManager.recognize(embeddingText); + log.info("embedding result, text:{} embeddingResp:{}", embeddingText, embeddingResp); + List embeddingRetrievals = embeddingResp.getRetrieval(); + if(!CollectionUtils.isEmpty(embeddingRetrievals)){ + if (hasCandidateQuery) { + embeddingRetrievals = embeddingRetrievals.stream() + .filter(llmRetrieval -> Double.parseDouble(llmRetrieval.getDistance()) + Math.abs(Double.parseDouble(o.getDistance())))).collect(Collectors.toList()); + embeddingResp.setRetrieval(embeddingRetrievals); + } + return embeddingRetrievals; + } catch (Exception e) { + log.warn("get embedding result error ", e); + } + return Lists.newArrayList(); + } + + private boolean hasCandidateQuery(QueryContext queryContext) { + return !CollectionUtils.isEmpty(queryContext.getCandidateQueries()); + } + + private void fillSemanticParseInfo(QueryContext queryContext, SemanticParseInfo semanticParseInfo) { + if (queryContext.getRequest().getQueryFilters() != null) { + semanticParseInfo.getDimensionFilters() + .addAll(queryContext.getRequest().getQueryFilters().getFilters()); + } + } + + protected String replaceText(QueryContext queryContext, Long domainId) { + String text = queryContext.getRequest().getQueryText(); + List schemaElementMatches = queryContext.getMapInfo().getMatchedElements(domainId); + if (CollectionUtils.isEmpty(schemaElementMatches)) { + return text; + } + List valueSchemaElementMatches = schemaElementMatches.stream() + .filter(schemaElementMatch -> + SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) + .collect(Collectors.toList()); + for (SchemaElementMatch schemaElementMatch : valueSchemaElementMatches) { + String detectWord = schemaElementMatch.getDetectWord(); + text = text.replace(detectWord, ""); + } + return text; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java new file mode 100644 index 000000000..9df4c6e8b --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java @@ -0,0 +1,26 @@ +package com.tencent.supersonic.chat.parser.embedding; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Data +public class EmbeddingConfig { + + @Value("${embedding.url:}") + private String url; + + @Value("${embedding.recognize.path:preset_query_retrival}") + private String recognizePath; + + @Value("${embedding.delete.path:preset_delete_by_ids}") + private String deletePath; + + @Value("${embedding.add.path:preset_query_add}") + private String addPath; + + @Value("${embedding.nResult:1}") + private String nResult; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java new file mode 100644 index 000000000..6ac6509d5 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java @@ -0,0 +1,110 @@ +package com.tencent.supersonic.chat.parser.embedding; + +import com.alibaba.fastjson.JSONObject; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.parser.function.DomainResolver; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; +import java.util.Set; + +@Slf4j +@Component("EmbeddingEntityResolver") +public class EmbeddingEntityResolver { + + private ConfigService configService; + + public EmbeddingEntityResolver(ConfigService configService) { + this.configService = configService; + } + + public Pair getDomainEntityId(QueryContext queryCtx, ChatContext chatCtx) { + DomainResolver domainResolver = ComponentFactory.getDomainResolver(); + Long domainId = domainResolver.resolve(queryCtx, chatCtx); + ChatConfigRich chatConfigRichResp = configService.getConfigRichInfo(domainId); + SchemaElement schemaElement = chatConfigRichResp.getChatDetailRichConfig().getEntity().getDimItem(); + if (schemaElement == null) { + return Pair.of(domainId, null); + } + Long entityId = getEntityValue(domainId, schemaElement.getId(), queryCtx, chatCtx); + return Pair.of(domainId, entityId); + } + + + private Long getEntityValue(Long domainId, Long entityElementId, QueryContext queryCtx, ChatContext chatCtx) { + Long entityId = null; + QueryFilters queryFilters = queryCtx.getRequest().getQueryFilters(); + if (queryFilters != null) { + entityId = getEntityValueFromQueryFilter(queryFilters.getFilters()); + if (entityId != null) { + log.info("get entity id:{} domain id:{} from query filter :{} ", entityId, domainId, queryFilters); + return entityId; + } + } + entityId = getEntityValueFromSchemaMapInfo(domainId, queryCtx.getMapInfo(), entityElementId); + log.info("get entity id:{} from schema map Info :{} ", entityId, JSONObject.toJSONString(queryCtx.getMapInfo())); + if (entityId == null || entityId == 0) { + Long entityIdFromChat = getEntityValueFromParseInfo(chatCtx.getParseInfo(), entityElementId); + if (entityIdFromChat != null && entityIdFromChat > 0) { + entityId = entityIdFromChat; + } + } + return entityId; + } + + private Long getEntityValueFromQueryFilter(List queryFilters) { + if (CollectionUtils.isEmpty(queryFilters)) { + return null; + } + QueryFilter filter = queryFilters.get(0); + String value = String.valueOf(filter.getValue()); + if (StringUtils.isNumeric(value)) { + return Long.parseLong(value); + } + return null; + } + + private Long getEntityValueFromParseInfo(SemanticParseInfo semanticParseInfo, Long entityElementId) { + Set filters = semanticParseInfo.getDimensionFilters(); + if (CollectionUtils.isEmpty(filters)) { + return null; + } + for (QueryFilter filter : filters) { + if (entityElementId.equals(filter.getElementID())) { + String value = String.valueOf(filter.getValue()); + if (StringUtils.isNumeric(value)) { + return Long.parseLong(value); + } + } + } + return null; + } + + + private Long getEntityValueFromSchemaMapInfo(Long domainId, SchemaMapInfo schemaMapInfo, Long entityElementId) { + List schemaElementMatchList = schemaMapInfo.getMatchedElements(domainId); + if (CollectionUtils.isEmpty(schemaElementMatchList)) { + return null; + } + for (SchemaElementMatch schemaElementMatch : schemaElementMatchList) { + if (Objects.equals(schemaElementMatch.getElement().getId(), entityElementId)) { + if (StringUtils.isNumeric(schemaElementMatch.getWord())) { + return Long.parseLong(schemaElementMatch.getWord()); + } + } + + } + return null; + } + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java new file mode 100644 index 000000000..4966514a9 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java @@ -0,0 +1,16 @@ +package com.tencent.supersonic.chat.parser.embedding; + + +import lombok.Data; + +import java.util.List; + +@Data +public class EmbeddingResp { + + private String query; + + private List retrieval; + + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java new file mode 100644 index 000000000..64d141119 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.chat.parser.embedding; + + +import lombok.Data; + +@Data +public class RecallRetrieval { + + private String id; + + private String distance; + + private String presetQuery; + + private String presetId; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java new file mode 100644 index 000000000..bb1dfcbff --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java @@ -0,0 +1,9 @@ +package com.tencent.supersonic.chat.parser.function; + +import lombok.Data; + +@Data +public class DomainMatchResult { + private Integer count = 0; + private double maxSimilarity; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java new file mode 100644 index 000000000..4ecd3e9db --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.chat.parser.function; + + +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; + +public interface DomainResolver { + + Long resolve(QueryContext queryContext, ChatContext chatCtx); + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java new file mode 100644 index 000000000..e32ccc9fd --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java @@ -0,0 +1,132 @@ +package com.tencent.supersonic.chat.parser.function; + +import com.alibaba.fastjson.JSON; +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.config.FunctionCallConfig; +import com.tencent.supersonic.chat.parser.ParseMode; +import com.tencent.supersonic.chat.parser.SatisfactionChecker; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.plugin.PluginManager; +import com.tencent.supersonic.chat.plugin.PluginParseResult; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.query.plugin.dsl.DSLQuery; +import com.tencent.supersonic.chat.service.PluginService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.util.ContextUtils; +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +@Slf4j +public class FunctionBasedParser implements SemanticParser { + + public static final double FUNCTION_BONUS_THRESHOLD = 200; + + @Override + public void parse(QueryContext queryCtx, ChatContext chatCtx) { + FunctionCallConfig functionCallConfig = ContextUtils.getBean(FunctionCallConfig.class); + PluginService pluginService = ContextUtils.getBean(PluginService.class); + String functionUrl = functionCallConfig.getUrl(); + + if (StringUtils.isBlank(functionUrl) || SatisfactionChecker.check(queryCtx)) { + log.info("functionUrl:{}, skip function parser, queryText:{}", functionUrl, + queryCtx.getRequest().getQueryText()); + return; + } + DomainResolver domainResolver = ComponentFactory.getDomainResolver(); + Long domainId = domainResolver.resolve(queryCtx, chatCtx); + List functionNames = getFunctionNames(domainId); + log.info("domainId:{},functionNames:{}", domainId, functionNames); + if (Objects.isNull(domainId) || domainId <= 0) { + return; + } + FunctionReq functionReq = FunctionReq.builder() + .queryText(queryCtx.getRequest().getQueryText()) + .functionNames(functionNames).build(); + + FunctionResp functionResp = requestFunction(functionUrl, functionReq); + log.info("requestFunction result:{}", functionResp.getToolSelection()); + if (Objects.isNull(functionResp) || StringUtils.isBlank(functionResp.getToolSelection())) { + return; + } + + PluginParseResult functionCallParseResult = new PluginParseResult(); + String toolSelection = functionResp.getToolSelection(); + Optional pluginOptional = pluginService.getPluginByName(toolSelection); + if (pluginOptional.isPresent()) { + toolSelection = pluginOptional.get().getType(); + functionCallParseResult.setPlugin(pluginOptional.get()); + } + PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(toolSelection); + + SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); + parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(domainId)); + functionCallParseResult.setRequest(queryCtx.getRequest()); + Map properties = new HashMap<>(); + properties.put(Constants.CONTEXT, functionCallParseResult); + parseInfo.setProperties(properties); + parseInfo.setBonus(FUNCTION_BONUS_THRESHOLD); + SchemaElement domain = new SchemaElement(); + domain.setDomain(domainId); + domain.setId(domainId); + parseInfo.setDomain(domain); + queryCtx.getCandidateQueries().add(semanticQuery); + } + + private List getFunctionNames(Long domainId) { + List plugins = PluginManager.getPlugins(); + Set functionNames = plugins.stream() + .filter(entry -> ParseMode.FUNCTION_CALL.equals(entry.getParseMode())) + .filter(entry -> { + if (!CollectionUtils.isEmpty(entry.getDomainList())) { + return entry.getDomainList().contains(domainId); + } + return true; + } + ).map(Plugin::getName).collect(Collectors.toSet()); + functionNames.add(DSLQuery.QUERY_MODE); + return new ArrayList<>(functionNames); + } + + public FunctionResp requestFunction(String url, FunctionReq functionReq) { + HttpHeaders headers = new HttpHeaders(); + long startTime = System.currentTimeMillis(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(JSON.toJSONString(functionReq), headers); + URI requestUrl = UriComponentsBuilder.fromHttpUrl(url).build().encode().toUri(); + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); + try { + log.info("requestFunction functionReq:{}", functionReq); + ResponseEntity responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, entity, + FunctionResp.class); + log.info("requestFunction responseEntity:{},cost:{}", responseEntity, + System.currentTimeMillis() - startTime); + return responseEntity.getBody(); + } catch (Exception e) { + log.error("requestFunction error", e); + } + return null; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java new file mode 100644 index 000000000..65c382cc0 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java @@ -0,0 +1,15 @@ +package com.tencent.supersonic.chat.parser.function; + +import java.util.List; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class FunctionReq { + + private String queryText; + + private List functionNames; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java new file mode 100644 index 000000000..f27021481 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java @@ -0,0 +1,10 @@ +package com.tencent.supersonic.chat.parser.function; + +import lombok.Data; + +@Data +public class FunctionResp { + + private String toolSelection; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java new file mode 100644 index 000000000..db7a486e1 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java @@ -0,0 +1,166 @@ +package com.tencent.supersonic.chat.parser.function; + +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; +import java.util.stream.Collectors; +import org.apache.commons.collections.CollectionUtils; + +@Slf4j +public class HeuristicDomainResolver implements DomainResolver { + + protected static Long selectDomainBySchemaElementCount(Map domainQueryModes, + SchemaMapInfo schemaMap) { + Map domainTypeMap = getDomainTypeMap(schemaMap); + if (domainTypeMap.size() == 1) { + Long domainSelect = domainTypeMap.entrySet().stream().collect(Collectors.toList()).get(0).getKey(); + if (domainQueryModes.containsKey(domainSelect)) { + log.info("selectDomain with only one domain [{}]", domainSelect); + return domainSelect; + } + } else { + Map.Entry maxDomain = domainTypeMap.entrySet().stream() + .filter(entry -> domainQueryModes.containsKey(entry.getKey())) + .sorted((o1, o2) -> { + int difference = o1.getValue().getCount() - o2.getValue().getCount(); + if (difference == 0) { + return (int) ((o1.getValue().getMaxSimilarity() + - o2.getValue().getMaxSimilarity()) * 100); + } + return difference; + }).findFirst().orElse(null); + if (maxDomain != null) { + log.info("selectDomain with multiple domains [{}]", maxDomain.getKey()); + return maxDomain.getKey(); + } + } + return 0L; + } + + /** + * to check can switch domain if context exit domain + * + * @return false will use context domain, true will use other domain , maybe include context domain + */ + protected static boolean isAllowSwitch(Map domainQueryModes, SchemaMapInfo schemaMap, + ChatContext chatCtx, QueryRequest searchCtx, Long domainId) { + if (!Objects.nonNull(domainId) || domainId <= 0) { + return true; + } + // except content domain, calculate the number of types for each domain, if numbers<=1 will not switch + Map domainTypeMap = getDomainTypeMap(schemaMap); + log.info("isAllowSwitch domainTypeMap [{}]", domainTypeMap); + long otherDomainTypeNumBigOneCount = domainTypeMap.entrySet().stream() + .filter(entry -> domainQueryModes.containsKey(entry.getKey()) && !entry.getKey().equals(domainId)) + .filter(entry -> entry.getValue().getCount() > 1).count(); + if (otherDomainTypeNumBigOneCount >= 1) { + return true; + } + // if query text only contain time , will not switch + if (!CollectionUtils.isEmpty(domainQueryModes.values())) { + for (SemanticQuery semanticQuery : domainQueryModes.values()) { + if (semanticQuery == null) { + continue; + } + SemanticParseInfo semanticParseInfo = semanticQuery.getParseInfo(); + if (semanticParseInfo == null) { + continue; + } + if (searchCtx.getQueryText() != null && semanticParseInfo.getDateInfo() != null) { + if (semanticParseInfo.getDateInfo().getText() != null) { + if (semanticParseInfo.getDateInfo().getText().equalsIgnoreCase(searchCtx.getQueryText())) { + log.info("timeParseResults is not null , can not switch context , timeParseResults:{},", + semanticParseInfo.getDateInfo()); + return false; + } + } + } + } + } + + // if context domain not in schemaMap , will switch + if (schemaMap.getMatchedElements(domainId) == null || schemaMap.getMatchedElements(domainId).size() <= 0) { + log.info("domainId not in schemaMap "); + return true; + } + // other will not switch + return false; + } + + public static Map getDomainTypeMap(SchemaMapInfo schemaMap) { + Map domainCount = new HashMap<>(); + for (Map.Entry> entry : schemaMap.getDomainElementMatches().entrySet()) { + List schemaElementMatches = schemaMap.getMatchedElements(entry.getKey()); + if (schemaElementMatches != null && schemaElementMatches.size() > 0) { + if (!domainCount.containsKey(entry.getKey())) { + domainCount.put(entry.getKey(), new DomainMatchResult()); + } + DomainMatchResult domainMatchResult = domainCount.get(entry.getKey()); + Set schemaElementTypes = new HashSet<>(); + schemaElementMatches.stream() + .forEach(schemaElementMatch -> schemaElementTypes.add( + schemaElementMatch.getElement().getType())); + SchemaElementMatch schemaElementMatchMax = schemaElementMatches.stream() + .sorted((o1, o2) -> + ((int) ((o2.getSimilarity() - o1.getSimilarity()) * 100)) + ).findFirst().orElse(null); + if (schemaElementMatchMax != null) { + domainMatchResult.setMaxSimilarity(schemaElementMatchMax.getSimilarity()); + } + domainMatchResult.setCount(schemaElementTypes.size()); + + } + } + return domainCount; + } + + + public Long resolve(QueryContext queryContext, ChatContext chatCtx) { + Long domainId = queryContext.getRequest().getDomainId(); + if (Objects.nonNull(domainId) && domainId > 0) { + return domainId; + } + SchemaMapInfo mapInfo = queryContext.getMapInfo(); + Set matchedDomains = mapInfo.getMatchedDomains(); + Map domainQueryModes = new HashMap<>(); + for (Long matchedDomain : matchedDomains) { + domainQueryModes.put(matchedDomain, null); + } + return resolve(domainQueryModes, queryContext, chatCtx, + queryContext.getMapInfo()); + } + + public Long resolve(Map domainQueryModes, QueryContext queryContext, + ChatContext chatCtx, SchemaMapInfo schemaMap) { + Long selectDomain = selectDomain(domainQueryModes, queryContext.getRequest(), chatCtx, schemaMap); + if (selectDomain > 0) { + log.info("selectDomain {} ", selectDomain); + return selectDomain; + } + // get the max SchemaElementType number + return selectDomainBySchemaElementCount(domainQueryModes, schemaMap); + } + + public Long selectDomain(Map domainQueryModes, QueryRequest queryContext, + ChatContext chatCtx, + SchemaMapInfo schemaMap) { + // if QueryContext has domainId and in domainQueryModes + if (domainQueryModes.containsKey(queryContext.getDomainId())) { + log.info("selectDomain from QueryContext [{}]", queryContext.getDomainId()); + return queryContext.getDomainId(); + } + // if ChatContext has domainId and in domainQueryModes + if (chatCtx.getParseInfo().getDomainId() > 0) { + Long domainId = chatCtx.getParseInfo().getDomainId(); + if (!isAllowSwitch(domainQueryModes, schemaMap, chatCtx, queryContext, domainId)) { + log.info("selectDomain from ChatContext [{}]", domainId); + return domainId; + } + } + // default 0 + return 0L; + } +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java new file mode 100644 index 000000000..9302ab920 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java @@ -0,0 +1,64 @@ +package com.tencent.supersonic.chat.parser.rule; + +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.tencent.supersonic.common.util.JsonUtil; +import lombok.extern.slf4j.Slf4j; + +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.*; + +@Slf4j +public class AggregateTypeParser implements SemanticParser { + + private static final Map REGX_MAP = Stream.of( + new AbstractMap.SimpleEntry<>(MAX, Pattern.compile("(?i)(最大值|最大|max|峰值|最高|最多)")), + new AbstractMap.SimpleEntry<>(MIN, Pattern.compile("(?i)(最小值|最小|min|最低|最少)")), + new AbstractMap.SimpleEntry<>(SUM, Pattern.compile("(?i)(汇总|总和|sum)")), + new AbstractMap.SimpleEntry<>(AVG, Pattern.compile("(?i)(平均值|日均|平均|avg)")), + new AbstractMap.SimpleEntry<>(TOPN, Pattern.compile("(?i)(top)")), + new AbstractMap.SimpleEntry<>(DISTINCT, Pattern.compile("(?i)(uv)")), + new AbstractMap.SimpleEntry<>(COUNT, Pattern.compile("(?i)(总数|pv)")), + new AbstractMap.SimpleEntry<>(NONE, Pattern.compile("(?i)(明细)")) + ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + @Override + public void parse(QueryContext queryContext, ChatContext chatContext) { + for (SemanticQuery semanticQuery : queryContext.getCandidateQueries()) { + if (!AggregateTypeEnum.NONE.equals(semanticQuery.getParseInfo().getAggType())) { + continue; + } + + String queryText = queryContext.getRequest().getQueryText(); + semanticQuery.getParseInfo().setAggType(resolveAggregateType(queryText)); + } + } + + public static AggregateTypeEnum resolveAggregateType(String queryText) { + Map aggregateCount = new HashMap<>(REGX_MAP.size()); + + for (Map.Entry entry : REGX_MAP.entrySet()) { + Matcher matcher = entry.getValue().matcher(queryText); + int count = 0; + while (matcher.find()) { + count++; + } + if (count > 0) { + aggregateCount.put(entry.getKey(), count); + } + } + + return aggregateCount.entrySet().stream().max(Map.Entry.comparingByValue()) + .map(entry -> entry.getKey()).orElse(NONE); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java new file mode 100644 index 000000000..073a4906c --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java @@ -0,0 +1,78 @@ +package com.tencent.supersonic.chat.parser.rule; + +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.query.rule.metric.MetricDomainQuery; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; +import com.tencent.supersonic.common.util.JsonUtil; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; + +@Slf4j +public class ContextInheritParser implements SemanticParser { + + private static final Map> MUTUAL_EXCLUSIVE_MAP = Stream.of( + new AbstractMap.SimpleEntry<>(METRIC, Arrays.asList(METRIC)), + new AbstractMap.SimpleEntry<>(DIMENSION, Arrays.asList(DIMENSION, VALUE)), + new AbstractMap.SimpleEntry<>(VALUE, Arrays.asList(VALUE, DIMENSION)), + new AbstractMap.SimpleEntry<>(ENTITY, Arrays.asList(ENTITY)), + new AbstractMap.SimpleEntry<>(DOMAIN, Arrays.asList(DOMAIN)) + ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + @Override + public void parse(QueryContext queryContext, ChatContext chatContext) { + if (!shouldInherit(queryContext, chatContext)) { + return; + } + + Long domainId = chatContext.getParseInfo().getDomainId(); + List elementMatches = queryContext.getMapInfo() + .getMatchedElements(domainId); + + List matchesToInherit = new ArrayList<>(); + for (SchemaElementMatch match : chatContext.getParseInfo().getElementMatches()) { + SchemaElementType matchType = match.getElement().getType(); + // mutual exclusive element types should not be inherited + if (!containsTypes(elementMatches, MUTUAL_EXCLUSIVE_MAP.get(matchType))) { + matchesToInherit.add(match); + } + } + elementMatches.addAll(matchesToInherit); + + List queries = RuleSemanticQuery.resolve(elementMatches, queryContext); + for (RuleSemanticQuery query : queries) { + query.fillParseInfo(domainId, chatContext); + queryContext.getCandidateQueries().add(query); + } + } + + private boolean containsTypes(List matches, List types) { + return matches.stream().anyMatch(m -> types.contains(m.getElement().getType())); + } + + protected boolean shouldInherit(QueryContext queryContext, ChatContext chatContext) { + if (queryContext.getMapInfo().getMatchedElements( + chatContext.getParseInfo().getDomainId()) == null) { + return false; + } + + // if candidates have only one MetricDomain mode and context has value filter , count in context + if (queryContext.getCandidateQueries().size() == 1 && (queryContext.getCandidateQueries() + .get(0) instanceof MetricDomainQuery) + && queryContext.getCandidateQueries().get(0).getParseInfo().getDomainId() + .equals(chatContext.getParseInfo().getDomainId()) + && !CollectionUtils.isEmpty(chatContext.getParseInfo().getDimensionFilters())) { + return true; + } else { + return queryContext.getCandidateQueries().size() == 0; + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java new file mode 100644 index 000000000..af1d7e0f8 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java @@ -0,0 +1,31 @@ +package com.tencent.supersonic.chat.parser.rule; + +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; + +import java.util.*; + +import com.tencent.supersonic.common.util.JsonUtil; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class QueryModeParser implements SemanticParser { + + @Override + public void parse(QueryContext queryContext, ChatContext chatContext) { + SchemaMapInfo mapInfo = queryContext.getMapInfo(); + + // iterate all schemaElementMatches to resolve semantic query + for (Long domainId : mapInfo.getMatchedDomains()) { + List elementMatches = mapInfo.getMatchedElements(domainId); + List queries = RuleSemanticQuery.resolve(elementMatches, queryContext); + + for (RuleSemanticQuery query : queries) { + query.fillParseInfo(domainId, chatContext); + queryContext.getCandidateQueries().add(query); + } + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java new file mode 100644 index 000000000..fec43ee27 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java @@ -0,0 +1,188 @@ +package com.tencent.supersonic.chat.parser.rule; + +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.xkzhangsan.time.nlp.TimeNLP; +import com.xkzhangsan.time.nlp.TimeNLPUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; + +@Slf4j +public class TimeRangeParser implements SemanticParser { + + private static final Pattern RECENT_PATTERN_CN = Pattern.compile( + ".*(?(近|过去)((?\\d+)|(?[一二三四五六七八九十百千万亿]+))个?(?[天周月年])).*"); + private static final Pattern DATE_PATTERN_NUMBER = Pattern.compile("(\\d{8})"); + private static final DateFormat DATE_FORMAT_NUMBER = new SimpleDateFormat("yyyyMMdd"); + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + @Override + public void parse(QueryContext queryContext, ChatContext chatContext) { + DateConf dateConf = parseRecent(queryContext.getRequest().getQueryText()); + if (dateConf == null) { + dateConf = parseDateNumber(queryContext.getRequest().getQueryText()); + } + if (dateConf == null) { + dateConf = parseDateCN(queryContext.getRequest().getQueryText()); + } + + if (dateConf != null) { + if (queryContext.getCandidateQueries().size() > 0) { + for (SemanticQuery query : queryContext.getCandidateQueries()) { + query.getParseInfo().setDateInfo(dateConf); + } + } else if(QueryManager.containsRuleQuery(chatContext.getParseInfo().getQueryMode())) { + RuleSemanticQuery semanticQuery = QueryManager.createRuleQuery( + chatContext.getParseInfo().getQueryMode()); + // inherit parse info from context + chatContext.getParseInfo().setDateInfo(dateConf); + semanticQuery.setParseInfo(chatContext.getParseInfo()); + queryContext.getCandidateQueries().add(semanticQuery); + } + } + } + + private DateConf parseDateCN(String queryText) { + Date startDate = null; + Date endDate; + + List times = TimeNLPUtil.parse(queryText); + if (times.size() > 0) { + startDate = times.get(0).getTime(); + }else { + return null; + } + + if (times.size() > 1) { + endDate = times.get(1).getTime(); + } else { + endDate = startDate; + } + + return getDateConf(startDate, endDate); + } + + private DateConf parseDateNumber(String queryText) { + String startDate; + String endDate = null; + + Matcher dateMatcher = DATE_PATTERN_NUMBER.matcher(queryText); + if (dateMatcher.find()) { + startDate = dateMatcher.group(); + } else { + return null; + } + if (dateMatcher.find()) { + endDate = dateMatcher.group(); + } + + endDate = endDate != null ? endDate : startDate; + + try { + return getDateConf(DATE_FORMAT_NUMBER.parse(startDate), DATE_FORMAT_NUMBER.parse(endDate)); + } catch (ParseException e) { + return null; + } + } + + private DateConf parseRecent(String queryText) { + Matcher m = RECENT_PATTERN_CN.matcher(queryText); + if (m.matches()) { + int num = 0; + String enNum = m.group("enNum"); + String zhNum = m.group("zhNum"); + if (enNum != null) { + num = Integer.parseInt(enNum); + } else if (zhNum != null) { + num = zhNumParse(zhNum); + } + if (num > 0) { + DateConf info = new DateConf(); + String zhPeriod = m.group("zhPeriod"); + int days; + switch (zhPeriod) { + case "周": + days = 7; + info.setPeriod(Constants.WEEK); + break; + case "月": + days = 30; + info.setPeriod(Constants.MONTH); + break; + case "年": + days = 365; + info.setPeriod(Constants.YEAR); + break; + default: + days = 1; + info.setPeriod(Constants.DAY); + } + days = days * num; + info.setDateMode(DateConf.DateMode.RECENT_UNITS); + String text = "近" + num + zhPeriod; + if (Strings.isNotEmpty(m.group("periodStr"))) { + text = m.group("periodStr"); + } + info.setText(text); + info.setStartDate(LocalDate.now().minusDays(days).toString()); + info.setUnit(num); + + return info; + } + } + + return null; + } + + private int zhNumParse(String zhNumStr) { + Stack stack = new Stack<>(); + String numStr = "一二三四五六七八九"; + String unitStr = "十百千万亿"; + + String[] ssArr = zhNumStr.split(""); + for (String e : ssArr) { + int numIndex = numStr.indexOf(e); + int unitIndex = unitStr.indexOf(e); + if (numIndex != -1) { + stack.push(numIndex + 1); + } else if (unitIndex != -1) { + int unitNum = (int) Math.pow(10, unitIndex + 1); + if (stack.isEmpty()) { + stack.push(unitNum); + } else { + stack.push(stack.pop() * unitNum); + } + } + } + + return stack.stream().mapToInt(s -> s).sum(); + } + + private DateConf getDateConf(Date startDate, Date endDate) { + if (startDate == null || endDate == null) { + return null; + } + + DateConf info = new DateConf(); + info.setDateMode(DateConf.DateMode.BETWEEN_CONTINUOUS); + info.setStartDate(DATE_FORMAT.format(startDate)); + info.setEndDate(DATE_FORMAT.format(endDate)); + return info; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java similarity index 82% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java index e8d700a20..25d5b526c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatConfigDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java @@ -1,6 +1,7 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; import java.util.Date; + import lombok.Data; import lombok.ToString; @@ -20,6 +21,8 @@ public class ChatConfigDO { private String chatAggConfig; + private String recommendedQuestions; + private Integer status; /** diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatContextDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatContextDO.java similarity index 82% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatContextDO.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatContextDO.java index bb3db6dcf..7d9027485 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatContextDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatContextDO.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; import java.io.Serializable; import java.time.Instant; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatDO.java similarity index 82% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatDO.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatDO.java index 597302a56..fa1af2c11 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatDO.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatQueryDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java similarity index 89% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatQueryDO.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java index c8dd559ce..600f8b87e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatQueryDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; import java.util.Date; @@ -48,7 +48,7 @@ public class ChatQueryDO { /** * queryResponse */ - private String queryResponse; + private String queryResult; /** * return question_id @@ -165,14 +165,14 @@ public class ChatQueryDO { /** * return query_response */ - public String getQueryResponse() { - return queryResponse; + public String getQueryResult() { + return queryResult; } /** * queryResponse */ - public void setQueryResponse(String queryResponse) { - this.queryResponse = queryResponse == null ? null : queryResponse.trim(); + public void setQueryResult(String queryResult) { + this.queryResult = queryResult == null ? null : queryResult.trim(); } } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatQueryDOExample.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java similarity index 99% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatQueryDOExample.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java index 99d6cd109..836e6db25 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/ChatQueryDOExample.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; import java.util.ArrayList; import java.util.Date; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/DimValueDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java similarity index 79% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/DimValueDO.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java index d81305cab..99e570d2c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/DimValueDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java @@ -1,10 +1,11 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; -import com.tencent.supersonic.chat.domain.pojo.config.Dim4Dict; import java.util.ArrayList; import java.util.List; + +import com.tencent.supersonic.chat.config.DefaultMetric; +import com.tencent.supersonic.chat.config.Dim4Dict; import lombok.Data; import lombok.ToString; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java new file mode 100644 index 000000000..30e6a60bf --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java @@ -0,0 +1,236 @@ +package com.tencent.supersonic.chat.persistence.dataobject; + +import java.util.Date; + +public class PluginDO { + /** + * + */ + private Long id; + + /** + * DASHBOARD,WIDGET,URL + */ + private String type; + + /** + * + */ + private String domain; + + /** + * + */ + private String pattern; + + /** + * + */ + private String parseMode; + + /** + * + */ + private String name; + + /** + * + */ + private Date createdAt; + + /** + * + */ + private String createdBy; + + /** + * + */ + private Date updatedAt; + + /** + * + */ + private String updatedBy; + + /** + * + */ + private String config; + + /** + * + * @return id + */ + public Long getId() { + return id; + } + + /** + * + * @param id + */ + public void setId(Long id) { + this.id = id; + } + + /** + * DASHBOARD,WIDGET,URL + * @return type DASHBOARD,WIDGET,URL + */ + public String getType() { + return type; + } + + /** + * DASHBOARD,WIDGET,URL + * @param type DASHBOARD,WIDGET,URL + */ + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + /** + * + * @return domain + */ + public String getDomain() { + return domain; + } + + /** + * + * @param domain + */ + public void setDomain(String domain) { + this.domain = domain == null ? null : domain.trim(); + } + + /** + * + * @return pattern + */ + public String getPattern() { + return pattern; + } + + /** + * + * @param pattern + */ + public void setPattern(String pattern) { + this.pattern = pattern == null ? null : pattern.trim(); + } + + /** + * + * @return parse_mode + */ + public String getParseMode() { + return parseMode; + } + + /** + * + * @param parseMode + */ + public void setParseMode(String parseMode) { + this.parseMode = parseMode == null ? null : parseMode.trim(); + } + + /** + * + * @return name + */ + public String getName() { + return name; + } + + /** + * + * @param name + */ + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + /** + * + * @return created_at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * + * @param createdAt + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * + * @return created_by + */ + public String getCreatedBy() { + return createdBy; + } + + /** + * + * @param createdBy + */ + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy == null ? null : createdBy.trim(); + } + + /** + * + * @return updated_at + */ + public Date getUpdatedAt() { + return updatedAt; + } + + /** + * + * @param updatedAt + */ + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + /** + * + * @return updated_by + */ + public String getUpdatedBy() { + return updatedBy; + } + + /** + * + * @param updatedBy + */ + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy == null ? null : updatedBy.trim(); + } + + /** + * + * @return config + */ + public String getConfig() { + return config; + } + + /** + * + * @param config + */ + public void setConfig(String config) { + this.config = config == null ? null : config.trim(); + } +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java new file mode 100644 index 000000000..e2c316a84 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java @@ -0,0 +1,975 @@ +package com.tencent.supersonic.chat.persistence.dataobject; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class PluginDOExample { + /** + * s2_plugin + */ + protected String orderByClause; + + /** + * s2_plugin + */ + protected boolean distinct; + + /** + * s2_plugin + */ + protected List oredCriteria; + + /** + * s2_plugin + */ + protected Integer limitStart; + + /** + * s2_plugin + */ + protected Integer limitEnd; + + /** + * + * @mbg.generated + */ + public PluginDOExample() { + oredCriteria = new ArrayList(); + } + + /** + * + * @mbg.generated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * + * @mbg.generated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * + * @mbg.generated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * + * @mbg.generated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * + * @mbg.generated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * + * @mbg.generated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * + * @mbg.generated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * + * @mbg.generated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * + * @mbg.generated + */ + public void setLimitStart(Integer limitStart) { + this.limitStart=limitStart; + } + + /** + * + * @mbg.generated + */ + public Integer getLimitStart() { + return limitStart; + } + + /** + * + * @mbg.generated + */ + public void setLimitEnd(Integer limitEnd) { + this.limitEnd=limitEnd; + } + + /** + * + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + + /** + * s2_plugin null + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTypeIsNull() { + addCriterion("type is null"); + return (Criteria) this; + } + + public Criteria andTypeIsNotNull() { + addCriterion("type is not null"); + return (Criteria) this; + } + + public Criteria andTypeEqualTo(String value) { + addCriterion("type =", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotEqualTo(String value) { + addCriterion("type <>", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThan(String value) { + addCriterion("type >", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThanOrEqualTo(String value) { + addCriterion("type >=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThan(String value) { + addCriterion("type <", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThanOrEqualTo(String value) { + addCriterion("type <=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLike(String value) { + addCriterion("type like", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotLike(String value) { + addCriterion("type not like", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeIn(List values) { + addCriterion("type in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotIn(List values) { + addCriterion("type not in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeBetween(String value1, String value2) { + addCriterion("type between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotBetween(String value1, String value2) { + addCriterion("type not between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andDomainIsNull() { + addCriterion("domain is null"); + return (Criteria) this; + } + + public Criteria andDomainIsNotNull() { + addCriterion("domain is not null"); + return (Criteria) this; + } + + public Criteria andDomainEqualTo(String value) { + addCriterion("domain =", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainNotEqualTo(String value) { + addCriterion("domain <>", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainGreaterThan(String value) { + addCriterion("domain >", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainGreaterThanOrEqualTo(String value) { + addCriterion("domain >=", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainLessThan(String value) { + addCriterion("domain <", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainLessThanOrEqualTo(String value) { + addCriterion("domain <=", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainLike(String value) { + addCriterion("domain like", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainNotLike(String value) { + addCriterion("domain not like", value, "domain"); + return (Criteria) this; + } + + public Criteria andDomainIn(List values) { + addCriterion("domain in", values, "domain"); + return (Criteria) this; + } + + public Criteria andDomainNotIn(List values) { + addCriterion("domain not in", values, "domain"); + return (Criteria) this; + } + + public Criteria andDomainBetween(String value1, String value2) { + addCriterion("domain between", value1, value2, "domain"); + return (Criteria) this; + } + + public Criteria andDomainNotBetween(String value1, String value2) { + addCriterion("domain not between", value1, value2, "domain"); + return (Criteria) this; + } + + public Criteria andPatternIsNull() { + addCriterion("pattern is null"); + return (Criteria) this; + } + + public Criteria andPatternIsNotNull() { + addCriterion("pattern is not null"); + return (Criteria) this; + } + + public Criteria andPatternEqualTo(String value) { + addCriterion("pattern =", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternNotEqualTo(String value) { + addCriterion("pattern <>", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternGreaterThan(String value) { + addCriterion("pattern >", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternGreaterThanOrEqualTo(String value) { + addCriterion("pattern >=", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternLessThan(String value) { + addCriterion("pattern <", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternLessThanOrEqualTo(String value) { + addCriterion("pattern <=", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternLike(String value) { + addCriterion("pattern like", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternNotLike(String value) { + addCriterion("pattern not like", value, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternIn(List values) { + addCriterion("pattern in", values, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternNotIn(List values) { + addCriterion("pattern not in", values, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternBetween(String value1, String value2) { + addCriterion("pattern between", value1, value2, "pattern"); + return (Criteria) this; + } + + public Criteria andPatternNotBetween(String value1, String value2) { + addCriterion("pattern not between", value1, value2, "pattern"); + return (Criteria) this; + } + + public Criteria andParseModeIsNull() { + addCriterion("parse_mode is null"); + return (Criteria) this; + } + + public Criteria andParseModeIsNotNull() { + addCriterion("parse_mode is not null"); + return (Criteria) this; + } + + public Criteria andParseModeEqualTo(String value) { + addCriterion("parse_mode =", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeNotEqualTo(String value) { + addCriterion("parse_mode <>", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeGreaterThan(String value) { + addCriterion("parse_mode >", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeGreaterThanOrEqualTo(String value) { + addCriterion("parse_mode >=", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeLessThan(String value) { + addCriterion("parse_mode <", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeLessThanOrEqualTo(String value) { + addCriterion("parse_mode <=", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeLike(String value) { + addCriterion("parse_mode like", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeNotLike(String value) { + addCriterion("parse_mode not like", value, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeIn(List values) { + addCriterion("parse_mode in", values, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeNotIn(List values) { + addCriterion("parse_mode not in", values, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeBetween(String value1, String value2) { + addCriterion("parse_mode between", value1, value2, "parseMode"); + return (Criteria) this; + } + + public Criteria andParseModeNotBetween(String value1, String value2) { + addCriterion("parse_mode not between", value1, value2, "parseMode"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("name is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("name is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("name =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("name <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("name >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("name >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("name <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("name <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("name like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("name not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("name in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("name not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("name between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("name not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNull() { + addCriterion("created_by is null"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNotNull() { + addCriterion("created_by is not null"); + return (Criteria) this; + } + + public Criteria andCreatedByEqualTo(String value) { + addCriterion("created_by =", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotEqualTo(String value) { + addCriterion("created_by <>", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThan(String value) { + addCriterion("created_by >", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThanOrEqualTo(String value) { + addCriterion("created_by >=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThan(String value) { + addCriterion("created_by <", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThanOrEqualTo(String value) { + addCriterion("created_by <=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLike(String value) { + addCriterion("created_by like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotLike(String value) { + addCriterion("created_by not like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByIn(List values) { + addCriterion("created_by in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotIn(List values) { + addCriterion("created_by not in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByBetween(String value1, String value2) { + addCriterion("created_by between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotBetween(String value1, String value2) { + addCriterion("created_by not between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNull() { + addCriterion("updated_by is null"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNotNull() { + addCriterion("updated_by is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedByEqualTo(String value) { + addCriterion("updated_by =", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotEqualTo(String value) { + addCriterion("updated_by <>", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThan(String value) { + addCriterion("updated_by >", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThanOrEqualTo(String value) { + addCriterion("updated_by >=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThan(String value) { + addCriterion("updated_by <", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThanOrEqualTo(String value) { + addCriterion("updated_by <=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLike(String value) { + addCriterion("updated_by like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotLike(String value) { + addCriterion("updated_by not like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByIn(List values) { + addCriterion("updated_by in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotIn(List values) { + addCriterion("updated_by not in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByBetween(String value1, String value2) { + addCriterion("updated_by between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotBetween(String value1, String value2) { + addCriterion("updated_by not between", value1, value2, "updatedBy"); + return (Criteria) this; + } + } + + /** + * s2_plugin + */ + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + /** + * s2_plugin null + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/QueryDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/QueryDO.java similarity index 92% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/QueryDO.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/QueryDO.java index 4564714b0..4f9dc0eec 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/dataobject/QueryDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/QueryDO.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.dataobject; +package com.tencent.supersonic.chat.persistence.dataobject; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatConfigMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java similarity index 62% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatConfigMapper.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java index 4e4583725..6b3c6802c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatConfigMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.chat.infrastructure.mapper; +package com.tencent.supersonic.chat.persistence.mapper; -import com.tencent.supersonic.chat.domain.dataobject.ChatConfigDO; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilterInternal; +import com.tencent.supersonic.chat.config.ChatConfigFilterInternal; +import com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO; import java.util.List; import org.apache.ibatis.annotations.Mapper; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatContextMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatContextMapper.java similarity index 65% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatContextMapper.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatContextMapper.java index 5a37fdba2..391ab3b76 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatContextMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatContextMapper.java @@ -1,6 +1,6 @@ -package com.tencent.supersonic.chat.infrastructure.mapper; +package com.tencent.supersonic.chat.persistence.mapper; -import com.tencent.supersonic.chat.domain.dataobject.ChatContextDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatContextDO; import org.apache.ibatis.annotations.Mapper; @Mapper diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatMapper.java similarity index 65% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatMapper.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatMapper.java index 5c7627158..870ac6076 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/mapper/ChatMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatMapper.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.chat.infrastructure.mapper; +package com.tencent.supersonic.chat.persistence.mapper; -import com.tencent.supersonic.chat.domain.dataobject.ChatDO; -import com.tencent.supersonic.chat.domain.dataobject.QueryDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.QueryDO; import java.util.List; import org.apache.ibatis.annotations.Mapper; @@ -12,8 +12,6 @@ public interface ChatMapper { List getAll(String creator); - List queryInfo(String userName, long chatId); - Boolean updateChatName(Long chatId, String chatName, String lastTime, String creator); Boolean updateLastQuestion(Long chatId, String lastQuestion, String lastTime); @@ -24,5 +22,4 @@ public interface ChatMapper { Boolean deleteChat(Long chatId, String userName); - Long createQuery(QueryDO queryDO); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java new file mode 100644 index 000000000..8eb2f1b98 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.chat.persistence.mapper; + +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDOExample; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ChatQueryDOMapper { + + int insert(ChatQueryDO record); + + List selectByExampleWithBLOBs(ChatQueryDOExample example); + + int updateByPrimaryKeyWithBLOBs(ChatQueryDO record); + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java new file mode 100644 index 000000000..426be06d8 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java @@ -0,0 +1,70 @@ +package com.tencent.supersonic.chat.persistence.mapper; + + +import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; +import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; +import org.apache.ibatis.annotations.Mapper; +import java.util.List; + +@Mapper +public interface PluginDOMapper { + /** + * + * @mbg.generated + */ + long countByExample(PluginDOExample example); + + /** + * + * @mbg.generated + */ + int deleteByPrimaryKey(Long id); + + /** + * + * @mbg.generated + */ + int insert(PluginDO record); + + /** + * + * @mbg.generated + */ + int insertSelective(PluginDO record); + + /** + * + * @mbg.generated + */ + List selectByExampleWithBLOBs(PluginDOExample example); + + /** + * + * @mbg.generated + */ + List selectByExample(PluginDOExample example); + + /** + * + * @mbg.generated + */ + PluginDO selectByPrimaryKey(Long id); + + /** + * + * @mbg.generated + */ + int updateByPrimaryKeySelective(PluginDO record); + + /** + * + * @mbg.generated + */ + int updateByPrimaryKeyWithBLOBs(PluginDO record); + + /** + * + * @mbg.generated + */ + int updateByPrimaryKey(PluginDO record); +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java similarity index 51% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java index 8a7e83e6c..33de13ec6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatConfigRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java @@ -1,12 +1,12 @@ -package com.tencent.supersonic.chat.domain.repository; +package com.tencent.supersonic.chat.persistence.repository; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfig; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; +import com.tencent.supersonic.chat.config.ChatConfig; +import com.tencent.supersonic.chat.config.ChatConfigFilter; +import com.tencent.supersonic.chat.config.ChatConfigResp; + import java.util.List; - public interface ChatConfigRepository { Long createConfig(ChatConfig chaConfig); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatContextRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatContextRepository.java similarity index 76% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatContextRepository.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatContextRepository.java index fd035d972..53a534d31 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatContextRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatContextRepository.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.repository; +package com.tencent.supersonic.chat.persistence.repository; import com.tencent.supersonic.chat.api.pojo.ChatContext; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java new file mode 100644 index 000000000..4b818c464 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java @@ -0,0 +1,20 @@ +package com.tencent.supersonic.chat.persistence.repository; + +import com.github.pagehelper.PageInfo; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResponse; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; + +public interface ChatQueryRepository { + + PageInfo getChatQuery(PageQueryInfoReq pageQueryInfoCommend, long chatId); + + void createChatQuery(QueryResult queryResult, QueryRequest queryContext, ChatContext chatCtx); + + ChatQueryDO getLastChatQuery(long chatId); + + int updateChatQuery(ChatQueryDO chatQueryDO); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatRepository.java similarity index 71% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatRepository.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatRepository.java index da1990ed0..54ee6ad53 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/repository/ChatRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatRepository.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.chat.domain.repository; +package com.tencent.supersonic.chat.persistence.repository; -import com.tencent.supersonic.chat.domain.dataobject.ChatDO; -import com.tencent.supersonic.chat.domain.dataobject.QueryDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.QueryDO; import java.util.List; public interface ChatRepository { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java new file mode 100644 index 000000000..4e434c376 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java @@ -0,0 +1,22 @@ +package com.tencent.supersonic.chat.persistence.repository; + +import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; +import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; + +import java.util.List; + +public interface PluginRepository { + List getPlugins(); + + List fetchPluginDOs(String queryText, String type); + + void createPlugin(PluginDO pluginDO); + + void updatePlugin(PluginDO pluginDO); + + PluginDO getPlugin(Long id); + + List query(PluginDOExample pluginDOExample); + + void deletePlugin(Long id); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java similarity index 58% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java index 3fd2a1e2d..cec064a1f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatConfigRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java @@ -1,16 +1,16 @@ -package com.tencent.supersonic.chat.infrastructure.repository; +package com.tencent.supersonic.chat.persistence.repository.impl; -import com.tencent.supersonic.chat.domain.dataobject.ChatConfigDO; -import com.tencent.supersonic.chat.domain.pojo.config.*; -import com.tencent.supersonic.chat.domain.repository.ChatConfigRepository; -import com.tencent.supersonic.chat.domain.utils.ChatConfigUtils; -import com.tencent.supersonic.chat.infrastructure.mapper.ChatConfigMapper; +import com.tencent.supersonic.chat.config.ChatConfig; +import com.tencent.supersonic.chat.config.ChatConfigFilter; +import com.tencent.supersonic.chat.config.ChatConfigFilterInternal; +import com.tencent.supersonic.chat.config.ChatConfigResp; +import com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO; +import com.tencent.supersonic.chat.persistence.repository.ChatConfigRepository; +import com.tencent.supersonic.chat.utils.ChatConfigHelper; +import com.tencent.supersonic.chat.persistence.mapper.ChatConfigMapper; import java.util.ArrayList; import java.util.List; -import java.util.Objects; - -import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -20,25 +20,25 @@ import org.springframework.util.CollectionUtils; @Primary public class ChatConfigRepositoryImpl implements ChatConfigRepository { - private final ChatConfigUtils chatConfigUtils; + private final ChatConfigHelper chatConfigHelper; private final ChatConfigMapper chatConfigMapper; - public ChatConfigRepositoryImpl(ChatConfigUtils chatConfigUtils, + public ChatConfigRepositoryImpl(ChatConfigHelper chatConfigHelper, ChatConfigMapper chatConfigMapper) { - this.chatConfigUtils = chatConfigUtils; + this.chatConfigHelper = chatConfigHelper; this.chatConfigMapper = chatConfigMapper; } @Override public Long createConfig(ChatConfig chaConfig) { - ChatConfigDO chaConfigDO = chatConfigUtils.chatConfig2DO(chaConfig); + ChatConfigDO chaConfigDO = chatConfigHelper.chatConfig2DO(chaConfig); chatConfigMapper.addConfig(chaConfigDO); return chaConfigDO.getId(); } @Override public Long updateConfig(ChatConfig chaConfig) { - ChatConfigDO chaConfigDO = chatConfigUtils.chatConfig2DO(chaConfig); + ChatConfigDO chaConfigDO = chatConfigHelper.chatConfig2DO(chaConfig); return chatConfigMapper.editConfig(chaConfigDO); @@ -53,7 +53,7 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { List chaConfigDOList = chatConfigMapper.search(filterInternal); if (!CollectionUtils.isEmpty(chaConfigDOList)) { chaConfigDOList.stream().forEach(chaConfigDO -> - chaConfigDescriptorList.add(chatConfigUtils.chatConfigDO2Descriptor(chaConfigDO.getDomainId(), chaConfigDO))); + chaConfigDescriptorList.add(chatConfigHelper.chatConfigDO2Descriptor(chaConfigDO.getDomainId(), chaConfigDO))); } return chaConfigDescriptorList; } @@ -61,7 +61,7 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { @Override public ChatConfigResp getConfigByDomainId(Long domainId) { ChatConfigDO chaConfigPO = chatConfigMapper.fetchConfigByDomainId(domainId); - return chatConfigUtils.chatConfigDO2Descriptor(domainId, chaConfigPO); + return chatConfigHelper.chatConfigDO2Descriptor(domainId, chaConfigPO); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatContextRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java similarity index 78% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatContextRepositoryImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java index 54ab46a83..56a70f5ba 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatContextRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java @@ -1,12 +1,12 @@ -package com.tencent.supersonic.chat.infrastructure.repository; +package com.tencent.supersonic.chat.persistence.repository.impl; import com.google.gson.Gson; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.domain.dataobject.ChatContextDO; -import com.tencent.supersonic.chat.domain.repository.ChatContextRepository; -import com.tencent.supersonic.chat.infrastructure.mapper.ChatContextMapper; -import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.chat.persistence.dataobject.ChatContextDO; +import com.tencent.supersonic.chat.persistence.mapper.ChatContextMapper; +import com.tencent.supersonic.chat.persistence.repository.ChatContextRepository; +import com.tencent.supersonic.common.util.JsonUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -64,14 +64,6 @@ public class ChatContextRepositoryImpl implements ChatContextRepository { chatContextDO.setUser(chatContext.getUser()); if (chatContext.getParseInfo() != null) { Gson g = new Gson(); - chatContext.getParseInfo().getDimensions().stream().forEach(d -> { - d.setUpdatedAt(null); - d.setCreatedAt(null); - }); - chatContext.getParseInfo().getMetrics().stream().forEach(d -> { - d.setUpdatedAt(null); - d.setCreatedAt(null); - }); chatContextDO.setSemanticParse(g.toJson(chatContext.getParseInfo())); } return chatContextDO; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatQueryRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java similarity index 56% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatQueryRepositoryImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java index 7b1e273d3..a5e87980b 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatQueryRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java @@ -1,19 +1,19 @@ -package com.tencent.supersonic.chat.infrastructure.repository; +package com.tencent.supersonic.chat.persistence.repository.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDO; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDOExample; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDOExample.Criteria; -import com.tencent.supersonic.chat.domain.pojo.chat.ChatQueryVO; -import com.tencent.supersonic.chat.domain.pojo.chat.PageQueryInfoReq; -import com.tencent.supersonic.chat.domain.repository.ChatQueryRepository; -import com.tencent.supersonic.chat.infrastructure.mapper.ChatQueryDOMapper; -import com.tencent.supersonic.common.util.json.JsonUtil; -import com.tencent.supersonic.common.util.mybatis.PageUtils; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDOExample; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDOExample.Criteria; +import com.tencent.supersonic.chat.api.pojo.response.QueryResponse; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; +import com.tencent.supersonic.chat.persistence.mapper.ChatQueryDOMapper; +import com.tencent.supersonic.chat.persistence.repository.ChatQueryRepository; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.util.PageUtils; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -35,7 +35,7 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { } @Override - public PageInfo getChatQuery(PageQueryInfoReq pageQueryInfoCommend, long chatId) { + public PageInfo getChatQuery(PageQueryInfoReq pageQueryInfoCommend, long chatId) { ChatQueryDOExample example = new ChatQueryDOExample(); example.setOrderByClause("question_id desc"); Criteria criteria = example.createCriteria(); @@ -46,7 +46,7 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { pageQueryInfoCommend.getPageSize()) .doSelectPageInfo(() -> chatQueryDOMapper.selectByExampleWithBLOBs(example)); - PageInfo chatQueryVOPageInfo = PageUtils.pageInfo2PageInfoVo(pageInfo); + PageInfo chatQueryVOPageInfo = PageUtils.pageInfo2PageInfoVo(pageInfo); chatQueryVOPageInfo.setList( pageInfo.getList().stream().map(this::convertTo) .sorted(Comparator.comparingInt(o -> o.getQuestionId().intValue())) @@ -54,28 +54,28 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { return chatQueryVOPageInfo; } - private ChatQueryVO convertTo(ChatQueryDO chatQueryDO) { - ChatQueryVO chatQueryVO = new ChatQueryVO(); - BeanUtils.copyProperties(chatQueryDO, chatQueryVO); - QueryResultResp queryResponse = JsonUtil.toObject(chatQueryDO.getQueryResponse(), QueryResultResp.class); - queryResponse.setQueryId(chatQueryDO.getQuestionId()); - chatQueryVO.setQueryResponse(queryResponse); - return chatQueryVO; + private QueryResponse convertTo(ChatQueryDO chatQueryDO) { + QueryResponse queryResponse = new QueryResponse(); + BeanUtils.copyProperties(chatQueryDO, queryResponse); + QueryResult queryResult = JsonUtil.toObject(chatQueryDO.getQueryResult(), QueryResult.class); + queryResult.setQueryId(chatQueryDO.getQuestionId()); + queryResponse.setQueryResult(queryResult); + return queryResponse; } @Override - public void createChatQuery(QueryResultResp queryResponse, QueryContextReq queryContext, ChatContext chatCtx) { + public void createChatQuery(QueryResult queryResult, QueryRequest queryRequest, ChatContext chatCtx) { ChatQueryDO chatQueryDO = new ChatQueryDO(); - chatQueryDO.setChatId(Long.valueOf(queryContext.getChatId())); + chatQueryDO.setChatId(Long.valueOf(queryRequest.getChatId())); chatQueryDO.setCreateTime(new java.util.Date()); - chatQueryDO.setUserName(queryContext.getUser().getName()); - chatQueryDO.setQueryState(queryResponse.getQueryState()); - chatQueryDO.setQueryText(queryContext.getQueryText()); - chatQueryDO.setQueryResponse(JsonUtil.toString(queryResponse)); + chatQueryDO.setUserName(queryRequest.getUser().getName()); + chatQueryDO.setQueryState(queryResult.getQueryState().ordinal()); + chatQueryDO.setQueryText(queryRequest.getQueryText()); + chatQueryDO.setQueryResult(JsonUtil.toString(queryResult)); chatQueryDOMapper.insert(chatQueryDO); - ChatQueryDO lastChatQuery = getLastChatQuery(queryContext.getChatId()); + ChatQueryDO lastChatQuery = getLastChatQuery(queryRequest.getChatId()); Long queryId = lastChatQuery.getQuestionId(); - queryResponse.setQueryId(queryId); + queryResult.setQueryId(queryId); } @Override diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java similarity index 80% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatRepositoryImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java index e40d2ff85..ce7c4249c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/repository/ChatRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java @@ -1,9 +1,9 @@ -package com.tencent.supersonic.chat.infrastructure.repository; +package com.tencent.supersonic.chat.persistence.repository.impl; -import com.tencent.supersonic.chat.domain.dataobject.ChatDO; -import com.tencent.supersonic.chat.domain.dataobject.QueryDO; -import com.tencent.supersonic.chat.domain.repository.ChatRepository; -import com.tencent.supersonic.chat.infrastructure.mapper.ChatMapper; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.QueryDO; +import com.tencent.supersonic.chat.persistence.repository.ChatRepository; +import com.tencent.supersonic.chat.persistence.mapper.ChatMapper; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java new file mode 100644 index 000000000..3538bb632 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java @@ -0,0 +1,80 @@ +package com.tencent.supersonic.chat.persistence.repository.impl; + +import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; +import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; +import com.tencent.supersonic.chat.persistence.mapper.PluginDOMapper; +import com.tencent.supersonic.chat.persistence.repository.PluginRepository; +import com.tencent.supersonic.common.util.ContextUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Repository +@Slf4j +public class PluginRepositoryImpl implements PluginRepository { + + private PluginDOMapper pluginDOMapper; + + public PluginRepositoryImpl(PluginDOMapper pluginDOMapper) { + this.pluginDOMapper = pluginDOMapper; + } + + @Override + public List getPlugins() { + return pluginDOMapper.selectByExampleWithBLOBs(new PluginDOExample()); + } + + @Override + public List fetchPluginDOs(String queryText, String type) { + + List pluginDOList = new ArrayList<>(); + + PluginRepository pluginRepository = ContextUtils.getBean(PluginRepository.class); + List pluginDOS = pluginRepository.getPlugins(); + + for (PluginDO pluginDO : pluginDOS) { + String pattern = pluginDO.getPattern(); + if (Strings.isNotEmpty(pattern)) { + + Pattern pluginPattern = Pattern.compile(pattern); + Matcher pluginMatcher = pluginPattern.matcher(queryText); + if (pluginMatcher.find()) { + log.info("pluginMatcher.find() is true, queryText:{}", queryText); + log.info("pluginDO:{}", pluginDO); + pluginDOList.add(pluginDO); + } + } + } + return pluginDOList; + } + + @Override + public void createPlugin(PluginDO pluginDO) { + pluginDOMapper.insert(pluginDO); + } + + @Override + public void updatePlugin(PluginDO pluginDO){ + pluginDOMapper.updateByPrimaryKeyWithBLOBs(pluginDO); + } + + @Override + public PluginDO getPlugin(Long id) { + return pluginDOMapper.selectByPrimaryKey(id); + } + + @Override + public List query(PluginDOExample pluginDOExample){ + return pluginDOMapper.selectByExampleWithBLOBs(pluginDOExample); + } + + @Override + public void deletePlugin(Long id){ + pluginDOMapper.deleteByPrimaryKey(id); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java new file mode 100644 index 000000000..469e11bfc --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java @@ -0,0 +1,37 @@ +package com.tencent.supersonic.chat.plugin; + + +import com.tencent.supersonic.chat.parser.ParseMode; +import com.tencent.supersonic.common.pojo.RecordInfo; +import lombok.Data; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Data +public class Plugin extends RecordInfo { + + private Long id; + + //plugin type WEB_PAGE WEB_SERVICE + private String type; + + private List domainList; + + //description, for parsing + private String pattern; + + //parse + private ParseMode parseMode; + + private String name; + + //config for different plugin type + private String config; + + public List getPatterns() { + return Stream.of(getPattern().split("\\|")).collect(Collectors.toList()); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java new file mode 100644 index 000000000..57540ebb5 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java @@ -0,0 +1,176 @@ +package com.tencent.supersonic.chat.plugin; + +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; +import com.tencent.supersonic.chat.parser.ParseMode; +import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; +import com.tencent.supersonic.chat.parser.embedding.EmbeddingResp; +import com.tencent.supersonic.chat.parser.embedding.RecallRetrieval; +import com.tencent.supersonic.chat.plugin.event.PluginAddEvent; +import com.tencent.supersonic.chat.plugin.event.PluginUpdateEvent; +import com.tencent.supersonic.chat.service.PluginService; +import com.tencent.supersonic.common.util.ContextUtils; +import java.net.URI; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.context.event.EventListener; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +@Slf4j +@Component +public class PluginManager { + + private static Map internalPluginMap = new ConcurrentHashMap<>(); + + private EmbeddingConfig embeddingConfig; + + private RestTemplate restTemplate; + + public PluginManager(EmbeddingConfig embeddingConfig, RestTemplate restTemplate) { + this.embeddingConfig = embeddingConfig; + this.restTemplate = restTemplate; + } + + public static List getPlugins() { + PluginService pluginService = ContextUtils.getBean(PluginService.class); + List pluginList = pluginService.getPluginList(); + pluginList.addAll(internalPluginMap.values()); + return new ArrayList<>(pluginList); + } + + @EventListener + public void addPlugin(PluginAddEvent pluginAddEvent) { + Plugin plugin = pluginAddEvent.getPlugin(); + if (ParseMode.EMBEDDING_RECALL.equals(plugin.getParseMode())) { + requestEmbeddingPluginAdd(convert(Lists.newArrayList(plugin))); + } + } + + @EventListener + public void updatePlugin(PluginUpdateEvent pluginUpdateEvent) { + Plugin oldPlugin = pluginUpdateEvent.getOldPlugin(); + Plugin newPlugin = pluginUpdateEvent.getNewPlugin(); + if (ParseMode.EMBEDDING_RECALL.equals(oldPlugin.getParseMode())) { + requestEmbeddingPluginDelete(getEmbeddingId(Lists.newArrayList(oldPlugin))); + } + if (ParseMode.EMBEDDING_RECALL.equals(newPlugin.getParseMode())) { + requestEmbeddingPluginAdd(convert(Lists.newArrayList(newPlugin))); + } + } + + @EventListener + public void delPlugin(PluginAddEvent pluginAddEvent) { + Plugin plugin = pluginAddEvent.getPlugin(); + if (ParseMode.EMBEDDING_RECALL.equals(plugin.getParseMode())) { + requestEmbeddingPluginDelete(getEmbeddingId(Lists.newArrayList(plugin))); + } + + } + + public void requestEmbeddingPluginDelete(Set ids) { + if(CollectionUtils.isEmpty(ids)){ + return; + } + doRequest(embeddingConfig.getDeletePath(), JSONObject.toJSONString(ids)); + } + + + public void requestEmbeddingPluginAdd(List> maps) { + if(CollectionUtils.isEmpty(maps)){ + return; + } + doRequest(embeddingConfig.getAddPath(), JSONObject.toJSONString(maps)); + } + + public void doRequest(String path, String jsonBody) { + String url = embeddingConfig.getUrl()+ path; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setLocation(URI.create(url)); + URI requestUrl = UriComponentsBuilder + .fromHttpUrl(url).build().encode().toUri(); + HttpEntity entity = new HttpEntity<>(jsonBody, headers); + log.info("[embedding] equest body :{}, url:{}", jsonBody, url); + ResponseEntity responseEntity = + restTemplate.exchange(requestUrl, HttpMethod.POST, entity, new ParameterizedTypeReference() {}); + log.info("[embedding] result body:{}", responseEntity); + } + + public void requestEmbeddingPluginAddALL(List plugins) { + plugins = plugins.stream() + .filter(plugin -> ParseMode.EMBEDDING_RECALL.equals(plugin.getParseMode())) + .collect(Collectors.toList()); + requestEmbeddingPluginAdd(convert(plugins)); + } + + public EmbeddingResp recognize(String embeddingText) { + String url = embeddingConfig.getUrl()+ embeddingConfig.getRecognizePath() + "?n_results=" + embeddingConfig.getNResult(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setLocation(URI.create(url)); + URI requestUrl = UriComponentsBuilder + .fromHttpUrl(url).build().encode().toUri(); + String jsonBody = JSONObject.toJSONString(Lists.newArrayList(embeddingText)); + HttpEntity entity = new HttpEntity<>(jsonBody, headers); + log.info("[embedding] request body:{}, url:{}", jsonBody, url); + ResponseEntity> embeddingResponseEntity = + restTemplate.exchange(requestUrl, HttpMethod.POST, entity, new ParameterizedTypeReference>() {}); + log.info("[embedding] recognize result body:{}",embeddingResponseEntity); + List embeddingResps = embeddingResponseEntity.getBody(); + if(CollectionUtils.isNotEmpty(embeddingResps)){ + for (EmbeddingResp embeddingResp : embeddingResps) { + List embeddingRetrievals = embeddingResp.getRetrieval(); + for (RecallRetrieval embeddingRetrieval : embeddingRetrievals) { + embeddingRetrieval.setId(getPluginIdFromEmbeddingId(embeddingRetrieval.getId())); + } + } + return embeddingResps.get(0); + } + throw new RuntimeException("get embedding result failed"); + } + + public List> convert(List plugins){ + List> maps = Lists.newArrayList(); + for(Plugin plugin : plugins){ + List patterns = plugin.getPatterns(); + int num = 0; + for(String pattern : patterns){ + Map map = new HashMap<>(); + map.put("preset_query_id", generateUniqueEmbeddingId(num, plugin.getId())); + map.put("preset_query", pattern); + maps.add(map); + num++; + } + } + return maps; + } + + private Set getEmbeddingId(List plugins) { + Set embeddingIdSet = new HashSet<>(); + for (Map map : convert(plugins)) { + embeddingIdSet.addAll(map.keySet()); + } + return embeddingIdSet; + } + + //num can not bigger than 100 + private String generateUniqueEmbeddingId(int num, Long pluginId) { + if (num < 10) { + return String.format("%s00%s", pluginId, num); + } else { + return String.format("%s0%s", pluginId, num); + } + } + + private String getPluginIdFromEmbeddingId(String id) { + return String.valueOf(Integer.parseInt(id) / 1000); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseResult.java new file mode 100644 index 000000000..ba7a4a9c7 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseResult.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.chat.plugin; + +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import lombok.Data; + +@Data +public class PluginParseResult { + + private Plugin plugin; + private QueryRequest request; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginAddEvent.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginAddEvent.java new file mode 100644 index 000000000..4aafc787a --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginAddEvent.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.chat.plugin.event; + +import com.tencent.supersonic.chat.plugin.Plugin; +import org.springframework.context.ApplicationEvent; + +public class PluginAddEvent extends ApplicationEvent { + + private Plugin plugin; + + public PluginAddEvent(Object source, Plugin plugin) { + super(source); + this.plugin = plugin; + } + + public Plugin getPlugin() { + return plugin; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginDelEvent.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginDelEvent.java new file mode 100644 index 000000000..0dd0d4520 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginDelEvent.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.chat.plugin.event; + +import com.tencent.supersonic.chat.plugin.Plugin; +import org.springframework.context.ApplicationEvent; + +public class PluginDelEvent extends ApplicationEvent { + + private Plugin plugin; + + public PluginDelEvent(Object source, Plugin plugin) { + super(source); + this.plugin = plugin; + } + + public Plugin getPlugin() { + return plugin; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginUpdateEvent.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginUpdateEvent.java new file mode 100644 index 000000000..2d2086f87 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/event/PluginUpdateEvent.java @@ -0,0 +1,26 @@ +package com.tencent.supersonic.chat.plugin.event; + +import com.tencent.supersonic.chat.plugin.Plugin; +import org.springframework.context.ApplicationEvent; + +public class PluginUpdateEvent extends ApplicationEvent { + + private Plugin oldPlugin; + + private Plugin newPlugin; + + public PluginUpdateEvent(Object source, Plugin oldPlugin, Plugin newPlugin) { + super(source); + this.oldPlugin = oldPlugin; + this.newPlugin = newPlugin; + } + + public Plugin getOldPlugin() { + return oldPlugin; + } + + public Plugin getNewPlugin() { + return newPlugin; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/HeuristicQuerySelector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java similarity index 84% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/query/HeuristicQuerySelector.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java index 9e2ffd615..82ef74840 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/HeuristicQuerySelector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java @@ -1,15 +1,16 @@ -package com.tencent.supersonic.chat.application.query; +package com.tencent.supersonic.chat.query; import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.common.constant.Constants; +import com.tencent.supersonic.common.pojo.Constants; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; @Slf4j public class HeuristicQuerySelector implements QuerySelector { @@ -18,13 +19,10 @@ public class HeuristicQuerySelector implements QuerySelector { public SemanticQuery select(List candidateQueries) { double maxScore = 0; SemanticQuery pickedQuery = null; - + if (CollectionUtils.isNotEmpty(candidateQueries) && candidateQueries.size() == 1) { + return candidateQueries.get(0); + } for (SemanticQuery query : candidateQueries) { - if (query instanceof LLMSemanticQuery) { - log.info("force to use LLM if existed"); - return query; - } - SemanticParseInfo semanticParse = query.getParseInfo(); double score = computeScore(semanticParse); if (score > maxScore) { @@ -43,7 +41,7 @@ public class HeuristicQuerySelector implements QuerySelector { Map maxSimilarityMatch = new HashMap<>(); for (SchemaElementMatch match : semanticParse.getElementMatches()) { - SchemaElementType type = match.getElementType(); + SchemaElementType type = match.getElement().getType(); if (!maxSimilarityMatch.containsKey(type) || match.getSimilarity() > maxSimilarityMatch.get(type).getSimilarity()) { maxSimilarityMatch.put(type, match); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java new file mode 100644 index 000000000..4cd897fb3 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java @@ -0,0 +1,64 @@ +package com.tencent.supersonic.chat.query; + +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +public class QueryManager { + + private static Map ruleQueryMap = new ConcurrentHashMap<>(); + private static Map pluginQueryMap = new ConcurrentHashMap<>(); + + public static void register(SemanticQuery query) { + if (query instanceof RuleSemanticQuery) { + ruleQueryMap.put(query.getQueryMode(), (RuleSemanticQuery) query); + } else if (query instanceof PluginSemanticQuery) { + pluginQueryMap.put(query.getQueryMode(), (PluginSemanticQuery) query); + } + } + + public static RuleSemanticQuery createRuleQuery(String queryMode) { + RuleSemanticQuery semanticQuery = ruleQueryMap.get(queryMode); + if (Objects.isNull(semanticQuery)) { + throw new RuntimeException("no supported queryMode :" + queryMode); + } + try { + return semanticQuery.getClass().getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException("no supported queryMode :" + queryMode); + } + } + + public static PluginSemanticQuery createPluginQuery(String queryMode) { + PluginSemanticQuery semanticQuery = pluginQueryMap.get(queryMode); + if (Objects.isNull(semanticQuery)) { + throw new RuntimeException("no supported queryMode :" + queryMode); + } + try { + return semanticQuery.getClass().getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException("no supported queryMode :" + queryMode); + } + } + + public static boolean containsRuleQuery(String queryMode) { + if (queryMode == null) { + return false; + } + return ruleQueryMap.containsKey(queryMode); + } + + public static List getRuleQueries() { + return new ArrayList<>(ruleQueryMap.values()); + } + + public static List getPluginQueryModes() { + return new ArrayList<>(pluginQueryMap.keySet()); + } + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QuerySelector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java similarity index 84% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QuerySelector.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java index e84b43586..dcc8ae79c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QuerySelector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.application.query; +package com.tencent.supersonic.chat.query; import com.tencent.supersonic.chat.api.component.SemanticQuery; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java new file mode 100644 index 000000000..da2b48072 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.chat.query.plugin; + +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public abstract class PluginSemanticQuery implements SemanticQuery { + + protected SemanticParseInfo parseInfo = new SemanticParseInfo(); + + public void setParseInfo(SemanticParseInfo parseInfo) { + this.parseInfo = parseInfo; + } + + public SemanticParseInfo getParseInfo() { + return parseInfo; + } + + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java new file mode 100644 index 000000000..a9aec8bf4 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java @@ -0,0 +1,22 @@ +package com.tencent.supersonic.chat.query.plugin; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class WebBase { + + private String url; + + //key, id of schema element + private Map params = new HashMap<>(); + + //key, value of shcema element + private Map valueParams = new HashMap<>(); + + //only forward + private Map forwardParam = new HashMap<>(); + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java similarity index 53% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java index 339cc608c..69f4a6bd7 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DslToSemanticInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java @@ -1,32 +1,38 @@ -package com.tencent.supersonic.chat.domain.utils; +package com.tencent.supersonic.chat.query.plugin.dsl; import static java.time.LocalDate.now; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.application.knowledge.WordNatureService; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.pojo.chat.LLMResp; -import com.tencent.supersonic.common.nlp.ItemDO; +import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.calcite.SqlParseUtils; import com.tencent.supersonic.common.util.calcite.SqlParserInfo; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.semantic.api.core.enums.TimeDimensionEnum; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @Slf4j -public class DslToSemanticInfo { +public class DSLBuilder { - protected static final String SUB_TABLE = " ( select * from t_{0} where {1} >= ''{2}'' and {1} <= ''{3}'' ) as t_sub_{0}"; + public static final String COMMA_WRAPPER = "'%s'"; + public static final String SPACE_WRAPPER = " %s "; + protected static final String SUB_TABLE = " ( select * from t_{0} where {1} >= ''{2}'' and {1} <= ''{3}'' {4} ) as t_sub_{0}"; - public String convert(SemanticParseInfo parseInfo, LLMResp llmResp, Integer domainId) throws SqlParseException { + public String build(QueryFilters queryFilters, SemanticParseInfo parseInfo, LLMResp llmResp, Long domainId) + throws SqlParseException { String sqlOutput = llmResp.getSqlOutput(); String domainName = llmResp.getDomainName(); @@ -46,10 +52,12 @@ public class DslToSemanticInfo { // 2. replace the llm dsl, such as replace fieldName and tableName. log.info("sqlParseInfo:{} ,domainName:{},domainId:{}", sqlParseInfo, domainName, domainId); - DomainInfos domainInfos = ContextUtils.getBean(WordNatureService.class).getCache().getUnchecked(""); - List fieldList = domainInfos.getMetrics(); - fieldList.addAll(domainInfos.getDimensions()); - Map fieldToBizName = getMapInfo(domainId, fieldList); + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + List dbAllFields = new ArrayList<>(); + dbAllFields.addAll(semanticSchema.getMetrics()); + dbAllFields.addAll(semanticSchema.getDimensions()); + + Map fieldToBizName = getMapInfo(domainId, dbAllFields); for (String fieldName : allFields) { String fieldBizName = fieldToBizName.get(fieldName); @@ -74,21 +82,43 @@ public class DslToSemanticInfo { TimeDimensionEnum timeDimension = TimeDimensionEnum.valueOf(period); String dayField = timeDimension.getName(); - String subTable = MessageFormat.format(SUB_TABLE, domainId, dayField, startDate, endDate); + String queryFilter = getQueryFilter(queryFilters); + + String subTable = MessageFormat.format(SUB_TABLE, domainId, dayField, startDate, endDate, queryFilter); String querySql = sqlOutput.replaceAll(tableName, subTable); log.info("querySql:{},sqlOutput:{},dateInfo:{}", querySql, sqlOutput, dateInfo); return querySql; } - protected String extraConvert(String sqlOutput, Integer domainId) throws SqlParseException { + private String getQueryFilter(QueryFilters queryFilters) { + String queryFilter = ""; + if (Objects.isNull(queryFilters) || CollectionUtils.isEmpty(queryFilters.getFilters())) { + return queryFilter; + } + List filters = queryFilters.getFilters(); + for (QueryFilter filter : filters) { + queryFilter = getSpaceWrap(queryFilter) + "and" + getSpaceWrap(filter.getBizName()) + getSpaceWrap( + filter.getOperator().getValue()) + getCommaWrap(filter.getValue().toString()); + } + return queryFilter; + } + + protected String extraConvert(String sqlOutput, Long domainId) throws SqlParseException { return SqlParseUtils.addAliasToSql(sqlOutput); } - protected Map getMapInfo(Integer domainId, List metrics) { + protected Map getMapInfo(Long domainId, List metrics) { return metrics.stream().filter(entry -> entry.getDomain().equals(domainId)) - .collect(Collectors.toMap(ItemDO::getName, a -> a.getBizName(), (k1, k2) -> k1)); + .collect(Collectors.toMap(SchemaElement::getName, a -> a.getBizName(), (k1, k2) -> k1)); } + private String getCommaWrap(String value) { + return String.format(COMMA_WRAPPER, value); + } + + private String getSpaceWrap(String value) { + return String.format(SPACE_WRAPPER, value); + } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java new file mode 100644 index 000000000..16d1de9d9 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java @@ -0,0 +1,205 @@ +package com.tencent.supersonic.chat.query.plugin.dsl; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.QueryState; +import com.tencent.supersonic.chat.config.LLMConfig; +import com.tencent.supersonic.chat.plugin.PluginParseResult; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.query.plugin.dsl.LLMReq.ElementValue; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.chat.utils.QueryReqBuilder; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.calcite.sql.parser.SqlParseException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Slf4j +@Component +public class DSLQuery extends PluginSemanticQuery { + + public static final String QUERY_MODE = "DSL"; + private DSLBuilder dslBuilder = new DSLBuilder(); + + protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + + public DSLQuery() { + QueryManager.register(this); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public QueryResult execute(User user) { + PluginParseResult functionCallParseResult = (PluginParseResult) parseInfo.getProperties() + .get(Constants.CONTEXT); + Long domainId = parseInfo.getDomainId(); + LLMResp llmResp = requestLLM(functionCallParseResult, domainId); + if (Objects.isNull(llmResp)) { + return null; + } + String querySql = convertToSql(functionCallParseResult.getRequest().getQueryFilters(), llmResp, parseInfo, + domainId); + QueryResult queryResult = new QueryResult(); + + long startTime = System.currentTimeMillis(); + QueryResultWithSchemaResp queryResp = semanticLayer.queryByDsl( + QueryReqBuilder.buildDslReq(querySql, domainId), user); + log.info("queryByDsl cost:{},querySql:{}", System.currentTimeMillis() - startTime, querySql); + + if (queryResp != null) { + queryResult.setQueryAuthorization(queryResp.getQueryAuthorization()); + } + String resultQql = queryResp == null ? null : queryResp.getSql(); + List> resultList = queryResp == null ? new ArrayList<>() + : queryResp.getResultList(); + List columns = queryResp == null ? new ArrayList<>() : queryResp.getColumns(); + queryResult.setQuerySql(resultQql); + queryResult.setQueryResults(resultList); + queryResult.setQueryColumns(columns); + queryResult.setQueryMode(QUERY_MODE); + queryResult.setQueryState(QueryState.SUCCESS); + + // add domain info + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) + .getEntityInfo(parseInfo, user); + queryResult.setEntityInfo(entityInfo); + parseInfo.setProperties(null); + return queryResult; + } + + + protected String convertToSql(QueryFilters queryFilters, LLMResp llmResp, SemanticParseInfo parseInfo, + Long domainId) { + try { + return dslBuilder.build(queryFilters, parseInfo, llmResp, domainId); + } catch (SqlParseException e) { + log.error("convertToSql error", e); + } + return null; + } + + protected LLMResp requestLLM(PluginParseResult parseResult, Long domainId) { + long startTime = System.currentTimeMillis(); + String queryText = parseResult.getRequest().getQueryText(); + final LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); + + if (StringUtils.isEmpty(llmConfig.getUrl())) { + log.warn("llmConfig url is null, skip llm parser"); + return null; + } + + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + Map domainIdToName = semanticSchema.getDomainIdToName(); + + LLMReq llmReq = new LLMReq(); + llmReq.setQueryText(queryText); + LLMReq.LLMSchema llmSchema = new LLMReq.LLMSchema(); + llmSchema.setDomainName(domainIdToName.get(domainId)); + List fieldNameList = getFieldNameList(domainId, semanticSchema); + llmSchema.setFieldNameList(fieldNameList); + llmReq.setSchema(llmSchema); + List linking = new ArrayList<>(); + linking.addAll(getValueList(domainId, semanticSchema)); + llmReq.setLinking(linking); + + log.info("requestLLM request, domainId:{},llmReq:{}", domainId, llmReq); + String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); + + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); + + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(JsonUtil.toString(llmReq), headers); + ResponseEntity responseEntity = restTemplate.exchange(questUrl, HttpMethod.POST, entity, + LLMResp.class); + + log.info("requestLLM response,cost:{}, questUrl:{} \n entity:{} \n body:{}", + System.currentTimeMillis() - startTime, questUrl, entity, responseEntity.getBody()); + return responseEntity.getBody(); + } catch (Exception e) { + log.error("requestLLM error", e); + } + return null; + } + + private List getValueList(Long domainId, SemanticSchema semanticSchema) { + Map itemIdToName = semanticSchema.getDimensions().stream() + .filter(entry -> domainId.equals(entry.getDomain())) + .collect(Collectors.toMap(SchemaElement::getId, SchemaElement::getName, (value1, value2) -> value2)); + + List matchedElements = parseInfo.getElementMatches(); + Set valueMatches = matchedElements.stream() + .filter(schemaElementMatch -> SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) + .map(elementMatch -> + { + ElementValue elementValue = new ElementValue(); + elementValue.setFieldName(itemIdToName.get(elementMatch.getElement().getId())); + elementValue.setFieldValue(elementMatch.getWord()); + return elementValue; + } + ) + .collect(Collectors.toSet()); + return new ArrayList<>(valueMatches); + } + + private List getFieldNameList(Long domainId, SemanticSchema semanticSchema) { + Map itemIdToName = semanticSchema.getDimensions().stream() + .filter(entry -> domainId.equals(entry.getDomain())) + .collect(Collectors.toMap(SchemaElement::getId, SchemaElement::getName, (value1, value2) -> value2)); + + List matchedElements = parseInfo.getElementMatches(); + Set fieldNameList = matchedElements.stream() + .filter(schemaElementMatch -> { + SchemaElementType elementType = schemaElementMatch.getElement().getType(); + return SchemaElementType.METRIC.equals(elementType) || + SchemaElementType.DIMENSION.equals(elementType) || + SchemaElementType.VALUE.equals(elementType); + }) + .map(schemaElementMatch -> { + SchemaElementType elementType = schemaElementMatch.getElement().getType(); + + if (!SchemaElementType.VALUE.equals(elementType)) { + return schemaElementMatch.getWord(); + } + return itemIdToName.get(schemaElementMatch.getElement().getId()); + }) + .filter(name -> StringUtils.isNotEmpty(name) && !name.contains("%")) + .collect(Collectors.toSet()); + return new ArrayList<>(fieldNameList); + } + + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java new file mode 100644 index 000000000..c78ceafc3 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java @@ -0,0 +1,32 @@ +package com.tencent.supersonic.chat.query.plugin.dsl; + +import java.util.List; +import lombok.Data; + +@Data +public class LLMReq { + + private String queryText; + + private LLMSchema schema; + + private List linking; + + @Data + public static class ElementValue { + + private String fieldName; + + private String fieldValue; + + } + + @Data + public static class LLMSchema { + + private String domainName; + + private List fieldNameList; + + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMResp.java similarity index 83% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMResp.java index b750161bf..80273fab8 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/pojo/chat/LLMResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMResp.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.pojo.chat; +package com.tencent.supersonic.chat.query.plugin.dsl; import java.util.List; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java new file mode 100644 index 000000000..7c981d808 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java @@ -0,0 +1,108 @@ +package com.tencent.supersonic.chat.query.plugin.webpage; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.QueryState; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.query.plugin.WebBase; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +public class WebPageQuery extends PluginSemanticQuery { + + public static String QUERY_MODE = "WEB_PAGE"; + + public WebPageQuery() { + QueryManager.register(this); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public QueryResult execute(User user) { + ConfigService configService = ContextUtils.getBean(ConfigService.class); + QueryResult queryResult = new QueryResult(); + queryResult.setQueryMode(QUERY_MODE); + Map properties = parseInfo.getProperties(); + Plugin plugin = (Plugin) properties.get(Constants.CONTEXT); + WebPageResponse webPageResponse = buildResponse(plugin); + queryResult.setResponse(webPageResponse); + if (parseInfo.getDomainId() != null && parseInfo.getDomainId() > 0 + && parseInfo.getEntity() != null && parseInfo.getEntity() > 0) { + ChatConfigRich chatConfigRichResp = configService.getConfigRichInfo(parseInfo.getDomainId()); + updateSemanticParse(chatConfigRichResp, parseInfo.getEntity()); + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class).getEntityInfo(parseInfo, user); + queryResult.setEntityInfo(entityInfo); + } else { + queryResult.setEntityInfo(null); + } + queryResult.setQueryState(QueryState.SUCCESS); + return queryResult; + } + + private void updateSemanticParse(ChatConfigRich chatConfigRichResp, Long entityId) { + parseInfo.setEntity(entityId); + SchemaElement domain = new SchemaElement(); + domain.setId(chatConfigRichResp.getDomainId()); + domain.setName(chatConfigRichResp.getDomainName()); + parseInfo.setDomain(domain); + } + + protected WebPageResponse buildResponse(Plugin plugin) { + WebPageResponse webPageResponse = new WebPageResponse(); + webPageResponse.setName(plugin.getName()); + webPageResponse.setPluginId(plugin.getId()); + webPageResponse.setPluginType(plugin.getType()); + WebBase webPage = JsonUtil.toObject(plugin.getConfig(), WebBase.class); + fillWebPage(webPage); + webPageResponse.setWebPage(webPage); + return webPageResponse; + } + + private void fillWebPage(WebBase webPage) { + List schemaElementMatchList = parseInfo.getElementMatches(); + Map elementValueMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(schemaElementMatchList) && !CollectionUtils.isEmpty(webPage.getParams()) ) { + schemaElementMatchList.stream() + .filter(schemaElementMatch -> + SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) + .sorted(Comparator.comparingDouble(SchemaElementMatch::getSimilarity)) + .forEach(schemaElementMatch -> + elementValueMap.put(String.valueOf(schemaElementMatch.getElement().getId()), + schemaElementMatch.getWord())); + } + if (!CollectionUtils.isEmpty(parseInfo.getDimensionFilters())) { + parseInfo.getDimensionFilters().forEach( + filter -> elementValueMap.put(String.valueOf(filter.getElementID()), filter.getValue()) + ); + } + Map params = webPage.getParams(); + for (Map.Entry entry : params.entrySet()) { + String key = entry.getKey(); + String elementId = String.valueOf(entry.getValue()); + Object elementValue = elementValueMap.get(elementId); + webPage.getValueParams().put(key, elementValue); + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java new file mode 100644 index 000000000..6c75a37f9 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java @@ -0,0 +1,22 @@ +package com.tencent.supersonic.chat.query.plugin.webpage; + +import com.tencent.supersonic.chat.query.plugin.WebBase; +import lombok.Data; +import java.util.List; + +@Data +public class WebPageResponse { + + private Long pluginId; + + private String pluginType; + + private String name; + + private String description; + + private WebBase webPage; + + private List moreWebPage; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java new file mode 100644 index 000000000..d9ebe1f95 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java @@ -0,0 +1,85 @@ +package com.tencent.supersonic.chat.query.plugin.webservice; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.QueryState; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.plugin.PluginParseResult; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.query.plugin.WebBase; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.util.*; + +import java.util.List; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import org.apache.calcite.sql.parser.SqlParseException; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public class WebServiceQuery extends PluginSemanticQuery { + + public static String QUERY_MODE = "WEB_SERVICE"; + + private S2ThreadContext s2ThreadContext; + + public WebServiceQuery() { + QueryManager.register(this); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public QueryResult execute(User user) throws SqlParseException { + QueryResult queryResult = new QueryResult(); + queryResult.setQueryMode(QUERY_MODE); + Map properties = parseInfo.getProperties(); + PluginParseResult pluginParseResult = (PluginParseResult) properties.get(Constants.CONTEXT); + WebServiceResponse webServiceResponse = buildResponse(pluginParseResult); + Object object = webServiceResponse.getResult(); + Map data=JsonUtil.toMap(JsonUtil.toString(object),String.class,Object.class); + queryResult.setQueryResults((List>) data.get("resultList")); + queryResult.setQueryColumns((List) data.get("columns")); + //queryResult.setResponse(webServiceResponse); + queryResult.setQueryState(QueryState.SUCCESS); + parseInfo.setProperties(null); + return queryResult; + } + + protected WebServiceResponse buildResponse(PluginParseResult pluginParseResult) { + WebServiceResponse webServiceResponse = new WebServiceResponse(); + Plugin plugin = pluginParseResult.getPlugin(); + WebBase webBase = JsonUtil.toObject(plugin.getConfig(), WebBase.class); + webServiceResponse.setWebBase(webBase); + //http todo + s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); + String authHeader = s2ThreadContext.get().getToken(); + log.info("authHeader:{}", authHeader); + try { + Map headers = new HashMap<>(); + headers.put("Authorization", authHeader); + Map params = new HashMap<>(); + params.put("queryText", pluginParseResult.getRequest().getQueryText()); + HttpClientResult httpClientResult = HttpClientUtils.doGet(webBase.getUrl(), headers, params); + log.info(" response body:{}", httpClientResult.getContent()); + Map result = JsonUtil.toMap(JsonUtil.toString(httpClientResult.getContent()), String.class, Object.class); + log.info(" result:{}", result); + Map data = JsonUtil.toMap(JsonUtil.toString(result.get("data")), String.class, Object.class); + log.info(" data:{}", data); + webServiceResponse.setResult(data); + } catch (Exception e) { + log.info("Exception:{}", e.getMessage()); + } + return webServiceResponse; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java new file mode 100644 index 000000000..4c3995745 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java @@ -0,0 +1,15 @@ +package com.tencent.supersonic.chat.query.plugin.webservice; + +import com.tencent.supersonic.chat.query.plugin.WebBase; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +public class WebServiceResponse { + + private WebBase webBase; + + private Object result; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatchOption.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatchOption.java similarity index 73% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatchOption.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatchOption.java index e740a0c44..3f611c27a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatchOption.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatchOption.java @@ -1,16 +1,15 @@ -package com.tencent.supersonic.chat.application.query; +package com.tencent.supersonic.chat.query.rule; -import com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption; import lombok.Data; @Data public class QueryMatchOption { - private SchemaElementOption schemaElementOption; + private OptionType schemaElementOption; private RequireNumberType requireNumberType; private Integer requireNumber; - public static QueryMatchOption build(SchemaElementOption schemaElementOption, + public static QueryMatchOption build(OptionType schemaElementOption, RequireNumberType requireNumberType, Integer requireNumber) { QueryMatchOption queryMatchOption = new QueryMatchOption(); queryMatchOption.requireNumber = requireNumber; @@ -21,7 +20,7 @@ public class QueryMatchOption { public static QueryMatchOption optional() { QueryMatchOption queryMatchOption = new QueryMatchOption(); - queryMatchOption.setSchemaElementOption(SchemaElementOption.OPTIONAL); + queryMatchOption.setSchemaElementOption(OptionType.OPTIONAL); queryMatchOption.setRequireNumber(0); queryMatchOption.setRequireNumberType(RequireNumberType.AT_LEAST); return queryMatchOption; @@ -29,7 +28,7 @@ public class QueryMatchOption { public static QueryMatchOption unused() { QueryMatchOption queryMatchOption = new QueryMatchOption(); - queryMatchOption.setSchemaElementOption(SchemaElementOption.UNUSED); + queryMatchOption.setSchemaElementOption(OptionType.UNUSED); queryMatchOption.setRequireNumber(0); queryMatchOption.setRequireNumberType(RequireNumberType.EQUAL); return queryMatchOption; @@ -39,5 +38,8 @@ public class QueryMatchOption { AT_MOST, AT_LEAST, EQUAL } + public enum OptionType { + REQUIRED, OPTIONAL, UNUSED + } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java similarity index 58% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java index 109982ebf..ce74dd3a7 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/query/QueryMatcher.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java @@ -1,10 +1,12 @@ -package com.tencent.supersonic.chat.application.query; +package com.tencent.supersonic.chat.query.rule; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.domain.pojo.chat.SchemaElementOption; -import com.tencent.supersonic.common.enums.AggregateTypeEnum; - +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -13,6 +15,7 @@ import java.util.Map; import java.util.Objects; import lombok.Data; import lombok.ToString; +import org.springframework.util.CollectionUtils; @Data @ToString @@ -23,6 +26,8 @@ public class QueryMatcher { private boolean supportOrderBy; private List orderByTypes = Arrays.asList(AggregateTypeEnum.MAX, AggregateTypeEnum.MIN, AggregateTypeEnum.TOPN); + private Long FREQUENCY = 9999999L; + private double SIMILARITY = 1.0; public QueryMatcher() { for (SchemaElementType type : SchemaElementType.values()) { @@ -34,7 +39,7 @@ public class QueryMatcher { } } - public QueryMatcher addOption(SchemaElementType type, SchemaElementOption option, + public QueryMatcher addOption(SchemaElementType type, QueryMatchOption.OptionType option, QueryMatchOption.RequireNumberType requireNumberType, Integer requireNumber) { elementOptionMap.put(type, QueryMatchOption.build(option, requireNumberType, requireNumber)); return this; @@ -47,12 +52,12 @@ public class QueryMatcher { * @return a list of all matched schema elements, * empty list if no matches can be found */ - public List match(List candidateElementMatches) { + public List match(List candidateElementMatches, QueryFilters queryFilters) { List elementMatches = new ArrayList<>(); - + List schemaElementMatchWithQueryFilter = addSchemaElementMatch(candidateElementMatches, queryFilters); HashMap schemaElementTypeCount = new HashMap<>(); - for (SchemaElementMatch schemaElementMatch : candidateElementMatches) { - SchemaElementType schemaElementType = schemaElementMatch.getElementType(); + for (SchemaElementMatch schemaElementMatch : schemaElementMatchWithQueryFilter) { + SchemaElementType schemaElementType = schemaElementMatch.getElement().getType(); if (schemaElementTypeCount.containsKey(schemaElementType)) { schemaElementTypeCount.put(schemaElementType, schemaElementTypeCount.get(schemaElementType) + 1); } else { @@ -70,10 +75,10 @@ public class QueryMatcher { } // add element match if its element type is not declared as unused - for (SchemaElementMatch elementMatch : candidateElementMatches) { - QueryMatchOption elementOption = elementOptionMap.get(elementMatch.getElementType()); + for (SchemaElementMatch elementMatch : schemaElementMatchWithQueryFilter) { + QueryMatchOption elementOption = elementOptionMap.get(elementMatch.getElement().getType()); if (Objects.nonNull(elementOption) && !elementOption.getSchemaElementOption() - .equals(SchemaElementOption.UNUSED)) { + .equals(QueryMatchOption.OptionType.UNUSED)) { elementMatches.add(elementMatch); } } @@ -81,6 +86,32 @@ public class QueryMatcher { return elementMatches; } + private List addSchemaElementMatch(List candidateElementMatches, QueryFilters queryFilter) { + List schemaElementMatchWithQueryFilter = new ArrayList<>(candidateElementMatches); + if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) { + return schemaElementMatchWithQueryFilter; + } + QueryMatchOption queryMatchOption = elementOptionMap.get(SchemaElementType.VALUE); + if (queryMatchOption != null && QueryMatchOption.OptionType.REQUIRED.equals(queryMatchOption.getSchemaElementOption())) { + for (QueryFilter filter : queryFilter.getFilters()) { + SchemaElement element = SchemaElement.builder() + .id(filter.getElementID()) + .name(String.valueOf(filter.getValue())) + .type(SchemaElementType.VALUE) + .build(); + SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() + .element(element) + .frequency(FREQUENCY) + .word(String.valueOf(filter.getValue())) + .similarity(SIMILARITY) + .detectWord(Constants.EMPTY) + .build(); + schemaElementMatchWithQueryFilter.add(schemaElementMatch); + } + } + return schemaElementMatchWithQueryFilter; + } + private int getCount(HashMap schemaElementTypeCount, SchemaElementType schemaElementType) { if (schemaElementTypeCount.containsKey(schemaElementType)) { @@ -91,7 +122,7 @@ public class QueryMatcher { private boolean isMatch(QueryMatchOption queryMatchOption, int count) { // check if required but empty - if (queryMatchOption.getSchemaElementOption().equals(SchemaElementOption.REQUIRED) && count <= 0) { + if (queryMatchOption.getSchemaElementOption().equals(QueryMatchOption.OptionType.REQUIRED) && count <= 0) { return false; } if (queryMatchOption.getRequireNumberType().equals(QueryMatchOption.RequireNumberType.AT_LEAST) @@ -102,7 +133,6 @@ public class QueryMatcher { && count > queryMatchOption.getRequireNumber()) { return false; } - return true; } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java new file mode 100644 index 000000000..173eb2b6e --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java @@ -0,0 +1,233 @@ + +package com.tencent.supersonic.chat.query.rule; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.QueryState; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.chat.utils.QueryReqBuilder; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.util.*; + +@Slf4j +@ToString +public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { + + protected SemanticParseInfo parseInfo = new SemanticParseInfo(); + protected QueryMatcher queryMatcher = new QueryMatcher(); + protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + + public RuleSemanticQuery() { + QueryManager.register(this); + } + + public List match(List candidateElementMatches, + QueryContext queryCtx) { + return queryMatcher.match(candidateElementMatches, queryCtx.getRequest().getQueryFilters()); + } + + public void fillParseInfo(Long domainId, ChatContext chatContext){ + parseInfo.setQueryMode(getQueryMode()); + + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigRich chatConfig = configService.getConfigRichInfo(domainId); + + SemanticService schemaService = ContextUtils.getBean(SemanticService.class); + DomainSchema domainSchema = schemaService.getDomainSchema(domainId); + + fillSchemaElement(parseInfo, domainSchema, chatConfig); + // inherit date info from context + if (parseInfo.getDateInfo() == null && chatContext.getParseInfo().getDateInfo() != null) { + parseInfo.setDateInfo(chatContext.getParseInfo().getDateInfo()); + } + } + + private void fillSchemaElement(SemanticParseInfo parseInfo, DomainSchema domainSchema, ChatConfigRich chaConfigRich) { + parseInfo.setDomain(domainSchema.getDomain()); + + Map> dim2Values = new HashMap<>(); + for (SchemaElementMatch schemaMatch : parseInfo.getElementMatches()) { + SchemaElement element = schemaMatch.getElement(); + switch (element.getType()) { + case ID: + case VALUE: + SchemaElement dimElement = domainSchema.getElement(SchemaElementType.DIMENSION, element.getId()); + if (dimElement != null) { + if (dim2Values.containsKey(element.getId())) { + dim2Values.get(element.getId()).add(schemaMatch); + } else { + dim2Values.put(element.getId(), new ArrayList<>(Arrays.asList(schemaMatch))); + } + } + break; + case DIMENSION: + parseInfo.getDimensions().add(element); + break; + case METRIC: + parseInfo.getMetrics().add(element); + break; + default: + } + } + + if (!dim2Values.isEmpty()) { + for (Map.Entry> entry : dim2Values.entrySet()) { + SchemaElement dimension = domainSchema.getElement(SchemaElementType.DIMENSION, entry.getKey()); + + if (entry.getValue().size() == 1) { + SchemaElementMatch schemaMatch = entry.getValue().get(0); + QueryFilter dimensionFilter = new QueryFilter(); + dimensionFilter.setValue(schemaMatch.getWord()); + dimensionFilter.setBizName(dimension.getBizName()); + dimensionFilter.setName(dimension.getName()); + dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); + dimensionFilter.setElementID(schemaMatch.getElement().getId()); + parseInfo.getDimensionFilters().add(dimensionFilter); + setEntityId(schemaMatch.getWord(), chaConfigRich, parseInfo); + } else { + QueryFilter dimensionFilter = new QueryFilter(); + List vals = new ArrayList<>(); + entry.getValue().stream().forEach(i -> vals.add(i.getWord())); + dimensionFilter.setValue(vals); + dimensionFilter.setBizName(dimension.getBizName()); + dimensionFilter.setName(dimension.getName()); + dimensionFilter.setOperator(FilterOperatorEnum.IN); + dimensionFilter.setElementID(entry.getKey()); + parseInfo.getDimensionFilters().add(dimensionFilter); + } + } + } + } + + public void setEntityId(String value, ChatConfigRich chaConfigRichDesc, + SemanticParseInfo semanticParseInfo) { + if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null + && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { + SchemaElement dimSchemaResp = chaConfigRichDesc.getChatDetailRichConfig().getEntity().getDimItem(); + if (Objects.nonNull(dimSchemaResp) && StringUtils.isNumeric(value)) { + semanticParseInfo.setEntity(Long.valueOf(value)); + } + } + } + + @Override + public QueryResult execute(User user) { + String queryMode = parseInfo.getQueryMode(); + + if (parseInfo.getDomainId() < 0 || StringUtils.isEmpty(queryMode) + || !QueryManager.containsRuleQuery(queryMode)) { + // reach here some error may happen + log.error("not find QueryMode"); + throw new RuntimeException("not find QueryMode"); + } + + QueryResult queryResult = new QueryResult(); + QueryResultWithSchemaResp queryResp = semanticLayer.queryByStruct( + convertQueryStruct(), user); + + if (queryResp != null) { + queryResult.setQueryAuthorization(queryResp.getQueryAuthorization()); + } + String sql = queryResp == null ? null : queryResp.getSql(); + List> resultList = queryResp == null ? new ArrayList<>() + : queryResp.getResultList(); + List columns = queryResp == null ? new ArrayList<>() : queryResp.getColumns(); + queryResult.setQuerySql(sql); + queryResult.setQueryResults(resultList); + queryResult.setQueryColumns(columns); + queryResult.setQueryMode(queryMode); + queryResult.setQueryState(QueryState.SUCCESS); + + // add domain info + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) + .getEntityInfo(parseInfo, user); + queryResult.setEntityInfo(entityInfo); + return queryResult; + } + + public QueryResult multiStructExecute(User user) { + String queryMode = parseInfo.getQueryMode(); + + if (parseInfo.getDomainId() < 0 || StringUtils.isEmpty(queryMode) + || !QueryManager.containsRuleQuery(queryMode)) { + // reach here some error may happen + log.error("not find QueryMode"); + throw new RuntimeException("not find QueryMode"); + } + + QueryResult queryResult = new QueryResult(); + QueryMultiStructReq queryMultiStructReq = convertQueryMultiStruct(); + QueryResultWithSchemaResp queryResp = semanticLayer.queryByMultiStruct(queryMultiStructReq, user); + if (queryResp != null) { + queryResult.setQueryAuthorization(queryResp.getQueryAuthorization()); + } + String sql = queryResp == null ? null : queryResp.getSql(); + List> resultList = queryResp == null ? new ArrayList<>() + : queryResp.getResultList(); + List columns = queryResp == null ? new ArrayList<>() : queryResp.getColumns(); + queryResult.setQuerySql(sql); + queryResult.setQueryResults(resultList); + queryResult.setQueryColumns(columns); + queryResult.setQueryMode(queryMode); + queryResult.setQueryState(QueryState.SUCCESS); + + // add domain info + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) + .getEntityInfo(parseInfo, user); + queryResult.setEntityInfo(entityInfo); + return queryResult; + } + + @Override + public SemanticParseInfo getParseInfo() { + return parseInfo; + } + + public void setParseInfo(SemanticParseInfo parseInfo) { + this.parseInfo = parseInfo; + } + + public static List resolve(List candidateElementMatches, + QueryContext queryContext) { + List matchedQueries = new ArrayList<>(); + for (RuleSemanticQuery semanticQuery : QueryManager.getRuleQueries()) { + List matches = semanticQuery.match(candidateElementMatches, queryContext); + + if (matches.size() > 0) { + RuleSemanticQuery query = QueryManager.createRuleQuery(semanticQuery.getQueryMode()); + query.getParseInfo().getElementMatches().addAll(matches); + matchedQueries.add(query); + } + } + + return matchedQueries; + } + + protected QueryStructReq convertQueryStruct() { + return QueryReqBuilder.buildStructReq(parseInfo); + } + + protected QueryMultiStructReq convertQueryMultiStruct() { + return QueryReqBuilder.buildMultiStructReq(parseInfo); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java new file mode 100644 index 000000000..6ca497420 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.chat.query.rule.entity; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; + +import org.springframework.stereotype.Component; + +@Component +public class EntityDetailQuery extends EntitySemanticQuery { + + public static final String QUERY_MODE = "ENTITY_DETAIL"; + + public EntityDetailQuery() { + super(); + queryMatcher.addOption(DIMENSION, REQUIRED, AT_LEAST, 1) + .addOption(VALUE, REQUIRED, AT_LEAST, 1); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java new file mode 100644 index 000000000..5899d9ccb --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java @@ -0,0 +1,27 @@ +package com.tencent.supersonic.chat.query.rule.entity; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + + +@Slf4j +@Component +public class EntityFilterQuery extends EntityListQuery { + + public static final String QUERY_MODE = "ENTITY_LIST_FILTER"; + + public EntityFilterQuery() { + super(); + queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 1); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java new file mode 100644 index 000000000..45398e1aa --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java @@ -0,0 +1,53 @@ +package com.tencent.supersonic.chat.query.rule.entity; + +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.config.ChatDefaultRichConfig; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.Order; +import com.tencent.supersonic.common.util.ContextUtils; + +import java.util.LinkedHashSet; +import java.util.Set; + +public abstract class EntityListQuery extends EntitySemanticQuery{ + + @Override + public void fillParseInfo(Long domainId, ChatContext chatContext){ + super.fillParseInfo(domainId, chatContext); + this.addEntityDetailAndOrderByMetric(parseInfo); + } + + private void addEntityDetailAndOrderByMetric(SemanticParseInfo parseInfo) { + if (parseInfo.getDomainId() > 0L) { + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigRich chaConfigRichDesc = configService.getConfigRichInfo( + parseInfo.getDomainId()); + if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null + && chaConfigRichDesc.getChatDetailRichConfig().getEntity() != null) { + Set dimensions = new LinkedHashSet(); + Set metrics = new LinkedHashSet(); + Set orders = new LinkedHashSet(); + ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig(); + if (chatDefaultConfig != null) { + chatDefaultConfig.getMetrics().stream() + .forEach(metric -> { + metrics.add(metric); + orders.add(new Order(metric.getBizName(), Constants.DESC_UPPER)); + }); + chatDefaultConfig.getDimensions().stream() + .forEach(dimension -> dimensions.add(dimension)); + + } + + parseInfo.setDimensions(dimensions); + parseInfo.setMetrics(metrics); + parseInfo.setOrders(orders); + } + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java new file mode 100644 index 000000000..50981348e --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java @@ -0,0 +1,105 @@ +package com.tencent.supersonic.chat.query.rule.entity; + +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.config.ChatConfigResp; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.config.ChatDefaultRichConfig; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.util.ContextUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; + +@Slf4j +public abstract class EntitySemanticQuery extends RuleSemanticQuery { + + private static final Long ENTITY_MAX_RESULTS = 500L; + + public EntitySemanticQuery() { + super(); + queryMatcher.addOption(ENTITY, REQUIRED, AT_LEAST, 1); + } + + @Override + public List match(List candidateElementMatches, + QueryContext queryCtx) { + candidateElementMatches = filterElementMatches(candidateElementMatches); + return super.match(candidateElementMatches, queryCtx); + } + + private List filterElementMatches(List candidateElementMatches) { + List filteredMatches = new ArrayList<>(); + if (CollectionUtils.isEmpty(candidateElementMatches) + || Objects.isNull(candidateElementMatches.get(0).getElement().getDomain())) { + return candidateElementMatches; + } + + Long domainId = candidateElementMatches.get(0).getElement().getDomain(); + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigResp chatConfig = configService.fetchConfigByDomainId(domainId); + + List blackDimIdList = new ArrayList<>(); + List blackMetricIdList = new ArrayList<>(); + if (Objects.nonNull(chatConfig.getChatDetailConfig()) + && Objects.nonNull(chatConfig.getChatDetailConfig().getVisibility())) { + blackDimIdList = chatConfig.getChatDetailConfig().getVisibility().getBlackDimIdList(); + blackMetricIdList = chatConfig.getChatDetailConfig().getVisibility().getBlackMetricIdList(); + } + + for (SchemaElementMatch schemaElementMatch : candidateElementMatches) { + + SchemaElementType type = schemaElementMatch.getElement().getType(); + if (SchemaElementType.DIMENSION.equals(type) || SchemaElementType.VALUE.equals(type)) { + if (!blackDimIdList.contains(schemaElementMatch.getElement().getId())) { + filteredMatches.add(schemaElementMatch); + } + } else if (SchemaElementType.METRIC.equals(type)) { + if (!blackMetricIdList.contains(schemaElementMatch.getElement().getId())) { + filteredMatches.add(schemaElementMatch); + } + } else { + filteredMatches.add(schemaElementMatch); + } + } + return filteredMatches; + } + + @Override + public void fillParseInfo(Long domainId, ChatContext chatContext) { + super.fillParseInfo(domainId, chatContext); + + parseInfo.setNativeQuery(true); + parseInfo.setLimit(ENTITY_MAX_RESULTS); + if (parseInfo.getDateInfo() == null) { + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigRich chatConfig = configService.getConfigRichInfo(parseInfo.getDomainId()); + ChatDefaultRichConfig defaultConfig = chatConfig.getChatDetailRichConfig().getChatDefaultConfig(); + + int unit = 1; + if (Objects.nonNull(defaultConfig) && Objects.nonNull(defaultConfig.getUnit())) { + unit = defaultConfig.getUnit(); + } + String date = LocalDate.now().plusDays(-unit).toString(); + DateConf dateInfo = new DateConf(); + dateInfo.setDateMode(DateConf.DateMode.BETWEEN_CONTINUOUS); + dateInfo.setStartDate(date); + dateInfo.setEndDate(date); + + parseInfo.setDateInfo(dateInfo); + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityTopNQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityTopNQuery.java new file mode 100644 index 000000000..ae0d34e61 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityTopNQuery.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.chat.query.rule.entity; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; + +import org.springframework.stereotype.Component; + +@Component +public class EntityTopNQuery extends EntityListQuery { + + public static final String QUERY_MODE = "ENTITY_LIST_TOPN"; + + public EntityTopNQuery() { + super(); + queryMatcher.addOption(METRIC, REQUIRED, AT_LEAST, 1) + .setSupportOrderBy(true); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java new file mode 100644 index 000000000..badc4aa2b --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java @@ -0,0 +1,45 @@ +package com.tencent.supersonic.chat.query.rule.metric; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.pojo.response.AggregateInfo; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import java.util.Objects; +import org.springframework.stereotype.Component; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.*; + +@Component +public class MetricDomainQuery extends MetricSemanticQuery { + + public static final String QUERY_MODE = "METRIC_DOMAIN"; + + public MetricDomainQuery() { + super(); + queryMatcher.addOption(DOMAIN, OPTIONAL, AT_MOST, 1); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public QueryResult execute(User user) { + QueryResult queryResult = super.execute(user); + if (!Objects.isNull(queryResult)) { + QueryResultWithSchemaResp queryResp = new QueryResultWithSchemaResp(); + queryResp.setColumns(queryResult.getQueryColumns()); + queryResp.setResultList(queryResult.getQueryResults()); + AggregateInfo aggregateInfo = ContextUtils.getBean(SemanticService.class) + .getAggregateInfo(user, parseInfo, queryResp); + queryResult.setAggregateInfo(aggregateInfo); + } + return queryResult; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java new file mode 100644 index 000000000..bb6125f47 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java @@ -0,0 +1,97 @@ +package com.tencent.supersonic.chat.query.rule.metric; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.pojo.response.AggregateInfo; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import java.util.*; +import java.util.stream.Collectors; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; + +@Slf4j +@Component +public class MetricFilterQuery extends MetricSemanticQuery { + + public static final String QUERY_MODE = "METRIC_FILTER"; + + public MetricFilterQuery() { + super(); + queryMatcher.addOption(VALUE, REQUIRED, AT_LEAST, 1) + .addOption(ENTITY, OPTIONAL, AT_MOST, 1); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public QueryResult execute(User user) { + if (!isMultiStructQuery()) { + QueryResult queryResult = super.execute(user); + if (Objects.nonNull(queryResult)) { + QueryResultWithSchemaResp queryResp = new QueryResultWithSchemaResp(); + queryResp.setColumns(queryResult.getQueryColumns()); + queryResp.setResultList(queryResult.getQueryResults()); + AggregateInfo aggregateInfo = ContextUtils.getBean(SemanticService.class) + .getAggregateInfo(user,parseInfo,queryResp); + queryResult.setAggregateInfo(aggregateInfo); + } + return queryResult; + } + return super.multiStructExecute(user); + } + + protected boolean isMultiStructQuery() { + Set filterBizName = new HashSet<>(); + parseInfo.getDimensionFilters().forEach(filter -> + filterBizName.add(filter.getBizName())); + return filterBizName.size() > 1; + } + + @Override + protected QueryStructReq convertQueryStruct() { + QueryStructReq queryStructReq = super.convertQueryStruct(); + addDimension(queryStructReq, true); + return queryStructReq; + } + + @Override + protected QueryMultiStructReq convertQueryMultiStruct() { + QueryMultiStructReq queryMultiStructReq = super.convertQueryMultiStruct(); + for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) { + addDimension(queryStructReq, false); + } + return queryMultiStructReq; + } + + private void addDimension(QueryStructReq queryStructReq, boolean onlyOperateInFilter) { + if (!queryStructReq.getDimensionFilters().isEmpty()) { + List dimensions = queryStructReq.getGroups(); + log.info("addDimension before [{}]", queryStructReq.getGroups()); + List filters = new ArrayList<>(queryStructReq.getDimensionFilters()); + if (onlyOperateInFilter) { + filters = filters.stream().filter(filter + -> filter.getOperator().equals(FilterOperatorEnum.IN)).collect(Collectors.toList()); + } + filters.forEach(d -> { + if (!dimensions.contains(d.getBizName())) { + dimensions.add(d.getBizName()); + }}); + queryStructReq.setGroups(dimensions); + log.info("addDimension after [{}]", queryStructReq.getGroups()); + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java new file mode 100644 index 000000000..82571a6d1 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java @@ -0,0 +1,26 @@ +package com.tencent.supersonic.chat.query.rule.metric; + +import org.springframework.stereotype.Component; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; + +@Component +public class MetricGroupByQuery extends MetricSemanticQuery { + + public static final String QUERY_MODE = "METRIC_GROUPBY"; + + public MetricGroupByQuery() { + super(); + queryMatcher.addOption(DIMENSION, REQUIRED, AT_LEAST, 1); + queryMatcher.addOption(VALUE, OPTIONAL, AT_LEAST, 0); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java new file mode 100644 index 000000000..177123be8 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java @@ -0,0 +1,105 @@ +package com.tencent.supersonic.chat.query.rule.metric; + +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.config.ChatConfigResp; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.config.ChatDefaultRichConfig; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.util.ContextUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.METRIC; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; + +@Slf4j +public abstract class MetricSemanticQuery extends RuleSemanticQuery { + + private static final Long METRIC_MAX_RESULTS = 365L; + + public MetricSemanticQuery() { + super(); + queryMatcher.addOption(METRIC, REQUIRED, AT_LEAST, 1); + } + + @Override + public List match(List candidateElementMatches, + QueryContext queryCtx) { + candidateElementMatches = filterElementMatches(candidateElementMatches); + return super.match(candidateElementMatches, queryCtx); + } + + private List filterElementMatches(List candidateElementMatches) { + List filteredMatches = new ArrayList<>(); + if (CollectionUtils.isEmpty(candidateElementMatches) + || Objects.isNull(candidateElementMatches.get(0).getElement().getDomain())) { + return candidateElementMatches; + } + + Long domainId = candidateElementMatches.get(0).getElement().getDomain(); + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigResp chatConfig = configService.fetchConfigByDomainId(domainId); + + List blackDimIdList = new ArrayList<>(); + List blackMetricIdList = new ArrayList<>(); + if (Objects.nonNull(chatConfig.getChatAggConfig()) + && Objects.nonNull(chatConfig.getChatAggConfig().getVisibility())) { + blackDimIdList = chatConfig.getChatAggConfig().getVisibility().getBlackDimIdList(); + blackMetricIdList = chatConfig.getChatAggConfig().getVisibility().getBlackMetricIdList(); + } + + for (SchemaElementMatch schemaElementMatch : candidateElementMatches) { + SchemaElementType type = schemaElementMatch.getElement().getType(); + + if (SchemaElementType.DIMENSION.equals(type) || SchemaElementType.VALUE.equals(type)) { + if (!blackDimIdList.contains(schemaElementMatch.getElement().getId())) { + filteredMatches.add(schemaElementMatch); + } + } else if (SchemaElementType.METRIC.equals(type)) { + if (!blackMetricIdList.contains(schemaElementMatch.getElement().getId())) { + filteredMatches.add(schemaElementMatch); + } + } else { + filteredMatches.add(schemaElementMatch); + } + } + return filteredMatches; + } + + @Override + public void fillParseInfo(Long domainId, ChatContext chatContext){ + super.fillParseInfo(domainId, chatContext); + + parseInfo.setLimit(METRIC_MAX_RESULTS); + if (parseInfo.getDateInfo() == null) { + ConfigService configService = ContextUtils.getBean(ConfigService.class); + ChatConfigRich chatConfig = configService.getConfigRichInfo(parseInfo.getDomainId()); + ChatDefaultRichConfig defaultConfig = chatConfig.getChatAggRichConfig().getChatDefaultConfig(); + + int unit = 1; + if (Objects.nonNull(defaultConfig) && Objects.nonNull(defaultConfig.getUnit())) { + unit = defaultConfig.getUnit(); + } + String startDate = LocalDate.now().plusDays(-unit).toString(); + String endDate = LocalDate.now().plusDays(-1).toString(); + DateConf dateInfo = new DateConf(); + dateInfo.setDateMode(DateConf.DateMode.BETWEEN_CONTINUOUS); + dateInfo.setStartDate(startDate); + dateInfo.setEndDate(endDate); + + parseInfo.setDateInfo(dateInfo); + } + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java new file mode 100644 index 000000000..196e8e70a --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java @@ -0,0 +1,64 @@ +package com.tencent.supersonic.chat.query.rule.metric; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.DIMENSION; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; +import static com.tencent.supersonic.common.pojo.Constants.DESC_UPPER; + +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.common.pojo.Order; +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Component +public class MetricTopNQuery extends MetricSemanticQuery { + + public static final String QUERY_MODE = "METRIC_ORDERBY"; + private static final Long ORDERBY_MAX_RESULTS = 3L; + private static final Pattern INTENT_PATTERN = Pattern.compile("(.*)(最大|最高|最多)(.*)"); + + public MetricTopNQuery() { + super(); + queryMatcher.addOption(DIMENSION, REQUIRED, AT_LEAST, 1); + queryMatcher.addOption(VALUE, OPTIONAL, AT_LEAST, 0); + queryMatcher.setSupportOrderBy(true); + } + + @Override + public List match(List candidateElementMatches, + QueryContext queryCtx) { + Matcher matcher = INTENT_PATTERN.matcher(queryCtx.getRequest().getQueryText()); + if (matcher.matches()) { + return super.match(candidateElementMatches, queryCtx); + } + return new ArrayList<>(); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public void fillParseInfo(Long domainId, ChatContext chatContext){ + super.fillParseInfo(domainId, chatContext); + + parseInfo.setLimit(ORDERBY_MAX_RESULTS); + parseInfo.setBonus(2.0); + parseInfo.setAggType(AggregateTypeEnum.SUM); + + SchemaElement metric = parseInfo.getMetrics().iterator().next(); + parseInfo.getOrders().add(new Order(metric.getBizName(), DESC_UPPER)); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java index 07658f701..d1ece0e2f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java @@ -4,18 +4,14 @@ import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; -import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.core.response.DimensionResp; -import com.tencent.supersonic.semantic.api.core.response.DomainResp; -import com.tencent.supersonic.semantic.api.core.response.MetricResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigBaseReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigEditReqReq; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigFilter; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; -import com.tencent.supersonic.chat.domain.service.ConfigService; +import com.tencent.supersonic.chat.config.*; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.chat.service.ConfigService; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -69,12 +65,12 @@ public class ChatConfigController { @GetMapping("/richDesc/{domainId}") - public ChatConfigRichResp getDomainExtendRichInfo(@PathVariable("domainId") Long domainId) { + public ChatConfigRich getDomainExtendRichInfo(@PathVariable("domainId") Long domainId) { return configService.getConfigRichInfo(domainId); } @GetMapping("/richDesc/all") - public List getAllChatRichConfig() { + public List getAllChatRichConfig() { return configService.getAllChatRichConfig(); } @@ -88,27 +84,25 @@ public class ChatConfigController { public List getDomainList() { return semanticLayer.getDomainListForAdmin(); - //return defaultSemanticUtils.getDomainListForAdmin(); } @GetMapping("/domainList/view") public List getDomainListForViewer() { return semanticLayer.getDomainListForViewer(); - //return defaultSemanticUtils.getDomainListForViewer(); } @PostMapping("/dimension/page") - public PageInfo queryDimension(@RequestBody PageDimensionReq pageDimensionCmd, - HttpServletRequest request, - HttpServletResponse response) { - return semanticLayer.queryDimensionPage(pageDimensionCmd); + public PageInfo getDimension(@RequestBody PageDimensionReq pageDimensionCmd, + HttpServletRequest request, + HttpServletResponse response) { + return semanticLayer.getDimensionPage(pageDimensionCmd); } @PostMapping("/metric/page") - public PageInfo queryMetric(@RequestBody PageMetricReq pageMetrricCmd, - HttpServletRequest request, - HttpServletResponse response) { - return semanticLayer.queryMetricPage(pageMetrricCmd); + public PageInfo getMetric(@RequestBody PageMetricReq pageMetrricCmd, + HttpServletRequest request, + HttpServletResponse response) { + return semanticLayer.getMetricPage(pageMetrricCmd); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java index f56131f90..85b0ea412 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java @@ -3,10 +3,10 @@ package com.tencent.supersonic.chat.rest; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.chat.domain.dataobject.ChatDO; -import com.tencent.supersonic.chat.domain.pojo.chat.ChatQueryVO; -import com.tencent.supersonic.chat.domain.pojo.chat.PageQueryInfoReq; -import com.tencent.supersonic.chat.domain.service.ChatService; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResponse; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; +import com.tencent.supersonic.chat.service.ChatService; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -68,13 +68,12 @@ public class ChatController { } @PostMapping("/pageQueryInfo") - public PageInfo pageQueryInfo(@RequestBody PageQueryInfoReq pageQueryInfoCommend, - @RequestParam(value = "chatId") long chatId, - HttpServletRequest request, - HttpServletResponse response) { - pageQueryInfoCommend.setUserName(UserHolder.findUser(request, response).getName()); - return chatService.queryInfo(pageQueryInfoCommend, chatId); + public PageInfo pageQueryInfo(@RequestBody PageQueryInfoReq pageQueryInfoCommand, + @RequestParam(value = "chatId") long chatId, + HttpServletRequest request, + HttpServletResponse response) { + pageQueryInfoCommand.setUserName(UserHolder.findUser(request, response).getName()); + return chatService.queryInfo(pageQueryInfoCommand, chatId); } - } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java index 9ffd97e18..0356e27ef 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java @@ -2,10 +2,10 @@ package com.tencent.supersonic.chat.rest; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.domain.pojo.chat.QueryData; -import com.tencent.supersonic.chat.domain.service.QueryService; -import com.tencent.supersonic.chat.domain.service.SearchService; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.request.QueryDataRequest; +import com.tencent.supersonic.chat.service.QueryService; +import com.tencent.supersonic.chat.service.SearchService; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -31,28 +31,28 @@ public class ChatQueryController { @PostMapping("search") - public Object search(@RequestBody QueryContextReq queryCtx, HttpServletRequest request, - HttpServletResponse response) { + public Object search(@RequestBody QueryRequest queryCtx, HttpServletRequest request, + HttpServletResponse response) { queryCtx.setUser(UserHolder.findUser(request, response)); return searchService.search(queryCtx); } @PostMapping("query") - public Object query(@RequestBody QueryContextReq queryCtx, HttpServletRequest request, HttpServletResponse response) + public Object query(@RequestBody QueryRequest queryCtx, HttpServletRequest request, HttpServletResponse response) throws Exception { queryCtx.setUser(UserHolder.findUser(request, response)); return queryService.executeQuery(queryCtx); } @PostMapping("queryContext") - public Object queryContext(@RequestBody QueryContextReq queryCtx, HttpServletRequest request, - HttpServletResponse response) throws Exception { + public Object queryContext(@RequestBody QueryRequest queryCtx, HttpServletRequest request, + HttpServletResponse response) throws Exception { queryCtx.setUser(UserHolder.findUser(request, response)); return queryService.queryContext(queryCtx); } @PostMapping("queryData") - public Object queryData(@RequestBody QueryData queryData, HttpServletRequest request, HttpServletResponse response) + public Object queryData(@RequestBody QueryDataRequest queryData, HttpServletRequest request, HttpServletResponse response) throws Exception { return queryService.executeDirectQuery(queryData, UserHolder.findUser(request, response)); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictionaryController.java similarity index 80% rename from chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictController.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictionaryController.java index 1df4b3861..09fb97995 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictionaryController.java @@ -3,13 +3,15 @@ package com.tencent.supersonic.chat.rest; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.chat.application.knowledge.DictApplicationService; -import com.tencent.supersonic.knowledge.domain.pojo.DictTaskFilter; -import com.tencent.supersonic.knowledge.domain.pojo.DimValue2DictCommand; -import com.tencent.supersonic.knowledge.domain.pojo.DimValueDictInfo; +import com.tencent.supersonic.chat.service.DictionaryService; +import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; +import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -20,13 +22,10 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/chat/dict") -public class DictController { +public class DictionaryController { - private final DictApplicationService dictApplicationService; - - public DictController(DictApplicationService dictApplicationService) { - this.dictApplicationService = dictApplicationService; - } + @Autowired + private DictionaryService dictApplicationService; /** * addDictInfo diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java new file mode 100644 index 000000000..c47444f6e --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java @@ -0,0 +1,57 @@ +package com.tencent.supersonic.chat.rest; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.service.PluginService; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +@RestController +@RequestMapping("/api/chat/plugin") +public class PluginController { + + private PluginService pluginService; + + public PluginController(PluginService pluginService) { + this.pluginService = pluginService; + } + + @PostMapping + public boolean createPlugin(@RequestBody Plugin plugin, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { + User user = UserHolder.findUser(httpServletRequest, httpServletResponse); + pluginService.createPlugin(plugin, user); + return true; + } + + @PutMapping + public boolean updatePlugin(@RequestBody Plugin plugin, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { + User user = UserHolder.findUser(httpServletRequest, httpServletResponse); + pluginService.updatePlugin(plugin, user); + return true; + } + + @DeleteMapping("/{id}") + public boolean deletePlugin(@PathVariable("id") Long id) { + pluginService.deletePlugin(id); + return true; + } + + @RequestMapping("/getPluginList") + public List getPluginList() { + return pluginService.getPluginList(); + } + + @PostMapping("/query") + List query(PluginQueryReq pluginQueryReq) { + return pluginService.queryWithAuthCheck(pluginQueryReq); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java index 0ceaefa13..7118c20b6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java @@ -1,15 +1,18 @@ package com.tencent.supersonic.chat.rest; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.domain.service.RecommendService; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.RecommendQuestion; +import com.tencent.supersonic.chat.api.pojo.response.RecommendResponse; +import com.tencent.supersonic.chat.service.RecommendService; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * recommend controller @@ -22,11 +25,31 @@ public class RecommendController { private RecommendService recommendService; @GetMapping("recommend/{domainId}") - public Object recommend(@PathVariable("domainId") Integer domainId, HttpServletRequest request, - HttpServletResponse response) { - QueryContextReq queryCtx = new QueryContextReq(); + public RecommendResponse recommend(@PathVariable("domainId") Long domainId, + @RequestParam(value = "limit", required = false) Long limit, + HttpServletRequest request, + HttpServletResponse response) { + QueryRequest queryCtx = new QueryRequest(); queryCtx.setUser(UserHolder.findUser(request, response)); queryCtx.setDomainId(domainId); - return recommendService.recommend(queryCtx); + return recommendService.recommend(queryCtx, limit); + } + + @GetMapping("recommend/metric/{domainId}") + public RecommendResponse recommendMetricMode(@PathVariable("domainId") Long domainId, + @RequestParam(value = "limit", required = false) Long limit, + HttpServletRequest request, + HttpServletResponse response) { + QueryRequest queryCtx = new QueryRequest(); + queryCtx.setUser(UserHolder.findUser(request, response)); + queryCtx.setDomainId(domainId); + return recommendService.recommendMetricMode(queryCtx, limit); + } + + @GetMapping("recommend/question") + public List recommendQuestion(@RequestParam(value = "domainId", required = false) Long domainId, + HttpServletRequest request, + HttpServletResponse response) { + return recommendService.recommendQuestion(domainId); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ChatService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java similarity index 59% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ChatService.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java index 531232822..590eec797 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/service/ChatService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java @@ -1,15 +1,15 @@ -package com.tencent.supersonic.chat.domain.service; +package com.tencent.supersonic.chat.service; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.domain.dataobject.ChatDO; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDO; -import com.tencent.supersonic.chat.domain.pojo.chat.ChatQueryVO; -import com.tencent.supersonic.chat.domain.pojo.chat.PageQueryInfoReq; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResponse; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; import java.util.List; public interface ChatService { @@ -25,7 +25,7 @@ public interface ChatService { public void updateContext(ChatContext chatCtx); - public void updateContext(ChatContext chatCtx, QueryContextReq queryCtx, SemanticParseInfo semanticParseInfo); + public void updateContext(ChatContext chatCtx, QueryContext queryCtx, SemanticParseInfo semanticParseInfo); public void switchContext(ChatContext chatCtx); @@ -41,9 +41,9 @@ public interface ChatService { Boolean deleteChat(Long chatId, String userName); - PageInfo queryInfo(PageQueryInfoReq pageQueryInfoCommend, long chatId); + PageInfo queryInfo(PageQueryInfoReq pageQueryInfoCommend, long chatId); - public void addQuery(QueryResultResp queryResponse, QueryContextReq queryContext, ChatContext chatCtx); + public void addQuery(QueryResult queryResult, QueryContext queryContext, ChatContext chatCtx); public ChatQueryDO getLastQuery(long chatId); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java new file mode 100644 index 000000000..d211d2580 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java @@ -0,0 +1,22 @@ +package com.tencent.supersonic.chat.service; + + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.config.*; + +import java.util.List; + +public interface ConfigService { + + Long addConfig(ChatConfigBaseReq extendBaseCmd, User user); + + Long editConfig(ChatConfigEditReqReq extendEditCmd, User user); + + List search(ChatConfigFilter filter, User user); + + ChatConfigRich getConfigRichInfo(Long domainId); + + ChatConfigResp fetchConfigByDomainId(Long domainId); + + List getAllChatRichConfig(); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java new file mode 100644 index 000000000..5ef1adec9 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.chat.service; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.knowledge.dictionary.DictConfig; +import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; +import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; + +import java.util.List; + +public interface DictionaryService { + Long addDictTask(DimValue2DictCommand dimValue2DictCommend, User user); + + Long deleteDictTask(DimValue2DictCommand dimValue2DictCommend, User user); + + List searchDictTaskList(DictTaskFilter filter, User user); + + DictConfig getDictInfoByDomainId(Long domainId); + + String getDictRootPath(); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java new file mode 100644 index 000000000..3d749e335 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java @@ -0,0 +1,28 @@ +package com.tencent.supersonic.chat.service; + + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq; + +import java.util.List; +import java.util.Optional; + +public interface PluginService { + + void createPlugin(Plugin plugin, User user); + + void updatePlugin(Plugin plugin, User user); + + void deletePlugin(Long id); + + List getPluginList(); + + List fetchPluginDOs(String queryText, String type); + + List query(PluginQueryReq pluginQueryReq); + + Optional getPluginByName(String name); + + List queryWithAuthCheck(PluginQueryReq pluginQueryReq); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java new file mode 100644 index 000000000..b13d5d893 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java @@ -0,0 +1,20 @@ +package com.tencent.supersonic.chat.service; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.request.QueryDataRequest; +import org.apache.calcite.sql.parser.SqlParseException; + +/*** + * QueryService for query and search + */ +public interface QueryService { + + QueryResult executeQuery(QueryRequest queryCtx) throws Exception; + + SemanticParseInfo queryContext(QueryRequest queryCtx); + + QueryResult executeDirectQuery(QueryDataRequest queryData, User user) throws SqlParseException; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java new file mode 100644 index 000000000..8e8aff45c --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java @@ -0,0 +1,20 @@ +package com.tencent.supersonic.chat.service; + + +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.RecommendQuestion; +import com.tencent.supersonic.chat.api.pojo.response.RecommendResponse; + +import java.util.List; + +/*** + * Recommend Service + */ +public interface RecommendService { + + RecommendResponse recommend(QueryRequest queryCtx, Long limit); + + RecommendResponse recommendMetricMode(QueryRequest queryCtx, Long limit); + + List recommendQuestion(Long domainId); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/SearchService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SearchService.java new file mode 100644 index 000000000..2460ef1e6 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SearchService.java @@ -0,0 +1,14 @@ +package com.tencent.supersonic.chat.service; + +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.SearchResult; +import java.util.List; + +/** + * search service + */ +public interface SearchService { + + List search(QueryRequest queryCtx); + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java new file mode 100644 index 000000000..fdac19b67 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java @@ -0,0 +1,430 @@ +package com.tencent.supersonic.chat.service; + + +import static com.tencent.supersonic.common.pojo.Constants.DAY; +import static com.tencent.supersonic.common.pojo.Constants.DAY_FORMAT; +import static com.tencent.supersonic.common.pojo.Constants.DAY_FORMAT_INT; +import static com.tencent.supersonic.common.pojo.Constants.MONTH; +import static com.tencent.supersonic.common.pojo.Constants.MONTH_FORMAT; +import static com.tencent.supersonic.common.pojo.Constants.MONTH_FORMAT_INT; +import static com.tencent.supersonic.common.pojo.Constants.TIMES_FORMAT; +import static com.tencent.supersonic.common.pojo.Constants.TIME_FORMAT; +import static com.tencent.supersonic.common.pojo.Constants.WEEK; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.response.AggregateInfo; +import com.tencent.supersonic.chat.api.pojo.response.DataInfo; +import com.tencent.supersonic.chat.api.pojo.response.DomainInfo; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; +import com.tencent.supersonic.chat.api.pojo.response.MetricInfo; +import com.tencent.supersonic.chat.config.ChatAggConfig; +import com.tencent.supersonic.chat.config.ChatConfigResp; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.config.ChatDefaultRichConfig; +import com.tencent.supersonic.chat.config.ChatDetailConfig; +import com.tencent.supersonic.chat.config.EntityRichInfo; +import com.tencent.supersonic.chat.config.ItemVisibility; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.chat.utils.QueryReqBuilder; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.DateConf.DateMode; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.RatioOverType; +import com.tencent.supersonic.common.util.DateUtils; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +@Service +@Slf4j +public class SemanticService { + + @Autowired + private SchemaService schemaService; + @Autowired + private ConfigService configService; + + private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + + public DomainSchema getDomainSchema(Long id) { + DomainSchema domainSchema = schemaService.getDomainSchema(id); + if (!Objects.isNull(domainSchema) && !Objects.isNull(domainSchema.getDomain())) { + ChatConfigResp chaConfigInfo = + configService.fetchConfigByDomainId(domainSchema.getDomain().getId()); + // filter dimensions in blacklist + filterBlackDim(domainSchema, chaConfigInfo); + // filter metrics in blacklist + filterBlackMetric(domainSchema, chaConfigInfo); + } + + return domainSchema; + } + + public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, User user) { + if (parseInfo != null && parseInfo.getDomainId() > 0) { + EntityInfo entityInfo = getEntityInfo(parseInfo.getDomainId()); + if (parseInfo.getDimensionFilters().size() <= 0) { + entityInfo.setMetrics(null); + entityInfo.setDimensions(null); + return entityInfo; + } + if (entityInfo.getDomainInfo() != null && entityInfo.getDomainInfo().getPrimaryEntityBizName() != null) { + String domainInfoPrimaryName = entityInfo.getDomainInfo().getPrimaryEntityBizName(); + String domainInfoId = ""; + for (QueryFilter chatFilter : parseInfo.getDimensionFilters()) { + if (chatFilter != null && chatFilter.getBizName() != null && chatFilter.getBizName() + .equals(domainInfoPrimaryName)) { + if (chatFilter.getOperator().equals(FilterOperatorEnum.EQUALS)) { + domainInfoId = chatFilter.getValue().toString(); + } + } + } + if (!"".equals(domainInfoId)) { + try { + setMainDomain(entityInfo, parseInfo.getDomainId(), + domainInfoId, user); + + return entityInfo; + } catch (Exception e) { + log.error("setMaintDomain error {}", e); + } + } + } + } + return null; + } + + public EntityInfo getEntityInfo(Long domain) { + ChatConfigRich chaConfigRichDesc = configService.getConfigRichInfo(domain); + if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatDetailRichConfig())) { + return new EntityInfo(); + } + return getEntityInfo(chaConfigRichDesc); + } + + private EntityInfo getEntityInfo(ChatConfigRich chaConfigRichDesc) { + + EntityInfo entityInfo = new EntityInfo(); + EntityRichInfo entityDesc = chaConfigRichDesc.getChatDetailRichConfig().getEntity(); + if (entityDesc != null && Objects.nonNull(chaConfigRichDesc.getDomainId())) { + DomainInfo domainInfo = new DomainInfo(); + domainInfo.setItemId(chaConfigRichDesc.getDomainId().intValue()); + domainInfo.setName(chaConfigRichDesc.getDomainName()); + domainInfo.setWords(entityDesc.getNames()); + domainInfo.setBizName(chaConfigRichDesc.getBizName()); + if (Objects.nonNull(entityDesc.getDimItem())) { + domainInfo.setPrimaryEntityBizName(entityDesc.getDimItem().getBizName()); + } + + entityInfo.setDomainInfo(domainInfo); + List dimensions = new ArrayList<>(); + List metrics = new ArrayList<>(); + + if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig()) + && Objects.nonNull(chaConfigRichDesc.getChatDetailRichConfig().getChatDefaultConfig())) { + ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig() + .getChatDefaultConfig(); + if (!CollectionUtils.isEmpty(chatDefaultConfig.getDimensions())) { + for (SchemaElement dimensionDesc : chatDefaultConfig.getDimensions()) { + DataInfo mainEntityDimension = new DataInfo(); + mainEntityDimension.setItemId(dimensionDesc.getId().intValue()); + mainEntityDimension.setName(dimensionDesc.getName()); + mainEntityDimension.setBizName(dimensionDesc.getBizName()); + dimensions.add(mainEntityDimension); + } + entityInfo.setDimensions(dimensions); + } + + if (!CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())) { + for (SchemaElement metricDesc : chatDefaultConfig.getMetrics()) { + DataInfo dataInfo = new DataInfo(); + dataInfo.setName(metricDesc.getName()); + dataInfo.setBizName(metricDesc.getBizName()); + dataInfo.setItemId(metricDesc.getId().intValue()); + metrics.add(dataInfo); + } + entityInfo.setMetrics(metrics); + } + } + } + return entityInfo; + } + + public void setMainDomain(EntityInfo domainInfo, Long domain, String entity, User user) { + DomainSchema domainSchema = schemaService.getDomainSchema(domain); + + domainInfo.setEntityId(entity); + SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); + semanticParseInfo.setDomain(domainSchema.getDomain()); + semanticParseInfo.setNativeQuery(true); + semanticParseInfo.setMetrics(getMetrics(domainInfo)); + semanticParseInfo.setDimensions(getDimensions(domainInfo)); + DateConf dateInfo = new DateConf(); + dateInfo.setUnit(1); + dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS); + semanticParseInfo.setDateInfo(dateInfo); + + // add filter + QueryFilter chatFilter = new QueryFilter(); + chatFilter.setValue(String.valueOf(entity)); + chatFilter.setOperator(FilterOperatorEnum.EQUALS); + chatFilter.setBizName(getEntityPrimaryName(domainInfo)); + Set chatFilters = new LinkedHashSet(); + chatFilters.add(chatFilter); + semanticParseInfo.setDimensionFilters(chatFilters); + + QueryResultWithSchemaResp queryResultWithColumns = null; + try { + queryResultWithColumns = semanticLayer.queryByStruct(QueryReqBuilder.buildStructReq(semanticParseInfo), + user); + } catch (Exception e) { + log.warn("setMainDomain queryByStruct error, e:", e); + } + + if (queryResultWithColumns != null) { + if (!CollectionUtils.isEmpty(queryResultWithColumns.getResultList()) + && queryResultWithColumns.getResultList().size() > 0) { + Map result = queryResultWithColumns.getResultList().get(0); + for (Map.Entry entry : result.entrySet()) { + String entryKey = getEntryKey(entry); + if (entry.getValue() == null || entryKey == null) { + continue; + } + domainInfo.getDimensions().stream().filter(i -> entryKey.equals(i.getBizName())) + .forEach(i -> i.setValue(entry.getValue().toString())); + domainInfo.getMetrics().stream().filter(i -> entryKey.equals(i.getBizName())) + .forEach(i -> i.setValue(entry.getValue().toString())); + } + } + } + } + + private Set getDimensions(EntityInfo domainInfo) { + Set dimensions = new LinkedHashSet(); + for (DataInfo mainEntityDimension : domainInfo.getDimensions()) { + SchemaElement dimension = new SchemaElement(); + dimension.setBizName(mainEntityDimension.getBizName()); + dimensions.add(dimension); + } + return dimensions; + } + + private String getEntryKey(Map.Entry entry) { + // metric parser special handle, TODO delete + String entryKey = entry.getKey(); + if (entryKey.contains("__")) { + entryKey = entryKey.split("__")[1]; + } + return entryKey; + } + + private Set getMetrics(EntityInfo domainInfo) { + Set metrics = new LinkedHashSet(); + for (DataInfo metricValue : domainInfo.getMetrics()) { + SchemaElement metric = new SchemaElement(); + metric.setBizName(metricValue.getBizName()); + metrics.add(metric); + } + return metrics; + } + + private String getEntityPrimaryName(EntityInfo domainInfo) { + return domainInfo.getDomainInfo().getPrimaryEntityBizName(); + } + + private void filterBlackMetric(DomainSchema domainSchema, ChatConfigResp chaConfigInfo) { + ItemVisibility visibility = generateFinalVisibility(chaConfigInfo); + if (Objects.nonNull(chaConfigInfo) && Objects.nonNull(visibility) + && !CollectionUtils.isEmpty(visibility.getBlackMetricIdList()) + && !CollectionUtils.isEmpty(domainSchema.getMetrics())) { + Set metric4Chat = domainSchema.getMetrics().stream() + .filter(metric -> !visibility.getBlackMetricIdList().contains(metric.getId())) + .collect(Collectors.toSet()); + domainSchema.setMetrics(metric4Chat); + } + } + + private void filterBlackDim(DomainSchema domainSchema, ChatConfigResp chatConfigInfo) { + ItemVisibility visibility = generateFinalVisibility(chatConfigInfo); + if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(visibility) + && !CollectionUtils.isEmpty(visibility.getBlackDimIdList()) + && !CollectionUtils.isEmpty(domainSchema.getDimensions())) { + Set dim4Chat = domainSchema.getDimensions().stream() + .filter(dim -> !visibility.getBlackDimIdList().contains(dim.getId())) + .collect(Collectors.toSet()); + domainSchema.setDimensions(dim4Chat); + } + } + + private ItemVisibility generateFinalVisibility(ChatConfigResp chatConfigInfo) { + ItemVisibility visibility = new ItemVisibility(); + + ChatAggConfig chatAggConfig = chatConfigInfo.getChatAggConfig(); + ChatDetailConfig chatDetailConfig = chatConfigInfo.getChatDetailConfig(); + + // both black is exist + if (Objects.nonNull(chatAggConfig) && Objects.nonNull(chatAggConfig.getVisibility()) + && Objects.nonNull(chatDetailConfig) && Objects.nonNull(chatDetailConfig.getVisibility())) { + List blackDimIdList = new ArrayList<>(); + blackDimIdList.addAll(chatAggConfig.getVisibility().getBlackDimIdList()); + blackDimIdList.retainAll(chatDetailConfig.getVisibility().getBlackDimIdList()); + List blackMetricIdList = new ArrayList<>(); + + blackMetricIdList.addAll(chatAggConfig.getVisibility().getBlackMetricIdList()); + blackMetricIdList.retainAll(chatDetailConfig.getVisibility().getBlackMetricIdList()); + + visibility.setBlackDimIdList(blackDimIdList); + visibility.setBlackMetricIdList(blackMetricIdList); + } + return visibility; + } + + public AggregateInfo getAggregateInfo(User user, SemanticParseInfo semanticParseInfo, + QueryResultWithSchemaResp result) { + if (CollectionUtils.isEmpty(semanticParseInfo.getMetrics())) { + return new AggregateInfo(); + } + List resultMetricNames = result.getColumns().stream().map(c -> c.getNameEn()) + .collect(Collectors.toList()); + Optional ratioMetric = semanticParseInfo.getMetrics().stream() + .filter(m -> resultMetricNames.contains(m.getBizName())).findFirst(); + if (ratioMetric.isPresent()) { + AggregateInfo aggregateInfo = new AggregateInfo(); + MetricInfo metricInfo = new MetricInfo(); + metricInfo.setStatistics(new HashMap<>()); + String dateField = QueryReqBuilder.getDateField(semanticParseInfo.getDateInfo()); + + Optional lastDayOp = result.getResultList().stream() + .map(r -> r.get(dateField).toString()) + .sorted(Comparator.reverseOrder()).findFirst(); + if (lastDayOp.isPresent()) { + Optional> lastValue = result.getResultList().stream() + .filter(r -> r.get(dateField).toString().equals(lastDayOp.get())).findFirst(); + if (lastValue.isPresent()) { + metricInfo.setValue(lastValue.get().get(ratioMetric.get().getBizName()).toString()); + } + metricInfo.setDate(lastValue.get().get(dateField).toString()); + } + try { + queryRatio(user, semanticParseInfo, ratioMetric.get(), AggOperatorEnum.RATIO_ROLL, + result, metricInfo); + queryRatio(user, semanticParseInfo, ratioMetric.get(), AggOperatorEnum.RATIO_OVER, + result, metricInfo); + aggregateInfo.getMetricInfos().add(metricInfo); + } catch (Exception e) { + log.error("queryRatio error {}", e); + } + return aggregateInfo; + } + return new AggregateInfo(); + } + + private void queryRatio(User user, SemanticParseInfo semanticParseInfo, SchemaElement metric, + AggOperatorEnum aggOperatorEnum, QueryResultWithSchemaResp results, MetricInfo metricInfo) { + QueryStructReq queryStructReq = QueryReqBuilder.buildStructRatioReq(semanticParseInfo, metric, aggOperatorEnum); + DateConf dateInfo = semanticParseInfo.getDateInfo(); + String dateField = QueryReqBuilder.getDateField(dateInfo); + + queryStructReq.setGroups(new ArrayList<>(Arrays.asList(dateField))); + queryStructReq.setDateInfo(getRatioDateConf(aggOperatorEnum, semanticParseInfo, results)); + QueryResultWithSchemaResp queryResp = semanticLayer.queryByStruct(queryStructReq, user); + if (Objects.nonNull(queryResp) && !CollectionUtils.isEmpty(queryResp.getResultList())) { + + Map result = queryResp.getResultList().get(0); + Optional valueColumn = queryResp.getColumns().stream() + .filter(c -> c.getNameEn().equals(metric.getBizName())).findFirst(); + + if (valueColumn.isPresent()) { + String ratio = ""; + if (Objects.nonNull(result.get(valueColumn.get().getNameEn()))) { + ratio = String.format("%.2f", + (Double.valueOf(result.get(valueColumn.get().getNameEn()).toString()) * 100)) + "%"; + } + String statisticsRollName = RatioOverType.DAY_ON_DAY.getShowName(); + String statisticsOverName = RatioOverType.WEEK_ON_DAY.getShowName(); + if (MONTH.equals(dateInfo.getPeriod())) { + statisticsRollName = RatioOverType.MONTH_ON_MONTH.getShowName(); + statisticsOverName = RatioOverType.YEAR_ON_MONTH.getShowName(); + } + if (WEEK.equals(dateInfo.getPeriod())) { + statisticsRollName = RatioOverType.WEEK_ON_WEEK.getShowName(); + statisticsOverName = RatioOverType.MONTH_ON_WEEK.getShowName(); + } + metricInfo.getStatistics().put(aggOperatorEnum.equals(AggOperatorEnum.RATIO_ROLL) ? statisticsRollName + : statisticsOverName, + ratio); + } + metricInfo.setName(metric.getName()); + } + } + + private DateConf getRatioDateConf(AggOperatorEnum aggOperatorEnum, SemanticParseInfo semanticParseInfo, + QueryResultWithSchemaResp results) { + String dateField = QueryReqBuilder.getDateField(semanticParseInfo.getDateInfo()); + Optional lastDayOp = results.getResultList().stream() + .map(r -> r.get(dateField).toString()) + .sorted(Comparator.reverseOrder()).findFirst(); + if (lastDayOp.isPresent()) { + String lastDay = lastDayOp.get(); + DateConf dateConf = new DateConf(); + dateConf.setPeriod(semanticParseInfo.getDateInfo().getPeriod()); + dateConf.setDateMode(DateMode.LIST_DISCRETE); + List dayList = new ArrayList<>(); + dayList.add(lastDay); + String start = ""; + if (DAY.equalsIgnoreCase(semanticParseInfo.getDateInfo().getPeriod())) { + DateTimeFormatter formatter = DateUtils.getDateFormatter(lastDay, + new String[]{DAY_FORMAT, DAY_FORMAT_INT}); + LocalDate end = LocalDate.parse(lastDay, formatter); + start = aggOperatorEnum.equals(AggOperatorEnum.RATIO_ROLL) ? end.minusDays(1).format(formatter) + : end.minusWeeks(1).format(formatter); + } + if (WEEK.equalsIgnoreCase(semanticParseInfo.getDateInfo().getPeriod())) { + DateTimeFormatter formatter = DateUtils.getTimeFormatter(lastDay, + new String[]{TIMES_FORMAT, DAY_FORMAT, TIME_FORMAT, DAY_FORMAT_INT}); + LocalDateTime end = LocalDateTime.parse(lastDay, formatter); + start = aggOperatorEnum.equals(AggOperatorEnum.RATIO_ROLL) ? end.minusWeeks(1).format(formatter) + : end.minusMonths(1).with(DayOfWeek.MONDAY).format(formatter); + } + if (MONTH.equalsIgnoreCase(semanticParseInfo.getDateInfo().getPeriod())) { + DateTimeFormatter formatter = DateUtils.getDateFormatter(lastDay, + new String[]{MONTH_FORMAT, MONTH_FORMAT_INT}); + YearMonth end = YearMonth.parse(lastDay, formatter); + start = aggOperatorEnum.equals(AggOperatorEnum.RATIO_ROLL) ? end.minusMonths(1).format(formatter) + : end.minusYears(1).format(formatter); + } + dayList.add(start); + dateConf.setDateList(dayList); + return dateConf; + + } + return semanticParseInfo.getDateInfo(); + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/ChatServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java similarity index 76% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/ChatServiceImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java index 1ae1e4cbd..9a61e618c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/ChatServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java @@ -1,24 +1,25 @@ -package com.tencent.supersonic.chat.application; +package com.tencent.supersonic.chat.service.impl; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.api.response.QueryResultResp; -import com.tencent.supersonic.chat.domain.dataobject.ChatDO; -import com.tencent.supersonic.chat.domain.dataobject.ChatQueryDO; -import com.tencent.supersonic.chat.domain.dataobject.QueryDO; -import com.tencent.supersonic.chat.domain.pojo.chat.ChatQueryVO; -import com.tencent.supersonic.chat.domain.pojo.chat.PageQueryInfoReq; -import com.tencent.supersonic.chat.domain.repository.ChatContextRepository; -import com.tencent.supersonic.chat.domain.repository.ChatQueryRepository; -import com.tencent.supersonic.chat.domain.repository.ChatRepository; -import com.tencent.supersonic.chat.domain.service.ChatService; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.persistence.dataobject.QueryDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResponse; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; +import com.tencent.supersonic.chat.persistence.repository.ChatContextRepository; +import com.tencent.supersonic.chat.persistence.repository.ChatQueryRepository; +import com.tencent.supersonic.chat.persistence.repository.ChatRepository; + import java.text.SimpleDateFormat; import java.util.List; import java.util.Objects; +import com.tencent.supersonic.chat.service.ChatService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; @@ -68,9 +69,10 @@ public class ChatServiceImpl implements ChatService { } @Override - public void updateContext(ChatContext chatCtx, QueryContextReq queryCtx, SemanticParseInfo semanticParseInfo) { + public void updateContext(ChatContext chatCtx, QueryContext queryCtx, + SemanticParseInfo semanticParseInfo) { chatCtx.setParseInfo(semanticParseInfo); - chatCtx.setQueryText(queryCtx.getQueryText()); + chatCtx.setQueryText(queryCtx.getRequest().getQueryText()); updateContext(chatCtx); } @@ -124,15 +126,15 @@ public class ChatServiceImpl implements ChatService { } @Override - public PageInfo queryInfo(PageQueryInfoReq pageQueryInfoCommend, long chatId) { + public PageInfo queryInfo(PageQueryInfoReq pageQueryInfoCommend, long chatId) { return chatQueryRepository.getChatQuery(pageQueryInfoCommend, chatId); } @Override - public void addQuery(QueryResultResp queryResponse, QueryContextReq queryContext, ChatContext chatCtx) { - chatQueryRepository.createChatQuery(queryResponse, queryContext, chatCtx); - chatRepository.updateLastQuestion(chatCtx.getChatId().longValue(), queryContext.getQueryText(), - getCurrentTime()); + public void addQuery(QueryResult queryResult, QueryContext queryContext, ChatContext chatCtx) { + chatQueryRepository.createChatQuery(queryResult, queryContext.getRequest(), chatCtx); + chatRepository.updateLastQuestion(chatCtx.getChatId().longValue(), + queryContext.getRequest().getQueryText(), getCurrentTime()); } @Override diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java similarity index 55% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java index 4a21a7e0f..3c1a762f3 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/ConfigServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java @@ -1,19 +1,18 @@ -package com.tencent.supersonic.chat.application; +package com.tencent.supersonic.chat.service.impl; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.pojo.config.*; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.chat.domain.repository.ChatConfigRepository; -import com.tencent.supersonic.chat.domain.service.ConfigService; -import com.tencent.supersonic.chat.domain.utils.ChatConfigUtils; -import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.config.*; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.chat.persistence.repository.ChatConfigRepository; +import com.tencent.supersonic.chat.utils.ChatConfigHelper; +import com.tencent.supersonic.common.util.JsonUtil; import java.util.ArrayList; import java.util.List; @@ -24,7 +23,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; -import org.springframework.context.annotation.Lazy; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -34,14 +33,17 @@ import org.springframework.util.CollectionUtils; public class ConfigServiceImpl implements ConfigService { private final ChatConfigRepository chatConfigRepository; - private final ChatConfigUtils chatConfigUtils; + private final ChatConfigHelper chatConfigHelper; + @Autowired + private SemanticService semanticService; + private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); public ConfigServiceImpl(ChatConfigRepository chatConfigRepository, - ChatConfigUtils chatConfigUtils) { + ChatConfigHelper chatConfigHelper) { this.chatConfigRepository = chatConfigRepository; - this.chatConfigUtils = chatConfigUtils; + this.chatConfigHelper = chatConfigHelper; } @Override @@ -49,7 +51,7 @@ public class ConfigServiceImpl implements ConfigService { log.info("[create domain extend] object:{}", JsonUtil.toString(configBaseCmd, true)); duplicateCheck(configBaseCmd.getDomainId()); permissionCheckLogic(configBaseCmd.getDomainId(), user.getName()); - ChatConfig chaConfig = chatConfigUtils.newChatConfig(configBaseCmd, user); + ChatConfig chaConfig = chatConfigHelper.newChatConfig(configBaseCmd, user); Long id = chatConfigRepository.createConfig(chaConfig); return id; } @@ -72,7 +74,7 @@ public class ConfigServiceImpl implements ConfigService { throw new RuntimeException("editConfig, id and domainId are not allowed to be empty at the same time"); } permissionCheckLogic(configEditCmd.getDomainId(), user.getName()); - ChatConfig chaConfig = chatConfigUtils.editChatConfig(configEditCmd, user); + ChatConfig chaConfig = chatConfigHelper.editChatConfig(configEditCmd, user); chatConfigRepository.updateConfig(chaConfig); return configEditCmd.getId(); } @@ -101,11 +103,11 @@ public class ConfigServiceImpl implements ConfigService { private ItemVisibilityInfo fetchVisibilityDescByConfig(ItemVisibility visibility, - DomainSchemaResp domainSchemaDesc) { + DomainSchema domainSchema) { ItemVisibilityInfo itemVisibilityDesc = new ItemVisibilityInfo(); - List dimIdAllList = chatConfigUtils.generateAllDimIdList(domainSchemaDesc); - List metricIdAllList = chatConfigUtils.generateAllMetricIdList(domainSchemaDesc); + List dimIdAllList = chatConfigHelper.generateAllDimIdList(domainSchema); + List metricIdAllList = chatConfigHelper.generateAllMetricIdList(domainSchema); List blackDimIdList = new ArrayList<>(); List blackMetricIdList = new ArrayList<>(); @@ -117,114 +119,124 @@ public class ConfigServiceImpl implements ConfigService { blackMetricIdList.addAll(visibility.getBlackMetricIdList()); } } - List whiteMetricIdList = metricIdAllList.stream().filter(id -> !blackMetricIdList.contains(id)) + List whiteMetricIdList = metricIdAllList.stream() + .filter(id -> !blackMetricIdList.contains(id) && metricIdAllList.contains(id)) .collect(Collectors.toList()); - List whiteDimIdList = dimIdAllList.stream().filter(id -> !blackDimIdList.contains(id)) + List whiteDimIdList = dimIdAllList.stream() + .filter(id -> !blackDimIdList.contains(id) && dimIdAllList.contains(id)) .collect(Collectors.toList()); itemVisibilityDesc.setBlackDimIdList(blackDimIdList); itemVisibilityDesc.setBlackMetricIdList(blackMetricIdList); - itemVisibilityDesc.setWhiteDimIdList(whiteDimIdList); - itemVisibilityDesc.setWhiteMetricIdList(whiteMetricIdList); + itemVisibilityDesc.setWhiteDimIdList(Objects.isNull(whiteDimIdList) ? new ArrayList<>() : whiteDimIdList); + itemVisibilityDesc.setWhiteMetricIdList(Objects.isNull(whiteMetricIdList) ? new ArrayList<>() : whiteMetricIdList); return itemVisibilityDesc; } @Override - public ChatConfigRichResp getConfigRichInfo(Long domainId) { - ChatConfigRichResp chatConfigRichResp = new ChatConfigRichResp(); + public ChatConfigRich getConfigRichInfo(Long domainId) { + ChatConfigRich chatConfigRich = new ChatConfigRich(); ChatConfigResp chatConfigResp = chatConfigRepository.getConfigByDomainId(domainId); if (Objects.isNull(chatConfigResp)) { log.info("there is no chatConfigDesc for domainId:{}", domainId); - return chatConfigRichResp; + return chatConfigRich; } - BeanUtils.copyProperties(chatConfigResp, chatConfigRichResp); + BeanUtils.copyProperties(chatConfigResp, chatConfigRich); - SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - DomainSchemaResp domainSchemaInfo = semanticLayer.getDomainSchemaInfo(domainId, false); - chatConfigRichResp.setBizName(domainSchemaInfo.getBizName()); - chatConfigRichResp.setDomainName(domainSchemaInfo.getName()); + DomainSchema domainSchema = semanticService.getDomainSchema(domainId); + chatConfigRich.setBizName(domainSchema.getDomain().getBizName()); + chatConfigRich.setDomainName(domainSchema.getDomain().getName()); - chatConfigRichResp.setChatAggRichConfig(fillChatAggRichConfig(domainSchemaInfo, chatConfigResp)); - chatConfigRichResp.setChatDetailRichConfig(fillChatDetailRichConfig(domainSchemaInfo, chatConfigRichResp, chatConfigResp)); + chatConfigRich.setChatAggRichConfig(fillChatAggRichConfig(domainSchema, chatConfigResp)); + chatConfigRich.setChatDetailRichConfig(fillChatDetailRichConfig(domainSchema, chatConfigRich, chatConfigResp)); - return chatConfigRichResp; + return chatConfigRich; } - private ChatDetailRichConfig fillChatDetailRichConfig(DomainSchemaResp domainSchemaInfo, ChatConfigRichResp chatConfigRichResp, ChatConfigResp chatConfigResp) { + private ChatDetailRichConfig fillChatDetailRichConfig(DomainSchema domainSchema, ChatConfigRich chatConfigRich, ChatConfigResp chatConfigResp) { if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatDetailConfig())) { return null; } ChatDetailRichConfig detailRichConfig = new ChatDetailRichConfig(); ChatDetailConfig chatDetailConfig = chatConfigResp.getChatDetailConfig(); - - detailRichConfig.setVisibility(fetchVisibilityDescByConfig(chatDetailConfig.getVisibility(), domainSchemaInfo)); - detailRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatDetailConfig.getKnowledgeInfos(), domainSchemaInfo)); + ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig(chatDetailConfig.getVisibility(), domainSchema); + detailRichConfig.setVisibility(itemVisibilityInfo); + detailRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatDetailConfig.getKnowledgeInfos(), domainSchema)); detailRichConfig.setGlobalKnowledgeConfig(chatDetailConfig.getGlobalKnowledgeConfig()); - detailRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), domainSchemaInfo)); + detailRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), domainSchema, itemVisibilityInfo)); - detailRichConfig.setEntity(generateRichEntity(chatDetailConfig.getEntity(), domainSchemaInfo)); + detailRichConfig.setEntity(generateRichEntity(chatDetailConfig.getEntity(), domainSchema)); return detailRichConfig; } - private EntityRichInfo generateRichEntity(Entity entity, DomainSchemaResp domainSchemaInfo) { + private EntityRichInfo generateRichEntity(Entity entity, DomainSchema domainSchema) { EntityRichInfo entityRichInfo = new EntityRichInfo(); if (Objects.isNull(entity) || Objects.isNull(entity.getEntityId())) { return entityRichInfo; } BeanUtils.copyProperties(entity, entityRichInfo); - Map dimIdAndRespPair = domainSchemaInfo.getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); + Map dimIdAndRespPair = domainSchema.getDimensions().stream() + .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); entityRichInfo.setDimItem(dimIdAndRespPair.get(entity.getEntityId())); return entityRichInfo; } - private ChatAggRichConfig fillChatAggRichConfig(DomainSchemaResp domainSchemaInfo, ChatConfigResp chatConfigResp) { + private ChatAggRichConfig fillChatAggRichConfig(DomainSchema domainSchema, ChatConfigResp chatConfigResp) { if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatAggConfig())) { return null; } ChatAggConfig chatAggConfig = chatConfigResp.getChatAggConfig(); ChatAggRichConfig chatAggRichConfig = new ChatAggRichConfig(); - - chatAggRichConfig.setVisibility(fetchVisibilityDescByConfig(chatAggConfig.getVisibility(), domainSchemaInfo)); - chatAggRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatAggConfig.getKnowledgeInfos(), domainSchemaInfo)); + ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig(chatAggConfig.getVisibility(), domainSchema); + chatAggRichConfig.setVisibility(itemVisibilityInfo); + chatAggRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatAggConfig.getKnowledgeInfos(), domainSchema)); chatAggRichConfig.setGlobalKnowledgeConfig(chatAggConfig.getGlobalKnowledgeConfig()); - chatAggRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), domainSchemaInfo)); + chatAggRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), domainSchema, itemVisibilityInfo)); return chatAggRichConfig; } - private ChatDefaultRichConfig fetchDefaultConfig(ChatDefaultConfig chatDefaultConfig, DomainSchemaResp domainSchemaInfo) { + private ChatDefaultRichConfig fetchDefaultConfig(ChatDefaultConfig chatDefaultConfig, DomainSchema domainSchema, ItemVisibilityInfo itemVisibilityInfo) { ChatDefaultRichConfig defaultRichConfig = new ChatDefaultRichConfig(); if (Objects.isNull(chatDefaultConfig)) { return defaultRichConfig; } BeanUtils.copyProperties(chatDefaultConfig, defaultRichConfig); - Map dimIdAndRespPair = domainSchemaInfo.getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); + Map dimIdAndRespPair = domainSchema.getDimensions().stream() + .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); - Map metricIdAndRespPair = domainSchemaInfo.getMetrics().stream() - .collect(Collectors.toMap(MetricSchemaResp::getId, Function.identity())); + Map metricIdAndRespPair = domainSchema.getMetrics().stream() + .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); - List dimensions = new ArrayList<>(); - List metrics = new ArrayList<>(); + List dimensions = new ArrayList<>(); + List metrics = new ArrayList<>(); if (!CollectionUtils.isEmpty(chatDefaultConfig.getDimensionIds())) { - chatDefaultConfig.getDimensionIds().stream().forEach(dimId -> { - DimSchemaResp dimSchemaResp = dimIdAndRespPair.get(dimId); - SchemaItem dimSchema = new SchemaItem(); - BeanUtils.copyProperties(dimSchemaResp, dimSchema); - dimensions.add(dimSchema); - }); + chatDefaultConfig.getDimensionIds().stream() + .filter(dimId -> dimIdAndRespPair.containsKey(dimId) && itemVisibilityInfo.getWhiteDimIdList().contains(dimId)) + .forEach(dimId -> { + SchemaElement dimSchemaResp = dimIdAndRespPair.get(dimId); + if (Objects.nonNull(dimSchemaResp)) { + SchemaElement dimSchema = new SchemaElement(); + BeanUtils.copyProperties(dimSchemaResp, dimSchema); + dimensions.add(dimSchema); + } + + }); } if (!CollectionUtils.isEmpty(chatDefaultConfig.getMetricIds())) { - chatDefaultConfig.getMetricIds().stream().forEach(metricId -> { - MetricSchemaResp metricSchemaResp = metricIdAndRespPair.get(metricId); - SchemaItem metricSchema = new SchemaItem(); - BeanUtils.copyProperties(metricSchemaResp, metricSchema); - metrics.add(metricSchema); - }); + chatDefaultConfig.getMetricIds().stream() + .filter(metricId -> metricIdAndRespPair.containsKey(metricId) && itemVisibilityInfo.getWhiteMetricIdList().contains(metricId)) + .forEach(metricId -> { + SchemaElement metricSchemaResp = metricIdAndRespPair.get(metricId); + if (Objects.nonNull(metricSchemaResp)) { + SchemaElement metricSchema = new SchemaElement(); + BeanUtils.copyProperties(metricSchemaResp, metricSchema); + metrics.add(metricSchema); + } + }); } defaultRichConfig.setDimensions(dimensions); @@ -234,15 +246,15 @@ public class ConfigServiceImpl implements ConfigService { private List fillKnowledgeBizName(List knowledgeInfos, - DomainSchemaResp domainSchemaInfo) { + DomainSchema domainSchema) { if (CollectionUtils.isEmpty(knowledgeInfos)) { return new ArrayList<>(); } - Map dimIdAndRespPair = domainSchemaInfo.getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, Function.identity())); + Map dimIdAndRespPair = domainSchema.getDimensions().stream() + .collect(Collectors.toMap(SchemaElement::getId, Function.identity(),(k1, k2) -> k1)); knowledgeInfos.stream().forEach(knowledgeInfo -> { if (Objects.nonNull(knowledgeInfo)) { - DimSchemaResp dimSchemaResp = dimIdAndRespPair.get(knowledgeInfo.getItemId()); + SchemaElement dimSchemaResp = dimIdAndRespPair.get(knowledgeInfo.getItemId()); if (Objects.nonNull(dimSchemaResp)) { knowledgeInfo.setBizName(dimSchemaResp.getBizName()); } @@ -252,11 +264,11 @@ public class ConfigServiceImpl implements ConfigService { } @Override - public List getAllChatRichConfig() { - List chatConfigRichInfoList = new ArrayList<>(); + public List getAllChatRichConfig() { + List chatConfigRichInfoList = new ArrayList<>(); List domainRespList = semanticLayer.getDomainListForAdmin(); domainRespList.stream().forEach(domainResp -> { - ChatConfigRichResp chatConfigRichInfo = getConfigRichInfo(domainResp.getId()); + ChatConfigRich chatConfigRichInfo = getConfigRichInfo(domainResp.getId()); if (Objects.nonNull(chatConfigRichInfo)) { chatConfigRichInfoList.add(chatConfigRichInfo); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/DictApplicationService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java similarity index 63% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/DictApplicationService.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java index a125eecb1..60fdf6f7c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/knowledge/DictApplicationService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java @@ -1,22 +1,23 @@ -package com.tencent.supersonic.chat.application.knowledge; +package com.tencent.supersonic.chat.service.impl; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.domain.dataobject.DimValueDO; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; -import com.tencent.supersonic.chat.domain.pojo.config.Dim4Dict; -import com.tencent.supersonic.chat.domain.utils.DictMetaUtils; -import com.tencent.supersonic.chat.domain.utils.DictQueryUtils; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.enums.TaskStatusEnum; -import com.tencent.supersonic.knowledge.domain.FileHandler; -import com.tencent.supersonic.knowledge.domain.converter.DictTaskConverter; -import com.tencent.supersonic.knowledge.domain.dataobject.DimValueDictTaskPO; -import com.tencent.supersonic.knowledge.domain.pojo.DictConfig; -import com.tencent.supersonic.knowledge.domain.pojo.DictTaskFilter; -import com.tencent.supersonic.knowledge.domain.pojo.DictUpdateMode; -import com.tencent.supersonic.knowledge.domain.pojo.DimValue2DictCommand; -import com.tencent.supersonic.knowledge.domain.pojo.DimValueDictInfo; -import com.tencent.supersonic.knowledge.domain.repository.DictRepository; +import com.tencent.supersonic.chat.config.DefaultMetric; +import com.tencent.supersonic.chat.config.Dim4Dict; +import com.tencent.supersonic.chat.persistence.dataobject.DimValueDO; +import com.tencent.supersonic.chat.service.DictionaryService; +import com.tencent.supersonic.chat.utils.DictMetaHelper; +import com.tencent.supersonic.chat.utils.DictQueryHelper; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.knowledge.dictionary.FileHandler; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; +import com.tencent.supersonic.knowledge.utils.DictTaskConverter; +import com.tencent.supersonic.knowledge.dictionary.DictConfig; +import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import com.tencent.supersonic.knowledge.dictionary.DictUpdateMode; +import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; +import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; +import com.tencent.supersonic.knowledge.persistence.repository.DictRepository; import java.util.List; import java.util.Map; import java.util.Objects; @@ -27,10 +28,10 @@ import org.springframework.util.CollectionUtils; @Slf4j @Service -public class DictApplicationService { +public class DictionaryServiceImpl implements DictionaryService { - private final DictMetaUtils metaUtils; - private final DictQueryUtils dictQueryUtils; + private final DictMetaHelper metaUtils; + private final DictQueryHelper dictQueryHelper; private final FileHandler fileHandler; private final DictRepository dictRepository; @Value("${dict.flush.enable:true}") @@ -38,14 +39,13 @@ public class DictApplicationService { @Value("${dict.file.type:txt}") private String dictFileType; private String dimValue = "DimValue_%d_%d"; - private String dateTimeFormatter = "yyyyMMddHHmmss"; - public DictApplicationService(DictMetaUtils metaUtils, - DictQueryUtils dictQueryUtils, - FileHandler fileHandler, - DictRepository dictRepository) { + public DictionaryServiceImpl(DictMetaHelper metaUtils, + DictQueryHelper dictQueryHelper, + FileHandler fileHandler, + DictRepository dictRepository) { this.metaUtils = metaUtils; - this.dictQueryUtils = dictQueryUtils; + this.dictQueryHelper = dictQueryHelper; this.fileHandler = fileHandler; this.dictRepository = dictRepository; } @@ -54,10 +54,10 @@ public class DictApplicationService { if (!dictFlushEnable) { return 0L; } - DimValueDictTaskPO dimValueDictTaskPO = DictTaskConverter.generateDimValueDictTaskPO(dimValue2DictCommend, + DictTaskDO dictTaskDO = DictTaskConverter.generateDimValueDictTaskPO(dimValue2DictCommend, user); - log.info("[addDictTask] dimValueDictTaskPO:{}", dimValueDictTaskPO); - dictRepository.createDimValueDictTask(dimValueDictTaskPO); + log.info("[addDictTask] dictTaskDO:{}", dictTaskDO); + dictRepository.createDimValueDictTask(dictTaskDO); TaskStatusEnum finalStatus = TaskStatusEnum.SUCCESS; try { //1. construct internal dictionary requirements @@ -68,7 +68,7 @@ public class DictApplicationService { Long domainId = dimValueDO.getDomainId(); DefaultMetric defaultMetricDesc = dimValueDO.getDefaultMetricDescList().get(0); for (Dim4Dict dim4Dict : dimValueDO.getDimensions()) { - List data = dictQueryUtils.fetchDimValueSingle(domainId, defaultMetricDesc, dim4Dict, user); + List data = dictQueryHelper.fetchDimValueSingle(domainId, defaultMetricDesc, dim4Dict, user); //3. local file changes String fileName = String.format(dimValue + Constants.DOT + dictFileType, domainId, dim4Dict.getDimId()); @@ -79,7 +79,8 @@ public class DictApplicationService { log.warn("addDictInfo exception:", e); finalStatus = TaskStatusEnum.ERROR; } - dictRepository.updateDictTaskStatus(finalStatus.getCode(), dimValueDictTaskPO); + dictRepository.updateDictTaskStatus(finalStatus.getCode(), + dictTaskDO); return 1L; } @@ -113,7 +114,6 @@ public class DictApplicationService { return fileHandler.getDictRootPath(); } - public List searchDictTaskList(DictTaskFilter filter, User user) { return dictRepository.searchDictTaskList(filter); } @@ -121,4 +121,4 @@ public class DictApplicationService { public DictConfig getDictInfoByDomainId(Long domainId) { return dictRepository.getDictInfoByDomainId(domainId); } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java new file mode 100644 index 000000000..d8f87a51e --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java @@ -0,0 +1,175 @@ +package com.tencent.supersonic.chat.service.impl; + +import com.google.common.collect.Lists; +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq; +import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; +import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; +import com.tencent.supersonic.chat.persistence.repository.PluginRepository; +import com.tencent.supersonic.chat.parser.ParseMode; +import com.tencent.supersonic.chat.plugin.event.PluginAddEvent; +import com.tencent.supersonic.chat.plugin.event.PluginDelEvent; +import com.tencent.supersonic.chat.plugin.event.PluginUpdateEvent; +import com.tencent.supersonic.chat.service.PluginService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class PluginServiceImpl implements PluginService { + + private PluginRepository pluginRepository; + + private ApplicationEventPublisher publisher; + + public PluginServiceImpl(PluginRepository pluginRepository, + ApplicationEventPublisher publisher) { + this.pluginRepository = pluginRepository; + this.publisher = publisher; + } + + @Override + public void createPlugin(Plugin plugin, User user){ + PluginDO pluginDO = convert(plugin, user); + pluginRepository.createPlugin(pluginDO); + publisher.publishEvent(new PluginAddEvent(this, plugin)); + } + + @Override + public void updatePlugin(Plugin plugin, User user){ + Long id = plugin.getId(); + PluginDO pluginDO = pluginRepository.getPlugin(id); + Plugin oldPlugin = convert(pluginDO); + convert(plugin, pluginDO, user); + pluginRepository.updatePlugin(pluginDO); + publisher.publishEvent(new PluginUpdateEvent(this, oldPlugin, plugin)); + } + + @Override + public void deletePlugin(Long id){ + PluginDO pluginDO = pluginRepository.getPlugin(id); + if (pluginDO != null) { + pluginRepository.deletePlugin(id); + publisher.publishEvent(new PluginDelEvent(this, convert(pluginDO))); + } + } + + + @Override + public List getPluginList() { + List plugins = Lists.newArrayList(); + List pluginDOS = pluginRepository.getPlugins(); + if(CollectionUtils.isEmpty(pluginDOS)){ + return plugins; + } + return pluginDOS.stream().map(this::convert).collect(Collectors.toList()); + } + + @Override + public List fetchPluginDOs(String queryText, String type) { + List pluginDOS = pluginRepository.fetchPluginDOs(queryText,type); + return convertList(pluginDOS); + } + + + @Override + public List query(PluginQueryReq pluginQueryReq) { + PluginDOExample pluginDOExample = new PluginDOExample(); + pluginDOExample.createCriteria(); + if (StringUtils.isNotBlank(pluginQueryReq.getType())) { + pluginDOExample.getOredCriteria().get(0).andTypeEqualTo(pluginQueryReq.getType()); + } + if (StringUtils.isNotBlank(pluginQueryReq.getDomain())) { + pluginDOExample.getOredCriteria().get(0).andDomainLike('%' + pluginQueryReq.getDomain() + '%'); + } + List pluginDOS = pluginRepository.query(pluginDOExample); + if (StringUtils.isNotBlank(pluginQueryReq.getPattern())) { + pluginDOS = pluginDOS.stream().filter(pluginDO -> + pluginDO.getPattern().contains(pluginQueryReq.getPattern()) || + (pluginDO.getName()!=null && pluginDO.getName().contains(pluginQueryReq.getPattern()))) + .collect(Collectors.toList()); + } + return convertList(pluginDOS); + } + + @Override + public Optional getPluginByName(String name) { + return getPluginList().stream() + .filter(plugin -> plugin.getName().equalsIgnoreCase(name)) + .findFirst(); + } + + @Override + public List queryWithAuthCheck(PluginQueryReq pluginQueryReq) { + return authCheck(query(pluginQueryReq)); + } + + private List authCheck(List plugins) { + SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + List domainIdAuthorized = semanticLayer.getDomainListForAdmin().stream() + .map(DomainResp::getId).collect(Collectors.toList()); + plugins = plugins.stream().filter(plugin -> { + if (CollectionUtils.isEmpty(plugin.getDomainList())) { + return false; + } + for (Long domainId : plugin.getDomainList()) { + if (domainIdAuthorized.contains(domainId)) { + return true; + } + } + return false; + }).collect(Collectors.toList()); + return plugins; + } + + public Plugin convert(PluginDO pluginDO){ + Plugin plugin = new Plugin(); + BeanUtils.copyProperties(pluginDO,plugin); + plugin.setParseMode(ParseMode.valueOf(pluginDO.getParseMode())); + if (pluginDO.getDomain() != null) { + plugin.setDomainList(Arrays.stream(pluginDO.getDomain().split(",")) + .map(Long::parseLong).collect(Collectors.toList())); + } + return plugin; + } + + public PluginDO convert(Plugin plugin, User user){ + PluginDO pluginDO = new PluginDO(); + BeanUtils.copyProperties(plugin,pluginDO); + pluginDO.setCreatedAt(new Date()); + pluginDO.setCreatedBy(user.getName()); + pluginDO.setUpdatedAt(new Date()); + pluginDO.setUpdatedBy(user.getName()); + pluginDO.setDomain(StringUtils.join(plugin.getDomainList(), ",")); + pluginDO.setParseMode(plugin.getParseMode().name()); + return pluginDO; + } + + public PluginDO convert(Plugin plugin, PluginDO pluginDO, User user){ + BeanUtils.copyProperties(plugin,pluginDO); + pluginDO.setUpdatedAt(new Date()); + pluginDO.setUpdatedBy(user.getName()); + pluginDO.setDomain(StringUtils.join(plugin.getDomainList(), ",")); + pluginDO.setParseMode(plugin.getParseMode().name()); + return pluginDO; + } + + public List convertList(List pluginDOS){ + if(!CollectionUtils.isEmpty(pluginDOS)){ + return pluginDOS.stream().map(this::convert).collect(Collectors.toList()); + } + return Lists.newArrayList(); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java new file mode 100644 index 000000000..ae4e51ae0 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java @@ -0,0 +1,94 @@ +package com.tencent.supersonic.chat.service.impl; + + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.chat.api.component.*; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.QueryState; +import com.tencent.supersonic.chat.query.QuerySelector; +import com.tencent.supersonic.chat.api.pojo.request.QueryDataRequest; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.service.ChatService; +import com.tencent.supersonic.chat.service.QueryService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import java.util.List; +import java.util.stream.Collectors; + +import com.tencent.supersonic.common.util.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.calcite.sql.parser.SqlParseException; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +@Service +@Component("chatQueryService") +@Primary +@Slf4j +public class QueryServiceImpl implements QueryService { + + @Autowired + private ChatService chatService; + + private List schemaMappers = ComponentFactory.getSchemaMappers(); + private List semanticParsers = ComponentFactory.getSemanticParsers(); + private QuerySelector querySelector = ComponentFactory.getQuerySelector(); + + @Override + public QueryResult executeQuery(QueryRequest queryReq) throws Exception { + QueryContext queryCtx = new QueryContext(queryReq); + // in order to support multi-turn conversation, chat context is needed + ChatContext chatCtx = chatService.getOrCreateContext(queryReq.getChatId()); + + schemaMappers.stream().forEach(mapper -> { + mapper.map(queryCtx); + log.info("{} result:{}", mapper.getClass().getSimpleName(), JsonUtil.toString(queryCtx)); + }); + + semanticParsers.stream().forEach(parser -> { + parser.parse(queryCtx, chatCtx); + log.info("{} result:{}", parser.getClass().getSimpleName(), JsonUtil.toString(queryCtx)); + }); + + QueryResult queryResult = null; + if (queryCtx.getCandidateQueries().size() > 0) { + log.info("pick before [{}]", queryCtx.getCandidateQueries().stream().collect( + Collectors.toList())); + SemanticQuery semanticQuery = querySelector.select(queryCtx.getCandidateQueries()); + log.info("pick after [{}]", semanticQuery); + + queryResult = semanticQuery.execute(queryReq.getUser()); + if (queryResult != null) { + // update chat context after a successful semantic query + if (queryReq.isSaveAnswer() && QueryState.SUCCESS.equals(queryResult.getQueryState())) { + chatService.updateContext(chatCtx, queryCtx, semanticQuery.getParseInfo()); + } + queryResult.setChatContext(chatCtx.getParseInfo()); + chatService.addQuery(queryResult, queryCtx, chatCtx); + } + } + + return queryResult; + } + + @Override + public SemanticParseInfo queryContext(QueryRequest queryCtx) { + ChatContext context = chatService.getOrCreateContext(queryCtx.getChatId()); + return context.getParseInfo(); + } + + @Override + public QueryResult executeDirectQuery(QueryDataRequest queryData, User user) throws SqlParseException { + SemanticQuery semanticQuery = QueryManager.createRuleQuery(queryData.getQueryMode()); + BeanUtils.copyProperties(queryData, semanticQuery.getParseInfo()); + return semanticQuery.execute(user); + } + +} + diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java new file mode 100644 index 000000000..ab314f84a --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java @@ -0,0 +1,131 @@ +package com.tencent.supersonic.chat.service.impl; + + +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.RecommendQuestion; +import com.tencent.supersonic.chat.config.ChatConfigFilter; +import com.tencent.supersonic.chat.config.ChatConfigResp; +import com.tencent.supersonic.chat.config.ChatConfigRich; +import com.tencent.supersonic.chat.api.pojo.response.RecommendResponse; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.RecommendService; +import com.tencent.supersonic.chat.service.SemanticService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +/*** + * Recommend Service impl + */ +@Service +@Slf4j +public class RecommendServiceImpl implements RecommendService { + + @Autowired + private ConfigService configService; + @Autowired + private SemanticService semanticService; + + @Override + public RecommendResponse recommend(QueryRequest queryCtx, Long limit) { + if (Objects.isNull(limit) || limit <= 0) { + limit = Long.MAX_VALUE; + } + log.debug("limit:{}", limit); + Long domainId = queryCtx.getDomainId(); + if (Objects.isNull(domainId)) { + return new RecommendResponse(); + } + + DomainSchema domainSchema = semanticService.getDomainSchema(domainId); + + List dimensions = domainSchema.getDimensions().stream() + .filter(dim -> Objects.nonNull(dim) && Objects.nonNull(dim.getUseCnt())) + .sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()) + .limit(limit) + .map(dimSchemaDesc -> { + SchemaElement item = new SchemaElement(); + item.setDomain(domainId); + item.setName(dimSchemaDesc.getName()); + item.setBizName(dimSchemaDesc.getBizName()); + item.setId(dimSchemaDesc.getId()); + return item; + }).collect(Collectors.toList()); + + List metrics = domainSchema.getMetrics().stream() + .filter(metric -> Objects.nonNull(metric) && Objects.nonNull(metric.getUseCnt())) + .sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()) + .limit(limit) + .map(metricSchemaDesc -> { + SchemaElement item = new SchemaElement(); + item.setDomain(domainId); + item.setName(metricSchemaDesc.getName()); + item.setBizName(metricSchemaDesc.getBizName()); + item.setId(metricSchemaDesc.getId()); + return item; + }).collect(Collectors.toList()); + + RecommendResponse response = new RecommendResponse(); + response.setDimensions(dimensions); + response.setMetrics(metrics); + return response; + } + + @Override + public RecommendResponse recommendMetricMode(QueryRequest queryCtx, Long limit) { + RecommendResponse recommendResponse = recommend(queryCtx, limit); + // filter black Item + if (Objects.isNull(recommendResponse)) { + return recommendResponse; + } + + ChatConfigRich chatConfigRich = configService.getConfigRichInfo(Long.valueOf(queryCtx.getDomainId())); + if (Objects.nonNull(chatConfigRich) && Objects.nonNull(chatConfigRich.getChatAggRichConfig()) + && Objects.nonNull(chatConfigRich.getChatAggRichConfig().getVisibility())) { + List blackMetricIdList = chatConfigRich.getChatAggRichConfig().getVisibility().getBlackMetricIdList(); + List metrics = filterBlackItem(recommendResponse.getMetrics(), blackMetricIdList); + recommendResponse.setMetrics(metrics); + + List blackDimIdList = chatConfigRich.getChatAggRichConfig().getVisibility().getBlackDimIdList(); + List dimensions = filterBlackItem(recommendResponse.getDimensions(), blackDimIdList); + recommendResponse.setDimensions(dimensions); + } + + return recommendResponse; + } + + @Override + public List recommendQuestion(Long domainId) { + List recommendQuestions = new ArrayList<>(); + ChatConfigFilter chatConfigFilter = new ChatConfigFilter(); + chatConfigFilter.setDomainId(domainId); + List chatConfigRespList = configService.search(chatConfigFilter, null); + if (!CollectionUtils.isEmpty(chatConfigRespList)) { + chatConfigRespList.stream().forEach(chatConfigResp -> { + if (Objects.nonNull(chatConfigResp) && !CollectionUtils.isEmpty(chatConfigResp.getRecommendedQuestions())) { + recommendQuestions.add(new RecommendQuestion(chatConfigResp.getDomainId(), chatConfigResp.getRecommendedQuestions())); + } + }); + return recommendQuestions; + } + return new ArrayList<>(); + } + + private List filterBlackItem(List itemList, List blackDimIdList) { + if (CollectionUtils.isEmpty(blackDimIdList) || CollectionUtils.isEmpty(itemList)) { + return itemList; + } + + return itemList.stream().filter(dim -> !blackDimIdList.contains(dim.getId())).collect(Collectors.toList()); + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java similarity index 54% rename from chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java index 47ba6529a..745c1c337 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/application/SearchServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java @@ -1,27 +1,26 @@ -package com.tencent.supersonic.chat.application; +package com.tencent.supersonic.chat.service.impl; import com.google.common.collect.Lists; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.chat.api.pojo.Filter; -import com.tencent.supersonic.chat.api.pojo.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.knowledge.NatureHelper; -import com.tencent.supersonic.chat.application.knowledge.WordNatureService; -import com.tencent.supersonic.chat.application.mapper.SearchMatchStrategy; -import com.tencent.supersonic.chat.domain.pojo.search.DomainInfoStat; -import com.tencent.supersonic.chat.domain.pojo.search.DomainWithSemanticType; -import com.tencent.supersonic.chat.domain.pojo.search.MatchText; -import com.tencent.supersonic.chat.domain.pojo.search.SearchResult; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.service.ChatService; -import com.tencent.supersonic.chat.domain.service.SearchService; -import com.tencent.supersonic.chat.domain.utils.NatureConverter; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.MapResult; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper; +import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.api.pojo.response.SearchResult; +import com.tencent.supersonic.chat.mapper.DomainInfoStat; +import com.tencent.supersonic.chat.mapper.DomainWithSemanticType; +import com.tencent.supersonic.chat.mapper.MatchText; +import com.tencent.supersonic.chat.mapper.SearchMatchStrategy; +import com.tencent.supersonic.chat.service.ChatService; +import com.tencent.supersonic.chat.service.SearchService; +import com.tencent.supersonic.chat.utils.NatureHelper; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; @@ -34,7 +33,6 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; - import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -49,27 +47,27 @@ import org.springframework.stereotype.Service; public class SearchServiceImpl implements SearchService { private static final int RESULT_SIZE = 10; - @Autowired - private WordNatureService wordNatureService; + private SchemaService schemaService; @Autowired private ChatService chatService; @Autowired private SearchMatchStrategy searchMatchStrategy; @Override - public List search(QueryContextReq queryCtx) { + public List search(QueryRequest queryCtx) { String queryText = queryCtx.getQueryText(); // 1.get meta info - DomainInfos domainInfosDb = wordNatureService.getCache().getUnchecked(""); + SemanticSchema semanticSchemaDb = schemaService.getSemanticSchema(); + List metricsDb = semanticSchemaDb.getMetrics(); + final Map domainToName = semanticSchemaDb.getDomainIdToName(); - List metricsDb = domainInfosDb.getMetrics(); - final Map domainToName = domainInfosDb.getDomainToName(); // 2.detect by segment List originals = HanlpHelper.getTerms(queryText); Map> regTextMap = searchMatchStrategy.match(queryText, originals, queryCtx.getDomainId()); regTextMap.entrySet().stream().forEach(m -> HanlpHelper.transLetterOriginal(m.getValue())); + // 3.get the most matching data Optional>> mostSimilarSearchResult = regTextMap.entrySet() .stream() @@ -78,9 +76,9 @@ public class SearchServiceImpl implements SearchService { entry1.getKey().getDetectSegment().length() >= entry2.getKey().getDetectSegment().length() ? entry1 : entry2); log.debug("mostSimilarSearchResult:{}", mostSimilarSearchResult); + // 4.optimize the results after the query if (!mostSimilarSearchResult.isPresent()) { - log.info("unable to find any information through search , queryCtx:{}", queryCtx); return Lists.newArrayList(); } Map.Entry> searchTextEntry = mostSimilarSearchResult.get(); @@ -89,7 +87,7 @@ public class SearchServiceImpl implements SearchService { Set searchResults = new LinkedHashSet(); DomainInfoStat domainStat = NatureHelper.getDomainStat(originals); - List possibleDomains = getPossibleDomains(queryCtx, originals, domainStat, queryCtx.getDomainId()); + List possibleDomains = getPossibleDomains(queryCtx, originals, domainStat, queryCtx.getDomainId()); // 4.1 priority dimension metric boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleDomains), domainToName, @@ -101,22 +99,26 @@ public class SearchServiceImpl implements SearchService { log.debug("possibleDomains:{},natureToNameMap:{}", possibleDomains, natureToNameMap); for (Map.Entry natureToNameEntry : natureToNameMap.entrySet()) { - searchDimensionValue(metricsDb, domainToName, domainStat.getMetricDomainCount(), searchResults, - existMetricAndDimension, matchText, natureToNameMap, natureToNameEntry, queryCtx.getQueryFilter()); + + Set searchResultSet = searchDimensionValue(metricsDb, domainToName, + domainStat.getMetricDomainCount(), existMetricAndDimension, + matchText, natureToNameMap, natureToNameEntry, queryCtx.getQueryFilters()); + + searchResults.addAll(searchResultSet); } return searchResults.stream().limit(RESULT_SIZE).collect(Collectors.toList()); } - private List getPossibleDomains(QueryContextReq queryCtx, List originals, - DomainInfoStat domainStat, Integer webDomainId) { + private List getPossibleDomains(QueryRequest queryCtx, List originals, + DomainInfoStat domainStat, Long webDomainId) { if (Objects.nonNull(webDomainId) && webDomainId > 0) { - List result = new ArrayList<>(); + List result = new ArrayList<>(); result.add(webDomainId); return result; } - List possibleDomains = NatureHelper.selectPossibleDomains(originals); + List possibleDomains = NatureHelper.selectPossibleDomains(originals); Long contextDomain = chatService.getContextDomain(queryCtx.getChatId()); @@ -124,8 +126,8 @@ public class SearchServiceImpl implements SearchService { // If nothing is recognized or only metric are present, then add the contextDomain. if (nothingOrOnlyMetric(domainStat) && effectiveDomain(contextDomain)) { - List result = new ArrayList<>(); - result.add(Math.toIntExact(contextDomain)); + List result = new ArrayList<>(); + result.add(contextDomain); return result; } return possibleDomains; @@ -140,77 +142,91 @@ public class SearchServiceImpl implements SearchService { return Objects.nonNull(contextDomain) && contextDomain > 0; } - private void searchDimensionValue(List metricsDb, - Map domainToName, - long metricDomainCount, - Set searchResults, - boolean existMetricAndDimension, - MatchText matchText, - Map natureToNameMap, - Map.Entry natureToNameEntry, - QueryFilter queryFilter) { + private Set searchDimensionValue(List metricsDb, + Map domainToName, + long metricDomainCount, + boolean existMetricAndDimension, + MatchText matchText, + Map natureToNameMap, + Map.Entry natureToNameEntry, + QueryFilters queryFilters) { + + Set searchResults = new LinkedHashSet(); String nature = natureToNameEntry.getKey(); String wordName = natureToNameEntry.getValue(); - Integer domain = NatureHelper.getDomain(nature); - SchemaElementType schemaElementType = NatureConverter.convertTo(nature); + Long domainId = NatureHelper.getDomainId(nature); + SchemaElementType schemaElementType = NatureHelper.convertToElementType(nature); if (SchemaElementType.ENTITY.equals(schemaElementType)) { - return; + return searchResults; } // If there are no metric/dimension, complete the metric information + SearchResult searchResult = SearchResult.builder() + .domainId(domainId) + .domainName(domainToName.get(domainId)) + .recommend(matchText.getRegText() + wordName) + .schemaElementType(schemaElementType) + .subRecommend(wordName) + .build(); if (metricDomainCount <= 0 && !existMetricAndDimension) { - if (filterByQueryFilter(matchText.getRegText(), queryFilter)) { - return; + if (filterByQueryFilter(wordName, queryFilters)) { + return searchResults; } - searchResults.add( - new SearchResult(matchText.getRegText() + wordName, wordName, domainToName.get(domain), domain, - schemaElementType)); - int metricSize = RESULT_SIZE / (natureToNameMap.entrySet().size()); - if (metricSize <= 1) { - metricSize = 1; - } - List metrics = filerMetricsByDomain(metricsDb, domain).stream().limit(metricSize).collect( - Collectors.toList()); + searchResults.add(searchResult); + int metricSize = getMetricSize(natureToNameMap); + List metrics = filerMetricsByDomain(metricsDb, domainId, metricSize); + for (String metric : metrics) { - String subRecommend = matchText.getRegText() + wordName + NatureType.SPACE + metric; - searchResults.add( - new SearchResult(subRecommend, wordName + NatureType.SPACE + metric, domainToName.get(domain), - domain, false)); + SearchResult result = SearchResult.builder() + .domainId(domainId) + .domainName(domainToName.get(domainId)) + .recommend(matchText.getRegText() + wordName + DictWordType.SPACE + metric) + .subRecommend(wordName + DictWordType.SPACE + metric) + .isComplete(false) + .build(); + searchResults.add(result); } } else { - searchResults.add( - new SearchResult(matchText.getRegText() + wordName, wordName, domainToName.get(domain), domain, - schemaElementType)); + searchResults.add(searchResult); } + return searchResults; } - private boolean filterByQueryFilter(String regText, QueryFilter queryFilter) { - if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) { + private int getMetricSize(Map natureToNameMap) { + int metricSize = RESULT_SIZE / (natureToNameMap.entrySet().size()); + if (metricSize <= 1) { + metricSize = 1; + } + return metricSize; + } + + private boolean filterByQueryFilter(String wordName, QueryFilters queryFilters) { + if (queryFilters == null || CollectionUtils.isEmpty(queryFilters.getFilters())) { return false; } - List filters = queryFilter.getFilters(); - for (Filter filter : filters) { - if (regText.equalsIgnoreCase(String.valueOf(filter.getValue()))) { + List filters = queryFilters.getFilters(); + for (QueryFilter filter : filters) { + if (wordName.equalsIgnoreCase(String.valueOf(filter.getValue()))) { return false; } } return true; } - protected List filerMetricsByDomain(List metricsDb, Integer domain) { + protected List filerMetricsByDomain(List metricsDb, Long domain, int metricSize) { if (CollectionUtils.isEmpty(metricsDb)) { return Lists.newArrayList(); } return metricsDb.stream() .filter(mapDO -> Objects.nonNull(mapDO) && domain.equals(mapDO.getDomain())) - .sorted(Comparator.comparing(ItemDO::getUseCnt).reversed()) + .sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()) .flatMap(entry -> { List result = new ArrayList<>(); result.add(entry.getName()); return result.stream(); }) - .collect(Collectors.toList()); + .limit(metricSize).collect(Collectors.toList()); } /*** @@ -219,7 +235,7 @@ public class SearchServiceImpl implements SearchService { * @return */ private Map getNatureToNameMap(Map.Entry> recommendTextListEntry, - Set possibleDomains) { + Set possibleDomains) { List recommendValues = recommendTextListEntry.getValue(); return recommendValues.stream() .flatMap(entry -> entry.getNatures().stream() @@ -227,21 +243,21 @@ public class SearchServiceImpl implements SearchService { if (CollectionUtils.isEmpty(possibleDomains)) { return true; } - Integer domain = NatureHelper.getDomain(nature); + Long domain = NatureHelper.getDomainId(nature); return possibleDomains.contains(domain); }) .map(nature -> { - WordNature posDO = new WordNature(); + DictWord posDO = new DictWord(); posDO.setWord(entry.getName()); posDO.setNature(nature); return posDO; } )).sorted(Comparator.comparingInt(a -> a.getWord().length())) - .collect(Collectors.toMap(WordNature::getNature, WordNature::getWord, (value1, value2) -> value1, + .collect(Collectors.toMap(DictWord::getNature, DictWord::getWord, (value1, value2) -> value1, LinkedHashMap::new)); } - private boolean searchMetricAndDimension(Set possibleDomains, Map domainToName, + private boolean searchMetricAndDimension(Set possibleDomains, Map domainToName, Map.Entry> searchTextEntry, Set searchResults) { boolean existMetric = false; @@ -251,27 +267,35 @@ public class SearchServiceImpl implements SearchService { for (MapResult mapResult : mapResults) { List dimensionMetricClassIds = mapResult.getNatures().stream() - .map(nature -> new DomainWithSemanticType(NatureHelper.getDomain(nature), - NatureConverter.convertTo(nature))) + .map(nature -> new DomainWithSemanticType(NatureHelper.getDomainId(nature), + NatureHelper.convertToElementType(nature))) .filter(entry -> matchCondition(entry, possibleDomains)).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(dimensionMetricClassIds)) { - for (DomainWithSemanticType domainWithSemanticType : dimensionMetricClassIds) { - existMetric = true; - Integer domain = domainWithSemanticType.getDomain(); - SchemaElementType semanticType = domainWithSemanticType.getSemanticType(); - searchResults.add( - new SearchResult(matchText.getRegText() + mapResult.getName(), mapResult.getName(), - domainToName.get(domain), domain, semanticType)); - } + if (CollectionUtils.isEmpty(dimensionMetricClassIds)) { + continue; } - log.info("parseResult:{},dimensionMetricClassIds:{},possibleDomains:{}", mapResult, - dimensionMetricClassIds, possibleDomains); + for (DomainWithSemanticType domainWithSemanticType : dimensionMetricClassIds) { + existMetric = true; + Long domainId = domainWithSemanticType.getDomain(); + SchemaElementType semanticType = domainWithSemanticType.getSemanticType(); + + SearchResult searchResult = SearchResult.builder() + .domainId(domainId) + .domainName(domainToName.get(domainId)) + .recommend(matchText.getRegText() + mapResult.getName()) + .subRecommend(mapResult.getName()) + .schemaElementType(semanticType) + .build(); + + searchResults.add(searchResult); + } + log.info("parseResult:{},dimensionMetricClassIds:{},possibleDomains:{}", mapResult, dimensionMetricClassIds, + possibleDomains); } return existMetric; } - private boolean matchCondition(DomainWithSemanticType entry, Set possibleDomains) { + private boolean matchCondition(DomainWithSemanticType entry, Set possibleDomains) { if (!(SchemaElementType.METRIC.equals(entry.getSemanticType()) || SchemaElementType.DIMENSION.equals( entry.getSemanticType()))) { return false; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java new file mode 100644 index 000000000..1062f27eb --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.chat.utils; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; + +import java.util.concurrent.TimeUnit; + +public class CacheUtils { + private static final Cache cache = Caffeine.newBuilder() + .expireAfterWrite(1200, TimeUnit.SECONDS) + .expireAfterAccess(1200, TimeUnit.SECONDS) + .maximumSize(1000) + .build(); + public static void put(QueryContext queryContext, ChatContext chatCtx, Object v){ + String key=chatCtx.getUser()+"_"+chatCtx.getChatId()+"_"+queryContext.getRequest().getQueryText(); + cache.put(key,v); + } + public static Object get(QueryContext queryContext,ChatContext chatCtx){ + String key=chatCtx.getUser()+"_"+chatCtx.getChatId()+"_"+queryContext.getRequest().getQueryText(); + return cache.getIfPresent(key); + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java similarity index 57% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java index e52274def..28a2f59bb 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ChatConfigUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java @@ -1,19 +1,18 @@ -package com.tencent.supersonic.chat.domain.utils; +package com.tencent.supersonic.chat.utils; -import static com.tencent.supersonic.common.constant.Constants.ADMIN_LOWER; +import static com.tencent.supersonic.common.pojo.Constants.ADMIN_LOWER; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.domain.pojo.config.*; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.chat.domain.dataobject.ChatConfigDO; -import com.tencent.supersonic.common.enums.StatusEnum; -import com.tencent.supersonic.common.util.RecordInfo; -import com.tencent.supersonic.common.util.json.JsonUtil; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestion; +import com.tencent.supersonic.chat.config.*; +import com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.util.JsonUtil; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -28,7 +27,7 @@ import org.springframework.util.CollectionUtils; @Component @Slf4j -public class ChatConfigUtils { +public class ChatConfigHelper { public ChatConfig newChatConfig(ChatConfigBaseReq extendBaseCmd, User user) { ChatConfig chatConfig = new ChatConfig(); @@ -54,63 +53,21 @@ public class ChatConfigUtils { return chatConfig; } - - public List generateDimDesc(List dimIds, DomainSchemaResp domainSchemaDesc) { - List dimSchemaDescList = new ArrayList<>(); - if (Objects.nonNull(domainSchemaDesc) && !CollectionUtils.isEmpty(domainSchemaDesc.getDimensions())) { - dimSchemaDescList = domainSchemaDesc.getDimensions().stream() - .filter(dimSchemaDesc -> dimIds.contains(dimSchemaDesc.getId())) - .collect(Collectors.toList()); - } - return dimSchemaDescList; - } - - public List generateMetricDesc(List metricIds, DomainSchemaResp domainSchemaDesc) { - List metricSchemaDescList = new ArrayList<>(); - if (Objects.nonNull(domainSchemaDesc) && !CollectionUtils.isEmpty(domainSchemaDesc.getMetrics())) { - metricSchemaDescList = domainSchemaDesc.getMetrics().stream() - .filter(metricSchemaDesc -> metricIds.contains(metricSchemaDesc.getId())) - .collect(Collectors.toList()); - } - return metricSchemaDescList; - } - - public EntityInternalDetail generateEntityDetailData(EntityDetailData detailData, - DomainSchemaResp domainSchemaDesc) { - EntityInternalDetail entityInternalDetailDesc = new EntityInternalDetail(); - if (Objects.isNull(detailData)) { - return entityInternalDetailDesc; - } - entityInternalDetailDesc.setDimensionList(generateDimDesc(detailData.getDimensionIds(), domainSchemaDesc)); - entityInternalDetailDesc.setMetricList(generateMetricDesc(detailData.getMetricIds(), domainSchemaDesc)); - - return entityInternalDetailDesc; - } - - public Map generateMetricIdAndDescPair(List metricIds, - DomainSchemaResp domainSchemaDesc) { - Map metricIdAndDescPair = new HashMap<>(); - List metricDescList = generateMetricDesc(metricIds, domainSchemaDesc); - - metricDescList.stream().forEach(metricDesc -> metricIdAndDescPair.put(metricDesc.getId(), metricDesc)); - return metricIdAndDescPair; - } - - public List generateAllDimIdList(DomainSchemaResp domainSchemaDesc) { - if (Objects.isNull(domainSchemaDesc) || CollectionUtils.isEmpty(domainSchemaDesc.getDimensions())) { + public List generateAllDimIdList(DomainSchema domainSchema) { + if (Objects.isNull(domainSchema) || CollectionUtils.isEmpty(domainSchema.getDimensions())) { return new ArrayList<>(); } - Map> dimIdAndDescPair = domainSchemaDesc.getDimensions() - .stream().collect(Collectors.groupingBy(DimSchemaResp::getId)); + Map> dimIdAndDescPair = domainSchema.getDimensions() + .stream().collect(Collectors.groupingBy(SchemaElement::getId)); return new ArrayList<>(dimIdAndDescPair.keySet()); } - public List generateAllMetricIdList(DomainSchemaResp domainSchemaDesc) { - if (Objects.isNull(domainSchemaDesc) || CollectionUtils.isEmpty(domainSchemaDesc.getMetrics())) { + public List generateAllMetricIdList(DomainSchema domainSchema) { + if (Objects.isNull(domainSchema) || CollectionUtils.isEmpty(domainSchema.getMetrics())) { return new ArrayList<>(); } - Map> metricIdAndDescPair = domainSchemaDesc.getMetrics() - .stream().collect(Collectors.groupingBy(MetricSchemaResp::getId)); + Map> metricIdAndDescPair = domainSchema.getMetrics() + .stream().collect(Collectors.groupingBy(SchemaElement::getId)); return new ArrayList<>(metricIdAndDescPair.keySet()); } @@ -120,6 +77,7 @@ public class ChatConfigUtils { chatConfigDO.setChatAggConfig(JsonUtil.toString(chatConfig.getChatAggConfig())); chatConfigDO.setChatDetailConfig(JsonUtil.toString(chatConfig.getChatDetailConfig())); + chatConfigDO.setRecommendedQuestions(JsonUtil.toString(chatConfig.getRecommendedQuestions())); if (Objects.isNull(chatConfig.getStatus())) { chatConfigDO.setStatus(null); @@ -147,6 +105,7 @@ public class ChatConfigUtils { chatConfigDescriptor.setChatDetailConfig(JsonUtil.toObject(chatConfigDO.getChatDetailConfig(), ChatDetailConfig.class)); chatConfigDescriptor.setChatAggConfig(JsonUtil.toObject(chatConfigDO.getChatAggConfig(), ChatAggConfig.class)); + chatConfigDescriptor.setRecommendedQuestions(JsonUtil.toList(chatConfigDO.getRecommendedQuestions(), RecommendedQuestion.class)); chatConfigDescriptor.setStatusEnum(StatusEnum.of(chatConfigDO.getStatus())); chatConfigDescriptor.setCreatedBy(chatConfigDO.getCreatedBy()); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ComponentFactory.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java similarity index 92% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ComponentFactory.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java index 6fcdcb4ed..7fa7a9164 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/ComponentFactory.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.domain.utils; +package com.tencent.supersonic.chat.utils; import com.tencent.supersonic.chat.api.component.SchemaMapper; import com.tencent.supersonic.chat.api.component.SemanticLayer; @@ -8,8 +8,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import com.tencent.supersonic.chat.application.parser.DomainResolver; -import com.tencent.supersonic.chat.application.query.QuerySelector; +import com.tencent.supersonic.chat.parser.function.DomainResolver; +import com.tencent.supersonic.chat.query.QuerySelector; import org.apache.commons.collections.CollectionUtils; import org.springframework.core.io.support.SpringFactoriesLoader; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java similarity index 72% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java index 122103051..ae8abf276 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictMetaUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java @@ -1,17 +1,16 @@ -package com.tencent.supersonic.chat.domain.utils; +package com.tencent.supersonic.chat.utils; -import static com.tencent.supersonic.common.constant.Constants.DAY; -import static com.tencent.supersonic.common.constant.Constants.UNDERLINE; +import static com.tencent.supersonic.common.pojo.Constants.DAY; +import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.domain.pojo.config.*; -import com.tencent.supersonic.common.pojo.SchemaItem; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.chat.domain.dataobject.DimValueDO; -import com.tencent.supersonic.knowledge.domain.pojo.DictUpdateMode; -import com.tencent.supersonic.knowledge.domain.pojo.DimValue2DictCommand; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.config.*; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.persistence.dataobject.DimValueDO; +import com.tencent.supersonic.knowledge.dictionary.DictUpdateMode; +import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; import java.util.ArrayList; import java.util.HashMap; @@ -30,20 +29,14 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @Component -public class DictMetaUtils { +public class DictMetaHelper { @Autowired - private ConfigServiceImpl configService; - + private ConfigService configService; @Value("${model.internal.metric.suffix:internal_cnt}") private String internalMetricNameSuffix; private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - public DictMetaUtils() { - - } - - public List generateDimValueInfo(DimValue2DictCommand dimValue2DictCommend) { List dimValueDOList = new ArrayList<>(); DictUpdateMode updateMode = dimValue2DictCommend.getUpdateMode(); @@ -54,13 +47,13 @@ public class DictMetaUtils { dimValueDOList = generateDimValueInfoByDomain(domainIds); break; case OFFLINE_FULL: - List domainSchemaDescList = semanticLayer.getDomainSchemaInfo(new ArrayList<>()); + List domainSchemaDescList = semanticLayer.getDomainSchema(); if (CollectionUtils.isEmpty(domainSchemaDescList)) { break; } - Map domainIdAndDescPair = domainSchemaDescList.stream() - .collect(Collectors.toMap(DomainSchemaResp::getId, domainSchemaDesc -> domainSchemaDesc)); + Map domainIdAndDescPair = domainSchemaDescList.stream() + .collect(Collectors.toMap(a -> a.getDomain().getId(), schema -> schema, (k1, k2) -> k1)); if (!CollectionUtils.isEmpty(domainIdAndDescPair)) { domainIds.addAll(domainIdAndDescPair.keySet()); dimValueDOList = generateDimValueInfoByDomain(domainIds); @@ -85,22 +78,22 @@ public class DictMetaUtils { return dimValueDOList; } - List domainSchemaDescList = semanticLayer.getDomainSchemaInfo(new ArrayList<>()); + List domainSchemaDescList = semanticLayer.getDomainSchema(); if (CollectionUtils.isEmpty(domainSchemaDescList)) { return dimValueDOList; } - Map domainIdAndDescPair = domainSchemaDescList.stream() - .collect(Collectors.toMap(DomainSchemaResp::getId, domainSchemaDesc -> domainSchemaDesc)); + Map domainIdAndDescPair = domainSchemaDescList.stream() + .collect(Collectors.toMap(a -> a.getDomain().getId(), a -> a, (k1, k2) -> k1)); for (Long domainId : domainAndDimMap.keySet()) { if (!domainIdAndDescPair.containsKey(domainId)) { continue; } - Map dimIdAndDescPairAll; + Map dimIdAndDescPairAll; dimIdAndDescPairAll = domainIdAndDescPair.get(domainId).getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, dimSchemaDesc -> dimSchemaDesc)); + .collect(Collectors.toMap(SchemaElement::getId, dimSchemaDesc -> dimSchemaDesc, (k1, k2) -> k1)); List dimIdReq = domainAndDimMap.get(domainId); - Map dimIdAndDescPairReq = new HashMap<>(); + Map dimIdAndDescPairReq = new HashMap<>(); for (Long dimId : dimIdReq) { if (dimIdAndDescPairAll.containsKey(dimId)) { dimIdAndDescPairReq.put(dimId, dimIdAndDescPairAll.get(dimId)); @@ -114,15 +107,15 @@ public class DictMetaUtils { private List generateDimValueInfoByDomain(Set domainIds) { List dimValueDOList = new ArrayList<>(); - List domainSchemaDescList = semanticLayer.getDomainSchemaInfo(new ArrayList<>(domainIds)); + List domainSchemaDescList = semanticLayer.getDomainSchema(new ArrayList<>(domainIds)); if (CollectionUtils.isEmpty(domainSchemaDescList)) { return dimValueDOList; } domainSchemaDescList.forEach(domainSchemaDesc -> { - Map dimIdAndDescPair = domainSchemaDesc.getDimensions().stream() - .collect(Collectors.toMap(DimSchemaResp::getId, dimSchemaDesc -> dimSchemaDesc)); - fillDimValueDOList(dimValueDOList, domainSchemaDesc.getId(), dimIdAndDescPair); + Map dimIdAndDescPair = domainSchemaDesc.getDimensions().stream() + .collect(Collectors.toMap(SchemaElement::getId, dimSchemaDesc -> dimSchemaDesc, (k1, k2) -> k1)); + fillDimValueDOList(dimValueDOList, domainSchemaDesc.getDomain().getId(), dimIdAndDescPair); }); @@ -130,8 +123,8 @@ public class DictMetaUtils { } private void fillDimValueDOList(List dimValueDOList, Long domainId, - Map dimIdAndDescPair) { - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domainId); + Map dimIdAndDescPair) { + ChatConfigRich chaConfigRichDesc = configService.getConfigRichInfo(domainId); if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatAggRichConfig())) { ChatDefaultRichConfig chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); @@ -147,7 +140,7 @@ public class DictMetaUtils { } private void fillKnowledgeDimValue(List knowledgeInfos, ChatDefaultRichConfig chatDefaultConfig, - List dimValueDOList, Map dimIdAndDescPair, Long domainId) { + List dimValueDOList, Map dimIdAndDescPair, Long domainId) { if (!CollectionUtils.isEmpty(knowledgeInfos)) { List dimensions = new ArrayList<>(); List defaultMetricDescList = new ArrayList<>(); @@ -156,18 +149,18 @@ public class DictMetaUtils { && dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) .forEach(knowledgeInfo -> { if (dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) { - DimSchemaResp dimensionDesc = dimIdAndDescPair.get(knowledgeInfo.getItemId()); + SchemaElement dimensionDesc = dimIdAndDescPair.get(knowledgeInfo.getItemId()); //default cnt if (Objects.isNull(chatDefaultConfig) || CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())) { - String datasourceBizName = dimensionDesc.getDatasourceBizName(); + String datasourceBizName = dimensionDesc.getBizName(); if (Strings.isNotEmpty(datasourceBizName)) { String internalMetricName = datasourceBizName + UNDERLINE + internalMetricNameSuffix; defaultMetricDescList.add(new DefaultMetric(internalMetricName, 2, DAY)); } } else { - SchemaItem schemaItem = chatDefaultConfig.getMetrics().get(0); + SchemaElement schemaItem = chatDefaultConfig.getMetrics().get(0); defaultMetricDescList.add(new DefaultMetric(schemaItem.getBizName(), chatDefaultConfig.getUnit(), chatDefaultConfig.getPeriod())); } @@ -193,11 +186,4 @@ public class DictMetaUtils { } } } - - private boolean isVisibleDim(KnowledgeInfo knowledgeInfo, ItemVisibilityInfo itemVisibilityDesc) { - if (Objects.isNull(itemVisibilityDesc) || CollectionUtils.isEmpty(itemVisibilityDesc.getBlackDimIdList())) { - return true; - } - return !itemVisibilityDesc.getBlackDimIdList().contains(knowledgeInfo.getItemId()); - } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictQueryUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java similarity index 89% rename from chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictQueryUtils.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java index 2b6c2610f..fe7bae341 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/domain/utils/DictQueryUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java @@ -1,21 +1,21 @@ -package com.tencent.supersonic.chat.domain.utils; +package com.tencent.supersonic.chat.utils; -import static com.tencent.supersonic.common.constant.Constants.AND_UPPER; -import static com.tencent.supersonic.common.constant.Constants.APOSTROPHE; -import static com.tencent.supersonic.common.constant.Constants.COMMA; -import static com.tencent.supersonic.common.constant.Constants.UNDERLINE_DOUBLE; +import static com.tencent.supersonic.common.pojo.Constants.AND_UPPER; +import static com.tencent.supersonic.common.pojo.Constants.APOSTROPHE; +import static com.tencent.supersonic.common.pojo.Constants.COMMA; +import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE_DOUBLE; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.semantic.api.core.pojo.QueryColumn; -import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.chat.config.DefaultMetric; +import com.tencent.supersonic.chat.config.Dim4Dict; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; -import com.tencent.supersonic.chat.domain.pojo.config.Dim4Dict; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.common.enums.AggOperatorEnum; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Order; @@ -36,21 +36,19 @@ import org.springframework.util.CollectionUtils; @Slf4j @Component -public class DictQueryUtils { +public class DictQueryHelper { - Long frequencyMax = 99999999L; + private static final Long MAX_FREQUENCY = 99999999L; private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); @Value("${dimension.multi.value.split:#}") private String dimMultiValueSplit; - @Value("${dimension.value.show:50}") private Integer printDataShow; - @Value("${dimension.max.limit:3000000}") private Long dimMaxLimit; public List fetchDimValueSingle(Long domainId, DefaultMetric defaultMetricDesc, Dim4Dict dim4Dict, - User user) { + User user) { List data = new ArrayList<>(); QueryStructReq queryStructCmd = generateQueryStructCmd(domainId, defaultMetricDesc, dim4Dict); try { @@ -119,8 +117,8 @@ public class DictQueryUtils { private void constructDataLines(Map valueAndFrequencyPair, String nature, List data) { valueAndFrequencyPair.forEach((dimValue, metric) -> { - if (metric > frequencyMax) { - metric = frequencyMax; + if (metric > MAX_FREQUENCY) { + metric = MAX_FREQUENCY; } data.add(String.format("%s %s %s", dimValue, nature, metric)); }); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java new file mode 100644 index 000000000..e928b566b --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java @@ -0,0 +1,166 @@ +package com.tencent.supersonic.chat.utils; + +import com.hankcs.hanlp.corpus.tag.Nature; +import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.mapper.DomainInfoStat; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +/** + * nature parse helper + */ +@Slf4j +public class NatureHelper { + + public static SchemaElementType convertToElementType(String nature) { + DictWordType dictWordType = DictWordType.getNatureType(nature); + SchemaElementType result = null; + switch (dictWordType) { + case METRIC: + result = SchemaElementType.METRIC; + break; + case DIMENSION: + result = SchemaElementType.DIMENSION; + break; + case ENTITY: + result = SchemaElementType.ENTITY; + break; + case DOMAIN: + result = SchemaElementType.DOMAIN; + break; + case VALUE: + result = SchemaElementType.VALUE; + break; + default: + break; + } + return result; + } + + private static boolean isDomainOrEntity(Term term, Integer domain) { + return (DictWordType.NATURE_SPILT + domain).equals(term.nature.toString()) || term.nature.toString() + .endsWith(DictWordType.ENTITY.getType()); + } + + public static Integer getDomainByNature(Nature nature) { + if (nature.startsWith(DictWordType.NATURE_SPILT)) { + String[] dimensionValues = nature.toString().split(DictWordType.NATURE_SPILT); + if (StringUtils.isNumeric(dimensionValues[1])) { + return Integer.valueOf(dimensionValues[1]); + } + } + return 0; + } + + public static Long getDomainId(String nature) { + try { + String[] split = nature.split(DictWordType.NATURE_SPILT); + if (split.length <= 1) { + return null; + } + return Long.valueOf(split[1]); + } catch (NumberFormatException e) { + log.error("", e); + } + return null; + } + + public static boolean isDimensionValueClassId(String nature) { + if (StringUtils.isEmpty(nature)) { + return false; + } + if (!nature.startsWith(DictWordType.NATURE_SPILT)) { + return false; + } + String[] split = nature.split(DictWordType.NATURE_SPILT); + if (split.length <= 1) { + return false; + } + return !nature.endsWith(DictWordType.METRIC.getType()) && !nature.endsWith(DictWordType.DIMENSION.getType()) + && StringUtils.isNumeric(split[1]); + } + + public static DomainInfoStat getDomainStat(List terms) { + return DomainInfoStat.builder() + .domainCount(getDomainCount(terms)) + .dimensionDomainCount(getDimensionCount(terms)) + .metricDomainCount(getMetricCount(terms)) + .dimensionValueDomainCount(getDimensionValueCount(terms)) + .build(); + } + + + private static long getDomainCount(List terms) { + return terms.stream().filter(term -> isDomainOrEntity(term, getDomainByNature(term.nature))).count(); + } + + private static long getDimensionValueCount(List terms) { + return terms.stream().filter(term -> isDimensionValueClassId(term.nature.toString())).count(); + } + + private static long getDimensionCount(List terms) { + return terms.stream().filter(term -> term.nature.startsWith(DictWordType.NATURE_SPILT) && term.nature.toString() + .endsWith(DictWordType.DIMENSION.getType())).count(); + } + + private static long getMetricCount(List terms) { + return terms.stream().filter(term -> term.nature.startsWith(DictWordType.NATURE_SPILT) && term.nature.toString() + .endsWith(DictWordType.METRIC.getType())).count(); + } + + /** + * Get the number of types of class parts of speech + * domainId -> (nature , natureCount) + * + * @param terms + * @return + */ + public static Map> getDomainToNatureStat(List terms) { + Map> domainToNature = new HashMap<>(); + terms.stream().filter( + term -> term.nature.startsWith(DictWordType.NATURE_SPILT) + ).forEach(term -> { + DictWordType dictWordType = DictWordType.getNatureType(String.valueOf(term.nature)); + Long domain = getDomainId(String.valueOf(term.nature)); + + Map natureTypeMap = new HashMap<>(); + natureTypeMap.put(dictWordType, 1); + + Map original = domainToNature.get(domain); + if (Objects.isNull(original)) { + domainToNature.put(domain, natureTypeMap); + } else { + Integer count = original.get(dictWordType); + if (Objects.isNull(count)) { + count = 1; + } else { + count = count + 1; + } + original.put(dictWordType, count); + } + }); + return domainToNature; + } + + public static List selectPossibleDomains(List terms) { + Map> domainToNatureStat = getDomainToNatureStat(terms); + Integer maxDomainTypeSize = domainToNatureStat.entrySet().stream() + .max(Comparator.comparingInt(o -> o.getValue().size())).map(entry -> entry.getValue().size()) + .orElse(null); + if (Objects.isNull(maxDomainTypeSize) || maxDomainTypeSize == 0) { + return new ArrayList<>(); + } + return domainToNatureStat.entrySet().stream().filter(entry -> entry.getValue().size() == maxDomainTypeSize) + .map(entry -> entry.getKey()).collect(Collectors.toList()); + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java new file mode 100644 index 000000000..44a1875e8 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java @@ -0,0 +1,178 @@ +package com.tencent.supersonic.chat.utils; + +import com.google.common.collect.Lists; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.query.rule.metric.MetricDomainQuery; +import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery; +import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery; +import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.Order; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; +import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; + +@Slf4j +public class QueryReqBuilder { + + public static QueryStructReq buildStructReq(SemanticParseInfo parseInfo) { + QueryStructReq queryStructCmd = new QueryStructReq(); + queryStructCmd.setDomainId(parseInfo.getDomainId()); + queryStructCmd.setNativeQuery(parseInfo.getNativeQuery()); + queryStructCmd.setDateInfo(parseInfo.getDateInfo()); + + List dimensionFilters = parseInfo.getDimensionFilters().stream() + .filter(chatFilter -> Strings.isNotEmpty(chatFilter.getBizName())) + .map(chatFilter -> new Filter(chatFilter.getBizName(), chatFilter.getOperator(), chatFilter.getValue())) + .collect(Collectors.toList()); + queryStructCmd.setDimensionFilters(dimensionFilters); + + List metricFilters = parseInfo.getMetricFilters().stream() + .map(chatFilter -> new Filter(chatFilter.getBizName(), chatFilter.getOperator(), chatFilter.getValue())) + .collect(Collectors.toList()); + queryStructCmd.setMetricFilters(metricFilters); + + addDateDimension(parseInfo); + List dimensions = parseInfo.getDimensions().stream().map(entry -> entry.getBizName()) + .collect(Collectors.toList()); + queryStructCmd.setGroups(dimensions); + queryStructCmd.setLimit(parseInfo.getLimit()); + Set order = getOrder(parseInfo.getOrders(), parseInfo.getAggType(), parseInfo.getMetrics()); + queryStructCmd.setOrders(new ArrayList<>(order)); + queryStructCmd.setAggregators(getAggregatorByMetric(parseInfo.getMetrics(), parseInfo.getAggType())); + return queryStructCmd; + } + + public static QueryMultiStructReq buildMultiStructReq(SemanticParseInfo parseInfo) { + QueryStructReq queryStructReq = buildStructReq(parseInfo); + QueryMultiStructReq queryMultiStructReq = new QueryMultiStructReq(); + List queryStructReqs = Lists.newArrayList(); + for (Filter dimensionFilter : queryStructReq.getDimensionFilters()) { + QueryStructReq req = new QueryStructReq(); + BeanUtils.copyProperties(queryStructReq, req); + req.setDimensionFilters(Lists.newArrayList(dimensionFilter)); + queryStructReqs.add(req); + } + queryMultiStructReq.setQueryStructReqs(queryStructReqs); + return queryMultiStructReq; + } + + /** + * convert to QueryDslReq + * @param querySql + * @param domainId + * @return + */ + public static QueryDslReq buildDslReq(String querySql,Long domainId) { + QueryDslReq queryDslReq = new QueryDslReq(); + if (Objects.nonNull(querySql)) { + queryDslReq.setSql(querySql); + } + queryDslReq.setDomainId(domainId); + return queryDslReq; + } + + + private static List getAggregatorByMetric(Set metrics, AggregateTypeEnum aggregateType) { + List aggregators = new ArrayList<>(); + String agg = (aggregateType == null || aggregateType.equals(AggregateTypeEnum.NONE)) ? "" + : aggregateType.name(); + for (SchemaElement metric : metrics) { + aggregators.add(new Aggregator(metric.getBizName(), AggOperatorEnum.of(agg))); + } + return aggregators; + } + + private static void addDateDimension(SemanticParseInfo parseInfo) { + if (parseInfo != null) { + String queryMode = parseInfo.getQueryMode(); + if (parseInfo.getDateInfo() == null) { + return; + } + if (parseInfo.getAggType() != null && (parseInfo.getAggType().equals(AggregateTypeEnum.MAX) + || parseInfo.getAggType().equals(AggregateTypeEnum.MIN)) && !CollectionUtils.isEmpty( + parseInfo.getDimensions())) { + return; + } + DateConf dateInfo = parseInfo.getDateInfo(); + String dateField = getDateField(dateInfo); + + for (SchemaElement dimension : parseInfo.getDimensions()) { + if (dimension.getBizName().equalsIgnoreCase(dateField)) { + return; + } + } + SchemaElement dimension = new SchemaElement(); + dimension.setBizName(dateField); + + if (MetricDomainQuery.QUERY_MODE.equals(queryMode) + || MetricGroupByQuery.QUERY_MODE.equals(queryMode) + || MetricFilterQuery.QUERY_MODE.equals(queryMode) + ) { + parseInfo.getDimensions().add(dimension); + } + } + } + + public static Set getOrder(Set parseOrder, AggregateTypeEnum aggregator, Set metrics) { + if (!CollectionUtils.isEmpty(parseOrder)) { + return parseOrder; + } + Set orders = new LinkedHashSet(); + if (CollectionUtils.isEmpty(metrics)) { + return orders; + } + if ((AggregateTypeEnum.TOPN.equals(aggregator) || AggregateTypeEnum.MAX.equals(aggregator) + || AggregateTypeEnum.MIN.equals( + aggregator))) { + for (SchemaElement metric : metrics) { + Order order = new Order(); + order.setColumn(metric.getBizName()); + order.setDirection("desc"); + orders.add(order); + } + } + return orders; + } + + public static String getDateField(DateConf dateConf) { + if(Objects.isNull(dateConf)) { + return ""; + } + String dateField = TimeDimensionEnum.DAY.getName(); + if (Constants.MONTH.equals(dateConf.getPeriod())) { + dateField = TimeDimensionEnum.MONTH.getName(); + } + if (Constants.WEEK.equals(dateConf.getPeriod())) { + dateField = TimeDimensionEnum.WEEK.getName(); + } + return dateField; + } + + public static QueryStructReq buildStructRatioReq(SemanticParseInfo parseInfo,SchemaElement metric,AggOperatorEnum aggOperatorEnum) { + QueryStructReq queryStructCmd = buildStructReq(parseInfo); + queryStructCmd.setNativeQuery(false); + queryStructCmd.setOrders(new ArrayList<>()); + List aggregators = new ArrayList<>(); + Aggregator ratioRoll = new Aggregator(metric.getBizName(), aggOperatorEnum); + aggregators.add(ratioRoll); + queryStructCmd.setAggregators(aggregators); + return queryStructCmd; + } +} diff --git a/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py b/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py deleted file mode 100644 index 31facf03b..000000000 --- a/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py +++ /dev/null @@ -1,147 +0,0 @@ -examplars= [ - { - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长"]""", - "question":"比较jerry和tom在内容库的访问次数", - "analysis": """让我们一步一步地思考。在问题“比较jerry和tom在内容库的访问次数“中,我们被问: -“内容库的访问次数”,所以我们需要column=[访问次数] -”比较jerry和tom“,所以我们需要column=[用户名] -基于table和columns,可能的cell values 是 = ['jerry', 'tom']。""", - "schema_links":"""["访问次数", "用户名", "'jerry'", "'tom'"]""", - "sql":"""select 用户名, 访问次数 from 内容库产品 where 用户名 in ('jerry', 'tom')""" - }, - { - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长"]""", - "question":"内容库近12个月访问人数 按部门", - "analysis": """让我们一步一步地思考。在问题“内容库近12个月访问人数 按部门“中,我们被问: -“内容库近12个月访问人数”,所以我们需要column=[访问人数] -”按部门“,所以我们需要column=[部门] -基于table和columns,可能的cell values 是 = []。""", - "schema_links":"""["访问人数", "部门"]""", - "sql":"""select 部门, sum(访问人数) from 内容库产品 where 部门 group by 部门""" - }, - { - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长"]""", - "question":"内容库编辑部、美术部的访问时长", - "analysis": """让我们一步一步地思考。在问题“内容库编辑部、美术部的访问时长“中,我们被问: -“访问时长”,所以我们需要column=[访问时长] -”内容库编辑部、美术部“,所以我们需要column=[部门] -基于table和columns,可能的cell values 是 = ['编辑部', '美术部']。""", - "schema_links":"""["访问时长", "部门", "'编辑部'", "'美术部'"]""", - "sql":"""select 部门, 访问时长 from 内容库产品 where 部门 in ('编辑部', '美术部')""" - }, - { - "table_name":"精选", - "fields_list":"""['归属系', '付费模式', '结算播放份额', '付费用户结算播放份额']""", - "question":"近3天飞天系结算播放份额", - "analysis": """让我们一步一步地思考。在问题“近3天飞天系结算播放份额“中,我们被问: -“结算播放份额”,所以我们需要column=[结算播放份额] -”飞天系“,所以我们需要column=[归属系] -基于table和columns,可能的cell values 是 = ['飞天系']。""", - "schema_links":"""["结算播放份额", "归属系", "'飞天系'"]""", - "sql":"""select 归属系, 结算播放份额 from 精选 where 归属系 in ('飞天系')""" - }, - { - "table_name":"歌曲库", - "fields_list":"""['歌曲ID', '歌曲MID', '歌曲名', '歌曲版本', '歌曲类型', '翻唱类型', '结算播放量', '运营播放量', '付费用户结算播放量', '历史累计结算播放量', '运营搜播量', '结算搜播量', '运营完播量', '运营推播量', '近7日复播率', '日均搜播量']""", - "question":"对比近3天翻唱版和纯音乐的歌曲播放量", - "analysis": """让我们一步一步地思考。在问题“对比近3天翻唱版和纯音乐的歌曲播放量“中,我们被问: -“歌曲播放量”,所以我们需要column=[结算播放量] -”翻唱版和纯音乐“,所以我们需要column=[歌曲类型] -基于table和columns,可能的cell values 是 = ['翻唱版', '纯音乐']。""", - "schema_links":"""["结算播放量", "歌曲类型", "'翻唱版'", "'纯音乐'"]""", - "sql":"""select 歌曲类型, 结算播放量 from 歌曲库 where 歌曲类型 in ('翻唱版', '纯音乐')""" - }, - { - "table_name":"艺人库", - "fields_list":"""['上下架状态', '歌手名', '歌手等级', '歌手类型', '歌手来源', '活跃区域', '年龄', '歌手才能', '歌手风格', '粉丝数', '在架歌曲数', '有播放量歌曲数']""", - "question":"对比一下流得滑、锅富程、章雪友的粉丝数", - "analysis": """让我们一步一步地思考。在问题“对比一下流得滑、锅富程、章雪友的粉丝数“中,我们被问: -“粉丝数”,所以我们需要column=[粉丝数] -”流得滑、锅富程、章雪友“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['流得滑', '锅富程', '章雪友']。""", - "schema_links":"""["粉丝数", "歌手名", "'流得滑'", "'锅富程'", "'章雪友'"]""", - "sql":"""select 歌手名, 粉丝数 from 艺人库 where 歌手名 in ('流得滑', '锅富程', '章雪友')""" - }, - { - "table_name":"歌曲库", - "fields_list":"""['歌曲ID', '歌曲MID', '歌曲名', '歌曲版本', '歌曲类型', '翻唱类型', '结算播放量', '运营播放量', '付费用户结算播放量', '历史累计结算播放量', '运营搜播量', '结算搜播量', '运营完播量', '运营推播量', '近7日复播率', '日均搜播量']""", - "question":"播放量大于1万的歌曲有多少", - "analysis": """让我们一步一步地思考。在问题“播放量大于1万的歌曲有多少“中,我们被问: -“歌曲有多少”,所以我们需要column=[歌曲名] -”播放量大于1万“,所以我们需要column=[结算播放量] -基于table和columns,可能的cell values 是 = [10000]。""", - "schema_links":"""["歌曲名", "结算播放量", 10000]""", - "sql":"""select 歌曲名 from 歌曲库 where 结算播放量 > 10000""" - }, - { - "table_name":"内容库产品", - "fields_list":"""['用户名', '部门', '模块', '访问时长', '访问次数', '访问人数']""", - "question":"内容库访问时长小于1小时,且来自美术部的用户是哪些", - "analysis": """让我们一步一步地思考。在问题“内容库访问时长小于1小时,且来自美术部的用户是哪些“中,我们被问: -“用户是哪些”,所以我们需要column=[用户名] -”美术部的“,所以我们需要column=[部门] -”访问时长小于1小时“,所以我们需要column=[访问时长] -基于table和columns,可能的cell values 是 = ['美术部', 1]。""", - "schema_links":"""["用户名", "部门", "访问时长", "'美术部'", 1]""", - "sql":"""select 用户名 from 内容库产品 where 部门 = '美术部' and 访问时长 < 1""" - }, - { - "table_name":"内容库产品", - "fields_list":"""['用户名', '部门', '模块', '访问次数', '访问人数', '访问时长']""", - "question":"内容库pv最高的用户有哪些", - "analysis": """让我们一步一步地思考。在问题“内容库pv最高的用户有哪些“中,我们被问: -“用户有哪些”,所以我们需要column=[用户名] -”pv最高的“,所以我们需要column=[访问次数] -基于table和columns,可能的cell values 是 = []。""", - "schema_links":"""["用户名", "访问次数"]""", - "sql":"""select 用户名 from 内容库产品 order by 访问次数 desc limit 10""" - }, - { - "table_name":"艺人库", - "fields_list":"""['歌手名', '歌手等级', '歌手类型', '歌手来源', '结算播放量', '运营播放量', '历史累计结算播放量', '有播放量歌曲数', '历史累计运营播放量', '付费用户结算播放量', '结算播放量占比', '运营播放份额', '完播量']""", - "question":"近90天袁呀味播放量平均值是多少", - "analysis": """让我们一步一步地思考。在问题“近90天袁呀味播放量平均值是多少“中,我们被问: -“播放量平均值是多少”,所以我们需要column=[结算播放量] -”袁呀味“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['袁呀味']。""", - "schema_links":"""["结算播放量", "歌手名", "'袁呀味'"]""", - "sql":"""select avg(结算播放量) from 艺人库 where 歌手名 = '袁呀味'""" - }, - { - "table_name":"艺人库", - "fields_list":"""['歌手名', '歌手等级', '歌手类型', '歌手来源', '结算播放量', '运营播放量', '历史累计结算播放量', '有播放量歌曲数', '历史累计运营播放量', '付费用户结算播放量', '结算播放量占比', '运营播放份额', '完播量']""", - "question":"周浅近7天结算播放量总和是多少", - "analysis": """让我们一步一步地思考。在问题“周浅近7天结算播放量总和是多少“中,我们被问: -“结算播放量总和是多少”,所以我们需要column=[结算播放量] -”周浅“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['周浅']。""", - "schema_links":"""["结算播放量", "歌手名", "'周浅'"]""", - "sql":"""select sum(结算播放量) from 艺人库 where 歌手名 = '周浅'""" - }, - { - "table_name":"内容库产品", - "fields_list":"""['部门', '模块', '用户名', '访问次数', '访问人数', '访问时长']""", - "question":"内容库访问次数大于1k的部门是哪些", - "analysis": """让我们一步一步地思考。在问题“内容库访问次数大于1k的部门是哪些“中,我们被问: -“部门是哪些”,所以我们需要column=[部门] -”访问次数大于1k的“,所以我们需要column=[访问次数] -基于table和columns,可能的cell values 是 = [1000]。""", - "schema_links":"""["部门", "访问次数", 1000]""", - "sql":"""select 部门 from 内容库产品 where 访问次数 > 1000""" - }, - { - "table_name":"歌曲库", - "fields_list":"""['歌曲ID', '歌曲MID', '歌曲名', '歌曲版本', '歌曲类型', '翻唱类型', '结算播放量', '运营播放量', '付费用户结算播放量', '历史累计结算播放量', '运营搜播量', '结算搜播量', '运营完播量', '运营推播量', '近7日复播率', '日均搜播量']""", - "question":"陈易迅唱的所有的播放量大于20k的雇佣者有哪些", - "analysis": """让我们一步一步地思考。在问题“陈易迅唱的所有的播放量大于20k的雇佣者有哪些“中,我们被问: -“雇佣者有哪些”,所以我们需要column=[歌曲名] -”播放量大于20k的“,所以我们需要column=[结算播放量] -”陈易迅唱的“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = [20000, '陈易迅']。""", - "schema_links":"""["歌曲名", "结算播放量", "歌手名", 20000, "'陈易迅'"]""", - "sql":"""select 歌曲名 from 歌曲库 where 结算播放量 > 20000 and 歌手名 = '陈易迅'""" - } -] \ No newline at end of file diff --git a/chat/core/src/main/resources/mapper/ChatConfigMapper.xml b/chat/core/src/main/resources/mapper/ChatConfigMapper.xml index 64e43a3c6..55eb670a4 100644 --- a/chat/core/src/main/resources/mapper/ChatConfigMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatConfigMapper.xml @@ -3,14 +3,15 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + + type="com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO"> + @@ -19,15 +20,15 @@ insert into s2_chat_config ( - domain_id, `chat_detail_config`, chat_agg_config, status, created_by, updated_by, created_at, updated_at + domain_id, `chat_detail_config`, chat_agg_config, recommended_questions, status, created_by, updated_by, created_at, updated_at ) values ( - #{domainId}, #{chatDetailConfig}, #{chatAggConfig}, #{status}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt} + #{domainId}, #{chatDetailConfig}, #{chatAggConfig}, #{recommendedQuestions}, #{status}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt} ) @@ -42,6 +43,9 @@ chat_agg_config = #{chatAggConfig} , + + recommended_questions = #{recommendedQuestions} , + status = #{status} , diff --git a/chat/core/src/main/resources/mapper/ChatContextMapper.xml b/chat/core/src/main/resources/mapper/ChatContextMapper.xml index 1c3291d5e..2a8834627 100644 --- a/chat/core/src/main/resources/mapper/ChatContextMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatContextMapper.xml @@ -3,10 +3,10 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + + type="com.tencent.supersonic.chat.persistence.dataobject.ChatContextDO"> @@ -20,7 +20,7 @@ from s2_chat_context where chat_id=#{chatId} limit 1 - + insert into s2_chat_context (chat_id,user,query_text,semantic_parse) values (#{chatId}, #{user},#{queryText}, #{semanticParse}) diff --git a/chat/core/src/main/resources/mapper/ChatMapper.xml b/chat/core/src/main/resources/mapper/ChatMapper.xml index b2f737d72..bda458423 100644 --- a/chat/core/src/main/resources/mapper/ChatMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatMapper.xml @@ -3,9 +3,9 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - + @@ -45,7 +45,7 @@ where chat_id = #{chatId} - + insert into s2_chat (chat_name, create_time, last_time, creator, last_question, is_delete, is_top) values (#{chatName}, #{createTime}, #{lastTime}, #{creator}, #{lastQuestion}, #{isDelete}, #{isTop}) @@ -59,7 +59,7 @@ - + @@ -83,14 +83,14 @@ - + update s2_chat_query set score=#{score}, feedback=#{feedback} where question_id = #{id} - insert into s2_chat_query (question_id, create_time, user_name, question, query_result, time, state, data_content, name, query_type, diff --git a/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml b/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml index 3d2501968..3c0b5bf81 100644 --- a/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -10,9 +10,9 @@ - + - + @@ -49,7 +49,7 @@ query_text, query_response - select distinct @@ -65,7 +65,7 @@ order by ${orderByClause} - select distinct @@ -94,17 +94,17 @@ delete from s2_chat_query where question_id = #{questionId,jdbcType=BIGINT} - + insert into s2_chat_query (question_id, create_time, user_name, query_state, chat_id, score, feedback, query_text, query_response ) values (#{questionId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{userName,jdbcType=VARCHAR}, #{queryState,jdbcType=INTEGER}, #{chatId,jdbcType=BIGINT}, #{score,jdbcType=INTEGER}, - #{feedback,jdbcType=VARCHAR}, #{queryText,jdbcType=LONGVARCHAR}, #{queryResponse,jdbcType=LONGVARCHAR} + #{feedback,jdbcType=VARCHAR}, #{queryText,jdbcType=LONGVARCHAR}, #{queryResult,jdbcType=LONGVARCHAR} ) - + insert into s2_chat_query @@ -131,7 +131,7 @@ query_text, - + query_response, @@ -160,18 +160,18 @@ #{queryText,jdbcType=LONGVARCHAR}, - - #{queryResponse,jdbcType=LONGVARCHAR}, + + #{queryResult,jdbcType=LONGVARCHAR}, - select count(*) from s2_chat_query - + update s2_chat_query @@ -195,13 +195,13 @@ query_text = #{queryText,jdbcType=LONGVARCHAR}, - - query_response = #{queryResponse,jdbcType=LONGVARCHAR}, + + query_response = #{queryResult,jdbcType=LONGVARCHAR}, where question_id = #{questionId,jdbcType=BIGINT} - + update s2_chat_query set create_time = #{createTime,jdbcType=TIMESTAMP}, user_name = #{userName,jdbcType=VARCHAR}, @@ -210,10 +210,10 @@ score = #{score,jdbcType=INTEGER}, feedback = #{feedback,jdbcType=VARCHAR}, query_text = #{queryText,jdbcType=LONGVARCHAR}, - query_response = #{queryResponse,jdbcType=LONGVARCHAR} + query_response = #{queryResult,jdbcType=LONGVARCHAR} where question_id = #{questionId,jdbcType=BIGINT} - + update s2_chat_query set create_time = #{createTime,jdbcType=TIMESTAMP}, user_name = #{userName,jdbcType=VARCHAR}, diff --git a/chat/core/src/main/resources/mapper/PluginDOMapper.xml b/chat/core/src/main/resources/mapper/PluginDOMapper.xml new file mode 100644 index 000000000..0fe6e3f5e --- /dev/null +++ b/chat/core/src/main/resources/mapper/PluginDOMapper.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, type, domain, pattern, parse_mode, name, created_at, created_by, updated_at, + updated_by + + + config + + + + + + delete from s2_plugin + where id = #{id,jdbcType=BIGINT} + + + insert into s2_plugin (id, type, domain, + pattern, parse_mode, name, + created_at, created_by, updated_at, + updated_by, config) + values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{domain,jdbcType=VARCHAR}, + #{pattern,jdbcType=VARCHAR}, #{parseMode,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, + #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, + #{updatedBy,jdbcType=VARCHAR}, #{config,jdbcType=LONGVARCHAR}) + + + insert into s2_plugin + + + id, + + + type, + + + domain, + + + pattern, + + + parse_mode, + + + name, + + + created_at, + + + created_by, + + + updated_at, + + + updated_by, + + + config, + + + + + #{id,jdbcType=BIGINT}, + + + #{type,jdbcType=VARCHAR}, + + + #{domain,jdbcType=VARCHAR}, + + + #{pattern,jdbcType=VARCHAR}, + + + #{parseMode,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{config,jdbcType=LONGVARCHAR}, + + + + + + update s2_plugin + + + type = #{type,jdbcType=VARCHAR}, + + + domain = #{domain,jdbcType=VARCHAR}, + + + pattern = #{pattern,jdbcType=VARCHAR}, + + + parse_mode = #{parseMode,jdbcType=VARCHAR}, + + + name = #{name,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + config = #{config,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_plugin + set type = #{type,jdbcType=VARCHAR}, + domain = #{domain,jdbcType=VARCHAR}, + pattern = #{pattern,jdbcType=VARCHAR}, + parse_mode = #{parseMode,jdbcType=VARCHAR}, + name = #{name,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + config = #{config,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update s2_plugin + set type = #{type,jdbcType=VARCHAR}, + domain = #{domain,jdbcType=VARCHAR}, + pattern = #{pattern,jdbcType=VARCHAR}, + parse_mode = #{parseMode,jdbcType=VARCHAR}, + name = #{name,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapperTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapperTest.java deleted file mode 100644 index 217cb9582..000000000 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/HanlpSchemaMapperTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tencent.supersonic.chat.application.mapper; - -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.test.context.ContextTest; -import org.junit.jupiter.api.Test; - -/** - * HanlpSchemaMapperTest - */ -class HanlpSchemaMapperTest extends ContextTest { - - @Test - void map() { - QueryContextReq queryContext = new QueryContextReq(); - queryContext.setChatId(1); - queryContext.setDomainId(2); - queryContext.setQueryText("supersonic按部门访问次数"); - HanlpSchemaMapper hanlpSchemaMapper = new HanlpSchemaMapper(); - hanlpSchemaMapper.map(queryContext); - } -} \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParserTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java similarity index 54% rename from chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParserTest.java rename to chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java index 14b67ec23..23d916e33 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeSemanticParserTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java @@ -1,19 +1,21 @@ package com.tencent.supersonic.chat.application.parser; import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.request.QueryContextReq; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.parser.rule.TimeRangeParser; import org.junit.jupiter.api.Test; -class TimeSemanticParserTest { +class TimeRangeParserTest { // private HeuristicQuerySelector voteStrategy = new HeuristicQuerySelector() { // @Override // public void init(List semanticParsers) { -// List queryMode = new ArrayList<>(Arrays.asList(EntityDetail.QUERY_MODE)); +// List queryMode = new ArrayList<>(Arrays.asList(EntityDetailQuery.QUERY_MODE)); // for(SemanticParser semanticParser : semanticParsers) { -// if(semanticParser.getName().equals(TimeSemanticParser.PARSER_MODE)) { +// if(semanticParser.getName().equals(TimeRangeParser.PARSER_MODE)) { // semanticParser.getQueryModes().clear(); // semanticParser.getQueryModes().addAll(queryMode); // } @@ -23,17 +25,17 @@ class TimeSemanticParserTest { @Test void parse() { - TimeSemanticParser timeSemanticParser = new TimeSemanticParser(); + TimeRangeParser timeRangeParser = new TimeRangeParser(); - QueryContextReq queryContext = new QueryContextReq(); + QueryRequest queryRequest = new QueryRequest(); ChatContext chatCtx = new ChatContext(); SchemaMapInfo schemaMap = new SchemaMapInfo(); - queryContext.setQueryText("supersonic最近30天访问次数"); - //voteStrategy.init(new ArrayList<>(Arrays.asList(timeSemanticParser))); - timeSemanticParser.parse(queryContext, chatCtx); + queryRequest.setQueryText("supersonic最近30天访问次数"); + //voteStrategy.init(new ArrayList<>(Arrays.asList(timeRangeParser))); + timeRangeParser.parse(new QueryContext(queryRequest), chatCtx); - //DateConf dateInfo = queryContext.getParseInfo(timeSemanticParser.getQueryModes().get(0)) + //DateConf dateInfo = queryContext.getParseInfo(timeRangeParser.getQueryModes().get(0)) // .getDateInfo(); //System.out.println(dateInfo); diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/AggregateSemanticParserTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/AggregateTypeParserTest.java similarity index 85% rename from chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/AggregateSemanticParserTest.java rename to chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/AggregateTypeParserTest.java index cc996969f..2677ef2e8 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/AggregateSemanticParserTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/aggregate/AggregateTypeParserTest.java @@ -2,15 +2,15 @@ package com.tencent.supersonic.chat.application.parser.aggregate; import static org.junit.Assert.assertEquals; -import com.tencent.supersonic.chat.application.parser.AggregateSemanticParser; -import com.tencent.supersonic.common.enums.AggregateTypeEnum; +import com.tencent.supersonic.chat.parser.rule.AggregateTypeParser; +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; import org.junit.jupiter.api.Test; -class AggregateSemanticParserTest { +class AggregateTypeParserTest { @Test void getAggregateParser() { - AggregateSemanticParser aggregateParser = new AggregateSemanticParser(); + AggregateTypeParser aggregateParser = new AggregateTypeParser(); AggregateTypeEnum aggregateType = aggregateParser.resolveAggregateType("supsersonic产品访问次数最大值"); assertEquals(aggregateType, AggregateTypeEnum.MAX); diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java new file mode 100644 index 000000000..470215470 --- /dev/null +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java @@ -0,0 +1,22 @@ +package com.tencent.supersonic.chat.mapper; + +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.request.QueryRequest; +import com.tencent.supersonic.chat.test.context.ContextTest; +import org.junit.jupiter.api.Test; + +/** + * HanlpDictMapperTest + */ +class HanlpDictMapperTest extends ContextTest { + + @Test + void map() { + QueryRequest queryRequest = new QueryRequest(); + queryRequest.setChatId(1); + queryRequest.setDomainId(2L); + queryRequest.setQueryText("supersonic按部门访问次数"); + HanlpDictMapper hanlpDictMapper = new HanlpDictMapper(); + hanlpDictMapper.map(new QueryContext(queryRequest)); + } +} \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/match/QueryMatchStrategyTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/match/QueryMatchStrategyTest.java similarity index 80% rename from chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/match/QueryMatchStrategyTest.java rename to chat/core/src/test/java/com/tencent/supersonic/chat/mapper/match/QueryMatchStrategyTest.java index 7a8856b47..c32ee810b 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/application/mapper/match/QueryMatchStrategyTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/match/QueryMatchStrategyTest.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.application.mapper.match; +package com.tencent.supersonic.chat.mapper.match; import com.tencent.supersonic.chat.test.context.ContextTest; import org.junit.jupiter.api.Test; diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java index 5ca6ebceb..c1d81d250 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java @@ -1,16 +1,15 @@ package com.tencent.supersonic.chat.test.context; -import com.tencent.supersonic.chat.domain.utils.ComponentFactory; -import com.tencent.supersonic.chat.infrastructure.mapper.ChatContextMapper; -import com.tencent.supersonic.chat.infrastructure.repository.ChatContextRepositoryImpl; -import com.tencent.supersonic.chat.infrastructure.semantic.RemoteSemanticLayerImpl; +import com.tencent.supersonic.chat.persistence.repository.impl.ChatContextRepositoryImpl; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.chat.persistence.mapper.ChatContextMapper; +import com.tencent.supersonic.knowledge.semantic.RemoteSemanticLayer; import com.tencent.supersonic.chat.test.ChatBizLauncher; -import com.tencent.supersonic.semantic.core.domain.DimensionService; -import com.tencent.supersonic.semantic.core.domain.DomainService; -import com.tencent.supersonic.semantic.core.domain.MetricService; -import com.tencent.supersonic.semantic.query.domain.QueryService; +import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.model.domain.DomainService; +import com.tencent.supersonic.semantic.model.domain.MetricService; +import com.tencent.supersonic.semantic.query.service.QueryService; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; @@ -25,7 +24,7 @@ import org.springframework.web.client.RestTemplate; @MockBean(DomainService.class) @MockBean(ChatContextMapper.class) @MockBean(RestTemplate.class) -@MockBean(RemoteSemanticLayerImpl.class) +@MockBean(RemoteSemanticLayer.class) @MockBean(ComponentFactory.class) //@MybatisTest //@AutoConfigureMybatis diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java index 81b75e7be..e79eaf500 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java @@ -6,28 +6,21 @@ import static org.mockito.Mockito.when; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.domain.service.QueryService; -import com.tencent.supersonic.semantic.api.core.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.DimensionResp; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.core.response.MetricResp; -import com.tencent.supersonic.semantic.api.core.response.MetricSchemaResp; -import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigResp; -import com.tencent.supersonic.chat.domain.pojo.config.ChatConfigRichResp; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetric; -import com.tencent.supersonic.chat.domain.pojo.config.DefaultMetricInfo; -import com.tencent.supersonic.chat.domain.pojo.config.EntityInternalDetail; -import com.tencent.supersonic.chat.domain.pojo.config.EntityRichInfo; -import com.tencent.supersonic.chat.domain.pojo.chat.DomainInfos; -import com.tencent.supersonic.chat.domain.service.ChatService; -import com.tencent.supersonic.chat.domain.utils.SchemaInfoConverter; -import com.tencent.supersonic.chat.infrastructure.mapper.ChatContextMapper; -import com.tencent.supersonic.chat.infrastructure.repository.ChatContextRepositoryImpl; -import com.tencent.supersonic.common.constant.Constants; -import com.tencent.supersonic.semantic.core.domain.DimensionService; -import com.tencent.supersonic.semantic.core.domain.DomainService; -import com.tencent.supersonic.semantic.core.domain.MetricService; +import com.tencent.supersonic.chat.config.*; +import com.tencent.supersonic.chat.persistence.repository.impl.ChatContextRepositoryImpl; +import com.tencent.supersonic.chat.service.QueryService; +import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import com.tencent.supersonic.chat.service.impl.ConfigServiceImpl; +import com.tencent.supersonic.chat.service.ChatService; +import com.tencent.supersonic.chat.persistence.mapper.ChatContextMapper; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.model.domain.DomainService; +import com.tencent.supersonic.semantic.model.domain.MetricService; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -47,7 +40,7 @@ public class MockBeansConfiguration { public static void buildHttpSemanticServiceImpl(SemanticLayer httpSemanticLayer, List dimensionDescs, List metricDescs) { - ChatConfigRichResp chaConfigRichDesc = new ChatConfigRichResp(); + ChatConfigRich chaConfigRichDesc = new ChatConfigRich(); DefaultMetric defaultMetricDesc = new DefaultMetric(); defaultMetricDesc.setUnit(3); defaultMetricDesc.setPeriod(Constants.DAY); @@ -79,10 +72,6 @@ public class MockBeansConfiguration { domainSchemaDesc.setDimensions(dimensionDescs); domainSchemaDesc.setMetrics(metricDescs); // when(httpSemanticLayer.getDomainSchemaInfo(anyLong())).thenReturn(domainSchemaDesc); - - DomainInfos domainInfos = new DomainInfos(); - when(SchemaInfoConverter.convert(httpSemanticLayer.getDomainSchemaInfo(anyList()))).thenReturn(domainInfos); - } public static void getDomainExtendMock(ConfigServiceImpl configService) { @@ -125,10 +114,6 @@ public class MockBeansConfiguration { public ChatContextRepositoryImpl getChatContextRepository() { return Mockito.mock(ChatContextRepositoryImpl.class); } -// @Bean -// public SemanticLayer getSemanticService() { -// return Mockito.mock(HttpSemanticServiceImpl.class); -// } @Bean public QueryService getQueryService() { diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/QueryServiceImplTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/QueryServiceImplTest.java deleted file mode 100644 index 9506aa6f4..000000000 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/QueryServiceImplTest.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.tencent.supersonic.chat.test.context; - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.request.QueryContextReq; -import com.tencent.supersonic.chat.application.mapper.HanlpSchemaMapper; -import com.tencent.supersonic.chat.application.mapper.QueryMatchStrategy; -import com.tencent.supersonic.chat.application.parser.DomainSemanticParser; -import com.tencent.supersonic.chat.domain.service.ChatService; -import com.tencent.supersonic.chat.test.ChatBizLauncher; -import com.tencent.supersonic.knowledge.infrastructure.nlp.Suggester; -import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ChatBizLauncher.class) -public class QueryServiceImplTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(QueryServiceImplTest.class); - -// @MockBean -// private QueryService queryService; - - //private SemanticLayer semanticLayer = mock(SemanticLayer.class); - -// @MockBean -// private DefaultSemanticLayerImpl semanticLayer; - //SemanticLayer - @Autowired - public QueryMatchStrategy queryMatchStrategy; - @Autowired(required = false) - public Suggester suggester; - @MockBean - private SemanticLayer semanticLayer;//= ComponentFactory.getSemanticLayer(); - -// @Before -// public void setUp() { -// //List getDomainSchemaInfo(List ids) -// List domainSchemaRespList=MockUtils.getChatContext(); -// Mockito.when(semanticLayer.getDomainSchemaInfo(Mockito.anyList())).thenReturn(domainSchemaRespList); -// } - @MockBean - private DomainSemanticParser domainSemanticParser; - @MockBean - private HanlpSchemaMapper hanlpSchemaMapper; - @MockBean - private ChatService chatService; - -//// @Autowired(required = false) -//// private ChatService chatService; - - //private SemanticLayer semanticLayer ; - - @Test - public void test() throws Exception { - QueryContextReq queryContextReq = getQueryContextReq("超音数访问次数"); - //hanlpSchemaMapper.map(queryContextReq); -// List terms = HanlpHelper.getSegment().seg(queryContextReq.getQueryText().toLowerCase()).stream() -// .collect(Collectors.toList()); -// LOGGER.info("terms::::{}",terms); -// MockUtils.putSuggester(); -// List matches = queryMatchStrategy.match(queryContextReq.getQueryText(), terms, queryContextReq.getDomainId()); -// HanlpHelper.transLetterOriginal(matches); -// HanlpSchemaMapperHelper.convertTermsToSchemaMapInfo(matches, queryContextReq.getMapInfo()); - HanlpSchemaMapper hanlpSchemaMapper = new HanlpSchemaMapper(); - hanlpSchemaMapper.map(queryContextReq); - //QueryContextReq queryContextReq=MockUtils.getQueryContextReq("METRIC_FILTER"); - LOGGER.info("QueryContextReq::::{}", queryContextReq.getMapInfo().getMatchedDomains()); - LOGGER.info("QueryContextReq::::{}", queryContextReq.getMapInfo().getDomainElementMatches()); - LOGGER.info("QueryContextReq::::{}", queryContextReq); - -// //chatService=new ChatServiceImpl(); -// ChatContext chatCtx = chatService.getOrCreateContext(queryContextReq.getChatId()); -// if (chatCtx == null) { -// chatCtx=new ChatContext(); -// chatCtx.setChatId(queryContextReq.getChatId()); -// } -// LOGGER.info("chatService::::{}",chatService); -// LOGGER.info("ChatContext::::{}",chatCtx); - ChatContext chatCtx = new ChatContext();//MockUtils.getChatContext1(); - //semanticLayer = ComponentFactory.getSemanticLayer(); -// DomainSemanticParser domainSemanticParser=new DomainSemanticParser(); -// domainSemanticParser.parse(queryContextReq,chatCtx); - - //DomainSemanticParser - - //domainSemanticParser=new DomainSemanticParser(); - LOGGER.info("domainSemanticParser::::{}", domainSemanticParser); - //SemanticLayer semanticLayer= mock(SemanticLayer.class); - //List domainSchemaRespList=MockUtils.getChatContext(); - -// //SemanticLayer semanticLayer = mock(SemanticLayer.class); -// when(semanticLayer.getDomainSchemaInfo(Mockito.anyList())).thenReturn(domainSchemaRespList); -// domainSemanticParser.parse(queryContextReq,chatCtx); -// LOGGER.info("QueryContextReq::::{}",queryContextReq); -// TimeSemanticParser timeSemanticParser=new TimeSemanticParser(); -// timeSemanticParser.parse(queryContextReq,chatCtx); -// AggregateSemanticParser aggregateSemanticParser=new AggregateSemanticParser(); -// aggregateSemanticParser.parse(queryContextReq,chatCtx); -// //PickStrategy pickStrategy = ComponentFactory.getPickStrategy(); -// LOGGER.info("pickStrategy::::{}",pickStrategy); -// pickStrategy=new ScoreBasedPickStrategy(); -// SemanticParseInfo semanticParse = pickStrategy.pick(queryContextReq, chatCtx); -// LOGGER.info("semanticParse::::{}",semanticParse); - //SemanticQueryExecutorHelper semanticQueryExecutorHelper=new SemanticQueryExecutorHelper(); - //semanticQueryExecutorHelper.execute(queryContextReq.getParseInfo(),queryContextReq.getUser()); -// LOGGER.info("queryContextReq::::{}",queryContextReq.getMapInfo().getMatchedDomains()); -// LOGGER.info("queryContextReq::::{}",queryContextReq.getMapInfo().getDomainElementMatches()); -// LOGGER.info("queryContextReq::::{}",queryContextReq.getCandidateParseInfos()); -// LOGGER.info("queryContextReq::::{}",queryContextReq.getDomainId()); - -// List queryExecutors = ComponentFactory.getQueryExecutors(); -// QueryResultResp queryResponse=new QueryResultResp(); -// for (QueryExecutor executor : queryExecutors) { -// queryResponse = executor.execute(semanticParse, queryContextReq.getUser()); -// if (queryResponse != null) { -// // update chat context after a successful semantic query -// if (queryContextReq.isSaveAnswer() && queryResponse.getQueryState() == QueryState.NORMAL.getState()) { -// chatService.updateContext(chatCtx, queryContextReq, semanticParse); -// } -// queryResponse.setChatContext(chatCtx.getParseInfo()); -// chatService.addQuery(queryResponse, queryContextReq, chatCtx); -// break; -// } -// } - - //assertThat(found.getName()).isEqualTo(name); - } - - public QueryContextReq getQueryContextReq(String query) { - QueryContextReq queryContextReq = new QueryContextReq(); - queryContextReq.setQueryText(query);//"alice的访问次数" - queryContextReq.setChatId(1); - queryContextReq.setUser(new User(1L, "admin", "admin", "admin@email")); - return queryContextReq; - } - - @TestConfiguration - static class EmployeeServiceImplTestContextConfiguration { - - @Bean - public QueryMatchStrategy queryMatchStrategyService() { - return new QueryMatchStrategy(); - } -// @Bean -// public SemanticLayer querySemanticLayer() { -// return new DefaultSemanticLayerImpl(); -// } - //@Bean - //public DomainSemanticParser queryDomainSemanticParser() { - // return new DomainSemanticParser(); - //} - -// @Bean -// public RestTemplate getRestTemplate(){ -// return new RestTemplate(); -// } -// -// @Bean -// public DefaultSemanticInternalUtils getUtils(){ -// return new DefaultSemanticInternalUtils(); -// } - - } -} diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java index ad0e0b887..16fad98df 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java @@ -1,12 +1,13 @@ package com.tencent.supersonic.chat.test.context; import com.google.gson.Gson; -import com.tencent.supersonic.chat.api.pojo.Filter; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import com.tencent.supersonic.common.enums.AggregateTypeEnum; +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.SchemaItem; + import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; @@ -31,9 +32,9 @@ public class SemanticParseObjectHelper { private static SemanticParseInfo getSemanticParseInfo(SemanticParseJson semanticParseJson) { Long domain = semanticParseJson.getDomain(); - Set dimensionList = new LinkedHashSet(); - Set metricList = new LinkedHashSet(); - Set chatFilters = new LinkedHashSet(); + Set dimensionList = new LinkedHashSet(); + Set metricList = new LinkedHashSet(); + Set chatFilters = new LinkedHashSet(); if (semanticParseJson.getFilter() != null && semanticParseJson.getFilter().size() > 0) { for (List filter : semanticParseJson.getFilter()) { @@ -52,7 +53,6 @@ public class SemanticParseObjectHelper { semanticParseInfo.setDimensionFilters(chatFilters); semanticParseInfo.setAggType(semanticParseJson.getAggregateType()); - semanticParseInfo.setDomainId(domain); semanticParseInfo.setQueryMode(semanticParseJson.getQueryMode()); semanticParseInfo.setMetrics(metricList); semanticParseInfo.setDimensions(dimensionList); @@ -72,9 +72,9 @@ public class SemanticParseObjectHelper { return null; } - private static Filter getChatFilter(List filters) { + private static QueryFilter getChatFilter(List filters) { if (filters.size() > 1) { - Filter chatFilter = new Filter(); + QueryFilter chatFilter = new QueryFilter(); chatFilter.setBizName(filters.get(1)); chatFilter.setOperator(FilterOperatorEnum.getSqlOperator(filters.get(2))); @@ -91,18 +91,15 @@ public class SemanticParseObjectHelper { return null; } - - private static SchemaItem getMetric(String bizName, Long domainId) { - SchemaItem metric = new SchemaItem(); + private static SchemaElement getMetric(String bizName, Long domainId) { + SchemaElement metric = new SchemaElement(); metric.setBizName(bizName); - //metric.set(domainId); return metric; } - private static SchemaItem getDimension(String bizName, Long domainId) { - SchemaItem dimension = new SchemaItem(); + private static SchemaElement getDimension(String bizName, Long domainId) { + SchemaElement dimension = new SchemaElement(); dimension.setBizName(bizName); - //dimension.setDomainId(domainId); return dimension; } diff --git a/chat/knowledge/pom.xml b/chat/knowledge/pom.xml index f6b39bbc8..5fed94b0e 100644 --- a/chat/knowledge/pom.xml +++ b/chat/knowledge/pom.xml @@ -102,6 +102,16 @@ auth-api ${project.version} + + com.tencent.supersonic + chat-api + ${project.version} + + + com.tencent.supersonic + semantic-query + ${project.version} + diff --git a/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java b/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java index ec978fe09..2f1a01f93 100644 --- a/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java +++ b/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java @@ -36,7 +36,7 @@ public abstract class BaseNode implements Comparable { */ protected V value; - public String prefix = null; + protected String prefix = null; public BaseNode transition(String path, int begin) { BaseNode cur = this; diff --git a/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/common/Term.java b/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/common/Term.java index 50332957c..fa52780f6 100644 --- a/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/common/Term.java +++ b/chat/knowledge/src/main/java/com/hankcs/hanlp/seg/common/Term.java @@ -3,7 +3,7 @@ package com.hankcs.hanlp.seg.common; import com.hankcs.hanlp.corpus.tag.Nature; import com.hankcs.hanlp.dictionary.CoreDictionary; import com.hankcs.hanlp.dictionary.CustomDictionary; -import com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; import lombok.Data; import lombok.ToString; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java new file mode 100644 index 000000000..5deb2dda1 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java @@ -0,0 +1,69 @@ +package com.tencent.supersonic.knowledge; + +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.knowledge.service.KnowledgeService; +import com.tencent.supersonic.knowledge.service.WordService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +public class ApplicationStartedInit implements ApplicationListener { + + @Autowired + private KnowledgeService knowledgeService; + @Autowired + private WordService wordService; + @Autowired + private SchemaService schemaService; + + @Override + public void onApplicationEvent(ApplicationStartedEvent event) { + try { + log.debug("ApplicationStartedInit start"); + + List dictWords = wordService.getAllDictWords(); + wordService.setPreDictWords(dictWords); + knowledgeService.reloadAllData(dictWords); + + log.debug("ApplicationStartedInit end"); + } catch (Exception e) { + log.error("ApplicationStartedInit error", e); + } + } + + /*** + * reload knowledge task + */ + @Scheduled(cron = "${reload.knowledge.corn:0 0/1 * * * ?}") + public void reloadKnowledge() { + log.debug("reloadKnowledge start"); + + try { + List dictWords = wordService.getAllDictWords(); + List preDictWords = wordService.getPreDictWords(); + + if (CollectionUtils.isEqualCollection(dictWords, preDictWords)) { + log.debug("dictWords has not changed, reloadKnowledge end"); + return; + } + log.info("dictWords has changed"); + wordService.setPreDictWords(dictWords); + knowledgeService.updateOnlineKnowledge(wordService.getAllDictWords()); + schemaService.getCache().refresh(SchemaService.ALL_CACHE); + + } catch (Exception e) { + log.error("reloadKnowledge error", e); + } + + log.debug("reloadKnowledge end"); + } +} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/BaseWordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/BaseWordNature.java deleted file mode 100644 index fe5de093c..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/BaseWordNature.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.ArrayList; -import java.util.List; -import lombok.extern.slf4j.Slf4j; - -/** - * base word nature - */ -@Slf4j -public abstract class BaseWordNature { - - /** - * 获取所有wordNature - * - * @param itemDOS - * @return - */ - public List getWordNatureList(List itemDOS) { - List wordNatures = new ArrayList<>(); - try { - wordNatures = getWordNaturesWithException(itemDOS); - } catch (Exception e) { - log.error("getWordNatureList error,", e); - } - return wordNatures; - } - - public List getWordNaturesWithException(List itemDOS) { - - List wordNatures = new ArrayList<>(); - - for (ItemDO itemDO : itemDOS) { - wordNatures.addAll(getWordNature(itemDO.getName(), itemDO)); - } - return wordNatures; - } - - public abstract List getWordNature(String word, ItemDO itemDO); - - public Integer getElementID(String nature) { - String[] split = nature.split(NatureType.NATURE_SPILT); - if (split.length >= 3) { - return Integer.valueOf(split[2]); - } - return 0; - } - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DimensionWordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DimensionWordNature.java deleted file mode 100644 index 7c5bae307..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DimensionWordNature.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.google.common.collect.Lists; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -/** - * dimension word nature - */ -@Service -public class DimensionWordNature extends BaseWordNature { - - @Value("${nlp.dimension.use.suffix:true}") - private boolean nlpDimensionUseSuffix = true; - - - @Override - public List getWordNature(String word, ItemDO itemDO) { - List result = Lists.newArrayList(); - result.add(getOnwWordNature(word, itemDO, false)); - if (nlpDimensionUseSuffix) { - String reverseWord = StringUtils.reverse(word); - if (StringUtils.isNotEmpty(word) && !word.equalsIgnoreCase(reverseWord)) { - result.add(getOnwWordNature(reverseWord, itemDO, true)); - } - } - return result; - } - - private WordNature getOnwWordNature(String word, ItemDO itemDO, boolean isSuffix) { - WordNature wordNature = new WordNature(); - wordNature.setWord(word); - Integer domainId = itemDO.getDomain(); - String nature = NatureType.NATURE_SPILT + domainId + NatureType.NATURE_SPILT + itemDO.getItemId() - + NatureType.DIMENSION.getType(); - if (isSuffix) { - nature = NatureType.NATURE_SPILT + domainId + NatureType.NATURE_SPILT + itemDO.getItemId() - + NatureType.SUFFIX.getType() + NatureType.DIMENSION.getType(); - } - wordNature.setNatureWithFrequency(String.format("%s 100000", nature)); - return wordNature; - } - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DomainWordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DomainWordNature.java deleted file mode 100644 index d76234985..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/DomainWordNature.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.google.common.collect.Lists; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.List; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * domain word nature - */ -@Service -@Slf4j -public class DomainWordNature extends BaseWordNature { - - @Override - public List getWordNature(String word, ItemDO itemDO) { - List result = Lists.newArrayList(); - WordNature wordNature = new WordNature(); - wordNature.setWord(word); - Integer domainId = itemDO.getDomain(); - String nature = NatureType.NATURE_SPILT + domainId; - wordNature.setNatureWithFrequency(String.format("%s 100000", nature)); - result.add(wordNature); - return result; - } - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/EntityWordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/EntityWordNature.java deleted file mode 100644 index 5682b67cc..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/EntityWordNature.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.google.common.collect.Lists; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.List; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * dimension value wordNature - */ -@Service -@Slf4j -public class EntityWordNature extends BaseWordNature { - - @Override - public List getWordNature(String word, ItemDO itemDO) { - List result = Lists.newArrayList(); - WordNature wordNature = new WordNature(); - wordNature.setWord(word); - Integer domain = itemDO.getDomain(); - String nature = NatureType.NATURE_SPILT + domain + NatureType.NATURE_SPILT + itemDO.getItemId() - + NatureType.ENTITY.getType(); - wordNature.setNatureWithFrequency(String.format("%s 200000", nature)); - result.add(wordNature); - return result; - } - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/MetricWordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/MetricWordNature.java deleted file mode 100644 index 34bae35b9..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/MetricWordNature.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.google.common.collect.Lists; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -/** - * Metric WordNature - */ -@Service -public class MetricWordNature extends BaseWordNature { - - @Value("${nlp.metric.use.suffix:true}") - private boolean nlpMetricUseSuffix = true; - - @Override - public List getWordNature(String word, ItemDO itemDO) { - List result = Lists.newArrayList(); - result.add(getOnwWordNature(word, itemDO, false)); - if (nlpMetricUseSuffix) { - String reverseWord = StringUtils.reverse(word); - if (!word.equalsIgnoreCase(reverseWord)) { - result.add(getOnwWordNature(reverseWord, itemDO, true)); - } - } - return result; - } - - private WordNature getOnwWordNature(String word, ItemDO itemDO, boolean isSuffix) { - WordNature wordNature = new WordNature(); - wordNature.setWord(word); - Integer domainId = itemDO.getDomain(); - String nature = NatureType.NATURE_SPILT + domainId + NatureType.NATURE_SPILT + itemDO.getItemId() - + NatureType.METRIC.getType(); - if (isSuffix) { - nature = NatureType.NATURE_SPILT + domainId + NatureType.NATURE_SPILT + itemDO.getItemId() - + NatureType.SUFFIX.getType() + NatureType.METRIC.getType(); - } - wordNature.setNatureWithFrequency(String.format("%s 100000", nature)); - return wordNature; - } - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/OnlineKnowledgeServiceImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/OnlineKnowledgeServiceImpl.java deleted file mode 100644 index b9e624948..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/OnlineKnowledgeServiceImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import com.tencent.supersonic.knowledge.domain.service.OnlineKnowledgeService; -import com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper; -import com.tencent.supersonic.knowledge.infrastructure.nlp.Suggester; -import java.util.List; -import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - -/** - * online knowledge service impl - */ -@Service -public class OnlineKnowledgeServiceImpl implements OnlineKnowledgeService { - - private final Logger logger = LoggerFactory.getLogger(OnlineKnowledgeServiceImpl.class); - - public void updateSemanticKnowledge(List natures) { - - List prefixes = natures.stream() - .filter(entry -> !entry.getNatureWithFrequency().contains(NatureType.SUFFIX.getType())) - .collect(Collectors.toList()); - - for (WordNature nature : prefixes) { - HanlpHelper.addToCustomDictionary(nature); - } - - List suffixes = natures.stream() - .filter(entry -> entry.getNatureWithFrequency().contains(NatureType.SUFFIX.getType())) - .collect(Collectors.toList()); - - Suggester.loadSuffix(suffixes); - } - - - public void reloadAllData(List natures) { - // 1. reload custom knowledge - try { - HanlpHelper.reloadCustomDictionary(); - } catch (Exception e) { - logger.error("reloadCustomDictionary error", e); - } - - // 2. update online knowledge - updateOnlineKnowledge(natures); - } - - public void updateOnlineKnowledge(List natures) { - try { - updateSemanticKnowledge(natures); - } catch (Exception e) { - logger.error("updateSemanticKnowledge error", e); - } - } - -} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/ValueWordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/ValueWordNature.java deleted file mode 100644 index 7f4d58c04..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/ValueWordNature.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - -import com.google.common.collect.Lists; -import com.tencent.supersonic.common.nlp.ItemDO; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.List; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * dimension value wordNature - */ -@Service -@Slf4j -public class ValueWordNature extends BaseWordNature { - - @Override - public List getWordNature(String word, ItemDO itemDO) { - List result = Lists.newArrayList(); - WordNature wordNature = new WordNature(); - wordNature.setWord(word); - Integer domain = itemDO.getDomain(); - String nature = NatureType.NATURE_SPILT + domain + NatureType.NATURE_SPILT + itemDO.getItemId(); - wordNature.setNatureWithFrequency(String.format("%s 100000", nature)); - result.add(wordNature); - return result; - } - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/WordNatureStrategyFactory.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/WordNatureStrategyFactory.java deleted file mode 100644 index e69f063e6..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/application/online/WordNatureStrategyFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tencent.supersonic.knowledge.application.online; - - -import com.tencent.supersonic.common.nlp.NatureType; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * WordNature Strategy Factory - */ -public class WordNatureStrategyFactory { - - private static Map strategyFactory = new ConcurrentHashMap<>(); - - static { - strategyFactory.put(NatureType.DIMENSION, new DimensionWordNature()); - strategyFactory.put(NatureType.METRIC, new MetricWordNature()); - strategyFactory.put(NatureType.DOMAIN, new DomainWordNature()); - strategyFactory.put(NatureType.ENTITY, new EntityWordNature()); - strategyFactory.put(NatureType.VALUE, new ValueWordNature()); - - - } - - public static BaseWordNature get(NatureType strategyType) { - return strategyFactory.get(strategyType); - } -} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictConfig.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java similarity index 74% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictConfig.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java index 5c9d4ace2..a3a17e080 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictConfig.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java @@ -1,6 +1,7 @@ -package com.tencent.supersonic.knowledge.domain.pojo; +package com.tencent.supersonic.knowledge.dictionary; import java.util.List; + import lombok.Data; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictTaskFilter.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictTaskFilter.java similarity index 76% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictTaskFilter.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictTaskFilter.java index 0ab2a7a14..c5758e8cc 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictTaskFilter.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictTaskFilter.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.domain.pojo; +package com.tencent.supersonic.knowledge.dictionary; public class DictTaskFilter { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictUpdateMode.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java similarity index 92% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictUpdateMode.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java index 4b3d6415d..df5cd9173 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DictUpdateMode.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.domain.pojo; +package com.tencent.supersonic.knowledge.dictionary; public enum DictUpdateMode { diff --git a/common/src/main/java/com/tencent/supersonic/common/nlp/WordNature.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWord.java similarity index 84% rename from common/src/main/java/com/tencent/supersonic/common/nlp/WordNature.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWord.java index 75e9950b9..955864006 100644 --- a/common/src/main/java/com/tencent/supersonic/common/nlp/WordNature.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWord.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.nlp; +package com.tencent.supersonic.knowledge.dictionary; import java.util.Objects; import lombok.Data; @@ -9,14 +9,12 @@ import lombok.ToString; */ @Data @ToString -public class WordNature { +public class DictWord { private String word; - private String nature; private String natureWithFrequency; - @Override public boolean equals(Object o) { if (this == o) { @@ -25,7 +23,7 @@ public class WordNature { if (o == null || getClass() != o.getClass()) { return false; } - WordNature that = (WordNature) o; + DictWord that = (DictWord) o; return Objects.equals(word, that.word) && Objects.equals(natureWithFrequency, that.natureWithFrequency); } diff --git a/common/src/main/java/com/tencent/supersonic/common/nlp/NatureType.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java similarity index 63% rename from common/src/main/java/com/tencent/supersonic/common/nlp/NatureType.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java index 302dbc633..bcb391bf4 100644 --- a/common/src/main/java/com/tencent/supersonic/common/nlp/NatureType.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.nlp; +package com.tencent.supersonic.knowledge.dictionary; import org.apache.commons.lang3.StringUtils; @@ -6,7 +6,7 @@ import org.apache.commons.lang3.StringUtils; * nature type * such as : metric、dimension etc. */ -public enum NatureType { +public enum DictWordType { METRIC("metric"), DIMENSION("dimension"), VALUE("value"), @@ -17,13 +17,12 @@ public enum NatureType { NUMBER("m"), SUFFIX("suffix"); + + public static final String NATURE_SPILT = "_"; + public static final String SPACE = " "; private String type; - public static String NATURE_SPILT = "_"; - - public static String SPACE = " "; - - NatureType(String type) { + DictWordType(String type) { this.type = type; } @@ -31,17 +30,19 @@ public enum NatureType { return NATURE_SPILT + type; } - public static NatureType getNatureType(String nature) { + + + public static DictWordType getNatureType(String nature) { if (StringUtils.isEmpty(nature) || !nature.startsWith(NATURE_SPILT)) { return null; } - for (NatureType natureType : values()) { - if (nature.endsWith(natureType.getType())) { - return natureType; + for (DictWordType dictWordType : values()) { + if (nature.endsWith(dictWordType.getType())) { + return dictWordType; } } //domain - String[] natures = nature.split(NatureType.NATURE_SPILT); + String[] natures = nature.split(DictWordType.NATURE_SPILT); if (natures.length == 2 && StringUtils.isNumeric(natures[1])) { return DOMAIN; } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/DictionaryAttributeUtil.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictionaryAttributeUtil.java similarity index 96% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/DictionaryAttributeUtil.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictionaryAttributeUtil.java index c86cf68dc..6743a2cd0 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/DictionaryAttributeUtil.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictionaryAttributeUtil.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.dictionary; import com.hankcs.hanlp.corpus.tag.Nature; import com.hankcs.hanlp.dictionary.CoreDictionary; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValue2DictCommand.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java similarity index 70% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValue2DictCommand.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java index 793e319ae..9a2821bdf 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValue2DictCommand.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java @@ -1,9 +1,11 @@ -package com.tencent.supersonic.knowledge.domain.pojo; +package com.tencent.supersonic.knowledge.dictionary; import java.util.HashMap; import java.util.List; import java.util.Map; + +import com.tencent.supersonic.knowledge.dictionary.DictUpdateMode; import lombok.Data; @Data diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValueDictInfo.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValueDictInfo.java similarity index 73% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValueDictInfo.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValueDictInfo.java index b066d9a48..153e6afdd 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValueDictInfo.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValueDictInfo.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.knowledge.domain.pojo; +package com.tencent.supersonic.knowledge.dictionary; -import com.tencent.supersonic.common.enums.TaskStatusEnum; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import java.util.Date; import lombok.Data; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValueInfo.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValueInfo.java similarity index 81% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValueInfo.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValueInfo.java index e60362be7..0a4f35c65 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/pojo/DimValueInfo.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValueInfo.java @@ -1,7 +1,7 @@ -package com.tencent.supersonic.knowledge.domain.pojo; +package com.tencent.supersonic.knowledge.dictionary; -import com.tencent.supersonic.common.enums.TypeEnums; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; import java.util.List; import javax.validation.constraints.NotNull; @@ -23,4 +23,4 @@ public class DimValueInfo { private List whiteList; private List ruleList; private Boolean isDictInfo; -} \ No newline at end of file +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/FileHandler.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/FileHandler.java similarity index 80% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/FileHandler.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/FileHandler.java index cc603cd1c..b4cee26b1 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/FileHandler.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/FileHandler.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.domain; +package com.tencent.supersonic.knowledge.dictionary; import java.util.List; @@ -12,15 +12,6 @@ public interface FileHandler { */ void backupFile(String fileName); - /** - * move files to a specific directory - * not backup - * - * @param fileName - * @param targetDirectory - */ - void moveFile(String fileName, String targetDirectory); - /** * create a directory * diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HadoopFileIOAdapter.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java similarity index 73% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HadoopFileIOAdapter.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java index 1721cfddb..f948c2817 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HadoopFileIOAdapter.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java @@ -1,23 +1,22 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.dictionary; import com.hankcs.hanlp.corpus.io.IIOAdapter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; + +import lombok.extern.slf4j.Slf4j; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@Slf4j public class HadoopFileIOAdapter implements IIOAdapter { - private static final Logger LOGGER = LoggerFactory.getLogger(HadoopFileIOAdapter.class); - @Override public InputStream open(String path) throws IOException { - LOGGER.info("open:{}", path); + log.info("open:{}", path); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(path), conf); return fs.open(new Path(path)); @@ -25,7 +24,7 @@ public class HadoopFileIOAdapter implements IIOAdapter { @Override public OutputStream create(String path) throws IOException { - LOGGER.info("create:{}", path); + log.info("create:{}", path); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(path), conf); return fs.create(new Path(path)); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/LocalFileConfig.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/LocalFileConfig.java similarity index 88% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/LocalFileConfig.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/LocalFileConfig.java index 4179f1a61..80aec2a1c 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/LocalFileConfig.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/LocalFileConfig.java @@ -1,6 +1,6 @@ -package com.tencent.supersonic.knowledge.domain; +package com.tencent.supersonic.knowledge.dictionary; -import com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.io.FileNotFoundException; import lombok.Data; import lombok.extern.slf4j.Slf4j; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/LocalFileHandler.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/LocalFileHandler.java similarity index 88% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/LocalFileHandler.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/LocalFileHandler.java index d651b1bee..2752b0cca 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/LocalFileHandler.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/LocalFileHandler.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.domain; +package com.tencent.supersonic.knowledge.dictionary; import java.io.BufferedWriter; @@ -44,18 +44,6 @@ public class LocalFileHandler implements FileHandler { } - @Override - public void moveFile(String filePath, String targetDirectoryPath) { - Path sourcePath = Paths.get(filePath); - Path targetPath = Paths.get(targetDirectoryPath, sourcePath.getFileName().toString()); - try { - Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); - log.info("File moved successfully!"); - } catch (IOException e) { - log.info("Failed to move file: " + e.getMessage()); - } - } - @Override public void createDir(String directoryPath) { Path path = Paths.get(directoryPath); @@ -136,4 +124,4 @@ public class LocalFileHandler implements FileHandler { } return Files.newBufferedWriter(Paths.get(filePath), StandardCharsets.UTF_8); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/tencent/supersonic/common/nlp/MapResult.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java similarity index 95% rename from common/src/main/java/com/tencent/supersonic/common/nlp/MapResult.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java index c4d61caac..aa2a7e9ab 100644 --- a/common/src/main/java/com/tencent/supersonic/common/nlp/MapResult.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.nlp; +package com.tencent.supersonic.knowledge.dictionary; import java.io.Serializable; import java.util.List; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/MultiCustomDictionary.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java similarity index 97% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/MultiCustomDictionary.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java index 2a678cf98..d2b732ca8 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/MultiCustomDictionary.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.dictionary; import static com.hankcs.hanlp.utility.Predefine.logger; @@ -14,6 +14,8 @@ import com.hankcs.hanlp.dictionary.other.CharTable; import com.hankcs.hanlp.utility.LexiconUtility; import com.hankcs.hanlp.utility.Predefine; import com.hankcs.hanlp.utility.TextUtility; +import com.tencent.supersonic.knowledge.service.SearchService; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.io.BufferedOutputStream; import java.io.BufferedReader; @@ -109,13 +111,13 @@ public class MultiCustomDictionary extends DynamicCustomDictionary { attribute = DictionaryAttributeUtil.getAttribute(map.get(word), attribute); map.put(word, attribute); if (addToSuggeterTrie) { - Suggester.put(word, attribute); + SearchService.put(word, attribute); } } else { map.put(word, attribute); if (addToSuggeterTrie) { - Suggester.put(word, attribute); + SearchService.put(word, attribute); } } } @@ -125,6 +127,20 @@ public class MultiCustomDictionary extends DynamicCustomDictionary { } } + public boolean load(String... path) { + this.path = path; + long start = System.currentTimeMillis(); + if (!this.loadMainDictionary(path[0])) { + Predefine.logger.warning("自定义词典" + Arrays.toString(path) + "加载失败"); + return false; + } else { + Predefine.logger.info( + "自定义词典加载成功:" + this.dat.size() + "个词条,耗时" + (System.currentTimeMillis() - start) + "ms"); + this.path = path; + return true; + } + } + /*** * load main dictionary * @param mainPath @@ -176,7 +192,7 @@ public class MultiCustomDictionary extends DynamicCustomDictionary { logger.info("正在构建DoubleArrayTrie……"); dat.build(map); if (addToSuggestTrie) { - // Suggester.save(); + // SearchService.save(); } if (isCache) { // 缓存成dat文件,下次加载会快很多 @@ -219,6 +235,10 @@ public class MultiCustomDictionary extends DynamicCustomDictionary { } } + public boolean loadMainDictionary(String mainPath) { + return loadMainDictionary(mainPath, this.path, this.dat, true, addToSuggesterTrie); + } + public static boolean loadDat(String path, DoubleArrayTrie dat) { return loadDat(path, HanLP.Config.CustomDictionaryPath, dat); } @@ -303,24 +323,6 @@ public class MultiCustomDictionary extends DynamicCustomDictionary { return word; } - public boolean load(String... path) { - this.path = path; - long start = System.currentTimeMillis(); - if (!this.loadMainDictionary(path[0])) { - Predefine.logger.warning("自定义词典" + Arrays.toString(path) + "加载失败"); - return false; - } else { - Predefine.logger.info( - "自定义词典加载成功:" + this.dat.size() + "个词条,耗时" + (System.currentTimeMillis() - start) + "ms"); - this.path = path; - return true; - } - } - - public boolean loadMainDictionary(String mainPath) { - return loadMainDictionary(mainPath, this.path, this.dat, true, addToSuggesterTrie); - } - public boolean reload() { if (this.path != null && this.path.length != 0) { IOUtil.deleteFile(this.path[0] + ".bin"); @@ -368,7 +370,7 @@ public class MultiCustomDictionary extends DynamicCustomDictionary { // return true; } if (addToSuggesterTrie) { - Suggester.put(word, att); + SearchService.put(word, att); } return true; } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java new file mode 100644 index 000000000..a600b972c --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java @@ -0,0 +1,49 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + +import java.util.ArrayList; +import java.util.List; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import lombok.extern.slf4j.Slf4j; + +/** + * base word nature + */ +@Slf4j +public abstract class BaseWordBuilder { + + public static final Long DEFAULT_FREQUENCY = 100000L; + + public List getDictWords(List schemaElements) { + List dictWords = new ArrayList<>(); + try { + dictWords = getDictWordsWithException(schemaElements); + } catch (Exception e) { + log.error("getWordNatureList error,", e); + } + return dictWords; + } + + protected List getDictWordsWithException(List schemaElements) { + + List dictWords = new ArrayList<>(); + + for (SchemaElement schemaElement : schemaElements) { + dictWords.addAll(doGet(schemaElement.getName(), schemaElement)); + } + return dictWords; + } + + protected abstract List doGet(String word, SchemaElement schemaElement); + + public Long getElementID(String nature) { + String[] split = nature.split(DictWordType.NATURE_SPILT); + if (split.length >= 3) { + return Long.valueOf(split[2]); + } + return 0L; + } + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java new file mode 100644 index 000000000..9bf4718b9 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java @@ -0,0 +1,51 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + +import com.google.common.collect.Lists; + +import java.util.List; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * dimension word nature + */ +@Service +public class DimensionWordBuilder extends BaseWordBuilder { + + @Value("${nlp.dimension.use.suffix:true}") + private boolean nlpDimensionUseSuffix = true; + + + @Override + public List doGet(String word, SchemaElement schemaElement) { + List result = Lists.newArrayList(); + result.add(getOnwWordNature(word, schemaElement, false)); + if (nlpDimensionUseSuffix) { + String reverseWord = StringUtils.reverse(word); + if (StringUtils.isNotEmpty(word) && !word.equalsIgnoreCase(reverseWord)) { + result.add(getOnwWordNature(reverseWord, schemaElement, true)); + } + } + return result; + } + + private DictWord getOnwWordNature(String word, SchemaElement schemaElement, boolean isSuffix) { + DictWord dictWord = new DictWord(); + dictWord.setWord(word); + Long domainId = schemaElement.getDomain(); + String nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + + DictWordType.DIMENSION.getType(); + if (isSuffix) { + nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + + DictWordType.SUFFIX.getType() + DictWordType.DIMENSION.getType(); + } + dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); + return dictWord; + } + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java new file mode 100644 index 000000000..f4c037bfa --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java @@ -0,0 +1,32 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + +import com.google.common.collect.Lists; + +import java.util.List; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * domain word nature + */ +@Service +@Slf4j +public class DomainWordBuilder extends BaseWordBuilder { + + @Override + public List doGet(String word, SchemaElement schemaElement) { + List result = Lists.newArrayList(); + DictWord dictWord = new DictWord(); + dictWord.setWord(word); + Long domainId = schemaElement.getDomain(); + String nature = DictWordType.NATURE_SPILT + domainId; + dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); + result.add(dictWord); + return result; + } + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java new file mode 100644 index 000000000..98a2ae368 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java @@ -0,0 +1,33 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + +import com.google.common.collect.Lists; + +import java.util.List; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * dimension value wordNature + */ +@Service +@Slf4j +public class EntityWordBuilder extends BaseWordBuilder { + + @Override + public List doGet(String word, SchemaElement schemaElement) { + List result = Lists.newArrayList(); + DictWord dictWord = new DictWord(); + dictWord.setWord(word); + Long domain = schemaElement.getDomain(); + String nature = DictWordType.NATURE_SPILT + domain + DictWordType.NATURE_SPILT + schemaElement.getId() + + DictWordType.ENTITY.getType(); + dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY * 2, nature)); + result.add(dictWord); + return result; + } + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java new file mode 100644 index 000000000..9802d4243 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java @@ -0,0 +1,50 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + +import com.google.common.collect.Lists; + +import java.util.List; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * Metric DictWord + */ +@Service +public class MetricWordBuilder extends BaseWordBuilder { + + @Value("${nlp.metric.use.suffix:true}") + private boolean nlpMetricUseSuffix = true; + + @Override + public List doGet(String word, SchemaElement schemaElement) { + List result = Lists.newArrayList(); + result.add(getOnwWordNature(word, schemaElement, false)); + if (nlpMetricUseSuffix) { + String reverseWord = StringUtils.reverse(word); + if (!word.equalsIgnoreCase(reverseWord)) { + result.add(getOnwWordNature(reverseWord, schemaElement, true)); + } + } + return result; + } + + private DictWord getOnwWordNature(String word, SchemaElement schemaElement, boolean isSuffix) { + DictWord dictWord = new DictWord(); + dictWord.setWord(word); + Long domainId = schemaElement.getDomain(); + String nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + + DictWordType.METRIC.getType(); + if (isSuffix) { + nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + + DictWordType.SUFFIX.getType() + DictWordType.METRIC.getType(); + } + dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); + return dictWord; + } + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java new file mode 100644 index 000000000..d08c1f6be --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java @@ -0,0 +1,41 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + +import com.google.common.collect.Lists; + +import java.util.List; +import java.util.Objects; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +/** + * dimension value wordNature + */ +@Service +@Slf4j +public class ValueWordBuilder extends BaseWordBuilder { + + @Override + public List doGet(String word, SchemaElement schemaElement) { + + List result = Lists.newArrayList(); + if (Objects.nonNull(schemaElement) && !CollectionUtils.isEmpty(schemaElement.getAlias())) { + + schemaElement.getAlias().stream().forEach(value -> { + DictWord dictWord = new DictWord(); + Long domainId = schemaElement.getDomain(); + String nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId(); + dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); + dictWord.setWord(value); + result.add(dictWord); + }); + } + log.debug("ValueWordBuilder, result:{}", result); + return result; + } + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java new file mode 100644 index 000000000..29e72182c --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java @@ -0,0 +1,28 @@ +package com.tencent.supersonic.knowledge.dictionary.builder; + + +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.builder.*; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * DictWord Strategy Factory + */ +public class WordBuilderFactory { + + private static Map wordNatures = new ConcurrentHashMap<>(); + + static { + wordNatures.put(DictWordType.DIMENSION, new DimensionWordBuilder()); + wordNatures.put(DictWordType.METRIC, new MetricWordBuilder()); + wordNatures.put(DictWordType.DOMAIN, new DomainWordBuilder()); + wordNatures.put(DictWordType.ENTITY, new EntityWordBuilder()); + wordNatures.put(DictWordType.VALUE, new ValueWordBuilder()); + } + + public static BaseWordBuilder get(DictWordType strategyType) { + return wordNatures.get(strategyType); + } +} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/converter/DictTaskConverter.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/converter/DictTaskConverter.java deleted file mode 100644 index caba1e634..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/converter/DictTaskConverter.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tencent.supersonic.knowledge.domain.converter; - -import com.google.common.base.Strings; -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.common.enums.TaskStatusEnum; -import com.tencent.supersonic.common.util.json.JsonUtil; -import com.tencent.supersonic.knowledge.domain.dataobject.DictConfPO; -import com.tencent.supersonic.knowledge.domain.dataobject.DimValueDictTaskPO; -import com.tencent.supersonic.knowledge.domain.pojo.DictConfig; -import com.tencent.supersonic.knowledge.domain.pojo.DimValue2DictCommand; -import com.tencent.supersonic.knowledge.domain.pojo.DimValueInfo; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Date; -import java.util.List; - -public class DictTaskConverter { - - private static String dateTimeFormatter = "yyyyMMddHHmmss"; - - public static DimValueDictTaskPO generateDimValueDictTaskPO(DimValue2DictCommand dimValue2DictCommend, User user) { - DimValueDictTaskPO taskPO = new DimValueDictTaskPO(); - Date createAt = new Date(); - String date = DateTimeFormatter.ofPattern(dateTimeFormatter) - .format(createAt.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); - String creator = Strings.isNullOrEmpty(user.getName()) ? "" : user.getName(); - String updateMode = dimValue2DictCommend.getUpdateMode().getValue(); - String name = String.format("DimValue_dic_%s_%s_%s", updateMode, creator, date); - taskPO.setName(name); - - taskPO.setCreatedAt(createAt); - taskPO.setCommand(JsonUtil.toString(dimValue2DictCommend)); - taskPO.setStatus(TaskStatusEnum.RUNNING.getCode()); - taskPO.setCreatedBy(creator); - - return taskPO; - } - - public static DictConfPO generateDictConfPO(DictConfig dictConfig, User user) { - DictConfPO dictConfPO = new DictConfPO(); - dictConfPO.setDimValueInfos(JsonUtil.toString(dictConfig.getDimValueInfoList())); - dictConfPO.setDomainId(dictConfig.getDomainId()); - - dictConfPO.setCreatedBy(user.getName()); - dictConfPO.setUpdatedBy(user.getName()); - dictConfPO.setCreatedAt(new Date()); - dictConfPO.setUpdatedAt(new Date()); - - return dictConfPO; - } - - public static DictConfig dictConfPO2Config(DictConfPO dictConfPO) { - DictConfig dictConfig = new DictConfig(); - dictConfig.setDomainId(dictConfPO.getDomainId()); - List dimValueInfos = JsonUtil.toList(dictConfPO.getDimValueInfos(), DimValueInfo.class); - dictConfig.setDimValueInfoList(dimValueInfos); - return dictConfig; - } -} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/repository/DictRepository.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/repository/DictRepository.java deleted file mode 100644 index d8980fd3d..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/repository/DictRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tencent.supersonic.knowledge.domain.repository; - -import com.tencent.supersonic.knowledge.domain.dataobject.DictConfPO; -import com.tencent.supersonic.knowledge.domain.dataobject.DimValueDictTaskPO; -import com.tencent.supersonic.knowledge.domain.pojo.DictConfig; -import com.tencent.supersonic.knowledge.domain.pojo.DictTaskFilter; -import com.tencent.supersonic.knowledge.domain.pojo.DimValueDictInfo; -import java.util.List; - -public interface DictRepository { - - Long createDimValueDictTask(DimValueDictTaskPO dimValueDictTaskPO); - - Boolean updateDictTaskStatus(Integer status, DimValueDictTaskPO dimValueDictTaskPO); - - List searchDictTaskList(DictTaskFilter filter); - - Boolean createDictConf(DictConfPO dictConfPO); - - Boolean editDictConf(DictConfPO dictConfPO); - - Boolean upsertDictInfo(DictConfPO dictConfPO); - - DictConfig getDictInfoByDomainId(Long domainId); -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/service/OnlineKnowledgeService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/service/OnlineKnowledgeService.java deleted file mode 100644 index 58baab16a..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/service/OnlineKnowledgeService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tencent.supersonic.knowledge.domain.service; - -import com.tencent.supersonic.common.nlp.WordNature; -import java.util.List; - -/** - * online knowledge service interface - */ -public interface OnlineKnowledgeService { - - void updateSemanticKnowledge(List natures); - - void reloadAllData(List natures); - - void updateOnlineKnowledge(List natures); - -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictConfMapper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictConfMapper.java deleted file mode 100644 index 57b2867a3..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictConfMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tencent.supersonic.knowledge.infrastructure.custom; - - -import com.tencent.supersonic.knowledge.domain.dataobject.DictConfPO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DictConfMapper { - - Boolean createDictConf(DictConfPO dictConfPO); - - Boolean editDictConf(DictConfPO dictConfPO); - - Boolean upsertDictInfo(DictConfPO dictConfPO); - - DictConfPO getDictInfoByDomainId(Long domainId); -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictTaskMapper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictTaskMapper.java deleted file mode 100644 index f5fa2bb9f..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/custom/DictTaskMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tencent.supersonic.knowledge.infrastructure.custom; - -import com.tencent.supersonic.knowledge.domain.dataobject.DimValueDictTaskPO; -import com.tencent.supersonic.knowledge.domain.pojo.DictTaskFilter; -import java.util.List; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface DictTaskMapper { - - Long createDimValueTask(DimValueDictTaskPO dimValueDictTaskPO); - - Boolean updateTaskStatus(DimValueDictTaskPO dimValueDictTaskPO); - - List searchDictTaskList(DictTaskFilter filter); -} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/repository/DictRepositoryImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/repository/DictRepositoryImpl.java deleted file mode 100644 index cf68f41b8..000000000 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/repository/DictRepositoryImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tencent.supersonic.knowledge.infrastructure.repository; - -import com.tencent.supersonic.common.enums.TaskStatusEnum; -import com.tencent.supersonic.knowledge.domain.converter.DictTaskConverter; -import com.tencent.supersonic.knowledge.domain.dataobject.DictConfPO; -import com.tencent.supersonic.knowledge.domain.dataobject.DimValueDictTaskPO; -import com.tencent.supersonic.knowledge.domain.pojo.DictConfig; -import com.tencent.supersonic.knowledge.domain.pojo.DictTaskFilter; -import com.tencent.supersonic.knowledge.domain.pojo.DimValueDictInfo; -import com.tencent.supersonic.knowledge.domain.repository.DictRepository; -import com.tencent.supersonic.knowledge.infrastructure.custom.DictConfMapper; -import com.tencent.supersonic.knowledge.infrastructure.custom.DictTaskMapper; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Repository; -import org.springframework.util.CollectionUtils; - - -@Repository -public class DictRepositoryImpl implements DictRepository { - - private final DictTaskMapper dictTaskMapper; - private final DictConfMapper dictConfMapper; - - public DictRepositoryImpl(DictTaskMapper dictTaskMapper, - DictConfMapper dictConfMapper) { - this.dictTaskMapper = dictTaskMapper; - this.dictConfMapper = dictConfMapper; - } - - @Override - public Long createDimValueDictTask(DimValueDictTaskPO dimValueDictTaskPO) { - dictTaskMapper.createDimValueTask(dimValueDictTaskPO); - return dimValueDictTaskPO.getId(); - } - - - @Override - public Boolean updateDictTaskStatus(Integer status, DimValueDictTaskPO dimValueDictTaskPO) { - dimValueDictTaskPO.setStatus(status); - Date createdAt = dimValueDictTaskPO.getCreatedAt(); - long elapsedMs = System.currentTimeMillis() - createdAt.getTime(); - dimValueDictTaskPO.setElapsedMs(elapsedMs); - CompletableFuture.supplyAsync(() -> { - dictTaskMapper.updateTaskStatus(dimValueDictTaskPO); - return null; - }); - return true; - } - - @Override - public List searchDictTaskList(DictTaskFilter filter) { - List dimValueDictDescList = new ArrayList<>(); - List dimValueDictTaskPOList = dictTaskMapper.searchDictTaskList(filter); - if (!CollectionUtils.isEmpty(dimValueDictTaskPOList)) { - dimValueDictTaskPOList.stream().forEach(dictTaskPO -> { - DimValueDictInfo dimValueDictDesc = new DimValueDictInfo(); - BeanUtils.copyProperties(dictTaskPO, dimValueDictDesc); - dimValueDictDesc.setStatus(TaskStatusEnum.of(dictTaskPO.getStatus())); - dimValueDictDescList.add(dimValueDictDesc); - }); - } - return dimValueDictDescList; - } - - @Override - public Boolean createDictConf(DictConfPO dictConfPO) { - return dictConfMapper.createDictConf(dictConfPO); - } - - @Override - public Boolean editDictConf(DictConfPO dictConfPO) { - return dictConfMapper.editDictConf(dictConfPO); - } - - @Override - public Boolean upsertDictInfo(DictConfPO dictConfPO) { - return dictConfMapper.upsertDictInfo(dictConfPO); - } - - @Override - public DictConfig getDictInfoByDomainId(Long domainId) { - DictConfPO dictConfPO = dictConfMapper.getDictInfoByDomainId(domainId); - if (Objects.isNull(dictConfPO)) { - return null; - } - return DictTaskConverter.dictConfPO2Config(dictConfPO); - } -} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/dataobject/DictConfPO.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java similarity index 73% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/dataobject/DictConfPO.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java index 4645c6049..c95c9f7fe 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/dataobject/DictConfPO.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java @@ -1,10 +1,10 @@ -package com.tencent.supersonic.knowledge.domain.dataobject; +package com.tencent.supersonic.knowledge.persistence.dataobject; import java.util.Date; import lombok.Data; @Data -public class DictConfPO { +public class DictConfDO { private Long id; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/dataobject/DimValueDictTaskPO.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictTaskDO.java similarity index 84% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/dataobject/DimValueDictTaskPO.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictTaskDO.java index 2bdeb4ce4..12ff115bc 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/domain/dataobject/DimValueDictTaskPO.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictTaskDO.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.domain.dataobject; +package com.tencent.supersonic.knowledge.persistence.dataobject; import java.util.Date; import lombok.Data; @@ -7,7 +7,7 @@ import org.apache.commons.codec.digest.DigestUtils; @Data @ToString -public class DimValueDictTaskPO { +public class DictTaskDO { private Long id; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java new file mode 100644 index 000000000..f8215d211 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.knowledge.persistence.mapper; + + +import com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DictConfMapper { + + Boolean createDictConf(DictConfDO dictConfDO); + + Boolean editDictConf(DictConfDO dictConfDO); + + Boolean upsertDictInfo(DictConfDO dictConfDO); + + DictConfDO getDictInfoByDomainId(Long domainId); +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java new file mode 100644 index 000000000..a63926643 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java @@ -0,0 +1,16 @@ +package com.tencent.supersonic.knowledge.persistence.mapper; + +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; +import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DictTaskMapper { + + Long createDimValueTask(DictTaskDO dictTaskDO); + + Boolean updateTaskStatus(DictTaskDO dictTaskDO); + + List searchDictTaskList(DictTaskFilter filter); +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java new file mode 100644 index 000000000..f7e00928c --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java @@ -0,0 +1,19 @@ +package com.tencent.supersonic.knowledge.persistence.repository; + + +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; +import com.tencent.supersonic.knowledge.dictionary.DictConfig; +import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; +import java.util.List; + +public interface DictRepository { + + Long createDimValueDictTask(DictTaskDO dictTaskDO); + + Boolean updateDictTaskStatus(Integer status, DictTaskDO dictTaskDO); + + List searchDictTaskList(DictTaskFilter filter); + + DictConfig getDictInfoByDomainId(Long domainId); +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java new file mode 100644 index 000000000..308f6b1d5 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java @@ -0,0 +1,77 @@ +package com.tencent.supersonic.knowledge.persistence.repository; + +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; +import com.tencent.supersonic.knowledge.utils.DictTaskConverter; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO; +import com.tencent.supersonic.knowledge.dictionary.DictConfig; +import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; +import com.tencent.supersonic.knowledge.persistence.mapper.DictConfMapper; +import com.tencent.supersonic.knowledge.persistence.mapper.DictTaskMapper; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Repository; +import org.springframework.util.CollectionUtils; + + +@Repository +public class DictRepositoryImpl implements DictRepository { + + private final DictTaskMapper dictTaskMapper; + private final DictConfMapper dictConfMapper; + + public DictRepositoryImpl(DictTaskMapper dictTaskMapper, + DictConfMapper dictConfMapper) { + this.dictTaskMapper = dictTaskMapper; + this.dictConfMapper = dictConfMapper; + } + + @Override + public Long createDimValueDictTask(DictTaskDO dictTaskDO) { + dictTaskMapper.createDimValueTask(dictTaskDO); + return dictTaskDO.getId(); + } + + + @Override + public Boolean updateDictTaskStatus(Integer status, DictTaskDO dictTaskDO) { + dictTaskDO.setStatus(status); + Date createdAt = dictTaskDO.getCreatedAt(); + long elapsedMs = System.currentTimeMillis() - createdAt.getTime(); + dictTaskDO.setElapsedMs(elapsedMs); + CompletableFuture.supplyAsync(() -> { + dictTaskMapper.updateTaskStatus(dictTaskDO); + return null; + }); + return true; + } + + @Override + public List searchDictTaskList(DictTaskFilter filter) { + List dimValueDictDescList = new ArrayList<>(); + List dictTaskDOList = dictTaskMapper.searchDictTaskList(filter); + if (!CollectionUtils.isEmpty(dictTaskDOList)) { + dictTaskDOList.stream().forEach(dictTaskPO -> { + DimValueDictInfo dimValueDictDesc = new DimValueDictInfo(); + BeanUtils.copyProperties(dictTaskPO, dimValueDictDesc); + dimValueDictDesc.setStatus(TaskStatusEnum.of(dictTaskPO.getStatus())); + dimValueDictDescList.add(dimValueDictDesc); + }); + } + return dimValueDictDescList; + } + + @Override + public DictConfig getDictInfoByDomainId(Long domainId) { + DictConfDO dictConfDO = dictConfMapper.getDictInfoByDomainId(domainId); + if (Objects.isNull(dictConfDO)) { + return null; + } + return DictTaskConverter.dictConfPO2Config(dictConfDO); + } +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java new file mode 100644 index 000000000..56ad0ecbe --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java @@ -0,0 +1,106 @@ +package com.tencent.supersonic.knowledge.semantic; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.Order; +import com.tencent.supersonic.common.pojo.ResultData; +import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.util.CollectionUtils; + +@Slf4j +public abstract class BaseSemanticLayer implements SemanticLayer { + + protected final Cache> domainSchemaCache = + CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); + + protected ParameterizedTypeReference> structTypeRef = + new ParameterizedTypeReference>() { + }; + + @SneakyThrows + public List fetchDomainSchema(List ids, Boolean cacheEnable) { + if (cacheEnable) { + return domainSchemaCache.get(String.valueOf(ids), () -> { + List data = doFetchDomainSchema(ids); + return data; + }); + } + List data = doFetchDomainSchema(ids); + return data; + } + + @Override + public DomainSchema getDomainSchema(Long domain, Boolean cacheEnable) { + List ids = new ArrayList<>(); + ids.add(domain); + List domainSchemaResps = fetchDomainSchema(ids, cacheEnable); + if (!CollectionUtils.isEmpty(domainSchemaResps)) { + Optional domainSchemaResp = domainSchemaResps.stream() + .filter(d -> d.getId().equals(domain)).findFirst(); + if (domainSchemaResp.isPresent()) { + DomainSchemaResp domainSchema = domainSchemaResp.get(); + return DomainSchemaBuilder.build(domainSchema); + } + } + return null; + } + + @Override + public List getDomainSchema() { + return getDomainSchema(new ArrayList<>()); + } + + @Override + public List getDomainSchema(List ids) { + List domainSchemaList = new ArrayList<>(); + + for(DomainSchemaResp resp : fetchDomainSchema(ids, true)) { + domainSchemaList.add(DomainSchemaBuilder.build(resp)); + } + + return domainSchemaList; + } + + protected void deletionDuplicated(QueryStructReq queryStructReq) { + if (!CollectionUtils.isEmpty(queryStructReq.getGroups()) && queryStructReq.getGroups().size() > 1) { + Set groups = new HashSet<>(); + groups.addAll(queryStructReq.getGroups()); + queryStructReq.getGroups().clear(); + queryStructReq.getGroups().addAll(groups); + } + } + + protected void onlyQueryFirstMetric(QueryStructReq queryStructReq) { + if (!CollectionUtils.isEmpty(queryStructReq.getAggregators()) && queryStructReq.getAggregators().size() > 1) { + log.info("multi metric in aggregators:{} , only query first one", queryStructReq.getAggregators()); + List aggregators = queryStructReq.getAggregators().subList(0, 1); + List excludeAggregators = queryStructReq.getAggregators().stream().map(a -> a.getColumn()) + .filter(a -> !a.equals(aggregators.get(0).getColumn())).collect( + Collectors.toList()); + queryStructReq.setAggregators(aggregators); + List orders = queryStructReq.getOrders().stream() + .filter(o -> !excludeAggregators.contains(o.getColumn())).collect( + Collectors.toList()); + log.info("multi metric in orders:{} ", queryStructReq.getOrders()); + queryStructReq.setOrders(orders); + + } + } + + protected abstract List doFetchDomainSchema(List ids); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java similarity index 83% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java index aa0715e05..6f55fb74f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/DefaultSemanticConfig.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java @@ -1,6 +1,5 @@ -package com.tencent.supersonic.chat.infrastructure.semantic; +package com.tencent.supersonic.knowledge.semantic; -import com.tencent.supersonic.chat.application.ConfigServiceImpl; import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -17,6 +16,9 @@ public class DefaultSemanticConfig { @Value("${searchByStruct.path:/api/semantic/query/struct}") private String searchByStructPath; + @Value("${searchByStruct.path:/api/semantic/query/multiStruct}") + private String searchByMultiStructPath; + @Value("${searchByStruct.path:/api/semantic/query/sql}") private String searchBySqlPath; @@ -35,9 +37,4 @@ public class DefaultSemanticConfig { @Value("${fetchDomainList.path:/api/semantic/schema/domain/view/list}") private String fetchDomainViewListPath; - @Autowired - private RestTemplate restTemplate; - - @Autowired - private ConfigServiceImpl configService; } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java new file mode 100644 index 000000000..f6a4c2e16 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java @@ -0,0 +1,119 @@ +package com.tencent.supersonic.knowledge.semantic; + +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; +import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +public class DomainSchemaBuilder { + + public static DomainSchema build(DomainSchemaResp resp) { + DomainSchema domainSchema = new DomainSchema(); + + SchemaElement domain = SchemaElement.builder() + .domain(resp.getId()) + .id(resp.getId()) + .name(resp.getName()) + .bizName(resp.getBizName()) + .type(SchemaElementType.DOMAIN) + .build(); + domainSchema.setDomain(domain); + + Set metrics = new HashSet<>(); + for (MetricSchemaResp metric : resp.getMetrics()) { + SchemaElement metricToAdd = SchemaElement.builder() + .domain(resp.getId()) + .id(metric.getId()) + .name(metric.getName()) + .bizName(metric.getBizName()) + .type(SchemaElementType.METRIC) + .useCnt(metric.getUseCnt()) + .build(); + metrics.add(metricToAdd); + + String alias = metric.getAlias(); + if (StringUtils.isNotEmpty(alias)) { + SchemaElement alisMetricToAdd = new SchemaElement(); + BeanUtils.copyProperties(metricToAdd, alisMetricToAdd); + alisMetricToAdd.setName(alias); + metrics.add(alisMetricToAdd); + } + } + domainSchema.getMetrics().addAll(metrics); + + Set dimensions = new HashSet<>(); + Set dimensionValues = new HashSet<>(); + for (DimSchemaResp dim : resp.getDimensions()) { + + Set dimValueAlias = new HashSet<>(); + if (!CollectionUtils.isEmpty(dim.getDimValueMaps())) { + List dimValueMaps = dim.getDimValueMaps(); + for (DimValueMap dimValueMap : dimValueMaps) { + if (Strings.isNotEmpty(dimValueMap.getBizName())) { + dimValueAlias.add(dimValueMap.getBizName()); + } + if (!CollectionUtils.isEmpty(dimValueMap.getAlias())) { + dimValueAlias.addAll(dimValueMap.getAlias()); + } + } + } + + SchemaElement dimToAdd = SchemaElement.builder() + .domain(resp.getId()) + .id(dim.getId()) + .name(dim.getName()) + .bizName(dim.getBizName()) + .type(SchemaElementType.DIMENSION) + .useCnt(dim.getUseCnt()) + .build(); + dimensions.add(dimToAdd); + + String alias = dim.getAlias(); + if (StringUtils.isNotEmpty(alias)) { + SchemaElement alisDimToAdd = new SchemaElement(); + BeanUtils.copyProperties(dimToAdd, alisDimToAdd); + alisDimToAdd.setName(alias); + dimensions.add(alisDimToAdd); + } + + + SchemaElement dimValueToAdd = SchemaElement.builder() + .domain(resp.getId()) + .id(dim.getId()) + .name(dim.getName()) + .bizName(dim.getBizName()) + .type(SchemaElementType.VALUE) + .useCnt(dim.getUseCnt()) + .alias(new ArrayList<>(Arrays.asList(dimValueAlias.toArray(new String[0])))) + .build(); + dimensionValues.add(dimValueToAdd); + } + domainSchema.getDimensions().addAll(dimensions); + domainSchema.getDimensionValues().addAll(dimensionValues); + + if (!CollectionUtils.isEmpty(resp.getEntityNames())) { + Set entities = new HashSet<>(); + for (String entity : resp.getEntityNames()) { + entities.add(SchemaElement.builder() + .domain(resp.getId()) + .id(resp.getId()) + .name(entity) + .bizName(entity) + .type(SchemaElementType.ENTITY) + .build()); + } + domainSchema.getEntities().addAll(entities); + } + + return domainSchema; + } +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java new file mode 100644 index 000000000..9cc896198 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java @@ -0,0 +1,116 @@ +package com.tencent.supersonic.knowledge.semantic; + +import com.github.pagehelper.PageInfo; +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.util.S2ThreadContext; +import com.tencent.supersonic.common.util.ThreadContext; +import com.tencent.supersonic.semantic.api.model.request.DomainSchemaFilterReq; +import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.model.domain.DomainService; +import com.tencent.supersonic.semantic.model.domain.MetricService; +import com.tencent.supersonic.semantic.query.service.QueryService; +import com.tencent.supersonic.semantic.query.service.SchemaService; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class LocalSemanticLayer extends BaseSemanticLayer { + + private SchemaService schemaService; + private S2ThreadContext s2ThreadContext; + private DomainService domainService; + private DimensionService dimensionService; + private MetricService metricService; + + @Override + public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user) { + deletionDuplicated(queryStructReq); + onlyQueryFirstMetric(queryStructReq); + try { + QueryService queryService = ContextUtils.getBean(QueryService.class); + QueryResultWithSchemaResp queryResultWithSchemaResp = queryService.queryByStruct(queryStructReq, user); + return queryResultWithSchemaResp; + } catch (Exception e) { + log.info("queryByStruct has an exception:{}", e.toString()); + } + return null; + } + + @Override + public QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user) { + for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) { + deletionDuplicated(queryStructReq); + onlyQueryFirstMetric(queryStructReq); + } + try { + QueryService queryService = ContextUtils.getBean(QueryService.class); + return queryService.queryByMultiStruct(queryMultiStructReq, user); + } catch (Exception e) { + log.info("queryByMultiStruct has an exception:{}", e); + } + return null; + } + + @Override + public QueryResultWithSchemaResp queryByDsl(QueryDslReq queryDslReq, User user) { + try { + QueryService queryService = ContextUtils.getBean(QueryService.class); + Object object = queryService.queryBySql(queryDslReq, user); + QueryResultWithSchemaResp queryResultWithSchemaResp = JsonUtil.toObject(JsonUtil.toString(object), + QueryResultWithSchemaResp.class); + return queryResultWithSchemaResp; + } catch (Exception e) { + log.info("queryByDsl has an exception:{}", e); + } + return null; + } + + @Override + public List doFetchDomainSchema(List ids) { + DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); + filter.setDomainIds(ids); + User user = new User(1L, "admin", "admin", "admin@email"); + schemaService = ContextUtils.getBean(SchemaService.class); + return schemaService.fetchDomainSchema(filter, user); + } + @Override + public List getDomainListForViewer() { + s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); + ThreadContext threadContext = s2ThreadContext.get(); + domainService = ContextUtils.getBean(DomainService.class); + return domainService.getDomainListForViewer(threadContext.getUserName()); + } + + @Override + public List getDomainListForAdmin() { + domainService = ContextUtils.getBean(DomainService.class); + s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); + ThreadContext threadContext = s2ThreadContext.get(); + return domainService.getDomainListForAdmin(threadContext.getUserName()); + } + + @Override + public PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd) { + dimensionService = ContextUtils.getBean(DimensionService.class); + return dimensionService.queryDimension(pageDimensionCmd); + } + + @Override + public PageInfo getMetricPage(PageMetricReq pageMetricCmd) { + metricService = ContextUtils.getBean(MetricService.class); + return metricService.queryMetric(pageMetricCmd); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java similarity index 54% rename from chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java index 084138e76..7a229b1ba 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/infrastructure/semantic/RemoteSemanticLayerImpl.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.infrastructure.semantic; +package com.tencent.supersonic.knowledge.semantic; import com.alibaba.fastjson.JSON; import com.github.pagehelper.PageInfo; @@ -8,29 +8,25 @@ import com.google.gson.Gson; import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; import com.tencent.supersonic.auth.api.authentication.constant.UserConstants; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.application.ConfigServiceImpl; -import com.tencent.supersonic.chat.domain.pojo.config.*; -import com.tencent.supersonic.common.util.context.ContextUtils; -import com.tencent.supersonic.common.util.context.S2ThreadContext; -import com.tencent.supersonic.common.util.context.ThreadContext; -import com.tencent.supersonic.common.util.json.JsonUtil; -import com.tencent.supersonic.semantic.api.core.request.DomainSchemaFilterReq; -import com.tencent.supersonic.semantic.api.core.request.PageDimensionReq; -import com.tencent.supersonic.semantic.api.core.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.core.response.*; -import com.tencent.supersonic.semantic.api.query.request.QuerySqlReq; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.S2ThreadContext; +import com.tencent.supersonic.common.util.ThreadContext; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.semantic.api.model.request.DomainSchemaFilterReq; +import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; +import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; +import com.tencent.supersonic.semantic.api.model.response.*; +import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; -import com.tencent.supersonic.common.exception.CommonException; -import com.tencent.supersonic.common.result.ResultData; -import com.tencent.supersonic.common.result.ReturnCode; +import com.tencent.supersonic.common.pojo.exception.CommonException; +import com.tencent.supersonic.common.pojo.ResultData; +import com.tencent.supersonic.common.pojo.ReturnCode; import java.net.URI; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; @@ -41,25 +37,16 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import static com.tencent.supersonic.common.constant.Constants.*; -import static com.tencent.supersonic.common.constant.Constants.PAGESIZE_LOWER; +import static com.tencent.supersonic.common.pojo.Constants.*; +import static com.tencent.supersonic.common.pojo.Constants.PAGESIZE_LOWER; @Slf4j -public class RemoteSemanticLayerImpl implements SemanticLayer { - - - private RestTemplate restTemplate; - - @Autowired - private ConfigServiceImpl configService; - +public class RemoteSemanticLayer extends BaseSemanticLayer { @Autowired private S2ThreadContext s2ThreadContext; - @Autowired private AuthenticationConfig authenticationConfig; @@ -80,10 +67,22 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } @Override - public QueryResultWithSchemaResp queryBySql(QuerySqlReq querySqlReq, User user) { + public QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user) { + for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) { + deletionDuplicated(queryStructReq); + onlyQueryFirstMetric(queryStructReq); + } + DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); + return searchByRestTemplate( + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getSearchByMultiStructPath(), + new Gson().toJson(queryMultiStructReq)); + } + + @Override + public QueryResultWithSchemaResp queryByDsl(QueryDslReq queryDslReq, User user) { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); return searchByRestTemplate(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getSearchBySqlPath(), - new Gson().toJson(querySqlReq)); + new Gson().toJson(queryDslReq)); } public QueryResultWithSchemaResp searchByRestTemplate(String url, String jsonReq) { @@ -95,10 +94,10 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { log.info("url:{},searchByRestTemplate:{}", url, entity.getBody()); ResultData responseBody; try { - DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - ResponseEntity> responseEntity = defaultSemanticConfig.getRestTemplate() - .exchange(requestUrl, - HttpMethod.POST, entity, structTypeRef); + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); + + ResponseEntity> responseEntity = restTemplate.exchange( + requestUrl, HttpMethod.POST, entity, structTypeRef); responseBody = responseEntity.getBody(); log.info("ApiResponse responseBody:{}", responseBody); QueryResultWithSchemaResp semanticQuery = new QueryResultWithSchemaResp(); @@ -116,7 +115,7 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { throw new CommonException(responseBody.getCode(), responseBody.getMsg()); } - public List fetchDomainSchemaAll(List ids) { + public List doFetchDomainSchema(List ids) { HttpHeaders headers = new HttpHeaders(); headers.set(UserConstants.INTERNAL, TRUE_LOWER); headers.setContentType(MediaType.APPLICATION_JSON); @@ -124,7 +123,7 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); URI requestUrl = UriComponentsBuilder.fromHttpUrl( - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainSchemaPath()).build() + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainSchemaPath()).build() .encode().toUri(); DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); filter.setDomainIds(ids); @@ -135,9 +134,9 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { HttpEntity entity = new HttpEntity<>(JSON.toJSONString(filter), headers); try { - ResponseEntity>> responseEntity = defaultSemanticConfig.getRestTemplate() - .exchange(requestUrl, - HttpMethod.POST, entity, responseTypeRef); + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); + ResponseEntity>> responseEntity = restTemplate.exchange( + requestUrl, HttpMethod.POST, entity, responseTypeRef); ResultData> responseBody = responseEntity.getBody(); log.debug("ApiResponse responseBody:{}", responseBody); if (ReturnCode.SUCCESS.getCode() == responseBody.getCode()) { @@ -150,141 +149,6 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { throw new RuntimeException("fetchDomainSchema interface error"); } - - @SneakyThrows - public List fetchDomainSchema(List ids, Boolean cacheEnable) { - if (cacheEnable) { - return domainSchemaCache.get(String.valueOf(ids), () -> { - List data = fetchDomainSchemaAll(ids); - fillEntityNameAndFilterBlackElement(data); - return data; - }); - } - List data = fetchDomainSchemaAll(ids); - fillEntityNameAndFilterBlackElement(data); - return data; - } - - @Override - public DomainSchemaResp getDomainSchemaInfo(Long domain, Boolean cacheEnable) { - List ids = new ArrayList<>(); - ids.add(domain); - List domainSchemaResps = fetchDomainSchema(ids, cacheEnable); - if (!CollectionUtils.isEmpty(domainSchemaResps)) { - Optional domainSchemaResp = domainSchemaResps.stream() - .filter(d -> d.getId().equals(domain)).findFirst(); - if (domainSchemaResp.isPresent()) { - DomainSchemaResp domainSchema = domainSchemaResp.get(); - return domainSchema; - } - } - return null; - } - - @Override - public List getDomainSchemaInfo(List ids) { - return fetchDomainSchema(ids, true); - } - - public DomainSchemaResp fillEntityNameAndFilterBlackElement(DomainSchemaResp domainSchemaResp) { - if (Objects.isNull(domainSchemaResp) || Objects.isNull(domainSchemaResp.getId())) { - return domainSchemaResp; - } - ChatConfigResp chaConfigInfo = getConfigBaseInfo(domainSchemaResp.getId()); - // fill entity names - fillEntityNamesInfo(domainSchemaResp, chaConfigInfo); - - // filter black element - filterBlackDim(domainSchemaResp, chaConfigInfo); - filterBlackMetric(domainSchemaResp, chaConfigInfo); - - return domainSchemaResp; - } - - public void fillEntityNameAndFilterBlackElement(List domainSchemaRespList) { - if (!CollectionUtils.isEmpty(domainSchemaRespList)) { - domainSchemaRespList.stream() - .forEach(domainSchemaResp -> fillEntityNameAndFilterBlackElement(domainSchemaResp)); - } - } - - private void filterBlackMetric(DomainSchemaResp domainSchemaResp, ChatConfigResp chaConfigInfo) { - - ItemVisibility visibility = generateFinalVisibility(chaConfigInfo); - if (Objects.nonNull(chaConfigInfo) && Objects.nonNull(visibility) - && !CollectionUtils.isEmpty(visibility.getBlackMetricIdList()) - && !CollectionUtils.isEmpty(domainSchemaResp.getMetrics())) { - List metric4Chat = domainSchemaResp.getMetrics().stream() - .filter(metric -> !visibility.getBlackMetricIdList().contains(metric.getId())) - .collect(Collectors.toList()); - domainSchemaResp.setMetrics(metric4Chat); - } - } - - private ItemVisibility generateFinalVisibility(ChatConfigResp chatConfigInfo) { - ItemVisibility visibility = new ItemVisibility(); - - ChatAggConfig chatAggConfig = chatConfigInfo.getChatAggConfig(); - ChatDetailConfig chatDetailConfig = chatConfigInfo.getChatDetailConfig(); - - // both black is exist - if (Objects.nonNull(chatAggConfig) && Objects.nonNull(chatAggConfig.getVisibility()) - && Objects.nonNull(chatDetailConfig) && Objects.nonNull(chatDetailConfig.getVisibility())) { - List blackDimIdList = new ArrayList<>(); - blackDimIdList.addAll(chatAggConfig.getVisibility().getBlackDimIdList()); - blackDimIdList.retainAll(chatDetailConfig.getVisibility().getBlackDimIdList()); - List blackMetricIdList = new ArrayList<>(); - - blackMetricIdList.addAll(chatAggConfig.getVisibility().getBlackMetricIdList()); - blackMetricIdList.retainAll(chatDetailConfig.getVisibility().getBlackMetricIdList()); - - visibility.setBlackDimIdList(blackDimIdList); - visibility.setBlackMetricIdList(blackMetricIdList); - } - return visibility; - } - - private void filterBlackDim(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigInfo) { - ItemVisibility visibility = generateFinalVisibility(chatConfigInfo); - if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(visibility) - && !CollectionUtils.isEmpty(visibility.getBlackDimIdList()) - && !CollectionUtils.isEmpty(domainSchemaResp.getDimensions())) { - List dim4Chat = domainSchemaResp.getDimensions().stream() - .filter(dim -> !visibility.getBlackDimIdList().contains(dim.getId())) - .collect(Collectors.toList()); - domainSchemaResp.setDimensions(dim4Chat); - } - } - - private void fillEntityNamesInfo(DomainSchemaResp domainSchemaResp, ChatConfigResp chatConfigInfo) { - if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(chatConfigInfo.getChatDetailConfig()) - && Objects.nonNull(chatConfigInfo.getChatDetailConfig().getEntity()) - && !CollectionUtils.isEmpty(chatConfigInfo.getChatDetailConfig().getEntity().getNames())) { - domainSchemaResp.setEntityNames(chatConfigInfo.getChatDetailConfig().getEntity().getNames()); - } - } - - private void deletionDuplicated(QueryStructReq queryStructReq) { - if (!CollectionUtils.isEmpty(queryStructReq.getGroups()) && queryStructReq.getGroups().size() > 1) { - Set groups = new HashSet<>(); - groups.addAll(queryStructReq.getGroups()); - queryStructReq.getGroups().clear(); - queryStructReq.getGroups().addAll(groups); - } - } - - private void onlyQueryFirstMetric(QueryStructReq queryStructReq) { - if (!CollectionUtils.isEmpty(queryStructReq.getAggregators()) && queryStructReq.getAggregators().size() > 1) { - log.info("multi metric in aggregators:{} , only query first one", queryStructReq.getAggregators()); - queryStructReq.setAggregators(queryStructReq.getAggregators().subList(0, 1)); - } - } - - public ChatConfigResp getConfigBaseInfo(Long domain) { - DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - return defaultSemanticConfig.getConfigService().fetchConfigByDomainId(domain); - } - @Override public List getDomainListForViewer() { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); @@ -311,7 +175,7 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { }; HttpEntity entity = new HttpEntity<>(JsonUtil.toString(bodyJson), headers); try { - restTemplate = ContextUtils.getBean(RestTemplate.class); + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); ResponseEntity> responseEntity = restTemplate.exchange(requestUrl, httpMethod, entity, responseTypeRef); ResultData responseBody = responseEntity.getBody(); @@ -341,7 +205,7 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } @Override - public PageInfo queryMetricPage(PageMetricReq pageMetricCmd) { + public PageInfo getMetricPage(PageMetricReq pageMetricCmd) { String body = JsonUtil.toString(pageMetricCmd); DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); log.info("url:{}", defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath()); @@ -355,7 +219,7 @@ public class RemoteSemanticLayerImpl implements SemanticLayer { } @Override - public PageInfo queryDimensionPage(PageDimensionReq pageDimensionCmd) { + public PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd) { String body = JsonUtil.toString(pageDimensionCmd); DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); Object dimensionListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDimensionPagePath(), body, HttpMethod.POST); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java new file mode 100644 index 000000000..ff26cad82 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java @@ -0,0 +1,15 @@ +package com.tencent.supersonic.knowledge.service; + +import com.tencent.supersonic.knowledge.dictionary.DictWord; + +import java.util.List; + +public interface KnowledgeService { + + void updateSemanticKnowledge(List natures); + + void reloadAllData(List natures); + + void updateOnlineKnowledge(List natures); + +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java new file mode 100644 index 000000000..1f089a5d4 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java @@ -0,0 +1,55 @@ +package com.tencent.supersonic.knowledge.service; + +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.utils.HanlpHelper; + +import java.util.List; +import java.util.stream.Collectors; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class KnowledgeServiceImpl implements KnowledgeService { + + public void updateSemanticKnowledge(List natures) { + + List prefixes = natures.stream() + .filter(entry -> !entry.getNatureWithFrequency().contains(DictWordType.SUFFIX.getType())) + .collect(Collectors.toList()); + + for (DictWord nature : prefixes) { + HanlpHelper.addToCustomDictionary(nature); + } + + List suffixes = natures.stream() + .filter(entry -> entry.getNatureWithFrequency().contains(DictWordType.SUFFIX.getType())) + .collect(Collectors.toList()); + + SearchService.loadSuffix(suffixes); + } + + + public void reloadAllData(List natures) { + // 1. reload custom knowledge + try { + HanlpHelper.reloadCustomDictionary(); + } catch (Exception e) { + log.error("reloadCustomDictionary error", e); + } + + // 2. update online knowledge + updateOnlineKnowledge(natures); + } + + public void updateOnlineKnowledge(List natures) { + try { + updateSemanticKnowledge(natures); + } catch (Exception e) { + log.error("updateSemanticKnowledge error", e); + } + } + +} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java new file mode 100644 index 000000000..05a4602be --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java @@ -0,0 +1,47 @@ +package com.tencent.supersonic.knowledge.service; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.knowledge.utils.ComponentFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Service +@Slf4j +public class SchemaService { + + private static final Integer META_CACHE_TIME = 5; + public static final String ALL_CACHE = "all"; + + private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + + private LoadingCache cache = CacheBuilder.newBuilder() + .expireAfterWrite(META_CACHE_TIME, TimeUnit.MINUTES) + .build( + new CacheLoader() { + @Override + public SemanticSchema load(String key) { + log.info("load getDomainSchemaInfo cache [{}]", key); + return new SemanticSchema(semanticLayer.getDomainSchema()); + } + } + ); + + public DomainSchema getDomainSchema(Long id) { + return semanticLayer.getDomainSchema(id, true); + } + + public SemanticSchema getSemanticSchema() { + return cache.getUnchecked(ALL_CACHE); + } + + public LoadingCache getCache() { + return cache; + } +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/Suggester.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java similarity index 89% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/Suggester.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java index 36b700ed0..de5139dae 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/Suggester.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java @@ -1,12 +1,13 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.service; import com.hankcs.hanlp.collection.trie.bintrie.BaseNode; import com.hankcs.hanlp.collection.trie.bintrie.BinTrie; import com.hankcs.hanlp.corpus.tag.Nature; import com.hankcs.hanlp.dictionary.CoreDictionary; -import com.tencent.supersonic.common.nlp.MapResult; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; + import java.util.Arrays; import java.util.List; import java.util.Map; @@ -14,17 +15,18 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.stream.Collectors; + +import com.tencent.supersonic.knowledge.dictionary.DictionaryAttributeUtil; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @Service -public class Suggester { +@Slf4j +public class SearchService { public static final int SEARCH_SIZE = 200; - private static final Logger LOGGER = LoggerFactory.getLogger(Suggester.class); private static BinTrie> trie; private static BinTrie> suffixTrie; private static String localFileCache = ""; @@ -75,7 +77,7 @@ public class Suggester { entry -> { String name = entry.getKey().replace("#", " "); List natures = entry.getValue().stream() - .map(nature -> nature.replaceAll(NatureType.SUFFIX.getType(), "")) + .map(nature -> nature.replaceAll(DictWordType.SUFFIX.getType(), "")) .collect(Collectors.toList()); name = StringUtils.reverse(name); return new MapResult(name, natures, key); @@ -107,7 +109,7 @@ public class Suggester { } public static void clear() { - LOGGER.info("clear all trie"); + log.info("clear all trie"); trie = new BinTrie<>(); suffixTrie = new BinTrie<>(); } @@ -117,12 +119,12 @@ public class Suggester { } - public static void loadSuffix(List suffixes) { + public static void loadSuffix(List suffixes) { if (CollectionUtils.isEmpty(suffixes)) { return; } TreeMap map = new TreeMap(); - for (WordNature suffix : suffixes) { + for (DictWord suffix : suffixes) { CoreDictionary.Attribute attributeNew = suffix.getNatureWithFrequency() == null ? new CoreDictionary.Attribute(Nature.nz, 1) : CoreDictionary.Attribute.create(suffix.getNatureWithFrequency()); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java new file mode 100644 index 000000000..0ff33d425 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java @@ -0,0 +1,52 @@ +package com.tencent.supersonic.knowledge.service; + +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.builder.WordBuilderFactory; + +import java.util.ArrayList; +import java.util.List; + +import com.tencent.supersonic.knowledge.utils.ComponentFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + + +@Service +@Slf4j +public class WordService { + + private List preDictWords = new ArrayList<>(); + + public List getAllDictWords() { + SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + SemanticSchema semanticSchema = new SemanticSchema(semanticLayer.getDomainSchema()); + + List words = new ArrayList<>(); + + addWordsByType(DictWordType.DIMENSION, semanticSchema.getDimensions(), words); + addWordsByType(DictWordType.METRIC, semanticSchema.getMetrics(), words); + addWordsByType(DictWordType.DOMAIN, semanticSchema.getDomains(), words); + addWordsByType(DictWordType.ENTITY, semanticSchema.getEntities(), words); + addWordsByType(DictWordType.VALUE, semanticSchema.getDimensionValues(), words); + + return words; + } + + private void addWordsByType(DictWordType value, List metas, List natures) { + List natureList = WordBuilderFactory.get(value).getDictWords(metas); + log.debug("nature type:{} , nature size:{}", value.name(), natureList.size()); + natures.addAll(natureList); + } + + public List getPreDictWords() { + return preDictWords; + } + + public void setPreDictWords(List preDictWords) { + this.preDictWords = preDictWords; + } +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java new file mode 100644 index 000000000..532f58203 --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java @@ -0,0 +1,34 @@ +package com.tencent.supersonic.knowledge.utils; + +import com.tencent.supersonic.chat.api.component.SemanticLayer; +import org.springframework.core.io.support.SpringFactoriesLoader; + +import java.util.List; +import java.util.Objects; + +public class ComponentFactory { + + private static SemanticLayer semanticLayer; + + public static SemanticLayer getSemanticLayer() { + if (Objects.isNull(semanticLayer)) { + semanticLayer = init(SemanticLayer.class); + } + return semanticLayer; + } + + public static void setSemanticLayer(SemanticLayer layer) { + semanticLayer = layer; + } + + private static List init(Class factoryType, List list) { + list.addAll(SpringFactoriesLoader.loadFactories(factoryType, + Thread.currentThread().getContextClassLoader())); + return list; + } + + private static T init(Class factoryType) { + return SpringFactoriesLoader.loadFactories(factoryType, + Thread.currentThread().getContextClassLoader()).get(0); + } +} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java new file mode 100644 index 000000000..0e4b8f1de --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java @@ -0,0 +1,47 @@ +package com.tencent.supersonic.knowledge.utils; + +import com.google.common.base.Strings; +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.knowledge.dictionary.DictConfig; +import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; +import com.tencent.supersonic.knowledge.dictionary.DimValueInfo; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; + +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.List; + +public class DictTaskConverter { + + private static String dateTimeFormatter = "yyyyMMddHHmmss"; + + public static DictTaskDO generateDimValueDictTaskPO(DimValue2DictCommand dimValue2DictCommend, User user) { + DictTaskDO taskPO = new DictTaskDO(); + Date createAt = new Date(); + String date = DateTimeFormatter.ofPattern(dateTimeFormatter) + .format(createAt.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + String creator = Strings.isNullOrEmpty(user.getName()) ? "" : user.getName(); + String updateMode = dimValue2DictCommend.getUpdateMode().getValue(); + String name = String.format("DimValue_dic_%s_%s_%s", updateMode, creator, date); + taskPO.setName(name); + + taskPO.setCreatedAt(createAt); + taskPO.setCommand(JsonUtil.toString(dimValue2DictCommend)); + taskPO.setStatus(TaskStatusEnum.RUNNING.getCode()); + taskPO.setCreatedBy(creator); + + return taskPO; + } + + public static DictConfig dictConfPO2Config(DictConfDO dictConfDO) { + DictConfig dictConfig = new DictConfig(); + dictConfig.setDomainId(dictConfDO.getDomainId()); + List dimValueInfos = JsonUtil.toList(dictConfDO.getDimValueInfos(), DimValueInfo.class); + dictConfig.setDimValueInfoList(dimValueInfos); + return dictConfig; + } +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/FileHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java similarity index 81% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/FileHelper.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java index cff816c98..3ad816b90 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/FileHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java @@ -1,19 +1,19 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.utils; import static com.hankcs.hanlp.HanLP.Config.CustomDictionaryPath; -import static com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper.FILE_SPILT; import com.hankcs.hanlp.dictionary.DynamicCustomDictionary; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; + +@Slf4j public class FileHelper { - private static final Logger LOGGER = LoggerFactory.getLogger(FileHelper.class); + public static final String FILE_SPILT = "/"; public static void deleteCacheFile(String[] path) throws IOException { @@ -25,9 +25,9 @@ public class FileHelper { for (File file : customSubFiles) { try { file.delete(); - LOGGER.info("customPath:{},delete cache file:{}", customPath, file); + log.info("customPath:{},delete cache file:{}", customPath, file); } catch (Exception e) { - LOGGER.error("delete " + file, e); + log.error("delete " + file, e); } } } @@ -70,7 +70,7 @@ public class FileHelper { } } - LOGGER.info("CustomDictionaryPath:{}", fileList); + log.info("CustomDictionaryPath:{}", fileList); CustomDictionaryPath = fileList.toArray(new String[0]); customDictionary.path = (CustomDictionaryPath == null || CustomDictionaryPath.length == 0) ? path : CustomDictionaryPath; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java similarity index 86% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java index 156c6977e..89987b103 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HanlpHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.utils; import static com.hankcs.hanlp.HanLP.Config.CustomDictionaryPath; @@ -7,30 +7,33 @@ import com.hankcs.hanlp.dictionary.CoreDictionary; import com.hankcs.hanlp.dictionary.DynamicCustomDictionary; import com.hankcs.hanlp.seg.Segment; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.common.nlp.MapResult; -import com.tencent.supersonic.common.nlp.NatureType; -import com.tencent.supersonic.common.nlp.WordNature; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.DictWord; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.HadoopFileIOAdapter; +import com.tencent.supersonic.knowledge.service.SearchService; +import com.tencent.supersonic.knowledge.dictionary.MultiCustomDictionary; +import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import org.springframework.util.ResourceUtils; /** * HanLP helper */ +@Slf4j public class HanlpHelper { public static final String FILE_SPILT = "/"; public static final String SPACE_SPILT = "#"; public static final String DICT_MAIN_FILE_NAME = "CustomDictionary.txt"; public static final String DICT_CLASS = "classes"; - private static final Logger LOGGER = LoggerFactory.getLogger(HanlpHelper.class); - public static volatile DynamicCustomDictionary CustomDictionary; + private static volatile DynamicCustomDictionary CustomDictionary; private static volatile Segment segment; static { @@ -38,7 +41,7 @@ public class HanlpHelper { try { resetHanlpConfig(); } catch (FileNotFoundException e) { - LOGGER.error("resetHanlpConfig error", e); + log.error("resetHanlpConfig error", e); } } @@ -76,7 +79,7 @@ public class HanlpHelper { */ public static boolean reloadCustomDictionary() throws IOException { - LOGGER.info("reloadCustomDictionary start"); + log.info("reloadCustomDictionary start"); final long startTime = System.currentTimeMillis(); @@ -93,10 +96,10 @@ public class HanlpHelper { FileHelper.resetCustomPath(getDynamicCustomDictionary()); } // 3.clear trie - Suggester.clear(); + SearchService.clear(); boolean reload = getDynamicCustomDictionary().reload(); - LOGGER.info("reloadCustomDictionary end ,cost:{},reload:{}", System.currentTimeMillis() - startTime, reload); + log.info("reloadCustomDictionary end ,cost:{},reload:{}", System.currentTimeMillis() - startTime, reload); return reload; } @@ -108,7 +111,7 @@ public class HanlpHelper { CustomDictionaryPath = Arrays.stream(CustomDictionaryPath).map(path -> hanlpPropertiesPath + FILE_SPILT + path) .toArray(String[]::new); - LOGGER.info("hanlpPropertiesPath:{},CustomDictionaryPath:{}", hanlpPropertiesPath, CustomDictionaryPath); + log.info("hanlpPropertiesPath:{},CustomDictionaryPath:{}", hanlpPropertiesPath, CustomDictionaryPath); HanLP.Config.CoreDictionaryPath = hanlpPropertiesPath + FILE_SPILT + HanLP.Config.BiGramDictionaryPath; HanLP.Config.CoreDictionaryTransformMatrixDictionaryPath = hanlpPropertiesPath + FILE_SPILT @@ -155,9 +158,9 @@ public class HanlpHelper { return ResourceUtils.getFile("classpath:hanlp.properties").getParent(); } - public static boolean addToCustomDictionary(WordNature wordNature) { - LOGGER.info("wordNature:{}", wordNature); - return getDynamicCustomDictionary().insert(wordNature.getWord(), wordNature.getNatureWithFrequency()); + public static boolean addToCustomDictionary(DictWord dictWord) { + log.info("dictWord:{}", dictWord); + return getDynamicCustomDictionary().insert(dictWord.getWord(), dictWord.getNatureWithFrequency()); } public static void transLetterOriginal(List mapResults) { @@ -178,7 +181,7 @@ public class HanlpHelper { public static List getTerms(String text) { return getSegment().seg(text.toLowerCase()).stream() - .filter(term -> term.getNature().startsWith(NatureType.NATURE_SPILT)) + .filter(term -> term.getNature().startsWith(DictWordType.NATURE_SPILT)) .collect(Collectors.toList()); } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HdfsFileHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java similarity index 74% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HdfsFileHelper.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java index 48863fbf5..2d4943954 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/infrastructure/nlp/HdfsFileHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java @@ -1,7 +1,6 @@ -package com.tencent.supersonic.knowledge.infrastructure.nlp; +package com.tencent.supersonic.knowledge.utils; import static com.hankcs.hanlp.HanLP.Config.CustomDictionaryPath; -import static com.tencent.supersonic.knowledge.infrastructure.nlp.HanlpHelper.FILE_SPILT; import com.hankcs.hanlp.dictionary.DynamicCustomDictionary; import com.hankcs.hanlp.utility.Predefine; @@ -9,20 +8,19 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; + +import lombok.extern.slf4j.Slf4j; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Hdfs File Helper */ +@Slf4j public class HdfsFileHelper { - private static final Logger LOGGER = LoggerFactory.getLogger(HdfsFileHelper.class); - /*** * delete cache file * @param path @@ -31,24 +29,24 @@ public class HdfsFileHelper { public static void deleteCacheFile(String[] path) throws IOException { FileSystem fs = FileSystem.get(URI.create(path[0]), new Configuration()); String cacheFilePath = path[0] + Predefine.BIN_EXT; - LOGGER.info("delete cache file:{}", cacheFilePath); + log.info("delete cache file:{}", cacheFilePath); try { fs.delete(new Path(cacheFilePath), false); } catch (Exception e) { - LOGGER.error("delete:" + cacheFilePath, e); + log.error("delete:" + cacheFilePath, e); } - int customBase = cacheFilePath.lastIndexOf(FILE_SPILT); - String customPath = cacheFilePath.substring(0, customBase) + FILE_SPILT + "*.bin"; + int customBase = cacheFilePath.lastIndexOf(FileHelper.FILE_SPILT); + String customPath = cacheFilePath.substring(0, customBase) + FileHelper.FILE_SPILT + "*.bin"; List fileList = getFileList(fs, new Path(customPath)); for (String file : fileList) { try { fs.delete(new Path(file), false); - LOGGER.info("delete cache file:{}", file); + log.info("delete cache file:{}", file); } catch (Exception e) { - LOGGER.error("delete " + file, e); + log.error("delete " + file, e); } } - LOGGER.info("fileList:{}", fileList); + log.info("fileList:{}", fileList); } /** @@ -61,11 +59,11 @@ public class HdfsFileHelper { String[] path = CustomDictionaryPath; FileSystem fs = FileSystem.get(URI.create(path[0]), new Configuration()); String cacheFilePath = path[0] + Predefine.BIN_EXT; - int customBase = cacheFilePath.lastIndexOf(FILE_SPILT); - String customPath = cacheFilePath.substring(0, customBase) + FILE_SPILT + "*.txt"; - LOGGER.info("customPath:{}", customPath); + int customBase = cacheFilePath.lastIndexOf(FileHelper.FILE_SPILT); + String customPath = cacheFilePath.substring(0, customBase) + FileHelper.FILE_SPILT + "*.txt"; + log.info("customPath:{}", customPath); List fileList = getFileList(fs, new Path(customPath)); - LOGGER.info("CustomDictionaryPath:{}", fileList); + log.info("CustomDictionaryPath:{}", fileList); CustomDictionaryPath = fileList.toArray(new String[0]); customDictionary.path = (CustomDictionaryPath == null || CustomDictionaryPath.length == 0) ? path : CustomDictionaryPath; diff --git a/chat/knowledge/src/main/resources/META-INF/spring.factories b/chat/knowledge/src/main/resources/META-INF/spring.factories index 6d4e71c08..68e94072d 100644 --- a/chat/knowledge/src/main/resources/META-INF/spring.factories +++ b/chat/knowledge/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ -com.tencent.supersonic.knowledge.domain.FileHandler=\ - com.tencent.supersonic.knowledge.domain.LocalFileHandler \ No newline at end of file +com.tencent.supersonic.knowledge.dictionary.FileHandler=\ + com.tencent.supersonic.knowledge.dictionary.LocalFileHandler \ No newline at end of file diff --git a/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml b/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml index 50541ac4c..7189d70ca 100644 --- a/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml +++ b/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml @@ -2,10 +2,10 @@ - + + type="com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO"> diff --git a/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml b/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml index e9b3b6918..2f26482a4 100644 --- a/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml +++ b/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml @@ -2,10 +2,10 @@ - + + type="com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO"> diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml new file mode 100644 index 000000000..47cd1044e --- /dev/null +++ b/checkstyle/checkstyle.xml @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/pom.xml b/common/pom.xml index 70397847c..f7440e463 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -129,6 +129,10 @@ calcite-core ${calcite.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + diff --git a/common/src/main/java/com/tencent/supersonic/common/nlp/ItemDO.java b/common/src/main/java/com/tencent/supersonic/common/nlp/ItemDO.java deleted file mode 100644 index df47bb072..000000000 --- a/common/src/main/java/com/tencent/supersonic/common/nlp/ItemDO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tencent.supersonic.common.nlp; - -import com.google.common.base.Objects; -import java.io.Serializable; -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -@Data -@Setter -@Getter -public class ItemDO implements Serializable { - - private Integer domain; - private Integer itemId; - private String name; - private String bizName; - private Long useCnt = 0L; - - public ItemDO() { - } - - public ItemDO(Integer domain, Integer itemId, String name, String bizName) { - this.domain = domain; - this.itemId = itemId; - this.name = name; - this.bizName = bizName; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ItemDO itemDO = (ItemDO) o; - return Objects.equal(domain, itemDO.domain) && Objects.equal(itemId, - itemDO.itemId) && Objects.equal(name, itemDO.name) - && Objects.equal(bizName, itemDO.bizName) && Objects.equal( - useCnt, itemDO.useCnt); - } - - @Override - public int hashCode() { - return Objects.hashCode(domain, itemId, name, bizName, useCnt); - } -} diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java index 7492543ca..e535de293 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.common.pojo; -import com.tencent.supersonic.common.enums.AggOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; import java.util.List; import javax.validation.constraints.NotBlank; diff --git a/common/src/main/java/com/tencent/supersonic/common/constant/Constants.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java similarity index 82% rename from common/src/main/java/com/tencent/supersonic/common/constant/Constants.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java index 5d06e987b..3dc422c3e 100644 --- a/common/src/main/java/com/tencent/supersonic/common/constant/Constants.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.constant; +package com.tencent.supersonic.common.pojo; import java.util.regex.Pattern; @@ -41,7 +41,10 @@ public class Constants { public static final String DAY = "DAY"; public static final String DAY_FORMAT = "yyyy-MM-dd"; public static final String MONTH_FORMAT = "yyyy-MM"; + public static final String TIMES_FORMAT = "yyyy-MM-dd HH:mm:ss.S"; + public static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static final String DAY_FORMAT_INT = "YYYYMMDD"; + public static final String MONTH_FORMAT_INT = "YYYYMM"; public static final String MONTH = "MONTH"; public static final String WEEK = "WEEK"; public static final String YEAR = "YEAR"; @@ -53,4 +56,10 @@ public class Constants { public static final String PAGESIZE_LOWER = "pageSize"; public static final String TRUE_LOWER = "true"; + public static final String NULL = "null"; + public static final Double MAX_SIMILARITY = 1.0d; + public static final String CONTEXT = "CONTEXT"; + public static final String BRACKETS_START = "["; + public static final String BRACKETS_END = "]"; + } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/DataFormat.java b/common/src/main/java/com/tencent/supersonic/common/pojo/DataFormat.java similarity index 70% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/DataFormat.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/DataFormat.java index f2749f5d4..b4e23ce71 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/DataFormat.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/DataFormat.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.semantic.api.core.pojo; +package com.tencent.supersonic.common.pojo; import lombok.Data; diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java index 9ebae3e5f..a3f0d292c 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java @@ -2,8 +2,6 @@ package com.tencent.supersonic.common.pojo; import static java.time.LocalDate.now; -import com.tencent.supersonic.common.constant.Constants; - import java.util.ArrayList; import java.util.List; @@ -47,10 +45,10 @@ public class DateConf { public enum DateMode { /** * date mode - * 1 - between, continuous value, - * 2 - list discrete value, - * 3 - recent time units, - * 4 - advance time until data is available + * 1 - BETWEEN_CONTINUOUS, continuous static value, [startDate, endDate] + * 2 - LIST_DISCRETE, discrete static value, [dateList] + * 3 - RECENT_UNITS, dynamic time related to the actual available time of the element, [unit, period] + * 4 - AVAILABLE_TIME, dynamic time which guaranteed to query some data, [startDate, endDate] */ BETWEEN_CONTINUOUS, LIST_DISCRETE, RECENT_UNITS, AVAILABLE_TIME } @@ -75,4 +73,4 @@ public class DateConf { sb.append('}'); return sb.toString(); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java index 4f05f1b30..9e8b70b36 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.common.pojo; -import static com.tencent.supersonic.common.constant.Constants.ASC_UPPER; +import static com.tencent.supersonic.common.pojo.Constants.ASC_UPPER; import com.google.common.base.Objects; import javax.validation.constraints.NotBlank; diff --git a/common/src/main/java/com/tencent/supersonic/common/request/PageBaseReq.java b/common/src/main/java/com/tencent/supersonic/common/pojo/PageBaseReq.java similarity index 89% rename from common/src/main/java/com/tencent/supersonic/common/request/PageBaseReq.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/PageBaseReq.java index c8db4524c..0d20903ba 100644 --- a/common/src/main/java/com/tencent/supersonic/common/request/PageBaseReq.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/PageBaseReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.request; +package com.tencent.supersonic.common.pojo; import lombok.Data; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryAuthorization.java b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java similarity index 87% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryAuthorization.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java index 66eae2b85..b06b26768 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryAuthorization.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.semantic.api.core.pojo; +package com.tencent.supersonic.common.pojo; import java.util.List; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java similarity index 91% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java index 748f3f362..942ab3310 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/core/pojo/QueryColumn.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.semantic.api.core.pojo; +package com.tencent.supersonic.common.pojo; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/RecordInfo.java b/common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java similarity index 96% rename from common/src/main/java/com/tencent/supersonic/common/util/RecordInfo.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java index 47160c564..a463977f3 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/RecordInfo.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util; +package com.tencent.supersonic.common.pojo; import com.google.common.base.Objects; import java.util.Date; diff --git a/common/src/main/java/com/tencent/supersonic/common/result/ResultData.java b/common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java similarity index 94% rename from common/src/main/java/com/tencent/supersonic/common/result/ResultData.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java index 9191bb410..0314ec35c 100644 --- a/common/src/main/java/com/tencent/supersonic/common/result/ResultData.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.result; +package com.tencent.supersonic.common.pojo; import lombok.Data; diff --git a/common/src/main/java/com/tencent/supersonic/common/result/ReturnCode.java b/common/src/main/java/com/tencent/supersonic/common/pojo/ReturnCode.java similarity index 91% rename from common/src/main/java/com/tencent/supersonic/common/result/ReturnCode.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/ReturnCode.java index e964fe11a..fa579a227 100644 --- a/common/src/main/java/com/tencent/supersonic/common/result/ReturnCode.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/ReturnCode.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.result; +package com.tencent.supersonic.common.pojo; public enum ReturnCode { SUCCESS(200, "success"), diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/AggOperatorEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java similarity index 86% rename from common/src/main/java/com/tencent/supersonic/common/enums/AggOperatorEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java index c4c3abd84..2852be869 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/AggOperatorEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum AggOperatorEnum { @@ -16,15 +16,17 @@ public enum AggOperatorEnum { PERCENTILE("PERCENTILE"), + RATIO_ROLL("RATIO_ROLL"), + RATIO_OVER("RATIO_OVER"), + UNKNOWN("UNKNOWN"); + private String operator; AggOperatorEnum(String operator) { this.operator = operator; } - private String operator; - public String getOperator() { return operator; } diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/AggregateTypeEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggregateTypeEnum.java similarity index 88% rename from common/src/main/java/com/tencent/supersonic/common/enums/AggregateTypeEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggregateTypeEnum.java index 5694a37c5..ad1907133 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/AggregateTypeEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggregateTypeEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum AggregateTypeEnum { SUM, diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/ConfigMode.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/ConfigMode.java similarity index 91% rename from common/src/main/java/com/tencent/supersonic/common/enums/ConfigMode.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/ConfigMode.java index f1ccf7d4f..2549469e3 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/ConfigMode.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/ConfigMode.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum ConfigMode { diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/ErrorCode.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/ErrorCode.java similarity index 83% rename from common/src/main/java/com/tencent/supersonic/common/enums/ErrorCode.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/ErrorCode.java index 243117117..1a19b31be 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/ErrorCode.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/ErrorCode.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum ErrorCode { diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/RatioOverType.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/RatioOverType.java new file mode 100644 index 000000000..2b58b7062 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/RatioOverType.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.common.pojo.enums; + +public enum RatioOverType { + DAY_ON_DAY("日环比"), + WEEK_ON_DAY("周同比"), + WEEK_ON_WEEK("周环比"), + MONTH_ON_WEEK("月同比"), + MONTH_ON_MONTH("月环比"), + YEAR_ON_MONTH("年同比"), + YEAR_ON_YEAR("年环比"); + + private String showName; + + RatioOverType(String showName) { + this.showName = showName; + } + + public String getShowName() { + return showName; + } +} diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/SensitiveLevelEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/SensitiveLevelEnum.java similarity index 82% rename from common/src/main/java/com/tencent/supersonic/common/enums/SensitiveLevelEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/SensitiveLevelEnum.java index 8a2146514..901f6ba90 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/SensitiveLevelEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/SensitiveLevelEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum SensitiveLevelEnum { diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/SinkDbEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/SinkDbEnum.java similarity index 91% rename from common/src/main/java/com/tencent/supersonic/common/enums/SinkDbEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/SinkDbEnum.java index 9695b6143..072aec700 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/SinkDbEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/SinkDbEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum SinkDbEnum { diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/StatusEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/StatusEnum.java similarity index 95% rename from common/src/main/java/com/tencent/supersonic/common/enums/StatusEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/StatusEnum.java index 0d68a6a02..478001c84 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/StatusEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/StatusEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum StatusEnum { diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/TaskStatusEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TaskStatusEnum.java similarity index 95% rename from common/src/main/java/com/tencent/supersonic/common/enums/TaskStatusEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/TaskStatusEnum.java index da1e72712..21e8861ca 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/TaskStatusEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TaskStatusEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum TaskStatusEnum { diff --git a/common/src/main/java/com/tencent/supersonic/common/enums/TypeEnums.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java similarity index 92% rename from common/src/main/java/com/tencent/supersonic/common/enums/TypeEnums.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java index 99c851364..7f83e4fc1 100644 --- a/common/src/main/java/com/tencent/supersonic/common/enums/TypeEnums.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.enums; +package com.tencent.supersonic.common.pojo.enums; public enum TypeEnums { diff --git a/common/src/main/java/com/tencent/supersonic/common/exception/AccessException.java b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/AccessException.java similarity index 75% rename from common/src/main/java/com/tencent/supersonic/common/exception/AccessException.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/exception/AccessException.java index 96d69fc39..606984bf9 100644 --- a/common/src/main/java/com/tencent/supersonic/common/exception/AccessException.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/AccessException.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.exception; +package com.tencent.supersonic.common.pojo.exception; public class AccessException extends RuntimeException { diff --git a/common/src/main/java/com/tencent/supersonic/common/exception/CommonException.java b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/CommonException.java similarity index 78% rename from common/src/main/java/com/tencent/supersonic/common/exception/CommonException.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/exception/CommonException.java index 25ede0b8d..4a79d8ef4 100644 --- a/common/src/main/java/com/tencent/supersonic/common/exception/CommonException.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/CommonException.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.exception; +package com.tencent.supersonic.common.pojo.exception; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/common/src/main/java/com/tencent/supersonic/common/exception/InvalidArgumentException.java b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/InvalidArgumentException.java similarity index 77% rename from common/src/main/java/com/tencent/supersonic/common/exception/InvalidArgumentException.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/exception/InvalidArgumentException.java index 9bb3b0027..bc55e9bb1 100644 --- a/common/src/main/java/com/tencent/supersonic/common/exception/InvalidArgumentException.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/InvalidArgumentException.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.exception; +package com.tencent.supersonic.common.pojo.exception; public class InvalidArgumentException extends RuntimeException { diff --git a/common/src/main/java/com/tencent/supersonic/common/exception/InvalidPermissionException.java b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/InvalidPermissionException.java similarity index 77% rename from common/src/main/java/com/tencent/supersonic/common/exception/InvalidPermissionException.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/exception/InvalidPermissionException.java index f094506a4..5ee97a4b4 100644 --- a/common/src/main/java/com/tencent/supersonic/common/exception/InvalidPermissionException.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/exception/InvalidPermissionException.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.exception; +package com.tencent.supersonic.common.pojo.exception; public class InvalidPermissionException extends RuntimeException { diff --git a/common/src/main/java/com/tencent/supersonic/common/util/mapper/BeanMapper.java b/common/src/main/java/com/tencent/supersonic/common/util/BeanMapper.java similarity index 95% rename from common/src/main/java/com/tencent/supersonic/common/util/mapper/BeanMapper.java rename to common/src/main/java/com/tencent/supersonic/common/util/BeanMapper.java index 95b162f21..2ee4c189c 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/mapper/BeanMapper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/BeanMapper.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.mapper; +package com.tencent.supersonic.common.util; import java.beans.PropertyDescriptor; import java.util.HashSet; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/context/ContextUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/ContextUtils.java similarity index 97% rename from common/src/main/java/com/tencent/supersonic/common/util/context/ContextUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/ContextUtils.java index 81b1418e9..6fc04b817 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/context/ContextUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/ContextUtils.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.context; +package com.tencent.supersonic.common.util; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeansException; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java new file mode 100644 index 000000000..76efdad78 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java @@ -0,0 +1,43 @@ +package com.tencent.supersonic.common.util; + +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class DateUtils { + + public static Integer currentYear(){ + Date date = new Date(); + SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd"); + String time=dateFormat.format(date).replaceAll("-",""); + int year = Integer.parseInt(time.substring(0,4)); + return year; + } + + public static DateTimeFormatter getDateFormatter(String date, String[] formats) { + for (int i = 0; i < formats.length; i++) { + String format = formats[i]; + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + try { + dateFormat.parse(date); + return DateTimeFormatter.ofPattern(format); + } catch (Exception e) { + } + } + return DateTimeFormatter.ofPattern(formats[0]); + } + + public static DateTimeFormatter getTimeFormatter(String date, String[] formats) { + for (int i = 0; i < formats.length; i++) { + String format = formats[i]; + try { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format); + LocalDateTime.parse(date,dateTimeFormatter); + return dateTimeFormatter; + } catch (Exception e) { + } + } + return DateTimeFormatter.ofPattern(formats[0]); + } +} diff --git a/common/src/main/java/com/tencent/supersonic/common/util/http/HttpClientResult.java b/common/src/main/java/com/tencent/supersonic/common/util/HttpClientResult.java similarity index 95% rename from common/src/main/java/com/tencent/supersonic/common/util/http/HttpClientResult.java rename to common/src/main/java/com/tencent/supersonic/common/util/HttpClientResult.java index f05e72972..694a81995 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/http/HttpClientResult.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/HttpClientResult.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.http; +package com.tencent.supersonic.common.util; import java.io.Serializable; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/http/HttpClientUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/HttpClientUtils.java similarity index 99% rename from common/src/main/java/com/tencent/supersonic/common/util/http/HttpClientUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/HttpClientUtils.java index b39f31e93..a9cc50825 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/http/HttpClientUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/HttpClientUtils.java @@ -1,7 +1,6 @@ -package com.tencent.supersonic.common.util.http; +package com.tencent.supersonic.common.util; -import com.tencent.supersonic.common.util.retry.RetryUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -231,7 +230,7 @@ public class HttpClientUtils { public static HttpClientResult doPost(String url, Map header, Map params) { return doPost(url, null, null, header, params); } - + /** * Send a get request; Without request header and request parameters * @@ -537,7 +536,6 @@ public class HttpClientUtils { HttpPost httpPost = null; try { -// File uploadFile = ResourceUtils.getFile("classpath:" + fullFilePath); File uploadFile = new File(fullFilePath); inputStream = new FileInputStream(uploadFile); @@ -641,9 +639,8 @@ public class HttpClientUtils { public static final String METHOD_NAME = "DELETE"; - @Override - public String getMethod() { - return METHOD_NAME; + public HttpDeleteWithBody() { + super(); } public HttpDeleteWithBody(final String uri) { @@ -656,8 +653,9 @@ public class HttpClientUtils { setURI(uri); } - public HttpDeleteWithBody() { - super(); + @Override + public String getMethod() { + return METHOD_NAME; } } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/json/JsonUtil.java b/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java similarity index 99% rename from common/src/main/java/com/tencent/supersonic/common/util/json/JsonUtil.java rename to common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java index a5a0b7d9a..eb1cdf24e 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/json/JsonUtil.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.json; +package com.tencent.supersonic.common.util; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParser; @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; + +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -49,6 +51,8 @@ public class JsonUtil { objectMapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true); // Java8日期时间类支持 objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + + objectMapper.registerModule(new JavaTimeModule()); } /** diff --git a/common/src/main/java/com/tencent/supersonic/common/util/coder/MD5Util.java b/common/src/main/java/com/tencent/supersonic/common/util/MD5Util.java similarity index 97% rename from common/src/main/java/com/tencent/supersonic/common/util/coder/MD5Util.java rename to common/src/main/java/com/tencent/supersonic/common/util/MD5Util.java index 70d33b656..63c56ab1e 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/coder/MD5Util.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/MD5Util.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.coder; +package com.tencent.supersonic.common.util; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/mybatis/PageUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/PageUtils.java similarity index 88% rename from common/src/main/java/com/tencent/supersonic/common/util/mybatis/PageUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/PageUtils.java index fb8a49c28..5d86a382c 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/mybatis/PageUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/PageUtils.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.mybatis; +package com.tencent.supersonic.common.util; import com.github.pagehelper.Page; import com.github.pagehelper.PageInfo; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/retry/RetryUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/RetryUtils.java similarity index 95% rename from common/src/main/java/com/tencent/supersonic/common/util/retry/RetryUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/RetryUtils.java index 381a748b0..03dc0392e 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/retry/RetryUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/RetryUtils.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.retry; +package com.tencent.supersonic.common.util; import java.util.function.Supplier; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/context/S2ThreadContext.java b/common/src/main/java/com/tencent/supersonic/common/util/S2ThreadContext.java similarity index 88% rename from common/src/main/java/com/tencent/supersonic/common/util/context/S2ThreadContext.java rename to common/src/main/java/com/tencent/supersonic/common/util/S2ThreadContext.java index bbfc71158..b3ba60dda 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/context/S2ThreadContext.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/S2ThreadContext.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.context; +package com.tencent.supersonic.common.util; import com.alibaba.ttl.TransmittableThreadLocal; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/context/ThreadContext.java b/common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java similarity index 78% rename from common/src/main/java/com/tencent/supersonic/common/util/context/ThreadContext.java rename to common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java index 74b152401..7399e787a 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/context/ThreadContext.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.context; +package com.tencent.supersonic.common.util; import lombok.Builder; @@ -6,8 +6,6 @@ import lombok.Data; import lombok.ToString; import java.util.Map; -import java.util.Map; - @Builder @ToString @Data diff --git a/common/src/main/java/com/tencent/supersonic/common/util/context/ThreadContextConfig.java b/common/src/main/java/com/tencent/supersonic/common/util/ThreadContextConfig.java similarity index 83% rename from common/src/main/java/com/tencent/supersonic/common/util/context/ThreadContextConfig.java rename to common/src/main/java/com/tencent/supersonic/common/util/ThreadContextConfig.java index a7a24c99a..5b47dfc2b 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/context/ThreadContextConfig.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/ThreadContextConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.context; +package com.tencent.supersonic.common.util; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/yaml/YamlUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/YamlUtils.java similarity index 98% rename from common/src/main/java/com/tencent/supersonic/common/util/yaml/YamlUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/YamlUtils.java index bec6c2c59..f32eba300 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/yaml/YamlUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/YamlUtils.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.common.util.yaml; +package com.tencent.supersonic.common.util; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java index 46393e517..383ce3584 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java @@ -19,6 +19,7 @@ import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.util.SqlString; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; /** * sql parse utils @@ -66,6 +67,8 @@ public class SqlParseUtils { case ORDER_BY: handlerOrderBy(sqlNode, sqlParserInfo); break; + default: + break; } } @@ -91,31 +94,50 @@ public class SqlParseUtils { * @param sqlParserInfo */ private static void handlerSelect(SqlNode select, SqlParserInfo sqlParserInfo) { + List allFields = sqlParserInfo.getAllFields(); SqlSelect sqlSelect = (SqlSelect) select; SqlNodeList selectList = sqlSelect.getSelectList(); - List allFields = sqlParserInfo.getAllFields(); - selectList.getList().forEach(list -> { Set selectFields = handlerField(list); sqlParserInfo.getSelectFields().addAll(selectFields); - allFields.addAll(selectFields); }); String tableName = handlerFrom(sqlSelect.getFrom()); sqlParserInfo.setTableName(tableName); + Set selectFields = handlerSelectField(sqlSelect); + allFields.addAll(selectFields); + } + + private static Set handlerSelectField(SqlSelect sqlSelect) { + Set results = new HashSet<>(); + if (sqlSelect.getFrom() instanceof SqlBasicCall) { + Set formFields = handlerField(sqlSelect.getFrom()); + results.addAll(formFields); + } + + sqlSelect.getSelectList().getList().forEach(list -> { + Set selectFields = handlerField(list); + results.addAll(selectFields); + }); + if (sqlSelect.hasWhere()) { - allFields.addAll(handlerField(sqlSelect.getWhere())); + Set whereFields = handlerField(sqlSelect.getWhere()); + results.addAll(whereFields); } if (sqlSelect.hasOrderBy()) { - allFields.addAll(handlerField(sqlSelect.getOrderList())); + Set orderByFields = handlerField(sqlSelect.getOrderList()); + results.addAll(orderByFields); } SqlNodeList group = sqlSelect.getGroup(); if (group != null) { group.forEach(groupField -> { - allFields.addAll(handlerField(groupField)); + Set groupByFields = handlerField(groupField); + results.addAll(groupByFields); + }); } + return results; } /** @@ -135,6 +157,8 @@ public class SqlParseUtils { SqlNode sqlNode = sqlBasicCall.getOperandList().get(0); SqlSelect sqlSelect = (SqlSelect) sqlNode; return handlerFrom(sqlSelect.getFrom()); + default: + break; } return ""; } @@ -155,7 +179,14 @@ public class SqlParseUtils { break; case IDENTIFIER: SqlIdentifier sqlIdentifier = (SqlIdentifier) field; - fields.add(sqlIdentifier.getSimple()); + String simpleName = sqlIdentifier.getSimple(); + if (StringUtils.isNotEmpty(simpleName)) { + fields.add(simpleName); + } + break; + case SELECT: + SqlSelect sqlSelect = (SqlSelect) field; + fields.addAll(handlerSelectField(sqlSelect)); break; default: if (field instanceof SqlBasicCall) { @@ -254,6 +285,8 @@ public class SqlParseUtils { SqlOrderBy sqlOrderBy = (SqlOrderBy) sqlNode; SqlSelect query = (SqlSelect) sqlOrderBy.query; return query.getSelectList(); + default: + break; } return null; } diff --git a/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java b/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java index 21bbd8bb9..ed65a10ce 100644 --- a/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java @@ -18,28 +18,35 @@ class SqlParseUtilsTest { void addAliasToSql() throws SqlParseException { String addAliasToSql = SqlParseUtils.addAliasToSql( - "select sum(pv) from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1"); + "select sum(pv) from ( select * from t_1 " + + "where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1"); - Assert.assertTrue(addAliasToSql.toLowerCase().contains("as `pv`")); + Assert.assertTrue(addAliasToSql.toLowerCase().contains("as pv")); } @Test void addFieldToSql() throws SqlParseException { String addFieldToSql = SqlParseUtils.addFieldsToSql( - "select pv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1", + "select pv from ( select * from t_1 " + + "where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1", Collections.singletonList("uv")); Assert.assertTrue(addFieldToSql.toLowerCase().contains("uv")); - addFieldToSql = SqlParseUtils.addFieldsToSql( - "select uv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 order by play_count desc limit 10", + "select uv from ( select * from t_1 " + + "where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 " + + "order by play_count desc limit 10", Collections.singletonList("pv")); Assert.assertTrue(addFieldToSql.toLowerCase().contains("pv")); addFieldToSql = SqlParseUtils.addFieldsToSql( - "select uv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 where user_id = '张三' order by play_count desc limit 10", + "select uv from " + + "( select * from t_1 where sys_imp_date >= '2023-07-07' " + + " and sys_imp_date <= '2023-07-07' " + + ") as t_sub_1 " + + "where user_id = '张三' order by play_count desc limit 10", Collections.singletonList("pv")); Assert.assertTrue(addFieldToSql.toLowerCase().contains("pv")); } @@ -49,7 +56,9 @@ class SqlParseUtilsTest { void getSqlParseInfo() { SqlParserInfo sqlParserInfo = SqlParseUtils.getSqlParseInfo( - "select pv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 "); + "select pv from " + + "( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' )" + + " as t_sub_1 "); Assert.assertTrue(sqlParserInfo.getTableName().equalsIgnoreCase("t_1")); @@ -59,13 +68,11 @@ class SqlParseUtilsTest { Assert.assertTrue(collect.contains("pv")); Assert.assertTrue(!collect.contains("uv")); - List selectFields = sqlParserInfo.getSelectFields().stream().map(field -> field.toLowerCase()) .collect(Collectors.toList()); Assert.assertTrue(selectFields.contains("pv")); Assert.assertTrue(!selectFields.contains("uv")); - sqlParserInfo = SqlParseUtils.getSqlParseInfo( "select uv from t_1 order by play_count desc limit 10"); @@ -82,10 +89,13 @@ class SqlParseUtilsTest { Assert.assertTrue(!selectFields.contains("pv")); Assert.assertTrue(!selectFields.contains("play_count")); - - sqlParserInfo = SqlParseUtils.getSqlParseInfo( - "select uv from ( select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' ) as t_sub_1 where user_id = '1' order by play_count desc limit 10"); + "select uv from " + + "( " + + " select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' " + + ") as t_sub_1 " + + "where user_id = '1' order by play_count desc limit 10" + ); Assert.assertTrue(sqlParserInfo.getTableName().equalsIgnoreCase("t_1")); collect = sqlParserInfo.getAllFields().stream().map(field -> field.toLowerCase()) @@ -103,4 +113,18 @@ class SqlParseUtilsTest { Assert.assertTrue(!selectFields.contains("play_count")); } + + @Test + void getWhereFieldTest() { + SqlParserInfo sqlParserInfo = SqlParseUtils.getSqlParseInfo( + "select uv from " + + " ( " + + " select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' and user_id = 22 " + + " ) as t_sub_1 " + + " where user_name_元 = 'zhangsan' order by play_count desc limit 10" + ); + List collect = sqlParserInfo.getAllFields().stream().map(field -> field.toLowerCase()) + .collect(Collectors.toList()); + Assert.assertTrue(collect.contains("user_id")); + } } \ No newline at end of file diff --git a/docs/images/chat_config.png b/docs/images/chat_config.png new file mode 100644 index 0000000000000000000000000000000000000000..73107b1d1bbbfe185a465d040f8273c0af97b179 GIT binary patch literal 36003 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 T4CC}F1|aZs^>bP0l+XkKJ2bsq literal 0 HcmV?d00001 diff --git a/docs/images/database.png b/docs/images/database.png new file mode 100644 index 0000000000000000000000000000000000000000..f32dd2384332466e9e9b7a2f69868da4bd837732 GIT binary patch literal 213644 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≺+w14-)YpOf>uy=g*hTZ^v zh~!*X;PgGJd29d_Pj~N3$NVZtG^cX}oHMu67S2F8WV9Gz9kw&_oOjKKA7gQqg1%MI z&~h9KgL|m-g>Kl6%X6t}`2xwa2(4?hAQytp?T$4eZPTrSTf{>knkV#U!M#(NHcylq z*ub284V8yV|J^}|ucWUq%UQ6aR(mNQFQD4&^xOb@xKJezdyWBDwCC7?ASh<^0k(}~ z^3o1CI+IVW3fyDRbl*3LSZjsq}kgj@wpBv8XMd$tb*gE*GE)i=F!)!ZpMmra(uLkx6ACqHK-5Too4ZP~-7A>(Bn(j5 z{`OWYsFNSp1k!*78fwt~i4ed+z!2>aDmU;Hke$IY9YTI&edDI1$$(OG#OTAZWy%wV zO$IK|wDdG@zo8V&H^Sz0aFgSnMwS5U7RZwdUJd#ub*P+ehopP_OM%se=f|c3k1ADL zIt3rW9wK}TWZCDH39b)73XKeFUT%YeZ_;`SB=kF!z>0G82kl3NviWOu$w6;PJ8XfVyet&4+afk-eN@NCdYtbR9PV;vY7-HnoiXQM#i3e=Dl)Au`n zBZQh|$OP0$541x8wh~{?-BDc|`54vfb;C>w#V-1ChW5XQLJ=f?+f+Cb3)G#hPsGSJRpVXIn7Ke+>t?d&y6^d+R`c41R z!3xM&4jv}hgN7{fze2vZfw3&iYy}l0gjS@HP^B$@^eE4PG{})dy!#odz96ISA`sH< zr=BiII7PI=8WH`uJ_UFSj5X-UqQHC!S-n5fm0mXOL-374NK)J%=$r;1&GjLgvUT`4 zVSx4;C4g)Iq?)f9{vI20qHCf3}S^o@+Pu@^=ZW3h=6;=g^SZa8!JuVE#8eCDvByzMVv`Lwd+jxK2G9?$K%0=A zoBIoty`p*WKf7n)n0kFWdfugte%@bg^2Y~smmU`J4z)#TwOC&9t`k5Sz^qxB`w0%x zuC)K4m`?!o$73>m=@Wthk^WjeH8+^UNdyDtf?Jccy33{3P310xl?DYLp8!ceN(Cqg zM?|j;Tn`m>F!g?f)E9SrzaQ7jZ@dfr!}JwUN~x)t)vI8jt?a3Enc{GK{;A5myR74p zg`qOk$t!w&Uyj*&e>A`pK=NAnC$H0A+bb=1OcoZDuu~W)N8#=1dnNiUFA6|U&yw{y zW-j##fp&-9jaBeA=nv+mq&!k8uAxPuRRRtm{pDCZNGJTnq676myeYi`N><>5OgXD7 ztM7Y%KOp~Ra5c;rq)fdQgg>FwxPCuOw!&9L^XN(l==C|g6tzcoHP2&0Z3Eq zQd@Be^?=Yg*BkP_*a*xMDGCJ|CHJQN%Pm> zYClPqmCpK1^po@y4)Yh+@|HbHTJkJ#(*O<0g8bi1>7oLElU4UQ5IiFIOl9u{*{o#U z6-RYgg#U`lHfp-D;L#jP>%37ccfe33_1HaP@#Jd&?1Ir>e@OXsNx!+kfJBuJ1r>sY z$U74J2#l`WfZhvHP2m0}Lt&dBzs1WBc&ezqR0jaBk?26}$Ku3nsq0%P4a)$s|2F-H z8$?q5fWbbZ=`)L<#QZog<+I~}qiTof-svBK9UF=)Ti#38k73<)&uLH*Mu9Fw4>HOo z@_$kan(so%7~Pqm+Zf6P0XdAGCl*1D7r9{h8+7Y>??MIbzv=(=s7H~;Lr!0boeU@^ zW;cNJAsEhdbDg`=tVq?@8@vlI2gxzbq|MxM!Gw}P2sr4!4A#0JwfhEhHcYc0yfp%} zzCU)yoI+IQ1S|V%0ub9&5d9wf*Oq~}I}mF=bIRdyggs9asa^N*;`yXMIGS8z-Iu~CIoZO;e#;&8et&OqN=axE#0a4$bO9FbRf*Px}j~W z5{$x{>vMlc!fRGQ_IZa6eXQMb=vMD+d}pTL>*HX<=Iy{dmc6 zpO+-b`R|K=7%*8j!pd2(=!ZA=hk}$5>fdL01{O;f{YLOFVYP(X8ov6--xmEm&!UXg zrb1lwGw64*eenAK;lqm^D;NFbmk)Uwi+=FiZ#G7Ye(?PdG46|guxayu_-O}zQA00! z!8d>VX?F1|{bBFew~PLf&6oeWkpHQYvl2;#%;(;f zUd+;|-0CkM(p=Iqk^R@OCCx<^io2FyIy{<$;5FuOovcWC11`LvlL}|lei=@hVSGAn z;a)*^ij(?Q`D1i3Wba&Tl#MKb#WuYio#_@nIa8P>skHRO`ZqGU+ze-AIb3y-3vJvx zwrUoMoIhJeqbauOCHsj!Y_T0gMY10=Z<6IF13QyT+7Aa;N?bj+&pnEk`SO}58#4w2 z*rNk@)G;{4ij3KGo^&0{bLNUOne|!GUPP2`3IiwKEtB?I6pOlbmwom~wlKz!6|#3R zX^f%F&jK@%=Ss5ZMD~!c+@9eg4WpT;+$3Ygim@C_3(SIfi0o-Z1!hw4UzJAF3`|&n-R|{DJ%9HB(B!cZGx`4Fc z98@J%(L*x@A|#bc3UFsflf#CvNM4vCykkzXpEJp|GxItxx7ZY|S}8J=i`s;y5u#B^ zS_^*A6FW7E(K$gE-9mWcWs{eD%DNu6VHUfxM=p24mHoiq7gy4*a{W<09lVb$0;P#+ zW~WlF5%km5#yw9yL&juR8t5|yrj6Yq+9>rN7n|aZi1ldXt}4ZRuJ7%aNX*N3muJG( zPUImh%H@fH&OF{J-Szfik;XK;s$^g)%Q<c9_sUP zZ>+b}j2X67am80;B6w??yfx0qT33R(i~Ci~AP$qY_^4AVt*{T7Y|m`P*a*Vjiab7# zOh95jUGugRSFKv)qRRc>twM8Yypw@{*kyW-lv`W>A?tr*?Ah(IvG&X=)p+JwH?6Yf z?@z`ChB$m{Vl~s<%j`Oyq!q2DTR7A_=3GynU$6NsMev6MoY7Q>+b3Vo{P~nwMt3M` z!@NZ*PTZgl-)!-qmnG9N-$Dq3tD!*@=k>t%zayLJ`2G7cW=aym1*ntt*`@W}*azw{ z?z%B9GVUjR>!8!T7UYl@5&wKRT9wItXZe|CJeEPu7*^=s>S@5`S}NWjcf#*ZO2OBF zNILc+7q+DOThp&z_j17XgghQ@iK(gtbg=)2D6toeaydB z99o3Ja^ptuve|v@peCFS*&IZTaeu@h_}!R~N6NPmwCAhf$H9Zi6Xn(Ug>bn#$Ka72 zpZk5BwafQLFiZ81i?+*9^{Vo5r+$Uw627d;^2?Dj&+!YKaLe0j9bQ)r6m}|b9`|^$ z==NQ_4QU;pv*u%34U265k()oqFqLJclh=qbozyR=)<9s1k>#+gwsn(Td>*mO0K2o8+IjI(zGXe3)eMdF2R>r7sV9D$o{- zyfBR6#@Y!~LHOUwINXmLUy7byKW#vk3`aNIS*92ck!9`5-D7x7;<7u60h^rSku?{) zP~5IY8~h$SBJ7-`34sboLdVCLM)(r!8du!=xEGJwwQJ;n=86fK?WNVr{PeSXx8{FR zz!f~^XFJ?0xXv+^dmnL+J~12C+kviIZ4ooDLVVW6Lt z8$8h8FVlgKePMPs;L7M4&?ULy;&*t?TCObx!A^`iv4*Smf#E3JOSaFn{pRW0H7|3iEB4kk);fCo;w$?)`T$*e8s`EW*_==Z|PZFVnR zO-cHmtp=WJ!#I9nTTSValDt7)JW`*QOM}bJy{~n+#F>p@r^Qp}jnH2{H>A~N;_ia* zYQOPOtDT-(TJoy2#im>IF3>2F8vCjQa$y?6x&fU$CE1nah%Gd1!HkWOnke>gDwP}& z6?&mc8uqy`E6SgUzaw>PJn806mOt6&lH6=xX@f`5oPM{pUTkPJWGfN@i%Sx$)suTRqNV5t`Kl(>qdc`O?zd#QiQpu8rm@=wNqHDJe0hhfLz;#E?n>{!`?S_?(L&3w9boORzZ*fjbvPRP)9`EV`+* zf5*#@m^=AzhHsn%FEy6bM~qP08}_0!T&>B5ThtAkll!9lXximY})lxPG%A*!T z0gmz;6V>Lnl*dLnf}9zQ;gd(6X*T%m`vm`y%m%!Lgk$||qiM^W$SPVlnpY~h$-@Mgu%N~g9nGhxBd z;c}Q$DXE$L9CI(pnq9z&zC4hkCcj86+G=qj6DpzJyrA(-?PPoRo*U_hY!AFde66( zQ!ErN+bB&tM$roEXwQK0U-+9fZ8$_fmCg`Za2KTk7xwYR8t7D|PDoq>dIY_TwR>;l zY*3rD(02;*kK=~7m+zoa&q@dUJP-`N+x>VPawh2ZcUrT}2hPR5=Vglp&a2Q>R#jHj zEDf>)=naIWU6lP{Qn6R~`N-*9hSlAi9S{A$w)WS3o$x-F9c$F*D8A;isdG9w8ecg(MI=9=|s7j z@OmiaA+(iE-s&#<1m;_<%b}j#iilaKN`#Rz6#ipG*loEq)(Am#*D4Jh>ZTl(OU_8m zUS#=KV<&>14U;#BC4`aowqD6)v_jE_I4_T0N7UayrA?PYNxHlNgwc6F;$mak!QIbn zP-*YHsV`K@KR)tq+;jRz)x645-x&!o6@bTJd(>(gweMTmMnyHVj|m+eRy}9OcU1Ge zz$@Yt#m0@#UwB8$R7coe*%u<|hup*J605wd5xU8&hg0BU*Uy5B1=CwbVk#9Ed?oZ? z@f5#@WnuHih-dsDe`?Bzn3_{!V7*M%pB+_iT1K84CR4!aYPf-SJrhTkVwR01+{h7GPV%h;3s?y=kGsXR5o`|#M2+UHIs_WHSzXG7%&gp?q=vre;m}>0 zr$U5H7$oVj-|Hn?J$Pw(Wh8v#S>yX&9W-m1c^qua7#D^uv6vpT)UJ4lLVkp)&rI5gB~B^!HnL@+xylyRa($*Nn!P;^*STco2mm`eLiKVzb2z`wB# zYRj@yx(ceuvv&kO)iSEc)7Disua1m5$m`H!t$FCCSap}2kCV>cV?t;9q&G<1sy-+u zX5SdjETcB^!Jy9Q#(bx_h9k*^jy(#cLZ;ZMLnLFlWc#RSMcq?2>!GE-s8*rSK80TF z!F_nSW5f9_8?mfa{Gg^i!e<_c=G=YJ z^|n9F(yLgHn9x3%1n+G?)27H;xIql)TFv8d5M zi&<%?qnPaVvkZ!K)8+`k&WM^YUZh}jtc#&HK3t8?)DnxCt@tRT#sK}uOH%V7-<^>$ zZVdiJHM`1N?+A_h2mg14tC@TwuP-z?InrOe-WTceqt?0RHzyCrR$|iSyIND2G3wU2 zQoh|fZ_1BxuiqP&h3t^$`dOo7Xg>-8PVMzG+Jdw4wGVY83klOCBQYV`ayuaudN`e8 z!cz9XoEM96-NtmhQ?$b;_hLOdL#{kq&f{_!f8H> zEJNNZaHov5W@FWC&jcL!DX4>XcqXWiRBu@OdZfpcsU zL`_JduUlmPr(v#B{lG^@{_pxYW4ZYqT+v*Z@K*Hv=|Iuw?vbttQ502@iW~aU@|?0a z{*HAfG(yh^hAGjky&KBYyan91Qp^|Gq~CxV+5=p1G~-N+J9W82xp#>o2~MX~ezp~J z0){qbAYSE0^R(TTW z=I~oa+U0os?`C7gm!k}20}Q@M=Xkq(UcJ7KA--Xb-!6B(!@$h2xsR>A85H`Jdth#G z%cbHAS5ZZQ(3VsbYw`N?)AVx(%|oU}RCQ7;g>zlKRN*x~SNs0F`~#O8-G^R`33^@e z2bgGWkUB38-~Nbi+vsz4X4UeLu^s>XvBqk?9J@@nEF#&grU!=rWl_4{B zZYCDN!=y8k-HlfJt3%@{mjkvosu}CTBddaYRM3_u0(HMsp5<2*&I{|wqt1ekTR&di z+7L5@B(jmI%5Dy>tLG}_-i6G;;qcb7d&dJGM#sbKd~<{v(qOGXs8_T?_pao#L} zpenVcZKcQ)FvIkeN2>?HJ#_%KZI;~i4++{iL;*Hs;mv=6V>mzyF8u4+;e0-q~zp6*gU1i=iJ7FByTZYKqSlC z_~k!%&uD9^Aw#BC^`EQ`$BtD3K0*x8>v{&Qvk1|CxP#}~Wy1ya_?`KC)0}YL`H?jb zy(2mdM*KA+T72L$I0Nv)qVRffXK+&!BM8cLMzm>Vw9Ym@8OgtPa`hsY;v_e(lFFdIjQ;@8xG+=P*XWWIZBEWyE7&J=3{=3 zr}La+8%D`gLn)a1(iEdpDNM7)SaY`7gJxy&ap@z!?N#VaINsJyqj3xx?d#=B0IrVdEzD zTz!>M_WA?O)Xlc`n%z-~+LlzkWcuA&Fdd&DIvj3=UAf0~B(aBsD#^N50q00`7Zjmr zHZmo94l`CZ(!h1zXiTYqW*=$DcA1uXM8}2^l-pVb;qT~!`0V|=m$_^5CaC&QW4?v$ z7Jex7dbzaC4Ky?(WFH!XlsKp-TE}p1+;dLledS`Ho$~U_hQBzRUUkI-91FgM`WU!) zwjA_m#`E(p@c6`G_HTOw2f^u5&&7LQ42KRf9HJ-B`EZ=60yM*2`A&!)fFT?K2X>yo z7#5YD77=fI!3?~Y8%>-T*pRK~9x=27Id?&54ETju0uN&iX4SIJr%5}DHcH3O^mCo- zD@TK1OH2@FdlEj^Gs(^ z#P*Bl=HynPkDBtFt78EwzkQj%jL`M&^_0~eCU;0ED*Q>X$PHf-Lm!LXGbY%PYZS)$_0jOS3jk$1A2UN6Cvfg?JQ;kxR0A#vQKcR>syV(4S0`@Sf7l7*?hs#FkHKo1kY5cI#P*{?=ayt6CT&tBIg z+N|ehRty*xs9`r@TA~F_Bbe1tSB=YeEQ_Sm{1sDkLD2T_6wDNQQ?SxM^vc$R3(T?} zsi9flTsHgt9Gom)4Hb*y$gJP?j%B=?fT%H(6EXn5>l;ml_n>jtCEUHgWZB?9T|&+L zJnSFKA@&ZqE8UAIG%o6TbZpR!p}V%)paRqk^qKw; z4bio`%6r*4S@wHC*>pZmxFOi$X7wAWdMd=;6#Enq+gnu zzw1xwUC?yaCQrwY;4AjiiTn}_G+DZ%6SGN0%iMIWmw^?Dy^pr9Z{^Vg$x>G)TaPMW zdy>3U)S}|`*R|Xz51;?yn&McN^jN?#A%}%@m+EIYY|Zs4hmHNntJ2lqsA0!G7W)Q* z7AH~7Le%G!hTL6=5g~7UEGj@{BRQH?s{DKHyD9dy0gLMS$w|TSfe^6!L4kjtfDXI* z{K`jww@arEU+t34dv4zzV}p&_9{gduZQby-;z09fQB$yHt1tP->nTltoOF1V;dIpN z<%NxO0O~!jhPCc?$9puiSRAjj(=v^%Wn*2mn@Lw_;nXepJpiosmJ*v7eTk-uotWv; z23)&*npvY}jCwOuIa!kw&#KA3x-szbi%4y8*7sO7FP6`)C>)q7>2qe9!V;M@IuYjt z^MwQMQy);H&OC5vA2!oG8)a7#aD9d`;(8S}mVqA%HOJRxPJM6}hw0V1V`YE}ZIw&T z*4jDjF_gb#Me)0@Md0GJBO)Ug0}6MoU3s~~CpVR*AGF7XxnZ{XV)sV<<`r2VyHMod z-mrpP4PK3oTc}^?KvBZk47GXBi-mYBLlvH~N^l3SH4l2kH_&A1McwjLgB+zf?Z2O8 z(0`vAsb0NJpFJ^m!67ok@$z9Lqu37g_V3Tgl0C@1V>upv04ulxqV#5DC!F0dw&NiOV@Z{g_#{iT?fBZWX75B`0^ON- zR)91BBG*j=7(G7rET~#^BzA8-HT(N{2zdg(h#@ssLeR)@$CnCh#DB%J|sfQZj+7 z%khaj5&IJGjF&!B{O6tuayN^ygP{^s8a`@Dwds;wq@jg<)&7%{cM>-G;mE5rt=$3r zJ)&C}Ii%qpnGv*BJhz6j1$QCx#JG=3D&rZ|Q;fo$tI=Ldd>s|-g=eY>yy;v$3z8y(W)MwK|T(!`NgDXqk3T23o#qZ5T$ng+;(gD9nL)? z$6;cZst*KR352GYB>3}CPs1np z5ItTdrmGfD15Y^z0aOp3B9S@QqWq-e5!@NfYad7d1es6ClPDl(x^=wWOzVBcStZB zz`O`;w6wyrp+(4cV}^*Vc^AsW@2II7?q!TFRWY0-&v#B$)#0!iGY9n*u|T3g6h_;z zLU;@yAtJteI5QoC#)~0>fv(hOYi1+!PEm=Gm61pO*5lMGqu0Z?*glAXS8oiD9S|)MBqJDQk+bbjcZrup3T9! z5nM3tD8GQ(`kUtyG(0@^m|T4P8*H=w8o$R&)Ap&T-M{Dy+ot!}W=s68e|*3E-}@Dwa&NdNDS74}{Yr9CqO$`Y)AKBd=t$7BOok@Z=1 z3`tRkeL-co!amPuzYUp2;isDpWx6}#=6WKKIn5_GS#9n1vkSJ&#{u-~V-bZ{!VhD@^e&&q6?;z@DIR7A8q{uJW*_#zak9>v1c= z5@%iR$eQsdg_gV-9lf56U5%G>qvZ$zv&-l;J+#b*dm_p`eq7#ak}wc;wuLVbqL4q$ zZ``kCM3TbjPhIQ{G=C1JKEI4W=TFD z(_7!nX{YrIO-`_!z1>e^D=&v|WdDL{?x|{hV1ts|U{%&Dmgneoj$SREdR_d$vT|H* ztMDly6q95Wky&lXkv(0X52%Fr!`!l5crfrf=SaoNc3Z7hEGC#dkPk*xA zIw%DD9g3DGYSN&dahWm=JYVf*NFMG@N#Ta6pK~ONr)T3{gF77W?t;X6lT#Y@t;rhx zz}Q!E!Hq%5CA*&4E$Q3wlGwQ8saf&Qbp@7eud#0M5=km!8Uyl*LaQxpiz2Ob_A73e z6uzn)HyPVaKDP;v*=Ei)O5T^>srGFU*1^-Y#y0}%rn%hzyBt7`4n59XM`a*tWbYFi zMWlpro|yk7A3Tq_m$)nR6$Me`T=e{}PPw-qB+ry3TNhi06^zubEP2kgi1{2z@g>+h zX|qo!U;3%dvm5P)CE=L!Z}yj_{AEjh%juP;+qk=5bC}} zzm&}1D>)Bg%(kG86J)lrwaLF6>#YEL%7<-kzQ0|uUoo|nn@lLNtd#1>N8c3MyNAjz z=_7nLrUsmht*z$z*JZ$-+@F-g_B3An1JF&0ZYDirkEA0C*oX0+)A<#ZwdQyDT{B}roELuT zuKj>}Az76_jYyq&WiV2pmZ6PiJ`cz*j@->&%g{?QBg!!Edt*5X55aTy}!8BYj1zh4HcZ3R$%<@uopT$vDqjhpWes!I!wyZKf2EAL&oQE znYtw%ops|NS4AvsG-_&;Obxe`=xm4%YaXA~{7t9qk0rj@* zK%`a*_Qg_Ld1drZjBWZ$ z4I?MSz0uzz<+`$9m2bRG{+#m}p}E)VfM{R?_cgsh>LF{IHmV~etgMvDDMj9j`9N&H zhAo9A+=}C2VlsS zh^Qt$P*t~m_KKjlbnIC6a#UvjlooV_L?ZQGZ_{-Z%dUO|F;bXkfJ#?qal2W*Zd zs%j|qcOG^(gYmGCKPt8;EWbx%^0#{sQBp~z;97ATTe6wUS2MOSqKINfu^Guu@Ox$~ zqTk6kd$Yf1luSvm={RJdTcH|y-=}uT&lF>EpD|LH937RX-Cwy1Q#ge{K(5a|~Z zmCXz3n__=-(456Z3AYLwO86Sq>B-mlAxxo$tCTR$;~ht##eIlS+UWhNNNY?~XOSSU zibiPw&plIefP^TyAd3)W@$oMj-d30Jg+sv-^bT%IB{$-~A!#ulS5=8-J4*asb)~Oi z1=1>QxZVb5sf8)5Z%Pszn_1vi_q=(Oa6gc&xhvSB`W3j-{vu};m1n>F!^P>4!NCL_e;^)Xjz0Qn&%(1 z#3lBH5xKeq?a>t5=`t8h8QAGTZx8Uv5_`XVF&#C@zs`|4cNcP_yveJmUbnMa0*9Vf zy?oGP!}YAA`N&^a&X4akAj`QA=VhIt8w&K7HNmdzq>A0pYzWTvtR8#%v8SqX zpqeyvnrBR$6I2yph1NAu^41k`;$OefJnD5Kqb1NyMKM%wpY~un=!V1SZi+?PD)Qr6 ztg37{v&T*+x);5nzJ-0#EXS05UzZ~D%FERCKHO711oa`&lUX>ut{!o9r%-%>$rpCi zA)Z@T@x;{HlIM~Bqm@G>+-hJ9hdqegn2V8T%yV8PgzZajHPVRS#(0gy_T}*S9|H7q zofrs*y7nD~tPfp{H(^xPlc`Zw8}8%%>UO6jes<29a8V!o%RHyTH8&YWI=uS-VDHVt znm)7k@pkO!bc))(w#5{LT3gX7L_opFl2W%?1I3_w)LIq{O0fXcg=PAk6vEz$tUMI&wcLu zKIaq>zBX?vqE-o&v<`l;zM0eRGG>-0OVE{i&0&1ZNIZL$LMHNFKH&X=|S^oNg;oA$^g)dzFS1XZ!Tu4rilHhnRDeADW&t8bH))*r3UTO<9RbE*u^#3A5WP@~XM7H>X zZ;uYqNcrvIjg?yz!~MNUa!Gt;wTy>-Om@`}mxLY^$F%=-U3(jE4+7%l(ViI8)}S}= zeyY(JY^K#}2z(QJz$sUDUCkIs!HqY2myhec_(%vL|AV2uZq1w*Cn{wFWopwt$`}_N z+yurzjStBpT$Rb2Fg2ghuvw|Xct5Sk$dz+B=b3uT<=zb%4Cz{!h|W{3-L8-LP>+^r z^$rE9Xi0L4k!2sf-m_n}9WyeDPdVHw;6{Pemm!J}lcGDWE;Aw0Bo~jH86OurqGMv3 zRVr+jruNG*MR!g@d8)`luFwOzj?R6bK8!!;^K02T4ct+EDu}rN&Q>xUM5ff$;xbH1exS&+a5U;kYv<+UIM!2W=Ud!*- zr{^GkzC`LIkV!II#JJ*y-uDeycR0ar*bgOpH|mjNLQ9K*R!wkI-m7&>7~Gp7Dtd7x z*TE?ryB%ViEJ8p&9|zwEZ2FEr%x^t?U8$JS%}_E-Z5$zW#t(8Z|AYNCUh+owHW&6} zfmhWRDwpCJ1+V>@25Gk+_O|EPkn~o{7Ps#3#$%&{FLccjfG1D&< z*M;Ys-En&!?ODXsd9!NpLnBhPu$lUNcd9$iw?h!cDswmS-pz&_PZ6bJEM1zfHD{IA zg=lG;@6JssD9tmnZXTd(UGr475*W){l_HWwdBc&H9)t!Q=j(dh4BbW_kkfJbx#?)K z&9l|%)_nf=SEh_nJtmgv>DIsjaVu9hhc&tPab?FNfR=_2uHhnwGslr^><`KXkKCSS zxn&n+&tH9JSFpxCqo-Q|WsEl)w8=|04Q*5>2jdei;FfMK!xISBbH+Xu2;5UJ|0b-r zTHIh<$N7prt+@sc?zsvHp3Gk?Nnsu{dUwhO!I!y3sc31OsV^%8Y=;-O&Jbo>?~&4yd3)6HGhwYM=K z@|Zh9ebOTZ%B5oGatsdR#kt~K{*&a?FAT6xQ5M6v6wFRCglL)@f*-m~9AkB78Qj_? zvEpqBR6304wd#KNGPrO&>hVYjy6?d@qA#ekVnmtWPc;dukNZ?N*rb#qAGh##trDn` zqKuoPD*aF{)aqqv=!Yj|6|EBFd1sv+VKfSVdXN)0xigqr=6PG~9UKsNai>FiS#s9_ ziet;-G#V&`42G=DUbG7d{Hv0tqrpXw(^Y2T03Qb1J~OO9RqelR4>!4pp&T?8BjTCI zEyEFkK>^>-n(q0*zW2@OD&mld(QQ}^RoTe3Xl46Z{P9S#E}X7I=`{j9!Cg6YsmpD)N*3+*mdgIAY<6ma zjQSlyJXhyP-cMOaggv{x3vN{rp3WEy^U&3B;*tDafvqHcyKtI=K8aZ&85_~#u8kxJ ze56FX74%O2OcPQl+l5(QS0U7$O+Y~PpLC%23(t?k9(Y50F_-n{%PF4EK8$<=xl27V zM45~|vRw^94uKl&#&cVFggk_c%6{dCu!FjCxb@LsBvn3>f8<~jyXfV<2w&o+^7k8x zH$x!3QJZswQb$XmF6x2Xm&elWIL7P3?^YH%vJ*0XjA&aViG&R)>{I6Pm`@BcJJkKq zXdFAge-mMN!)4wC9n(@r@SNEubaeDh;v{6Uiv^EB#^|7up}~2^1WE%r_zWUFJzV?5 zPO;kNk{761T-9wHv(!SS5kG(+3J~wSxJVE;SPa~XpIfFy||``lc0h0N5}!SEgWhk<0UCtwr*yhy&kIG;ZIv%$KqFoUbXi;Og_8bCbZzyxU2# z(Mj(>48HJ|-lqhd-uAJxxdiuT>TcuJZrNAC8spt%Y1YJH){+aRhdHL(PfP~_cjB*p zg^!Q})LMU4xRJ2>LQ&ZD8#|$x2?ooXSRe?(yY7)Grm!`Xt|+=QKj^*e&B-Hzmt~iXT{yZ=`F3z_J1Hv8 z*ffJ5!3ufv@OpMl`l4-@VR^9ddE=QeW{OxvLOTzD+qCwg;UZmk<$!C)Y5$Sc2F zxT=YEw6ZP$XRJNP;5{DDoD3uJ^wZx1Jw>_MbO&H7`4=ktR zNE1IyG`EE-M2J}F%Jh4_5;_CUJ$wWdc7n+JCft{>aP(aPtjq08F+nP?&5_U8*3?*x z_j7ut8Wv@lJeOE`a(QVW>lPk6-tlP)w}-pbpnduFH?lJg0D&Vt`b$#Xiiu7HKCb<} z3xW`@iz2a3M!QA9CblN`=6sOY_6w4hdO!kOiHLkkwDBuFo z)CAxGoh+_$GGe*Ynx?)vW>W=rs@x#zS{RI5Ax$>}&$dUxW+CrKQdo#MkWOnE35*CC z*Sc7v9u0OhduLzlnMN+(kLg~oB4eSA)7eHjO}r`I)8v+gT_N45?53V0b2c;zcPS;9 zd)~5w+)*0S0$SGcW%ABFDMD{Vpbnq5&v$7HE^v(?6uyD~(FRi8gV@b@VR-di^06BGzSGv)1Xnl(gp* zp7LRn3;k+0e@WIF$JTD0zN~=CTXOK^lfia4p<6IB8H+eXm=fasb|vcjJ^P_`?Y`#( z)Knz>ytnEeQ+cG%l=gEqU07|2cEi+I%{+pGomLv#qJ~}aOOctkK^D$4O!6_wy47I_ zN(NVON{@k+T5TSBp+YECPVPfUGF%`t?iMyOY+;KTBdHifp6cCRJ^nJ?Se+`WqNWa0 z(m@_E`35UnG)?dS5in<(;wKg{i_4`_Nz(8EjR%tEq`PWN$bNj?=F=@usMA{{W9NY* zTZpQgA);ID+a)t*EVWgU+dZ5hoUBQAq-@yIapy~2?lbkP3Q;K0dgcdzAj}MeypTw| zcK&sHCJrM+8=@0PANaSSAu;2~ZrnJM61TT^Z|3IF2-$`$>XF6eYP{~uNBs}CuWBu9 zczbHaQm`DlI&_+TJ?-UCa)0&G+to_U(Qu#4(KPEv{m<#1Hpgf!3XLJ!3yO+kWitcA z_Tf~QKI+%8Ea^%wP@6Qy#91JAJJteL53*9#cz8T{I%&Kzv2?t1$NhWUiVHBDC&(&c z`PbsnkMm`1VFj{tSe#71e!&gzozXT$y|(CYBQ<(=Cs*mVwr(z&qv!x^YvOoqxqu%S zJ(4G2x(-u3)u&5M=B4z}aB%~;MRN91=x*P13x)of6{8VL5q*43^jjkPblF(TQAwde z&9E-nJpS@sF)iscEZ%S1IKNmR2CT4lSC7P3=!>|ZW;zM{+xLpeLnT-njrZkc7R{z2 z*?AiuO)>(HpV*G~n8f;kp6jp8yT8U`I89mwwl~Y9>0Qhhe5LSG`$D2Lm=j z#hPJ?N^QDAn#5APXZkd9+Pl;@eY|AiHHTU0soEm9f)Bn8KMfwwrUJ1(eG~>Ivl;l0Y5wWE^2qVH^sZAn||a= z6_b5?7)kr9R!Gh9iwG2TCp|eNLckt)>PERQOBl4(c6)5dPKdA&q&sSRatEZUGTM=7 zgF>X?aLLNW@s(l=-amPuzDltS&7DTz(c#**%ZmvF&1jL*%Po!f6FrRLigZzUH+c@+ zHeYvG;)oH+sYlS4Pdb3-A3n_5U?G#CN;}yd9?dotNIfpke(q?C36|!qK3bIp3%$MED<(V3?>ux+G)*&zYo_CrJd(T z^V$zmA~_|gTlm2gYBRUp(`hJ`a(5_CwS81XkfaCERk_6+op=P{>%voTaM7j$RUneO zE@)v=FRr-tO9UHZjk*(#Ke#K1vZ&CJ7?Etrx-7eyl|s0qVI(dvVY4?84t^`s>Sa*k67DDxOIl7CJQ*@&ppU)=~7fRLlUr?=eUCYYnlA@^`t^=?}=b0u*l+{*(cxX_6gT}+~CmU=beDIA&hl)rX&!f>99k-!gA0aVX?iq$C=LW_G zOt`!4q}mt2l#PJbjI2&uA&5CiN_c=fy|#Y{s65zzCEwmbNTpA5bIU-KG5Mss^8vmXiR1eo}J9lTGh@Ho}w@*9Iy=y#s9;#?dQ=&n^HK( zKqb4y@X}qOnug##;10arZ=CA1DJ}hUl!ft8^oNDio-G8|UHA&ljFUNLYOGL3G9?xK z80Z6^tB(Kzpx~5)IGJsY#0{(VBF0+REEu*quCb>irfBpV5JJ8FF4jgJM%8KlYHO`w zt%nBVeY*&OoAsVr2`@LrD;bYX0;4=M=9`!nbuC|4Jr>|yu8kd!rKDF_ike^ERVb+E zy{Nhi4FaF=VzF0QskbcIcW1t=#c?|Auo+g&wv`wYEkcH=BKG5bVo{6$;*;{n9r>2w zRTy3=a8-et`r4tBzf?q8@3V^57zvhWMOx$K;B{VzKuF$)l4ete!PIK#PV~!s2Zp?j z4ts*dLas#JyCf)9s0WjtBX_K4f`oVeDvYNrPKDosaxZ=66fMQOckmQE1&Xx-kcW8Q zf#))#y>H52gnKi7>^73KBNi^pa4AJ!W&dF(bZRIYw!3Uz+4T?7T{p^mkMOiL{o!7E0|+M1Py0kz9xXCrUIxqs=sP z6l;mGWvkPRT32s1N`JDqW$mSya8C(~%io(ry{L9SL_w&%bB%I_e-E}; zf74l_R=Y{`H;OEU#x6dZXI!45Z|;O9bqG+v^G>;-acxqF&b8x~c4)8^6c7rHWvQsoK-A20KVw%1#4v_d7abKe-v1)AZTv0H~WeXw@ zlN~xYQy#vE`$oicIdAov;H~+*b!cSgj=%7Fc3FZBqjGg;#@jfX^anc7z2V+gw@A70gr5PQ#+4+-~Ij9nF)}| z@jhCSr5}SkwPXpW{j+je^x?zcgIj>(mQ7 z46e4KQ^u-w1AAK>;cgAQwMmBzbeSMOa zAxe^?G|8jpL0SKRk#>uv(MDIZSh$FtQKv`J$TahdJNf-jh&I~m-j3Sq=+pZsU|Sgn z9niL~DO_`}?X$6N)7`U0zX+#c?&V)gVVl`!OJJYG%jdj%{gqBS5SRQ5JTAwaCmRj( z2&Ygz4wwwWWdVm1IGtQQizF-{9+7qC2C;1GafqL~KL~Z<>PYIQjk(0g^2zM;=XUvi z3_(ldeF>_$(-ObxiZI~J7e{tZ|dck=T5Rh{n_guxYWaYVpA z+U&GXl+uoiT+rwib4701UvntbIqi6&4?q_Zm3TN#R{Q-nNV9$FbC`CT3>D|K_u6l- zA1wkhr1ff8f{qRq$y+{afP$?!pp z)u3O+&%scTqOxGRtji_=jez-hvPTZfMwd`ZO#gFMWj;)MS0LHe?zVZo+gqbR!>F2f zPxyS>6)oAQkt+C~CIdKH6X3077)Xxe`U)X*#c6<*+n^K|M+OWIg<3CQ04^@RSY-5B0yPkyUrd_V^Mx6*P&gT#Eb*?pb_Njgl*p{(cJm z)uD(oJuEn2vbbB*x1m#WTI3{wIU{I#!=x!KK9|;{u1Byk)tV&8i`3q^ne*yqE;>cn z?&~OX`@9?ECaB~cy*E^Lmw{zbPf^lB0sbCSv}43(qW?>Z=T#7MH}FFdnGLx(W}a$Y zF=y9(B>QE_6?xAK3J6L zU1Q3yh7~044ruTC$ur}bO_+L%JBybb=&d)MP5j!VS1wZYe&pWP(SCi}V|(TqAcwDX zUUkXsg~ERQo;kyHM)#!6mmI~of=~1m>=R~D?xu^h%i61W3Md=-T>Faty_F9-oPnxJIhdbBPG^3NnW$}-_&=?V?^JfUZ-pAI1MlcN7 zI)zbt;sbVd3GjK#9K2A1y_A+M)UkOljKSA(QaBpPCozwuD}fiyQ=Z#SW^ewqm2dME zxxDRTFoMMU9I1VXAvXQx#|jqPrWEVgVZ5m^9we)o&w;swy5TnOfD3!gXKGou0@W<( zPGlEdFOnDe9g)ex^*15HMDWOJo<+*vAb2 z@i8ht-?V-PsN`8KHHUl- z^?yM)5L|tT35-~6#@x~!I~u%PuAJV28u!KHA9mn=*<~B(a|UTQ>ta3@u4RVJX>sGH zL~ax2nP=q z2i%y~UX*YJCt;G4^Y(_o*#x}547Pq1CyXGUv<)~NaABnVW{3$t6|bcj9g0tq10;I7 z-k!7)nR!4T{SK^{?u`hLrGJg7Ii8-tgDzR43(jnYY28T@twdWOl-}qZojdehv0Cw- zTxM2p=9;Ca_$G{wxwHxu8j&r^Q+Y$9 zHg?|eq*dt;c>X9A-tRbG?^K*(8Jx_-;5i-62wC)vO+#lkZM~f}#t|fC<_8z29i$M* z{6tCLNO+3Z4NDr7PeStRiq(uhkH7FV5tsA5p% z3s-kdZ4nRpq3FbD8S)j2tnqT0m-@yEh)7?yW;av~qYyE$2Ujcdb?GvGV6Sm#!~u#i}xZAd~f1@`8}~m0K-jwoKg_(SXHD9aH|1 zJWoauT-565+rx9U&_cctB6CSQK66%hZ>_Fr?H(C=4bg{gmaLTxuxFh>q1X4)L!!7o zjd^2K`xzd$$bL5A?*Ntr#{MmjfQ9!@+@g^HF z*;l5T?gi67I0k#f(A!_7yO$S`a?fy)j=)KlW`6*mxYcDHu@1wAc#!B#0MjNpp19<9 zdPf1lq*>5EudpQ@QcM_Yv9v)D0-0jS8JXtPU6q%9xex0Ft-nER#hBCRgGuFwEJgeW zlN5R9LSTapl*LvBxI<>8`kO`L!_$g8j6K4qZg4m*zN%Ou`@U$8h><HDVhQWuH#PZ# zDTd9uXKUFMC*#PKnoi{^8k~K~iT%yUUz z44bJE&+gbU>RGi85#)?dH!NsTzf|AF*dysj z;`Cs9^^gR!$}N+r)Dd3!k`w8?^UZLx9x4~+^`IzLb#f6m+t<=nQ@*r7CRSr}{RURP z7f^}tC|@A+km!@{<{)~I?;N7+c9-)SJxTd8py#=5aVfWv!E_JKQS8(8>djs%PdeWm zb0dG{$tLU-iDsor=qBPB8-p?M0@X*r1H$&q?|r_Cpk(-R*3Rg|I%Ruc{Y@IzkMxXg zU7@&$(BH_PHtBDR!y=gaIWT5w_Lfj*tiU(KxexL8ZkK8N@DIMl`^GPM;gwH1ZWkuK zH{s^ZJI<`yPc&iMf9hPw)Tb|Ol*q;TOAHLwL{f#L zhW7OKHa#rSi{7a#w24I@j6mVLyP&8E2JL7wEgd-KR`I{U+-|B_3qL2b-9K)t+%xwc z^k;Q)jZQ>d&3Cb zn2>=nViGPu!<8)Rh94Q3JcMb=`UQ;dk$g$Al{i{cvs<_12QNYkvp#lV8_Lq&`fgn7 z8Th2@OeF*Ac8D_>(`1^r`-;+J%tX}g6U@;BEq6R>L~7oV85g}VAD$Y4h+_2X8@Xq$ zY0Qv$#@OLQQt$`pxKNF++dG|~evS%uP?%Z+YQSUwROEsW+Cu9M7v#EBT6JJ4@25?y z^!uE+mJAP*Pxcm6GR|0KX^feAN0m4fgP*nXMrdJjB!FO zpQWVfJ5Hx6FzYHwqU8`#fgcJAMy%Rg(s+!kz00Hu>d$_vwoZ+F-u??njHc%$2-97M zZ}Qo(jKbdiXk(U=4P5MUuKQUYSE|M`3zpH*qx?DVQx7Mf<;Y~_rM?L#9+MLzB3AR? zlfde|5p&lyO`G_wO^hM~`59v2nWptle*y7n`|0>yDKz1ytePc0ro4A`-XL!>@OF_y5tJf`8|Xj%^cqD_|uR>(%2oKdZ|Nzx=@ z&AczPI=*+d`mWv~cV#TNfG9hBvoT>!D(r1;Wc2k;JU%W$P{pv4b^UuOOACP`;r;ny zpi%gd{$=#kRT5133%bqBI4~Ytv_VR_g?vn=RhUc%+wSG476ihL&(G?Ph^+L{MDZXW zn?qx|cQ>7wie;-^r|o}9`I3FxiRQ^Z{27qYl+Zv}>IgrliHODL(G+S!(mxV3mg@|q z>GoCCdlH!_VkF&K8tzC?vb`5cVQYwW`l8FaXgxc+c`f^1`LwO$MrZ2{vu*4ju=uSF zsV4?9L~eID@FZ0ka-_Ecwq4J9Zo$Wm`nm4>`3(BDP`Lyk+P zyH2hoR-yOg3kWmO0(!Qmdb9iAxqrKZF=j0FsZATNja@y0AB@7L^Oq?qnE_$@md10} zcsQvo@}D4X1e>DD zTJrsv7XnP|3l(G)&ytrVbInN!Hemi<*ZUq$SEZ+ZQF~vOQM+Y70L0Trmep3#TI$o3deWrdKoe?Pv(1KsDH++!m+Y_5wjKHi0+RamiDcGlOKM+9!5RYQ>t} zOF1VumoucvQahm89RP(JV;8nyuzJb=ND{{*i+i7Ozqzwk zS4_KrRnl>AM-RS5D>2w!95+*SyEQm5BU}?(6`=+8@h>yfYHScC@-zNUBy?*kpuw<6 ziN2l@sF~qIFB}B+eFfK6PYKG@<qEiP*_nt--AmvpEx+*|)Dv z>zf!#|7+7TGCk^U@M*4*K5a?cG$eR)96q`=#%JQ9+rqfq#C?#v0cEf)o$x7@{o<&- zh2MWeKXNjFXnyp}iD=g$)EwsCmqsH0lGrmQ2VlW8bl`@A1URFH%LcgL_f=WWW(p~Li(gEw>BOURObHLml}n9 z28q#cp1s}QKkwME;+}HSHWmdZb8&foD&kU=@6old$~V}A&sb$nd$SRMH8!0Y=DCo` z?hzSs6~fv?%TlNrSKf{RrTZB=gJt8Q zx$vI4=u&UL`x6dy-x?hVs&e=J9NajjUO!@(QPbdvrSO{$dP$QvABVAU#xN5(VELHHZa*&!t@b2K?y=_Zw~Q@Z-M@=ALs|Y*%SQ+lK)0{$~+&H zc882O*5kdR4tRiM_dgPhcptIx9vVD(<mNU31ClL8UMnQlm@A#=Z9Cd*!?)B?A9#%>t6HmRZ}2*2nj-5Q zXMv?;yU(!v-qcuNxexHt$03t@ol^&_%PswnR#~6It@nMc8{mXnCG!K6#w3 z4~MVNFZZ2&5gf^8TnEPNv!W3c-eCfJbutcL6SHPGg?uDew~Ms{{g3#zOBm}t+=_bh ziB0)fM%gE;1GLyn?IgsOOYQqMQX?n)cf2r85l(5V+@Y1ep{_~)W2LI_Crk0Z-R-yZ zu-wFifZzmHwg+YjU)EP<8uFl$^+kY5KsQW#1P^_vdjoCXKRGzH=%2c;H;^Fzv=r+8 zdbfYt26g6O)IYC*s_XdY4)2(pe;%~n_1T-Q?)gjc%J%=&1pxkK!-aodR(1H}|31(g z0OJ438+sTsAvE4Tyeux=@r``))?4?>Krb`-T0_v6?t(er|22#1jDK{uO&Z)h8+^DB z?4jri6B^%O6v0v{9zs}F?`V^D#J$hs+i2;qsQt|s^VSK=ut&9dL+roA)KCA7sW)HL ze^1?;Z{w}E{%u~m|D9pBH!%M4=evIWLr#}iRXuaoW%D`oiZc~AH&i5;YcxK3mHU=| zyO8f!4E!j z4J2dD>V!w%{2U)M!$1@k3;i}S@G=E2+i3V!cm zYLdw@}^)Vs^fx$NboXQe4yUOc^z-jBNhTKeoISdB(jpFPyX{UxZ3c&a?ia{UDSVmgqGuW(uAxAL684`PvHN5^HZza zL^w0eUkhe@^jnJqnx>b%N39keRO9RMX4_Iy0DE86z}`R~GuD|v;o=ykTreJ>yITBv zfP2XPO+MfFQ-+8S2daX$KctjkH|Z%u95mCcW=Ac7Tpdbh84ge0?O`J)KwIB!%cNcC z{?HRm!CFog?PA0ha|B_mI8HGQ#wJi@agfc{=Pz;J+Z$F?$?r-{0~!s$D* zv%N7u4}nC9(u_X+Y@8+?G*6BmAg1s36eq>vj8x^!g*d$vSn9GG=wE1YYky68m-tvL z1=!;wM1vo*=l0i|v(p7A6wr?N_ZWdz_2Xszp7g^y zB*f`Xm7El)SJC*4TP$y@GfDR(Dnpd@6IyH+ADsQI`)&HI=4qu3hJ#7!p2PX)Xf zp=J#`AsF5^->j&8XMCeDLo|lR>^JKlpPFj|&J0afW1v}!0t!E9{axZU9m=lhR-ma( zsNWM?A^DBGcHxa=a{SUl=49PR>#EF4yvrQIyWvwe;v}4YtpspA(T>iv_Ohm_D`WiI z1Gf)`A}C3pp#r45WSz*`0UmBsv7hRLoz}{=mwXOqX$jhxPQ z>+D5mg>c+lq)UzE`KglGY^EjM6KLd#xR!{8%s{y2;lxcl4o;HX;G^8@n=mS(H}Oa4 zzoQQx@81P0SOoz_7Q1sy1N-4Mi|$mwCc^0nxa21lvVH=}j_i^)({IQdNGRn`?#;Z0 z)CDc12VV?s+0=jQo;X9)=j{vwJqSm&GwQ${v=tRu@o1cbCTbHLpBw!4Wxoq`-ftNXnQ-O8Ul%@I~!+ z!5D)oPw^q(!Ttt=F!70V6*R=l@s1bGp+F&X&~fYJL5aQKOzy{}lf&f?<|^2h>9Y#- z!5ZO_a-2c{>~KnV9rE{2g?9gU0m~`z+&c2nx{!XSI}M$uJ-2q5=+lP&s+~J3sMQA! zPWz}j3=O^c-y>l|_0xv3ETlCEsN37f^y*O9c3l_RrQ%gm0K&yJ!^GH((*zj5X-M30 zuee-Ow$m}a89xf~VXNiwrKASWTtC$bF!uJ>Lv*9*>c4x@(T`hdw|2XI=)9`8=y~DF zIN7_^lCuIv*AJ@#tD)S^I&elJHmOP?6}iVE+lyuWx@CHFlL>el9PCE$@l}q*aM1;o z^`y!m@l1Ja?7pm11Y^-cu*a;~;iaXNGs)a(Z>};VtJ3fHXqTto<&@|Iu@M_5$4n+o zvi2L8s(d??wI%JiE~z;w;1m2@lWkS9Vt^Pi%p8eTdeK(VcE1J~8|lB}=>H8|pOo07 zk+*gSh)40dG@DOGciamJ!}T@>out>E(0nc`$`e*6wSYdq{0Gx*!-IaR#h#)dvC9Gp z+Zi7@`(y~3F~U%06>AKd)8&=G^I&0UfQ=}Zz@6kERT-1}1H345+;1Rj*!#DKu!(Uz z{q%d-uYmjTlI3|oeNVa`2m8^(&4%|H@umC$&81lv^kg=%Om7U;S1|zXz_J z$OXbO{{GvyStd2NCv=~7Z6hR*e1j{KRqHk6A z1!xO?WO)imR{cP<`o!*hidSuY(M0pKPIpU$jqjYexs2Rh;yLy_K?1s_?lDd3K;P8e(e&i6_h;p(c?jbvi*>nOaZk9qYVvl)IUun6u| zk+$(0Ahe-vnJ?voYwtjm7RfayprcWE(Rx%uZtoF|&L)O>;N^+rXJ4?ZtoVr!%J+Ir zr+ww4#DQSnslwbC;m@ZQu}f6?I4Bfh#L*@)9XHyn1;}I6 zphfi2syZe+ki=(W66)TiaCKCm&IjB)udBc(hok@X3DlHO-O zTL#9yfL7+A-vC7AvVbk+X^QF8_JABF_*N9cg8kKp+~?d#5s9r6H>W|fj5wWe9OtH# z_s6#_q+^&ZN>}#29gkq)n^F91FMd4JKar1HN@NY>08rop26WZBYUWYHQY_gY6a#(8 zHRKOwugb!n7*h5K7#Z2sBD{>*lYRmxsdL6?3>c8GwjNR%^Hb=;#+zBEo$T`F!x~)j z9lO{t93A%c#iD!U+-UBtIbfF9CuZ@OI`}`3Al&;u4pr_Yo&e61jgFCW4-QY5--8x4 z2vv=#vrlGtb0waR8Kj7aFt)`e$||v1Qj=RRrru+P7k_Mz`4&elb|f_bVc5IiqBCl% z=;J@Ii|{peIs8~?_nKK)%qgK)&*z*uuNPO+`mTO}6oP-a>4@KJo^Ub>prj*64wr)I z{z4mlZvEz3-%2SaQMpG$AxQB=ktkW zkz)vg(u+~0KkXUlIT3K3hjd%rEfl4YkIuxS`gNoG>3*o=Andg-V017AOyQJO=@km_ zK>s}W68oy?6}|-k@POvmCx(~lK??_dCtWtu-CuDmhBwn35Q;!@D&FvrG2fEmCnHz{ zORL}`X@awg3q{L?_CM7itlN{H1J@Fi+;hCGoR@1zk&4E>|{8FMkE$yb^* zJWje@JMG4p9w=Krt7Hj&Nb4)&nDg5k*G63#sRk3GCVSc`H9H?;2+X>1bI)$40^PwK zj3)LZ3l849{~r~zH04jD8@VJdJ^xwk!V;bXe!SDr3_@-9s|w&^lt%aJ&f0IsIbLrY zp>Cx~>K%^IM)))+&A$N1XEa z`Id)F`UDjqLC!t9ORNGew?>xb=~e)}IcULM;6@u%>XYQrDR(M6%4zRm-+GOVZ z6)=nzuaX;w(?vP`?OZs78KeF+?5nXOzmq1%6Jq}~SH?)T2|%N67zj4)glFWF9|L_o z(GQSAg5j$jC!6Xv#SaXCb_N3gKxwm2 zCOttFQB*@-mbDx5sqB;pjDrX5`GH$pBuJPPG%P99wO#GW&6^f6#nxw{WdXLzeF5vb zD<1uSNAf*C6(_%{N`J0+?^2liY2M*`bwzj5)yHN1^v((QF@A&Zf#%x|Nz#JEJehU7^G&!o`I*|#0iP9M?!@=#Wm*PE_!LuQEP&o%X1Faz^txp4=y z7+(imO<(EeyRImhlpwS2ADRzEZgL(H{YjDw_tF;Py2z)KU>^SK(z5k8fC&Uw*IxvV65{?2;?0Mx1cYM?vCJHHppYLUOqo4+ZafG~l@MCSx&X&wqN& zD9%gut1)YHF&`ENry~x`ew*CuXbH38DuWT|ucutwsR!9u*M9ECc<}JsM4+$Zpg2V7 zgp~WK>ILFM2vTqw`Va~-&|Q$QK%fRQwtS{%-;;lT(n7IHKY!jpIq-67uzkJS!g|)` zmFA!+la>Gr7xfn0$pfssa;`|R4Eg=>jO~At)WEL1wOhNScT$_T_5j=*B14?k4o;^I zO+QWRxC)oCETHTT&Yrh65^$EAhVc<;G&$)p`2+Q}okjmZq=Ia>Um+j_Ia|kj<>!Co z`wQox2pgN(2%B!4_VAzQIO^m23ww6nxu#xD1}mHbY?N5BL*9?Mh!!5VSDchEv$@@nbSC%=M!<^9cgv9s&0awCoP8qtQpZ#% zH44AkJsjgY6@4Ty>MLB&O+kOgSPVq%f}gIAdyrE;KwnFTpR~N&-_u^~s+16ol7rfb z)Gg(!%E7w_`wXsb*rwd)d(JJ%;HYj`fjPHnBxf@QkteCrA-~dP)I_d)mXPUfLk}Wi;uB_$K0K zW6z5w3WL#JfinN-ugJYo!iCkye9~F~v9G>jChlJJ@k;^YtjLnQv7(eBBa(Bx1y+%| z1(oW+%?I9&gj*{lA4=4X#+Co+AyGSSM@O}2_)98x7OV@YabTvXIZrn(cv@9s-ddk9 zYUqh?)`^U}tLDe}6wgP@@kT0vRkKA?v|ApG9|KJzv~v$7tfZsUpuOJp+4u+;rqT#H z=sa|;#T;%}qSn8ZlvNZ(Ua6jEjT~0+?+q=VEn}D={sd6j3$~6I9rDg?zp6tl?1xQy zmamGvZMQ7*iANlN!)eVN0dT4BW=JotC8Ab4#{Z^lJpGfJYt8S- z_44QcQYHSG*6;?d{T;_#{#`M91IYY=&_4fN(|Dr*`8^+h{=2gGMr8fYxO~1Vni=fXBki_ zf2wu=H+{XnX#ShAL5TdRFXjKlB}Fa+#rJ*$UN4ytTV~8=6@fOtuao7w@OSz1Uy=M} z&=x_Thp51VP9IK`Vfx+qE}t-G9fjhL*+KJqPvxt^`Oc}KiJPw><>!k-{*}5}$g~Ry zkothCzRId)TTAEp2QdG~*^wF3JI~*1J6q;i@n$QOxNn}kkv}c_ycNt1!Yod1|tM zxSmQB#qXP!y5mTrOB`A(2r$-P&??GGc6Y$P%yFuEL}PAB_!|~*jeT^V=M#v1yWyr= z$(u(i(BG{84aa@@+M)8lK#edR0=gS{JniGT`QpiNY9w5D1&*BOLn1RqBeUUk2A~v` z>caY039~>8eC=I>nhRCTOxLs!%t;6?)ysHtsC{hV{oa1q=f5cj$KU@G&_C{{5{J;L zBYa-mmP>Gia5GL)*t6TSrrUL1{uTD_qQkz|fi~!Y(&72md|zbhUBF{YwGld_P+>GE z=UV95=e$6JoTJ@uWc%fX9{&P9Z~8gR;#uRZV8$Mtk%n(Ct<-WoEXc06<^Z2XTU09^ zIeJds-QqZPyvwLe-(3a5YlDZ>EPU>{gElDwI`tPS{CD#LNk5%FbTbX0=pE4Mhye4e zuT;SXOu-K5YgzB}<0t?8bJ|jG-~QMJC~l1F%O$A7Tv$Z3Vj2`CubJ zM}gR{J3<1dFk&?t)w)I;|;= zo3FN^{6QViKl(_Xp>;9Hu^#_Rz^#*Vp`WnCx06-Y^I~|G>1j98=@GAFCJ~l zpRaaYuzjF?m4v|e|3CKLJgmtx?-y_1&gk@1WjeM3vb957YgG`DMFOObE!L_~H&9tJ z8X+P}L?D5LB<(PDV{-*rV~c=_kjfSyB&k&rC6KTPAp{a7LI??oAtV7pl5;;GR4YC2 z`CZq0{jPJ~(|`O+;CY_=zQ4<7`Q8~?;r#Ptd=_SSd^eZcI zR3O!#o`#khL)b$1STi)-2zsQS+J3@Rwa6O3^zSlCNdu+X@Ei`LF(`)!Ra}#B3m16R zBPM97H@EY%w1wcFgRsx$57Y0^JQG7w`R#C0$_?C+GUV+tv;5o9R2yYQwrJw>+L`al z%BeiY54dS_TX|Uj*n?3Co?Or)YbpV!_dqCU^|g_-7$fM_kj0{cYc!xLx!vW@{3kGU z7YrJDCA`*={r&SK=Iu}{89^AAp^9@dCv-4Xt#2uiV6@21pqI1uSur1S-Ontt6C> zJwb>AQDG!1PV>0DoM{~FA00CKQ$)Uo=@SD>9kN9K?8@mtTWf*hJEAv#9}#u<^n(Tp z_ydu$GY$u!Uf3vnuvG_%u5f zs|m~jyJbHW+ZtKFWj7=U>CuDfT>u!`GjLL3*DW?Po+doi%9%I)y@&c|p`Fo8xEO)x z0URU{>v+k)&^e~`)cmV1*|JD1SUq7Pv`M?Gg!YwTy|QbgvJJxrRH0L4CuAA=AdW*) zBhH|(0qZ1g8f_l%zvIi$KN>A}c27Tw+Urk;g2F5VdinbkebV0(GT9X_000PV+@_F9Y?m<12(mU0iL#8+oWU{MW z7>Ex{oI2pqb!>7HCh^J4%G+n`!w#B#?)NQ=p4~_?y6dg< zSO6A-aE12yyYJH*@wWjju=z-PK4Thu+e;h@MJ0iBC;@+Ss$GuT*DwQyg@qBou`14) zS0QiqT;v3fU)O8&zPH0B)pxrG?~{TFQ&Wu~_c8>wvqbR;FhipvKuS2$u?|Tok8d~3 zGeq_#U$9yr#DH-u!C{~92LP-5pZ+OqT^`^CcatXL2~#puXb8Dc2>mpX`Bv5~-{8A| zi@gZQru?$$I(otU(a6WYzR>`1(4^Xhpz47#!NVCpa}E^*$y90~ z-IN`+D9G65QFljW09B?neZDl=aevPB({AxH{)JXuy*Sn*G~U5M1%~rjMKGF)y1We6 zh2}C(^?&8*?sliS&HE#Mv}5Mu&Lm74XrT6QZr`c_CjSkRR~Zj6#%j zx0Fn=p(h+2O8nB)-vbm2qj%AFj}F}iWj0Xe1TMVi3&s2^@A`49YWZb$tAdCp3v z{!c}Dmyce@j^(*^FLg-yhOTDWbg!c{&0U?5-eSfSnV0*RgQpiOb~f%QDrhxK%PD-b)qJS>DACy*j5B#?XVCK0Q+p|kRx13;L#~)h-?}U`$6f2p z`M4=DU&E|LFIM>h1xo>!rnqmh-TC5tsP9^97J@&d+v-`ue?4ac83VdWeYz`ozBkC* zI&?)egC1KfLqKXI_~!Ez#`KAazs`>Po5 zrJXgKkKS-a{i?_LmA9CqJig6!{Z(=FD|s--JN(>g{i|x~*FX9~usFOZb1>JRZ;XFA zVlRB^x$SUm%de7;mza{dl;2wLt19j#y5hg~HP2Lo&wcxFEf~)P=;X|>P4w|o>jEo* z0Tw_52C>-}7ikWr=`^!xge06iMJf-XSQ~|`tA?p(UA)_%ptqub@ge~X1BEoS<6r&E zv5fE#q3yGXf8#)}7-W`{%-gj9VM!13Iz@A4Siu=>liKIS{`n_`w?3mFAxS>n#DW#) z=qODwSw5y+wF4{gfosT^usM>>y)ufztR;&3Q#ggiIjv1#zDhVxg?h1Hrnk@43$K25 z)$pMu4Rd1w1v%-3S3m`0_~pl-(R=b3QWHv12f-`T9RWHDxZlja8!9H8^Zh|ZvgLan zl+Ph{)Ve{@A`XHI4jh_(b*pMtk_9IqIirwzm!2?umFl8z7-CURbj1fa^h@WB1N=-#!pE z$^nBGx2o2ViGgE~;6IV~fK@P=e-U(#p&?>k7V*^QS^$M?r{o?=o-$8$_;v^AC%>$n zxg5Y=(y;H5;bRpU*g;<$$e0z2Z8l-Bb+f;_NO5ON!kGI=YfL3*iE!zMSwBGXr`fIq z0- z-_WFeEre`pMKw0N2|>mcP+c8TBY-;}qb-af9kwGrj+FQYwzWuNMGLNm8*LxXR=&Rp zk@)gu?jB%>%9;ttPtd{4a7Ok+o(!VECbkKv!7p-LKWn>IcPl+6-T+}RZ}Y_v+{KYH zPJugVh50|kETP8mw^wq6*;H3#Z`1C8^(nE3At_ZYpST@kHxaQ+xD$k%TVgPQgWB?Q z-Im4;P|KoCjBx-HKN^&s>te0w$BzDQed7a5^7Bu$!w&GnNKwYBHASalA^VXwyv?Ba z(jM<$*!CO?`5eNMwYAfxysK0dq?d#GG|*T*9{XY-*SGYjSE>jY8}`C=kYs?r@)Rct zQ}y9VAgoks+8zCGQRFj|!|y#qkdr%l6AQ~sB6ALVRCtv=(DbXTC4bvuAyOA;9c?OJ zLhm9Fz?pEzYshnL`?n)OPt0_aOMCO^k6<8)@f% zdT2KF&TLY=b##o|x6QGmKfpDw5CV1ldq?F?F@IaTXZY z-UWyk@KJqZO?F>;t8MlG^#=-naw~g-0)Tbsv{a%I)et`01}r>xsYf6r(mr|O)+p41 zQJg8o%c9GIPu~NfU({;^^PD-o5TG2G<*S?M{a^|NW^4WQuYs&`@jzyN2*POTnt}xG zzrQ=a_O0F!6J!S%(EnWA4Hqr_u57rY zc`VM#A?+Qj65i9s%ozqGKr0vVPZ|jBa%#MkY`32oEmHbJekEhCeahsy9(nN?A@AL> zWJ_?h#w_IGcNjptM)g5m$N03$T2w?(hHK@=SDYxjo$Q4MQC8RicCmKYI1Y)taR77G zhToc+o|VsTT9Aq4&oLdp$@I`R=6>Ov%3Zb{5-a&MwaHtPY9^#K(_S(o-{1`r7&5g7 z*ce*sG2qs#AduX?&;sRhAQXOlmT)~2!HC|*i?@w>c$bg4gG1wl(=nMws;ozZaT^( zY4jnY^TrqHLOId%Jnd zEzkS%rmV~JLbV%hZoe1C^Vie^E&o}6RQnX9Dg+mELXxH8?tIg8>D%}FI)PCl-4uB& z8b6>yQxI%WY4mHu^JYQrvG|tQmW`7@N_fi|y4Q7-^Yv`i1{oIl?_2+@tQB9>#spP{ zgl0v}N-1Y=E)ez}k)PrCRtAi;$uq$|NSesI*kbVF*Dg<`)lS^c8tuYr)X^(&u77n> z@h=C!DE7Nhy)=E3qx{WyR$D{mmTwm%g*6Rxil$dfJ~XqkqTNsitUj)kHWIzMOa)f}?IShe4@W>?C?T)jm5WQAHcNP6$;h za3OWirH-9tPO6-A>^|VB0Q0pGTM|7<+_ewcwxkH7`?219Km--6B)$}g`HR)}V--M3 zHk=?Vh|U)t+nD!sBcHBcbqo9|XEh!p|PD=LT~ z;$Z{4AOB0@8HdEfK0obl(+i?UQ*8EvZ%cJkRde;hCgLcC6f9st;U&~9Z`Z|pdL00}6^JlrowbSU`aR;bLFR8Lc$yxF><^*kbS@Kf5U^*zywDR=;02j7I zK7c5NKEQ{&;ACI@nj~JVyUDB=n5wo*EHtZ`C}JLB=3bRwdBnAG&drezQa7&ssOs&h ze=KwPU~BeIfBDz9e@{FA!Kbu4Elz*axqbK7hyU^2zkmAoh426L@Kp7MexBZ-EMO$~ zbGJ|p&;D^)$p*H|OVwnCRCJJ<)N$W+q+-qlbR0mKCw4!(uBX56aAVtw{JhNEQztMz z1D`b?IznN}Div`Su%kF!;=QOyDYvjN3Y+mg@*`V50ykCb!~R8Wth(Z z5`gCU1|?`z7fg@T^( zqM(1i3|BrU)Ia>_I`!~MfKEG<->D~1dhUeg6n^jFpd)I8@K(Pvm!6D{SV~|;SbhdU zqBE;WpJWVpa8JUHKNd!{8=gA`gzJrM;iMMsLBp5Ja1uAu)M*$iOdq$VAUoq)*)AU+ zL;P8J<;?x%f+zLSsY~eb!`uMF7tTs^dmcb&R=4!6Dv9#R`_ zJK^WzL{OZQb~23ybNYaZw$$#j(qw?^Jom*c3qihNLw&TJsqS^zpTXhMo}90V?D|UD zL*s*wc4UmlYx!a1u;!4;C9bdJRn@{GgI7xZpx4GhWJ_815XB z)f}?SqLU}Zxn+oJt2PiFX~b`gOX$tj*5<*SoSf-C=>iDTXE~REt%|my-R8)Hb=DI~ z;m}(>R=LCAA4-uiO`K`m!u`y^69k~BS$pI+9(7f5kk?o1GX`55vHjX7y@bJCRE`Me zL96UNosr-9sH_O?K0=tzZ4eMj{mEB-1wXmacKeQ0{3yQeak?dL3fvQz@9!Dc(<^`H zjGYVkxcxhQwl~Hxfz!D`825<0<}_PP#CL<0(ZSYrcI?AsR7vizqTnIqP*JEiN*{IZ zo+cM%_M%Z1a;!7Jdms$t)s0J_SQS?$kq$Ht)#0o5MEM5#Bz3BhZ}F{iSck%q{jjMK zFjsPEdDk`z_{9voq|Rlujop+yP%NSljXx(CLM?89zQxrpVdP4}v%Bz}V)(OqMdSUf z=}7k#T;2qS!ckD&F}v5#yxtR?Mgrpr8qCG-sRm%`)MeN8BAsPj3Y;q-W*EJ0wrY?*5=Wx2Eti*y+NCW@YnVJ?+=A>RtT6 z1;9HF(}(Xz|C|p;EJLbD&pV=LR-?!n9nV=A`LL|#g6n#0&_Hj)4bs%Nb)JC5F%>J) znNynYJ@cQt@r`aao7hpdK%2xb+3C#0MEBy2yRl>Hg9E7|PaAZ>Rch-skMpi?TOzP$ zCH54$_|SJRfDRdFv7?F=uRDDUs+KXQMV^}2-0z~&cc_{S_Y}*jT=v^hlKQRQWFy(1 zdY-O)XBDHUP>aYms*XOlD6gEa=DDm*&8i*= zR-vZp2tIS+bHx&R_nbYi;xVv4W?#IhK)9dEUYJwTl0z=^c%bUjYv;IZFRNFcZ4WV9 zL>1vUH|JOEM%;OE30w78f|c*~grVnP!N)*9Iv=j{HjiWk-Z|)k`Q*FWsGeiyO`Rhn z$EAnok@3FJ8Ll@GYtP)qBa!Wy!RQw=gI<0+@aaB`%QsQSM$GK+XjP+CAOPG3VjN_y#3v(Y`e{|eM7jP>3vj*m1p8&~e7yI*fy#FN3?OKHW*$ws!zNPfAeC3Ju>mEyfcKMTO zlyA`r?iL&3>%5UC`<;~t?yinmx3~?5zC9>DS*Ttjt;+)`yUW@d>!qG`lSE(VW>;&= zw0jz;#}z)vjY~thWby~1+HLNSAk4Zvg|FJ}+?$C^*FUp|;xGeAcmDhiB0%gja!uj+ zKt1B?9v9mGi4%wSFlu3>fWiN@+86BB6g_rv#%QP5Nst*qN|rG1WB#zPpLU>5Z0 zeYdNcGuY^vs*r9OvD@547}J)>`k4JiMzn3#x%HU?vpuAKSPS@EXCC5;Q^Uk45M0`L z!brl#@_40dn?g zad%QC5#VI52+UBTAjXM4(|0#6z8fH1jZ(S%V-cc>XSBFhU`Gz4%04bC27Z|rG3c@4 z^;YBZQaYJfy{whe!umYv{K5oTh*1Jt%1(^gpL}&vFQw^y2MT zE~CdOR!o{Y1eziCPo6b)0mRdylmyrvPp-qA!^mGx3_xc=kMMGQhq}c8xai6%I}K-| z)1#~;$HH?aWr8gub_f46ZMd72q+f*B<1DENguHXiZ*c{llc}0?&C6~$aX>6^7&p>#+mciznmdYbY92a>FC%z-eZuB zrJ?=NMbn0f>2o=ySW3N5OmJ;weCmk`0Nv#!Pk%2+(tr~jfs&2c|9sjim1X6&q=-6@ zO!69OUn}@_vy%Zpw|!%G>g7G8E1BLplpyA4eP4N)W0$9EOhKYMt7QAkdSQB;6k zx#MF3d|b<<+7IpF6oc`-G-)RPIf!n%pmW)O(1+O{ENOCima!Gx)Kkx!vJ5*kdWRk-p7dgQ)*G}sub$*)R~t+6 z{e{TJNO`RrFDbRaAzNu4sUmO%+M~PGzZ9M7`?Ek0SseCOuN9wFubqrUm0AQ=?0|q( zo43rWr|=zJ5e0=A|Ii$@qM6^ktgml6XtIr?SuG*sP2sWvjT6Tn=2xli$2*?Bn+)(? zmw#~C_ku#>HL=CdwmLphpJ$&lJowq&uSsnMr5d_7sUsGp83PuB=AYdC8k!9jUQuZ8 zh!DU}P32maT)eoUFbd;#yj@5^6%kzUVGAU|^!V$IIsi=uT&mnE=&IbBljB<=MW(K< z78{4J%T+k<3ewRqoc=tlv&o!Sw8{a$^{{>P>80Q(c}(v9qfc?2JC=i=|= z-g+GiaNug!Q5JGoC7Xrj@&DBIsyD34X_lu;LcJ@S&!Z+Y*lFxcIQ!6rV$UMLrJTYf zk7y6GLD|LkWb}ab?|TsCrTlkSl{D>c?F-~q#+g%)zq0jPu4CD(ixYisTbAW8wrprK z=+dKmZBV13#HY(;slldPKdiEK3BzR~L%80@cpC(RqPIH3V#KCMDH)To4NcRSq90nL zD#z?4x>24-|6Sp8SHIgXCo(wpgc*UNs>!Oz{#5T{MPo?80o}h>qQa>e)jZZW+J{I| z_VVuy86n8_)%p#vnv4%mE!)q82qRaqpW1t08L!1&3X0E1-0a|*6WYFnzB_5vaxyN0 zYtNSsE_*O_2rEfyzUHZP4Ih=s0QYnZ*+*}rk+d-%>g`N2`$49 z5&HbF`<0Bi==8nFjjQi>Bo*ibQ`#H4E05OLZ0oR6vkqY_iV|k*9lK^s%^fGO2bR)Z z3NorqtH|p}MT6faS`AR*j~(0TzKXk@k$S#*HCvET*5(PbS(3BX9xe(9^A1WUQyPbd zi%@T74$9w0P$#FGbI(fTHGqfV*3!6-Q%0?sUvCe{-SP>ya%TEcc!}uD{I*DY9SL&- z#+&k(a(-FRnzpZZMucQzGAH2gD6Sv@k3};+ay7Cy;Dj|*#6PGPg zekbb;SKTl;q-=%>qnXvLVMo5z6&-Bb$?mOaVvl$*o^BAeY&JfN$J*Ro)jXzg728kW zzvY8o=|mfEtVxvDDO@DcY`xD$7;ImxHFI)kNFWKw^WK0DpvQLY^xm#+ZHX&5|JDF; z$Z^=p!*ct*`9_SeNa_MLWhr0eud(p{c!Q_nP7Pt~r0QL-jv3{0+PZ3(;#^dwI9Z=W=Iztp^y2<#1J0-3{o%j9rsc`>eYwA+ZlJhNISo`=bfZY&VxKf}_Xq9={ZTbA^VMd-!^s!zP=b?P z|3*+_dNDz@;lpaDdxPFbQ14C}h?{{jbrE%J6>pF20aDnuqYF=Y!}*0b`=uWD)}vI> zxzD&t93Wo8-{RiSyjBzz`n)d|6`t{Qq?<3w3x#?nWgJHIsl9|1Y;t%16EHSzDU6!t zN3{b#XMwxSyrNac3d(k@s1<3wN@eNrX6Yk{v#{i3t~FEy+%Ca!PsPRAwx@d2+w*yRg@oV#EXB3?Kc6sJcCZQ+J_)@g$k0q z7=FznBC6RQ^^X0sLGg?WY@Zst!h2Jw+Q6J>+6`BS%3 zP$kfEeMBQI%M=Hzw@UYL+(1DC9iXMfKZQB0ohAF2=T`rgg-`)mWpt2&1`Me0cUYpu&zI^te#*7wNg8R|n@Vs2XWsIYJZ}SE@WhRK zJ3q%F5NQhwQ(L(VZ&-mNlb#MK8YIi8YUyXoT}LvI@7^DrF@B$9ddF#+;C{Yxdi7B& zJ01b5Nsw3J5#HOq`JgHGj~`}?e}7i`Vo^R?B*1SPvFp#Pm3IR9TtVRv9^9tjh?A=w zyTHV~jYgpJsOpd>0kz3rJVE(<&!sN(r{~(}CymLPucU!%p=vbxdGLCNJFFP?I=_b+ z#G!&mOCPBVoLh6rJr(9p4e?h8qiIm~3?+QCpZ{LxMX7%Xh% zo~9zt%W>YZwku!Ii2o0qPwe<&>wf6%|6ua|`|-4SULymWHeCX)T9KbEY6z^U=F^n1}$SbH-B{FH2nEF|-RH+Ka$W8yp>xsK0F-p06Kog{WcL8NK{>1qx^)Mg(L72@CANju%3R z{FB+Bh5ik54k;P{`(IeNpicO(h1Y4rj1u!-PcFMbS;IX39`y3B3MMq-YL$Eugkb@I z*|B#{9P!3!)M8?R7k;{=UzHXwG5WLX@y8GT*L<8{#)ja!(rPY!vysCzp&IojLE*wQ zhCcmbDz9wxk4xw(N=P9Q+npgZoUzUE3G|$~X+6slIXVV=QRh>iENzYw`R6Oo8qA>E zO(=WsIu76rbXhq9elq%@Fa{tdvWg*9qVmHRr=ipG@|;QP6`2z?1rHl(QvpSrYgaXo zex(j=-b_nLNZ1UtwdXe{PTx`74e*u~OguWBAxNCBiwIOO!|Fy(7;Y`NN`Vup9&9e$ zS#GJ%VE;vZjl6yKnEghlH$FB7da#}tFm{~WW?vSxPK3Bx_=A2O0``HAex`{#KeXxw zp#f-l*7@jqk-6`$1F3ccqJIt33{DU%$3NwFe{&N?(R+~?FCbU3=QyDG(>%t>$jmJL z^E<23GfsKL_V+eK%na5|8CN-lT=VIXUS0HqkoDI+rU7dfk>y~XhcHg~xwI0L4brM3 z%AL;i#|;VK*Tj+Q(N{lwzH#nczN!c1K(bEP51Sar4td4&G()Shkv8+ZIN}CWHqv6c z2i28;8>nJ8Xmxnl!c>a9_S*-_S=>5Wf~=EUVoVc0qh=Y1qDB8gkS%njk)z<|>{qnW znAqmrE1^X&X%nXtQsnw@v|!O9M<)&mkX(H75$WC+8)5Ih!*$Vu-mmocE#QifMpRrV zkyg*MoP)7`{>|nXon5@v-7t*8ie{S5SGFu^c&c7Q<~cbFp{j2{_24r1 z5o?~NxDincFp|wA(@gYD1Gtm03=*0FnQu;WVqAWGOusa3Zgj(MckPGRq3PomD}~d+pRUKtP|e{GOBZYS zaxNil^nO{Xv;h&GdSX(mcLuNdQr$^FA=t+N#6>u)iOz&9lDj$XH+Zkevnl>tSp z418;szc6Gy%rZ!QI#HoAe(IxbwMEV=-A?SFFiq3FN!Vk@KDun)Qfc^c(QrWlx-wUp zt{ij#fI04ptafUN^#CVzLWxHxa#y`5@ONl+vNCe1WmwXOHqRN8gK4>w()#tk_dB5w zgl1O%9RkItTlg!!V$w!ginw`!+(UlsAiqCsduZ+$6mZhFzHziR$nK3eP~&p-74n<~_o&cm;C&L3_- zFq)+E1%Ax?Ojwrq2ezs+Kl^nUc65O*`>59WwMzM=iu4bS=^v8XKNQ3}F8v{x2G*+i z^!Nv=^xqFv`oD5@H;6OsV4Xm7Ix=$$2Q{+32WvmU7x1bB+@p5^fnE~r;4p`B)A`I@4=hHBpF%-<_|>_ zh3rne^KLWYc~)02M=THVs>iFyg$%&Mb!j~YuFm2{3!qu%Yd9NJrypH!liClso$b;~ zyhgycRLda~RnfLStplL|vZ$8CDFK}c1W`a$_1VDo`Idi?LSY#WNP&*bcAsrff7!{y z%?ki`z6N4KSEplKTjEG=Bk~HfSCZK&XLIV?^h7PQR!n>~$khc=D zq$;WD2!Q`3^LKPUejR~?D9WN_U31a>-jgb0b+xcRj-M(ZBOlU$g4sQ9j1dFh?%?4H zjgS;bo`LZOj2DzUenl$hJm0DqIbUbyU3tCk0rWF_c!MnCvQq#hz_1%=5O2gsYU^Tz zMO@(5E!x(90a&}6?yesr{rpU^o)PCKUT)(N?l=IXfBxbv&mSiIa;~})P)^}FiD}gu zWq(6F^=_;;muLuR;ZEa$GLy}!Pg}*j=!19$iUlCG9H#OzAT^n%lMB+H1BlHRBlpvO*p3~p{F4y z0;SAwog7Xb0R64aexkUZ&`$|cPtPhSw1vq!O0}zQRd6jXCNE_oJ-Xe70*`fm@h$f5 zTNH(b%PdQ8b)iat=1Ufm*9q3Yi{do3 z&0R;I?hD2jy?b!}tbMWwlD=ugI3d{`+2O+6;oRD6hJwN`lZeg`!ScfIZ}X2PkDaRF#b`kX<~_Re#k*Ep37+ zaT{r&Gw2#Bxc4vLuXCqnl|q;D6yS8b1K=<$m19b|ZzqV#a-D$0KD1Cvh|0(BTG&gk z+rdtN`-A%$5`zyLey)yu`YgV)3C;VeT$!}Ff?+sUV>*{C8(63ON@I$`9ZpgFIdY)b zIok^c_+RF%qAMPeQlh%zMjzCR;IRMoBm8e@ z4bM|(<9{hJZOt7wD0cZiq_mVYXVfA2Gt2y49 z&dtsTYQZ;Bfbh07p2u8Y7%vJZ@Dz|{-`sixAqt6c~ z&YG~RT=lC$XY%2tkbq=!2j+0*SsEwMqirlPo>k0XI-N}5fs z1$xlUnu&J|nW^(d+KIU_OuyCk+SzRHj9L>?5H>wrvsoo{tvZ4(xP_hi-s6Tv>=bJC zK!dBzB&*$HcGm*Qt`MeIiWTgl9Y9)@n+p!@L^s9Z+Bp)}839tKq7Imn!|1g$^f{d1lVtSXl{>QZ~$dfEV>w#y)i7?2E+qkFGm z6em|9<|9G%BFnXUg5f*nArK^cv<6qntALpPk}M~pSOj#fHOh-yWLH!DHvpiwdSDg1 zmj2*^N8VYG<}ebMqXl?{8Xf?tFlmH-=N2*&{l3He?YxUs^?6`eYZi!Dx5t;xjn>s-~aWw0ja7h3SBm}wCK_*TTEad z1EUfn)3I5;u@Rq`8fb&S_n~BwIW4@2e4siKLIcnWpn(*fkdz9zd+yHSuaM3#Rx|o9 zzSjb>{kZkDa%3-1)CUID=9)*9&MR<+s}=<0 zO`Ft#tzZZRM4A}Y0n}qW{Z)$Hg@_{J5#3B&vIt1bQ2OOlQCD94{#%b;J8VFSGyeWk zIwVL|(n*+UU~1U~Rd5)i<(83*qu(?Q8V|@W?WAzSwtMSmH9Dt+K9Su1DQJ^MAjL_A zals2QwCJ^(VbjP4gzt!t;;c+&5hT8n5k4!C0x4`YU7tiP{ zs((<;j$j~Q$^7dcvCvmUAtf`~p}{K8o#^z;g(H9JHFyZp{w%<si4JN|=g4UIF|hig7EQ zUmQyWtXi{zp^S`3_R4Kft)x!L$V0QT^W1M|y$*>G^-=Y%5=z(iv%If5nc5txrRzoT zA~^Wo_99?!(|P>}uyw_aT&W5pbmcaFM5vGDx&CFo-mGzc9YO@Pv*oq{rYH_^7#e`` z@!E{^=p9g!ZUl>0El+Ds1ge)yl?_TtBx|j-q`0hAA&0g-%{c1jPznZA$YLczh)TjM zK!8pd&{9>Hfw$LizXquh-yav-j|Doqst$C&N7z2Sd>;ObTm)tW!$1g7Ec6Al7r10y zrDt)hcMo&`-s*45-|od%e71xMW`O(?jIII9CI%34%kbjErZ8w!L*dT(19)OF7t{jk z{fDFc4{-DU^mze$_knEW=hq1cSZG{B7nmRoK<_u+_%?HLAbDnm4>3nn^Lh$fxsZhePepLo|L2ht0NI~uZ9>zvfdJK?PaQW* z&8kibb`*m03vSH~ihd;v0)iv_*fGVf|6n!E_gh!j5zC6q#NQ`3+IU|;LVCz zgZ3<36`&d_tREyTEUs$yi8IT@1=48FY6tOGO%3u8}nzuR8wk>jKS_*-h&Hh5ghpl71T zrmByPGp%XBFKlL!+2u)1v?2JmB3y*OyZ3tGMoMunWEz0nf2ClK7=HPb{1NjL3zJ06 z-GFr)@p(@Ri_Za(hObLolm- zEX8 z@;=d-C>;3eD(GmC*8?dT=v6l4`$SpmL+Spe&Y--ISwD%Q@DRS;+ZwBJUtSa zW>TP=uD{Nbc*LyUQC5Jt*K4FeIH6OE}TpyPNxZl_b*$gk}8VOF7S;FSAH9yY2 z^ZgaLG)T7%lphFz#1)}C=%43ZA^nRPj=IVP-#c{85EqYAQoE)y!&IQTe15Qemq z&YPnYb%l#b3J}p#->!K8w~PY!frx}#&-m|v%rB6HH+}gEq^%yRXz$-nQpnMbQUBmg zf4aO2vOX`NF&h*CwItQheX8=i5#1QMG*J$3VK|WR&51}9JyRXpq}zm&XS^GgekdR> zndk+obVz0+yS&^6#$OS8jr_KnZdd%YJ|G<}AsI5xrfKn&o=eo4XI1McHa6F@r>r+A zuBR1+af~DpqKq1xi*wK46rUVnqziKN502C(bNJyBfpt2SZj*cbqOYYDzl^t``bDL zehUNg;9f55_A%kMOD|O^r`}6r*@p zfJR`P3a`zf^pWDlRD_1+9`w&E-6Gp*P{RY6h+)?_y#GjAz->S4?#hwjDdOu?nw7o? zz#4)W34X2U{`K!p#68A|->RK1E>!WFqT10DyNZ~XDQ zRuopu_?u`V^RH&_umen#WXoW~pl<4lk6(m>`_~nI}O09wGZ#~{$Q6J?)?Oa|jEQ2I1id&}*24=il(B^kRp_VO9IHR=Qr7(uxuL#J!^ z5Tha2UQBQOt$3LfeCyk$T~>Af*$bg-SvDmPHlBd|M&DbSKb-Y6#@d)|NMTd=M!$Qj zNV(^mWv63-^AU-p&rS;jzJxB0#|K7GH$Sa)iAS;0DlqQ)0b5Jk&nvQLg+S9myN`c&8y4thCbPsNtYvC&9={NI*qAV|BsL z<;QfFp(Mw_O+4+0gcrdl1N-!>jj04*=Rt8Kx;OJ~dd7lT4^%KjiJHDOniMU&BN zl(#*pomWI(3wJUmnAcCA9M~=}dz@od55~VowN|OJw!-0OreN!DPwQugHr@(ZObB*j z`RbAfBOm!WP5u0FivBvX>f(->`1CT!?8JDhXz^}EX zzx7bn0)`CC^o}8|R-*2H6|9N^r4 zSyMbJ(|GM5J1Rn|<*t_ObtJ+7LLT;3wbfb3U52E}OexLr6RStxhm(Q%evQqZW{r_; z7HFqdsJ#X;YFn2ZnVdoQxEUI{%cs7tK2Fnnasx9|f0wD87B00nfRf7r7TBz!|5dfl z51HKj-9O>#-ek%0&ak3yRkTlmS$B-R&VkBu8F9;0xShxtuhyABMTW8YRCil(e3LW$ zo!ImY4du`bnpoGr6}8e{)i7AS2|&};yf4xRmezv(;_Eo;d>tFCo@l=xFkx4W4bmp< z-rub1B1$?Tvs*n?7Bu5MYwtGbr^7xC_Kg_R=Z*oHZXdy$V=JGu&-j7VUyA=zSj0ga za&8()!&aE44pq+Xp$vVKI!^*W|5vhR5>{e>f4y-}vr8IZ9H2&ZtPG%U)aj9DnM=pF z#+>B~GmY*2i4-sk6SXX+RjmkQ?)iEdda%ms(u3!6fPGrq{O};r<(Kp~ z`=AlC$EY&5Cy%yob;&;ODh{2Hmt$!M@=ueV~V z*owOT;3Te5qdZdu->zPbD_mRSd0|?>BjqkfTRI)yhfg8lcVh_N;wXx9o0IcC z+nkh-u)vamVw9g1^+8IjkjN&UeSysOM+yA4=d@n+eJ?d~PoE#U? zwT=?=Re>qD==17^^I^X%*VjTXt4<`QH}Z~$Mxzm+7$#48 zHEX_~6n$!1uL!y-al4qIKjc)D+t7kq?`-et&=WR0Wu@Gb+%?(6aygH53u~5+`4)v| zCZ>X@P zc4<$$xFdugm9$clV|9&X#4kTHNQ?_T>-vUn^=-hWKX;7<>on&ZjlwMdMDtXz5!JRK z5ahe|(xiy4rX+?HwK*mhc&E7~scHNxS+0h{kEw`e{(JX-2-COmSk^cnqAin%icEiZ z7&xwvQN{o@jBzsFsYj=u8DzLvIS~m*J+HvgDSnMvgnoB;@yQXb_8evCQJHe}XW2eQ zQ_{PNjn1N=CT0>@O{A?O`biG1T1WJicqWioY2-6R@luz)U{b6M^eKv;ng>mBhbTWB zi#x9Sd0Q5gZ`HkIP>#|vTE~aMXc+giN{^8L$=;iXHF@oAqusCHmUhcf>%>gmT5$vs zA^;m{@uTOHSpNkuD&#}>Y|bwe~+*?$2Inu zJb{69rmo{GDvc_zqQ>{f7n@;-luNURfFsoIn)uz0YKp!s@?Am7Pld)gu|NizZqh0m z7Cr|@IHR>B>QuA*{wggACsAg4mP5*;1XnT7N^k;5s0H+jB?PI2kitBTnLyf3C2xk? zZHHwY2`s~@yCnUPmz`B$DpK>AYY~A5mrOuPzeOj4yEG#_RdljgqP(uxER5-6vW4U2 z5*MUZWTLoRp1ksE1Rz8F3@@!P3Qv&sz%RWLij&rhmcfxd;(ifBERz-wGAk()|K)MG zABv8qS^omYQd50vD)Gx-3peN1LOogAhr_1kbp352vqjmyewiCrXzh=^KtNxhm+jTA zngncs3pTJWJZ4<2NIb7~2)|dgm<*|%#6Xde9ZpOf>Dl~?#IQo^@Px!{)CLbSx*_ey ztJU_F)Iv1R73q*D@$S0KV!2qtv-}x*t+pkw5uitzIym7?c~iz(^3{;WtKn;aqSQc+Ju*NSPrjIEX~S`zCuAuJ)%O<68C#i_d1 zyLiGSH$2iK(BozY23r47l_Uart~N{3H4#__@OxZVcWFKD^FuT}dLXpT{ZFo7>Y**b?8p#(PHzIy4 zVtS|0YW}G_q9^^gna7ynt>s$o{LG^fO>e$2yBAKfFR9codS);V240T3$CFnt-iGr+ zf4u?;8}?M+(9&6*V|O4V;cicf)n?;UKOg9`=`FqZ7r%_w2c8qGY`Z;)tM_HBus6ju z9o?jGCM1x0sAxLVH@0X!ZLcgXCBBzo?Ylb--2!A2peEf*`YC9JJt(vtbzNU%Y6v~|6+@4M7=SE??pvzI}n8 z^KyoR$O{jTrVt1_52 z#QGH8sU}wG5b|rwBr#Cvc(D^XA-r^xf5n5@!BE zt@@p{5&qhSCsQZX@h5|fctTDx$Aip2+*jVy{{x|tRlIkF+=TUXTC8QJn1d!$o&p$@Ui<^xz{0ZKL9g z+!G?lPhC9-S&Se8FU7{_Tw;*#_XPe<1W9f=-)3|pts$E%eo*rOXfhyWP#4#ai~<9B zm6@4aiM)w1zJOrq@9RZKclCR%#NCNX*Zbv$zj$X7TQh|_2kkj?#wK$ID#;~Dy z1TQL)1Fg7pl^B8Vx+tf{Pg0nK+6QC(NRfjgLS}G)Z&TarU)vEfB@V!?^z2iRqZT(j z#3rKaoIIDqQG8oYPSZuKiT@3d7CO5n`15N1;n`PgOhi2kUK~SFJbs(#AD~&ZE>CP6 z^)tlcYrNHpgH*si3vXf$o}Bo@E@@2Zxe{Z+Y2}&t!s`cByhmJPOHMrNhLN$)9Uu;o#7(+$6;uk&LB`eNPZWEsR-C z@BD-RO=IYF(uR@g_=uU%zsGuW3m5?F!G^|r21wRsDP#m+w~B2Tp`bQl>66DmU)hnR zjYwl%<=y6eyK&IQVWTN+iuQ5;M+vrv`jHi6BhYP4`W?0H8%@m@?}JF3KC2M18fT?> z$L|*O@I#xVog-{*!<=!$`zvYdR2Kp%qE#vO;}Rf5!WizciS+EF^fD1untu>^->bMt zS{9HtfGC|07*Dp*?^^9oWL&bA>ux06-ZPvLAx)|@1%q|~%F>)PHU!n5!78|L@fhGo zV5y=z^Z-YpuFwP}2`z(}O%Bd8ZEK)A5$DX zioY-7>ys|`FmEg2kA4bjQV7PR#h$VMwGZO0|E4j)AT=3tjiFyxJB-!w9ohGjtYcke zoz`hiY5XhSE+Q)K@V<_72WhJhXz%pfx^mrM{jdJM2MFneMR)J;2G+v~5}QKoy6z}v zG>@?3?s{MxuUNo1M3)vd;N_4;EJS;KczGx+^Z35+CmZQxL0J+2Ock*THvcLaX&kdt2@(4LGaz3c<>25V3ol1`|&ZfRng(vIH0 z*##Bb`2c<3hAn?+Xq*F~2`hS$UyIa7?e>v#_9y_Mg+TRzWI={|toM&2M>EQ$#ny!k z<{x&rA?`t^_>o(w2zJ=l$2JoY6c-X$Wd&H}5@?nEvmm|K4y$CEl%MdLQ%n2_!gqHA z%F@wJNWD^J^2$fj|FaBj9PZ<**6hUs`A9fi(JB-_IE_+gO%b_L7M$lTAmm)dKmV#G zUEg`^%nTFep+aU@^)@HFNqqmJ)z2@Pi;dT0`7WaBd)4|4H?-dx`t}~{j}2Keh#YBQ z>B!x10J4KqP2X;WyK_n}7XJtRr~`lG-kP^j&XS5bAN9(U%(vfDTjVVX{6p_0B-@d~ z$ot4KDchet*tYl@r*}uSZ?aEc`zpq1ipv#$uGdVCj5Q&NdhAaQtU{6#*rxE|`YG5e z5R*bIs7pAOqm-J#8DM5J2hf5NWvW%AJbf?v7(a8Voh31mgOF|G39aPuvX!M9)N#w# zjYK>GN{=S>NWUV1!BKn?Hl{(^6GO-S&W!G&@;XlD zj{}a}L%&s|azNjsiqRIjEHlE}yN$Oe0A$gv{y#YWZ)GszoA69!bG=2rc9}?2+Fo4DLNm0(0)X_6g zZSIgdWVpQc`lbut)w&)BcBQ@%zvH(4_%nmg7?mj6I23jaw*PUdjz1}4Ka-RL@@O$5 zS$Oi%L1Sbs%c_wc4YZ5JR)l!gG8v?O*p#odjopc$Bq8xWQ`drww#BS$gLp5#fJQT= zIrpazIZVANzL@!gHtFPNDW1lXOvry%l*RZuxo0$t-3tui`q{M!A4jBuGo}BSb=*dC z;~5gxXnX@ssA9=|FBSdl%@Y=Z{4J^qpRkf#R2h{JC5lP{^>BWeKs2V{n)N9xE|4Ty z*v!OAmgJ%>%Jc=5V1-W*CzkE~eV?#m%q#+k7b%14(J>vxjVt3GSUne;dL}_BFR4hIxcjW!h22_YvfqE>;)u@!%LRf zB(s*1*gaN8;;0zkUS4c0)k8W0n2U-iGf#E*g`p$QR6UeuW%fyKNj@y!iQhHxvj)7a|uB$TjOE1ziJzwmskO(Go2a2mhdVEBtcxua6qN1CBs{PwnTHG#;Rqof;a-T`f|K zD8J9d4f`heOkvji{4bN2k=JO#(ChVMA1Oy5Tp6I{TKg#%_S7n_EiFw{yd7=`1ZlZY z-q*{&<6C;M=t#yec-=4k9_nvgVJRf2j zt=}WW59sA3#SHU-a-&6(c1{#?;&;nc$zIBYF{~NI*9$Wde2G*f8ew@??Zt=0BVM=(ko#elUax#{x>9M{>N&(V7l%1)RjRc=dNMlPE*4G^P z67$K3XG~HL>rrZ%3-uHS5%*BMdUSG+j+ffTcr@nNW;GWK=NGP)eJzPjD#E5Q?(a{C zm1=&f{aRvJ87GX6bxHR(9L0Q>Hsa@!B_i$fC&64;5{hZ^Qg|gm9qxrSJUgs(8Hh0U z3o;>kz7?AjcJ}!R^(W|MB|L=yRM&E8;SldcjoNt&la>Aj$5+_`i5#CZwZZA=vtG`cZ5=Qf#r3yoQ*tF{f>Svcl|V zv13w9#$QX@v&A%MLM7%}PsKyz|7yg^FXuf}tZ;i)+dsIHyd`T>R-QtCTszw(jT zR!BMH1r;{J+^O7?#9D=5>3fb(x)_a`R*Wh3=p0BBw}^Tan+S!qNEo3pMU@7?S}6?( zv6;f_dceF$S)l?MQshc%*p?{6R7dqP@J5=|4CJvZNb;}oOQTN9GWpBp5V%GZa|9lBa zH3nT(K=-GWUY?N;K8RVU%PYI>GnCE?#X0_q*lMx}uO3AiC_H zc&K#yX1tX(b&CJQ&Rhikv8)0MGza!DGDD9|rV>@mZ~z$Jnv#6@^B@(l2 zWbVLQ^oXx-gNU>JSz{$+Y6$eaf4+8H2#_ovv6{N~Zs*RDaEn|C_(~Y0&-spt~AAE>gZ29DJhD@T}ntmg?h2 z{qEhqeq+QsXV>)vtM0(HqOZRBAp!0B^qY-zo8JvRyD*99jKW=jTg6Hav!^Vget}bLxwKzMQ!!;a69b z>GWJZkXWB~0s!u?m_Fc#whlB*U+J~{1I>ljnaiF&_~!Ro7P%GEI?xB7X2X)FIqGZY zM56yZm^%F^8^IN-(|0sp`hey-IDaWVnD+FU2E0C4gAcB!x(BXp1q<-)3T-T)|3E?n z-+wRrf>7X{ARWW$?y^ZfF9(x}3l6!kCe*jp^(Km;%LgLHE-K(Ow(NMm2W* zHJ}}PCllRRdqT?cGDLhs=5o2)|CU5v76&lEl3dC2r>i`a6d{+<9B2j~c{HkG$kP0T zCBt#}pEu8}L38K=OHiu15zCb}l9r#U&oBXx%WHn^XtqbTw`!#CS~9HmO0*0%zSy~PwpveTB# zNh6Q?;e&Wfu)n*>rQrUoCM$6rnQAaOIcb<|T9%k@8yCNBk2|72_X^{}H@j0|@Av23 zbfxk^_LA$Mhs7N(Tw=dN#Awd~U!z8Q)OT2dv6Mi~&6oT>n*#FoF7!qiSzqvpZUO6p2QgwtJ7p}L z-rATi&BmxM>{Xcy=~iO+srn!NxWAD$>tcAasCH_Md|49cdQ#x#O8K+mW+{Kyle&t- z+f8Q+9zo^&952FPbevGUW;1nQ{N1ZN7f;j;d9*wRm{@iHD&Ep-zA;4a%ymLUv}L_Q z@_l!_k=c@%N?c3KaGP;E{plHFAva93Y>P_NENqTJl5hcajC2B#6D*)^)S~QQlu4N7 z(v`Ov71Se3-HjtcDohzvBUrFIOREi-YnSZF0mupmXqNA1fA9T$I`{k_m23s$Cko;4 ziS9JkZ+eBH90=?MZQ_|mU{aTdAq5I z9+!wB{1M}Tx^Mr$S*+Z3f?nToqHSnm%U+7~X*loMCRE5o6i`*5{2|Ie+hpYRFg!Zy zO*gVRpt4{Rzspl|2bSgTq==p9zU?Izz*AsZJqk6v|MqNEzjoK5Q&V#^A015{tU@SU z!l^s_n`H=oGoJ7wv%6S|(m}Y#H~`vR5qbyGMymv^UrD=iddea#vyN2Kbho#w3Kvs` zm%Gs#_Mr|KkJ3+|oO);TqFnLJJoX2v^gRVw*XZO?SFvP`$L>5ebPP=5#ouHV8X+t( zO_eA3eW99IkGQ3b#2=Z-7Sy51?IRHzXRk97C}yUcK5%-2+Xse+MPCRJHw;!LP&Yz5 zc|`R*@WgN!DsC^4w2YcDx#zl6Lyz-l%rds6PPh)RIqayzibG&J;&mq&KW-2;AZ<8aK7eAkJm)!z%yvyOv`n&+VITEud>!JO_EX^6I&y1#5|Kh5%o8gA5n z6l+W`j%=#&8ekWj>)`oKFmCbNhn3Y?Sw4x#Qr0FiC1qy;Z!B9@B{l!ez#18Mw74I$ z*#%B@pSJ!-oK{4Ej-K22t>P_et)aRJT-j#K(KCvxo>n>-K(G$ z;K_r8R0avVngi>~#*Ax8TliXrUzQ&5U^Z^;9S?x~Y8>zvA>Jw)X&(x8r0wy^_NC&d z4$H+pv(YYcer4&im{QPL9(h21`gQJufnPVA@Q^)C{t+m#k6p`YjkW2@F17zUX;F6+ zR@8kO3K_taH)(t!XI^%?`faH4c}q3gJi%RjvsHiM+Z#Ej=E}cjOxkos_~Ait8sMk} zt4?sA$5%7V5lbTr;Bv791dd&6T6sQLpR#_n`Gpl`$+FBC(XB0Js7cVayQKi}gc~9D z6G*g73AfR`O{*9stUXzV1f1kCWOo9wgz`)_%3sF(F;5n`KMW{%%xZs5TFigpOf8CY zKJ5HoX;luJ%ax)BAZOs8L5?YTQZk4}hIgqWonDFg1%XLN`JY7*8`3I|x4Vj;kY#;r zv27s%_P+Q{dOd$v`(4F1gX-FXyECNg&gUfAudYwm?Bbsh>ed1+&I+CGt1ZN3NscGN zk35PB;16Q1%uTNeerTA!%d$|*wjTPpVlnU2#K%$GRus=s+G-m=mqh&{fyLhaKA{FN;9 z!FynU=RYr+g3IlQLRiq>`jgVH)9=1d`!1jcvP(-#VO`sLsiC7qYib6pEj~vkl-ntX zR{1I1$Ol45*F+b$94T9$U>9=G@JkP3;HipnpZAwmIP9Nydj513s{?hhd_h(GO3Pqx z4za*}AV&QgOJ-2H6G||lkSzLJcOnd#>na9OK$pXDH1wpgL0Sd~@@?6&YX_vr4>NZ`Pte*dTUjWpjxuFCu%YjxC;8AS&z9us`Uv)`Gk+n3#0!X z!NC1KS`^2M%9ejNm!hHq*3eN0SD;-=X&=5A&WQrN)kSm;?w=bZnpm(x3LsQ=8oG2h14m0 z;NEPNtC+4=n(W^1^raEiXYB*V55J#xLkaLyei0)w{`i^x(=DX@X9W(YKaK+2Dq8W7BBm zMCjnrRTrS_j3Yz9C;iLDC)qV!(MxKwoN7x}kje__;XJ7wnRlmZ)&Cuu4sL zRGEvQx=vBG(^#727;+MeuWzrb{`I%`Ne^ivnRd4I##X^SuV%h^rjzaFqZLlhwh!c{ zJ$#8XgS=tJ6V4(~;f)_Of4JjDb_1%XzmqP=H1?&E=Wlx2BVP}o1DcFLCi@Hf9;l>l zEyE|9MIV!cI+#DmeJa|K?2<}#Hy)#-QTaVDsGdI7-*8}{piw0J`u_To;f2l@8}%kz z)_f6`>l&PYV@Icovy5FH=IJ1Sag97A!6gAwR(HKsYOd=$oR}E^5?^ou^bL9~9Nx=1 z0a$a1`MBwUR_F{rp1u|E+x`z*O2M>qvD|Zuy3W-eIEzXTjBQ= zK+JV~O{O3VjP+B{5%L>3Y@pJiu;vi1!=7&GG_k9#06jbSH#axXT#* z;GECG1`FG#3Y6;ftY}edIP=yr)aO&FuPhiqu-%kn2+V5#BGzPtyK8uSKcc!0(LyPhJUQ`ldtWfuj8P5; z0}_C79;wWI00#Hy){9I1g(abC6nT&aBMbvWZJOPw+;h|U+a zYVn3V#FwJX@wX3lbe$XSD&M3Go=n(YAFLbg2GDNrvlC|3;9UNYEG9>tg)Y!b$y!Fj zHNWty`Dg8JqvYAX(j(ZX(Ei!~r^(BH&SJ{^gl%4|fMBu0!otz`ozBkA|0%nZSdYt( zDlX6H&3%|V0}-F%Q+p@?k z7{#{!hBIvok=Re_eqCIv4a-G#vs9-AbA&p?mO#24$2t+NvSgxHKQ@C7V{$z#Kp zrUnP6982%CXvT*qn}ZHE%&j={cf^_!z;7t)8T10Yhu0b9OFB)BJV5VuG{ZcLU=?FB z`+lzp^RpU$wrnWOGB|p_=;`ld14N}g=xz?{K*SB=?`$WDtZdoNJlx`>a9A)`A@!*Y z*)i4neLMsSyRA!(Alzw~Btc19ld) z5Nn94fz&CwOtO<2?+}bR4yv~1T@?W2d8jE`q=Q8e`I&06NnClsjR}#KB8KP~IeLCm zA=O5C{Fz4$s2E{|bHB1ccQJD@1ze7fG0DEj7NnFD{$295$EvjnJ0AJ$A@c5foNl2hKr_}CkBH6iX11+7# z{i@NfzbCY_gSJ~ddj-bYg^rspcGYI@#gfUHO7z`L1GcjH)ZeG5YQ<5%>yNQlvO@{AY)6 zFvp?ofxw>3E+YhL;0~stbL_;Z!K(8br5JHu&qcZ3nV1clO?iqQX$XKqCXa>nS^U7d zP!ise+8qbCFYbLedp*Hg6TA6`I=BfUI9!0>1&yGp2;eFJ^Xjg#H;c3Kv)s+^w0oVo zRX~R}ARM)sOO*Jt;ta%%?mN1s03%|KoY&A3Q03vQIE&5f-p;5*XB*K7#zXY(ko+Es z#2zhY4{kp`YqXCv^Upi*M)bYuHBbw4{djF^9;}eyIN*$aT@E2PE$|Z6a4qWsbLE!3 zHC^W#K-1Q6($?c;Vlsmj&*}-F0RNIEieK|)Uk>9I%YpDV;KX32-UXb9`1c9UE!Hhz zgR6Lam;-@#EueevB@)q4**pZs3)=|peeWc0q0Zf{@!EI3Lumnr08(2?qM?u~8ETTfD*-JD%4IsTIl1Ch{L8bmZDX_eLqq%Zt zA+K4N4a<727>9E`^2GFW!C_AnHKYs!Q{v!nqwNqRih%!-Uzqmig{L)-PfMCdJ3U;a z`vF#Tx+$G)f^q&cOEcAgpKEk1n(x~|&w{7v?|K)z6ux&&JA~a7Qq<$`CjKl8zZX(` zD4%tKk)_;S7T%*HSkAo(uFkpfE)Qp_L#C)@s-$Q?NiNp|?)6n0sy+OO7A4aKF$>y# zHLnf4AFw7MN2p~M4TUJUN_K7%v|6{StMh9>@Aay?Z1|B~kMrwTZdO*N;QaA9JDiAYqDXb!|ckM@0YC;%Y<{@K4#vkfY$X*gV8K(+i%_Ry_;HiIeA$z<$TbjvU!i= zE;xx0cdE&V=DP`Kbf$}kA&LY5Qk%+VOZYz*c&tGnm12YSF5?%vRXfYzMaf2}a>uEV z1i9=3V*G<%XGyul1|X8UF`0l`!ug991^hb!xEZ^YVk(vT;MDNsR>{lsmN3iAs2u|$ z?yEAdS#vR2Ki`2xH{tF)vK}zOHj6=1!-L7;OmUs3@}lWC8tcJbq0@h~yt;uV|+ zNM;s2bN1oxPD`2o^1)QaK?Yd)Gps^R_bt!canPZ>&wFrpj^w&F2C=|i%>gW*3i3|{ z`Sf}JZ#fh+=rF)}#W88Se{>m`eX9QF_wiGm{$DQ0JEE1^&V*~erSqdbK9kkE50DSc54_+ak=~anD%$x+1WrX$OUtq;((tSWAB>b(OQ(K?G7*hc22th@O5Jsj z<@UX(s=KyjH!T5bDNOypU^xd__U8J|_a%Vznp0V+S^F2ixdN|q6X7;jiFf{&-T3r8 zX(6Jt5dHnEA9#E~8RSf$`^Fu>>Ok1#M-Bl{13W!bTcT&_+k@GC8z_?E@iop1J&h6Z z)p`gu^`0Xu3@?X!p$Lr&G6UW_^ZnDs(Z_AtIUr+!#>3p}PJ^%?cZ+AAb$TxB<4)Y1 zg--3^|MVZ6B$S-&^_=QK(q_1!|DtigqxD>ufvmCyO3vDga`Mn)@1_% zC_fniO449&1MjeUg+?`^d|TeH>5O{&Z~xSxiZU@?*)39->Rl)!O+^fZSb8Y01*&Ta-Q2sKwZNqlFr&v!-EE z!Nn2X?ZWE6iM>#jZfhnFlY=r3NwPxWMVOSS4#L96OVBj>G7vSEe3lFiKtQdvH8=$z z-o1MoXLjpm$RlOlA;Bb&T5UU9Z=_L|3ap!XdNTvqA5j%%Z6G(+GOM0#-0Mr^ld3^x zZna1i)Jq6h(E01c6zW?nxufYxwKnq-Y3ZcsB+vucT?M1ndKu z3LL$f5lc^-Let49*Z#3_pa}W2V@B)tR9G29jbv!7BNY*2Jvu&aYiiUD!V5~i@!Mm2;qRA4_ zQoiLn^aRJ}_1F6}mGRj@oR5$9Oan zBR=h|D(T~+t8lfgr6tDw?rD?XRzRhC;wIiox9WndusaLcPqg#9ch<4=JA3;xV5@^V zDhkjnF5n#-5eP5IUR(_@4I5D>8|;3~TO(0WwD=HfPe=bjh;*(C*O#=!h!ShqAeRm3 zdR&?zTUs|^8pd@K$!5z7x9R=a3a{KXx6b8_(lu+I-Lx@_Uz`+8 zo4D=RrDWh*#wtb8_t9f)7fn^ZCYl&6K_%udXhrF)&^%U_eczuC0;F$9e6>5>#37Qy z6Ff%$FC)f-MQq-SGW5@m4;EUP9|7uC4eG1B?qH{j82)V(d^hFIKLaP-${VauN-6Nk zX5nYVO@Ouy<~jfviH;Fo!NVV@w|(8w1_T2=gHwiV$YMdKOg<)Kacse-?gie?MHm|$5hcZZVG1& zIcDdhhMwcLS+|X}ie8!Jxi3MWIy!-6Pup)_RdSbj-%Mmk$_1V{({%@@5AwSJv0a-O z#=ip*&_CauYT?1sDgiz}6xhr-Tn1q3Gfrot7P6D~aR$h`jj63fPprh}I>B6BxH!7s z<42|=h&;R(vu)&$z1LjX6?c2ZCfeTsEx(F+9j1=%_enkv+}I|3)th3-8J++x@`R+n zt{M!28E$`@XptU%0Gb-W{udGK4V!npG)M#-cCI^v)K5;#~bqkaXkb|DH7b3XLCduKUI!?b~-dx9=c6N5GsTeb=X}(og z17uK)JZWbCHkMKC-g0=?Wr}IC!NLJ~A*S1Ga9#WFzWx8-3FiD1`W`#GluRanTt0B7 zxX&LF7r{IpyR|ii@aj%pUf#za2DOGMJP_VIeVjfJW`Mx3z_$ClXhBdFMPD&n1-*6$ zbPKrwPI+JT!!#xMKaJao21M?(pto1&s)9~(v;%7SzxHc@*F3veE=S9wC)Fp9^*D!Xl$&Mr$sA=oCp`VN+)MRiSK;9ii4%D zsQc0TEvHJ(2gC^bw9*BpngFkS7+ExtS6&eNsOV*tlEx z9uhn_9})gEhw*6+W8Rth?>L9?0YU#0j5zC-KJj{H`OcrTh2|*J|8safsuHL@0-DtA zpy|i|5m(zE%qejO<=_^m#4bFHP`W_P`N=F@Pf)fzB>KiZluNnFv1>o_VrR-wfnr)v z?L*}YNau>*d5+&`;)tzY;mI>p_aZcFz@SAoIzk*%iP1CV(b0nd+jzvJXx*EzfyN$A z9A#aix1NdTu{kp5ENUv$Af%S=;JiE(SbgUezxqX9l3rNE7R=d?m?7jaCptGq^Ms!tCI8AJ(E1S(mfPwDE6vy-T54}$GF zJm}0+w7G*1K~Z;jnVZS;}3T;uvVnZVTEeAx|1ZA1l^ z9Z|YK0t@bnM2*D`;>tx3L@2PA{Db=n>HPh`tp$i_fd)vFU{F}8T zPi6UItZ$Os`I-1u2h_q3Kxzs#lBq6q4cD$Mk>8yrCj6le*3vykf`$*Exm)+VO{J4Z zb#20bm?ehX^IQo2hmC`x^MWSa5H59 z{|wFqbi8XdA*J2EmQ&Ib(Pm(jX!|2)Fr*_0@3N*Vc{0{*XlzHr`W>zTC2*prZotn* zj1s60#*GizzhQ;|bR%~0li^G7%5ytT&g}Dk%7TqT^p~AZ(U>=%mDnFl%y|VGuq{Lw zbjTfaA_qQul(GtuWlHrfa!8=P8{B>{v8Fld@1e#OS@=PD_!gIO$*)XZVK#55HMA1UiaGc%ZAfHE>*6Qh(jvF$1H{O#&kqct+9ncZ&4p zC{}`;_|Fn6%A?ODqvtw72e$W~%?W6{=obp$4A5J<<27u3N5cNeNeOS3{BV%B;A4k< zX6Tk~-(!aXTM{70b$yZJrTY)QvxEzjUE0q+cj&rUkx9+F?XE=us8z~^Vl=+;c=tbn zO3N|Yi36G!6%tVQ`yHM%*sS~+4M{)9>;+NBCDbWk1fR5~>n4vGssk34|JH7Q5*cD} z=ooHdpd*a~;L3KAk>~hI-VUduQ4q!EBX2dh0KMDd{dKrEbB1a zct{sE5Yr=ArO?VPaA?Ywg=RIejf-?g!S-D-g@aQW@XTRU(*5i}3=SK4n`|APV5G@# zM4iCi7sjvXezvdwwh%p3iEil&kAYZU)xaI5TzJ%==&_3`yP;XE^_52_G{|)u9qM!! zbG!kdLxpaJo{KeArr6Q)`&WLOEu-A#*Dv>kfb8+LksAs9(pJ#9Fc$<5gyr-i#k!Q-l87^Z(b=~H0qh(ouOBX(TZG%k5VFfJfAPyq6 z$)J$OAAEC62P+%uSY{incF@`H;Vi5k?Ygu z*%*jbZT~&E4NS)EDUUhk&~2;Uqw9|zWgCy#){^{;$LS=WyxP@he1R(QCaaMBCD1Xx zEh&uwmt^z4R-;b7VS3D9YYRIYF+ww*96lLh9PYdQ#94<-+qN^G88IHCyRf3Ni`@Wv zuWt57-0tpYdQ3#wW7^I0zX=sTT3 zWx$E8hB2OEIEwb{eIx3fPqbPtB&OG>^jtFCokFNAyE{p1c(L|6u&mpTVCHHRi{6ay z6>IdNSvObS0Vkj65gp8JqSR9}8ChW)+EfYA6;+AEABkpi>6MwBsCBw!_E9+ZZ!*%V zqD^qbHA^fhm+2Wr*7SrD_0zeyL~ zm}!IaHEg5HmNH%}a=Z$Nf`h{l;qftx$AxDn^?Zhb#C0UG!4Tu?Di0VP?o8Gl<#Rq$ zrZKt?WIqfQbW$)LUUbuZ)E3e2NuxR?CeJ#Au?5i{de7a0hMx9uD8?*eMx7mQvI@zE zhU>zKPX4f!aZk}@hUBUI;#e`59fj%q$oJcecEWNet~67?=;|`tkWOQFM+GKey;G=@ z(*rw~L}oDNv{Br1s9P~hN6ibA2)BDYiUDJE(6p}hLx|>cqB&6@!JKOB?3dh*`VVye zl?eXh83ms%7hc$M4@)W}-jj4WP6{Y^S}L54P{dto0eC^0K!$6$@exMLRX!7tCHabr zYX;>}RWKKG+wdkMjZV+Sr;=k%-LqNH!3BtiAVfOFz_O~@qfoz4J_^?;R&`ris)L*S z_5uX@=cXnZ7=qlpqr)yKv8Kb{XH&D_fh3~m;)6x;IUKv?iECP-UW$NF+g@mZGSCH{ zm1N}cBKVL9gjE#(dBhvm8A7JqLCf!rA_1N%uc%3k(rXKaUjc#W3Q)`W1rJeOd4bBT z)XhFwTn3pK_PxVInf)YSxt`hqh}r^F!yfXgxK?2sD#&}bf^D6zBm6O?$-?@OprKcbupFvroyr!f2j$N7QJScVSZ7}l9$ss}>rt|~4#ueQSg zRfI9j8`d0E&cM$iWCIrtGDLw85@qq?F53&-22g}c^DVYNAFRF)abg_;kZLUA&X-kvNdD3|PBFz7(v=eHCQlPoisFVS1-e5s%2@bcf;_A;u=p z7ax4xDlBpmm)~+OEHEj=O9#vU)kZ#>oC9dT(aenvOAz%)pp;&zoZl-fLC)X<}jL#0%rBQy~p(P-^92J#n=*CiM_7ixI7 zCLUi1bD&ypr*eB{BindX*Cf5< zOqo^Sefwh+|CccVrlSekFmjJf;L?BD@M|uMU8f!Cz_XwK>1enuGvWN zGb@a-R~x7eopJIDouy1W!!G4?K_mQbUeMO@7*P0u*as(C`p9}OfT8;E|A2uJcQT#4 zf_6$uG5wpuNNCy!9K-jpEC*x2+T~bSYnu+xY6yk8H#oBKFwtLi(OJyW!2?f* zMeI7kZQn=l@~^mOI9V&=&E(u$$njZ!uy>j@a9n#aC1N_8Ubi>6$?N5}+mW~}HC&Cr z67K=)t3LwE;rROyRA*r04a1r^&BTs$nxccGzO}`TQn#35kkN;+e$wzI2DX?&MwHts zjCe8(j5(RUZv=%`V=9YvQQss_+|(of6Q?99JqRZR!I!#t_ll%^PRGMZTXTGJXmF5g6&E4<@E?zpWJS@IyJxCZ8yYgD1$GEJ#oaKNNIzYbayG)iKYz6Vl7}&NA8nhK$G)+>))lprWbU3NXx!DL>s;mMRKabWacVgbX%`qJvC-Hv*K_LI-Pcj%N zs4Erf6oi7Z#9il6x@;ux72G){rP z(>ukRc$yr^QYDHNl^naW3;_)JdP|C{n53yAhK*lNjybzKIwU${+o=YrS_N0Oh-B7w zgkj~a2}&VrxfW%DlVM}efHO9Wqob46L%VVPr85h?_VKh9(ALGVT!(2C;L7c70}TTu zaQ%jka8gGxF;dJ`O>CharBm#~L?m@bar&Aj&6rpv9~u#Q_LoLI(moT0FyNn3Dw^vM z=@dfmG1!|e$*F%4nWA}SmnsO6~gm_p{YZYipHZgIR7SG z@1Rk!hh~5ojvQ!6!>|k}eM6Nrg;?|RxFvYpAbX1~y#(w3XpBKF&$uaww=@wpPT~~f zbmigV4i*hvY@{5oB=CjBDy^jOQchvQA9`jJXY#cFlwL=45TnNFV@4dN4Tq*_8`9Ir zmlPvZU8n|NaRfp@jDf2r$4rGRHk(wytsG^YwG+1@V!GpT71o1lrKM_eNW{TOck_Ir z??30Irub#avdbp=3I>acXVTw*W77={zpVoW(<<}Z12(>If=%lJefYZX#a?pnPIq$? zo@SROO|iF{K2Vw8o-)sjK2VvzJ>3fZaO>Y|Xfz+3MqcR0o4lr#_D_G%(75sA)LD6= z4}@%{Rp$48(3d+f&As^0H0F?!wE-LFz3d0wo4wPDQJ-G+&;Kbq3*rX1qy4%M6(1eh zSD)6wqK?~4wSV8Of9?>L4pbxE-vGn~35;bYt5IvN?JBfr|(Hyh;xC?lEJ34$~4F?@L5`31(x zJsZi*_bjZpoTCW~uZr8GCW_^a&C_~jA6RJaU2QBg!=67>HS2|S?quA8{mbuG?#PLf zzw1_hHTwdO+$TaPc&7T%^kBTw^d7L_e_psXh7Zg7uus`M?UN-%uO5 zkm*mm1^vc_{LQp4+6sioX0wX-c0cVCj@!MDGw+?vv?F>F`aXqv@8M=t(YhD(H2()* zP<%zu`8crH8rfKH;Zw1lmRqQhiJ6+)%{6g)NFyVoVl6$>dds6^C3l!zibPQ-`i6!} zd07YtLbOSLW2Vrzg+D0bRJJk#VRaH}w6yOI({*}#n@1K{>(asmSL?dT@+5YpJr#ITM^Z%5w8_DI5NXOeUMPx9QDVzu-{gTfii>5+8arrcH5T+5@FOY{=A{ZOC1J@(l^GPdqGCU4s> z^;;hz8egVczCL@6t8HGok!kMtvdi;AIwQ$M2y*vJr?xsg%J{ytik_)^es?K~m*p($ z3gg6FyZr85YiD(QELWZ8zlwP*y;#sUl3`GKdl(282HW$+J$E8fjN__M z@v_uOaz9!?dJ$Emeu6U}F&sJetxK}>$@V#u->^kBFz4GD`eJz#=#qPBfVb4w;e>P z!F}J#$Y8?W7}dF9DHE=F{v`6WfpLFyCY-3gtY8K{_cu`XJ@oe6xT8b+95d4qMhmBu z7>({!Q$zAamWg08ow)Ari@HW8+b;8c2{3Xumx7bx2>n5=2JBP#tedh(hQ%VT|Drd; zZ_$dmj#RScRFwMVBY$La*dPlsgY=v>ZU3-q9satePVG9&!y=pgS*u_u?vN-yLsFXX zwY9g8?Q{I_W7a9)Q2sZ2Zywi#we63#*K?#jqO`|Wi6FG4RjUk@2q7}09(thG0cT`Z z8KMG-5Fi9X(q1aGWvT;21QIPOMFnIY5{Q*TgpdS92tx)TgaCm=2oOT1-;RK_S5NQf ze%^cc-S=+)ZDYvZd+oK?`mXPHEqkEq6H_QCr_yz zdvJbLC2(0-;z;~NRm*lX{L)N=IBh@zKC0$N*GNkG!EIvLASJBrTWbft!l9QRj2oMm zX6*gW4X=@x)Cv+pKCYMf#MV|gEp+^7A9O499a_YXx!1>mr8*K3R_vAw=c0yw{oa#( zG2!X`Z)B?)`t8@*tQbmn!`$lWw|~s4!$m#pvm6NfvLQYxg_ zlv&OR9*)A?&Dq!-y1!s&ccW2#)`!UgbB_JIAfwVkvbRC3i?&t>|H--nOP(}O)etiO z+1fP#lEzx&`xw0aaY3nupxP@*dOj6)_r;lz*E~@IemIN+vhuGT=-w%JZ-V{CB8}Lw z7v2nE+xrm$KUu-k<@!PAJNo>>+cDP3oa1a<(+AxT23ZcbM4QVXs zK9FN&8+MiLER=Ohj#vwVd_hyrgK;a%aCXr-PYW*VbC|iY7~*Cx@b`yL@L? z6rCrV8SCOpAIc^0NNkwk@$Fq`qNac$&&p={{H(xDkR(42NL-r;+6B#_rFTASd8XUT zZ(ovq_Jy%kcC^pvA?kKh!(r529h^+FYjOh6`hF!jyYkA28^(uyqaosB9tnD5grGpS zUarsTSLy-E#22lD{9Texb+!?)bX(wAl@k%w2J5Lfo_Vm8^L32R!0H4`2_%8}U9}zE zI}qb>H;r3%@t0_JYu-9WovPCKJ4OEV)o5I6lj=}hIi9e_(v7BaiKdpgtrxrY?$6wl z(gKuc0=11A{S%P}eD$H&u#-#6abC=rUk(A<5fQllM4rC$bl*ErjP!j9B*7N>IV(2++Hbxyp~HtzyE9l?F?}3zVx&4`CRcKa zZUWzfrYj^IbmsmvdlYNF?(!qFtzB)~wYc(WjlF3=PaN=P+XL_Nu=)rpd=qfgG6FK{ zYnsz&0QN0vCJ!w`h|_xPpRp-vqCUI_bBZP1#+B4ddP&Od(;Juv;*X~3U1x-sbX!#S zzgfW-g{3#m!vh>gS&DWAM?S1rYT7Z@_By{Nt&aFE_m@*1`H-`=fwgNxpI&)4jE%Yq zW#^ncjq5nH^2an}x=njuJSqFpId+Pl^Ho}usC6VBioC_z&JjXoET6z|rh?fEErUjf z@r-XWlSVlHgo)mA)YtwitLv?awwZD3jjEXale^@{Y}_cCe08RA4JL>0UrW^MWc21} z{!aUkWLY70;N>jnj_X$c2z4SIMC&?`A14oJ{B4;&g!QSl(#z0KB=NS+ajJBi#Qgx7 z`ZSB8Hl21^N>x`c0!J^Op>YED4&v92PRF2gkq#POhCRFEoI{p(%JsCY`ff-NMy&}< zxd&l+=*adzb%c+a_;QPlu;9l!X-6m!^G*)qMkFp0QeZ+c zHPVA!KLMfxVn|iKow))Zowv;pVkcEin`*gwfF7}+A4!x7s#q&yio{Xi)u^9Yc&G(0 z5;E#9`3yGZJDtyWm^hwslEOcFZ(L2lFK0%(IZE7H;@D=j5{? zA$iQ`0OGy+qoJn$gfjd}(&`h6gy{y1OKA{YkZ}mA>G;fnG;3Lz|7qORG(o&QnrfWP zEN@GaM71k6+$Q!s4K3Ro`mKNKFCd;v2)Rrf$Hw_KrL)w>*eG-O92_Ix&rZqX_-A5e zcJkfiM7OnC?q$7W^tvJ5CZykf?Jjhw9deb-60vkYy=-6ew3VO%I7bw=eNcrEOdvc~ zQXsBj*162+xgP&G;PP1qL-bgt;^94eQK$VoHi#nNxzjVDD_Qc;zxcMlQ#r; z9%s|2+3BXtzI`MRwW+p3{*iNVSmfr8CWc&v7U#T+8mHW>4NI>dcgx9$BE=3rydax{ zGr@oT>)ia5h#z_rq@MKfU(Ik$^^xq6JV}8l=lVIK3(t;WL$8%}*5EhU$FRP36i2lu zk|lwH+K*O@8K+~C^hp7iCA5i-hI(t!usP*u8Lsag+_o~>bi0+@yO`KB@-Vy+1i2$p zrd+HVrn5Bp10z_28J89DyxmqU<(1@!rIeAn_oMz$B{yXk*aCZUSjxE&Cew z;ei^&-&xnH5dv!~j`4nIFDn${0TyX**w#@8WuN7(IVt5PEVv`oy^8=>qlmrvN?TDE zPk(!ROv+E%>uC13c>_q7tD=Jf63>hM)tV7fwUOBiMy3ACC+0u5d^b*(vHLv%@*> zhN<|vEtO%N1C~-$>>MvY!=biK8`uzYhA=ig?TZ=MkXHEEJT-b#Z~j zLG~gCvH#64lQATv$4`OC_E=eYTxXu$=a`9wtnBhB5Qqt9eYPx6zNcj|QENe#m=AD@ zGAc)RqWNniCne#lPeU-z$U)Cz4lh3TI$<#V37(lrUtbk}oFKUbPULPjF) z+}XN*-sxeKS^$0bRD zM^*S)g!4`Nr)<$kM1$CACJ4!XLL1lmIgaiVPa7vH{#vn=MQ&c2Ci}Y>v!|91?plfS zHGeG42Spk@D|1fnG6s3*Y?N^VwAH$h^-x&5jdLeIz_GdaD6+vO^o_iC&k`gco>A2|;yJRa zR2RR!xf|bibmisH;kp9jLzpmb%T(CPOPlxSj~d?i;jpL2Q!4)HkrVoD!(PbAoNrDO zFV}OC^FI6<$eWUi&{=dImoy~>3F`>A39}daH})(@a5Rsj z&dEfhj|%g$NKg&R8*ZWHQlR}K74`=}{i3COtYX^D)~xcDy)R3_>2xX-w?N;qYd_$O zEMm#U+JLyckCe4%xA>E}adO46k_|J@GnTS#a^~&e0|a7UX9Do_@-y%|@|`Opm!1Ub z>yOK6v=Oh0hQ)V?>#f~?{cs^!AYx?MHSV)ef=8LZ=$Y=>XHllYhZlII>7S*7V_atw zEJ)uI?q-FR@y0CfxJXJo8qu^V57;`}TGkXZ*B@$Oo6IS(Krq~pKiJSI43-Gp4bo@0 zD8fQN!pfrpSfSG)nalGE+@s=MmNb~vB$zN2{o{@U)gYs(938pa3`d>m+y0OedWAMY zXB|xz#Ed<@$qKHH4+~n3sEanMT-Bnx8odQmhcL`V_?pr30?E2DZQ@6sBM&2XY;Eqy zKkA6Q!g}U_K>p?Gu3!TD%WC6@+KbzRAvflX8of*Xa~na9%@4&9QNkvE#@6+og`w~D z>G}4h)>a+Hd!V|E=$rxY6O7TAoB{h07KVAcrp85LKax(%2}SnWgnr=LT2{^$NhVsw z+uJ9D^*XIzW&(I)6n$;-94K4X3VeBSz7HI!Wo>Vhg!W0UmFaUID*T@x<2YS7P0MNI zNNd2-IlJ{yq>afgVFHSIvUyrd&4!t<&I09jWSPaZY6sco|~LCiYHODL>X< ze^if=SU`UCU|-IAbZYYJiu64gOYK3~DREp{;iK4 z*(<4L$pZVovwx1AQlYyWDBn+R<=h!j)b-xpB|mj16VwAuEL8QvW66S<9zS%6OXX6D z(Y|jKopYyjU)1>NdyNbh!4g*@eTB5 z|DDzq9oDb=8RkA}f7K>*1~)a-;+Yvv-lLaj0&zqR1wqGALOb%N8=^Noop#nLZw0kh z1JsR=*B0$B7)Mc**Ubm)M@t?N(bJ~l_z`%wp=PDSn4j%N79X*=Lo}}0>ds#ugfFMc z^Uo{?lJl=~8v&4yEa1^M%sv|F_z6x8FHYZ}5OaaC+cHmA8Cxnc%u3N++v7{ zJ#N(7TJ`hLD56}@D1(noR6`z<;h0;_qR5pM92do2A*TK^s@`XiW7*1}$NBTocF*{~=kRL9wsq2X`aFqBQeUs*LP3RMr4_2-8V;d)eJAm5T zN4Et@C2#eKJ&>%Ch+@c_@;G=H&P`ldC?!--pDE-$n>tJQ@W=^y^|DnE~?mZHOq*Fhq(Ku96k8C&Y?Co>rMV|30*Bs>iz ztaw*?3esoc5`WK(^8D2tyK7b-_C@Zav+Td*okaW7;>*n*97H$0QDUP!D7cf)k3X%-A2vm5{1bDY9#Y}Om9^d5?Xs%pRTHFOfu1L! zpYLBTIo@ErZeh!%?f)*w{e|B5HGs_v;p2Z#P2p<)HRWJ)s$$QQG4Fo7Q%sG0B_F!l zeofht3*{qrGyuo&`+|(Cuv|i&D_ZO#^Sde*C{C-U#WG8?fX3)h!uQL6!nX)tOP2R4 z0@PiLI^UNov7iXwSXur^8*GIfdr^eaw)f$z{$-iy2>Ws3!pxb%7h6~J>2jIte5C@6 zF$2%t?|#>r&OBg(blj$IK6s2IX z4cR%ViRz4%u~B%f8K06C8Oz^qKw2h7@@gB@bfUgQb#n=c`}j=JVjl1^&jf_hUC6*Z zZMJ+t*XQZB(1zMUy^WYJwCm92>F07-G$$~*Jw#Tl?K2fMfxTrIgNvCV{_Xkxs z2Wmlv_Srm_pcTd;h}=}dxwz41%%dxo3pW>M0M-P8hu_n^Ho5_L(2+}I);1F7ev#|u zCx(l?CEN&p1(+w&K||;+A%p=rYPC2>g~vKCCEypU2(NtA+0agPMjo22dz7WC1p6@8 zw(mLJaYetTkB+BGo1V3}@{?|*qx4e<)p=PBV*YzhM`<9{4U~vMfnv-+!_cbr&nRKS zg-OdRNt#qbh=H%C2w#r09`Af*^NX_q1F3@pc_e!>{^CD~H z>z668fbq!;a&=QbWVrRIWb|40O0=p*$!VG$Ky((sVI=JfwxJ*WFuN-6;N%bl+jWd< zvkfUu68E>IaEWtmUiz7l zYs&NPcC4}&%qizrH`r!%f{>t|?1Q12`T`ukAi$ItN`>%ET>~v_Ib6|0VFa{sPMC? z$dJND=*zD7;@MYL{P;4cYORu0Ca&qw2{t1J3T7Rx`sNix6`D=Zo9JVzz*yiFsnn<_ zwoY9wDsq(DaVEie$0F5QgBfe{5ncsuF#Wz|b3C#LIsR@*0FF3Oix|pCk5DFwI}N-m z84B8ZO$i(h75Z$X{yAsZ*-sAYAL6@>aCbCLkh+G>3s{zmU+j4e-yJfen<8pX!BVun z41}wiq+h^>$rJUdLI-xzV}R@AV)bJPH5~~6Ah~T2K(d4Mt*kyIVFF2IVmyS;{qc(5 z`l>G~JzsW_hGcPe8#hd1=Pz4%?@kI;JWZefMqZ#DLg+L4$_TPrN3q1eX`&%Wm(Ah0 z%?x@SS)K6Q6D3pT_rlmL3Va3n3;<;#BY3%5o*llFYKxrJ76{dsSWx2^-R(k-4atI4>w_ps2GYK|ApbfHIX-EScZwH+G!p%7s;-R4VIa%M)X(T1%WqZW zqFD0fBk%>XkrKIH&41{~eSguIkOSH$S(*;tWC2V_b5*a`bI@_YJQISFf!yrXxRc%u z8$f~Fk55IYd1wu_4_JYO^rA=kzLx646!aPi1iB=?^ z+wiEX9Pa!!_wZl+Ymk}8h6m4GLd>S|KdYTjr7RTpb%%2$wZ{c~sxl0r-$Q@yqTz|E zJB;5112+m5=QO^|*8Fr$g2DRLdx*2>GV_@^qdErwro&2wqpj3>jk~4p3s{GC!b^Wh zsld|Y?v>9i#lSj`)9d{BlgrogvFO#^0B@46jks_K+d420Ty>RM&&b^dI28rBr*!aM ze5QWpNr+d>4X6Z`^G5tHYZ0RcMMPgMen5@1)X1_p`^gE_RO_r+1A9J38RT)_IhzrW z60YKF{}a!pr!`u`DN8B>3pFpc%5?t zH);7+EcRP_`GWsuXuJQUyf1IlpAg6YD-g%6od&#cI~A1HCjih^S(Y>z4nlSiwEH(X zbFiZ-+oZFv#ARm;V7}FjQ2pm`KmTm}k*33xL$3tr25?lPQse;)Z#;WjB^4`Y0}6{1 z{n*l(->6|?M^rKw;dPR{OTk}wRXSn_5&%3{zzgv~+F$IE5)hEjfI8!jqPf(GyXI|rde;fF5W2sT^ zpH%zj2k^3t=ry>%U~^Y>I5!N*&d&`nFf(=s0BS5nzwc(Mi6t9YLzsz$%ax#tKvg54 zGIM|`k<~YVrn}N(G}AlT1N!adeaxW`_|LvTlyAxmRkD+9-T;3-t2ElTQ4D@0t8*pd0zEcxd6qh zzw{sI_%T=C{J%iQe?kI3e{P}@Xy*EkW^+OoK>(a^KiQ>Ei}hCI9-p(2C=zByAK6fr z3Me-iixZk(F1;;PcXihfdeH3Xn(2u>K?{dqZg(NGvXIV1#Rv+N%T!+j5aGf0erNKJ|9(MB^Xyo2WI0P~PqKN~g zEL0vvM%G)~aE$8kAZk#s27T4*&yu5)sDz6mKY92?E?i*0xKVCEUBE#wRf&k7Bph3im_47=erLmeyMbHQB8BgsEVCpa4=CMfkYX zB!WWJsXSNKxHF$Rairjp$l?(L-EEmqVI*VCYMG zu}UVS6BUkz%6jW1_jc(78LOrnq$v_LVWE2)&i*C9qei9Gy@4IYY+Wa}1L-hp3pIbrshL-Btd)tg z!R@=Vm2sx;ble?jPjUXqgj|=}=#HF>8g&Z3W(l)e{VFrvIDxV^^aItR{-h~-6Az!8 zGk7+o)~;!O2tY;7{KRAIjy!coD9JX!cjw<_OrImnz9Y~p9Z64`^x#UBUCpx9#(N!=wExwy+Ku7?xKXd}@c{8(#eDasey znFy|p%yjYT+ANM>L$XO+>e=C?mThBgi}3Et_d;x0<1*W1$WVDnvl;DQJC%LX z+~GpeBo!eKxe|4F*bN(Z&K6Nmde$C@c4Rs_&-m>6Z5(uWUudn_%v{#gDRGn9{fYS{ z}1nKSQa;rHNK8uR?4mT zFbuLc>~dW^fB)sm`LHdTn|4XX&Y}oNif!hOvHB-RY?)&yYR=yfm`1C5capmxz zS-EF0fWwlWh{<`{Kdp%#8Kkiv=0-s;+bVMr7*%;Nqv6eH$di!@O}$fpfO)5Fc&$;R zU-dkG8Y6SI|AFNbhvDnAYN~z>GgkWWyZF8~x-8UCjo9%mXm}#!~L!X!gbd z_>L0xyzj~!$b+yQW~#*Y&m79GBTfetnTvQ>k4A`c&Zr4IOJw2MMtcw2LcX!9x(rGx z00OZ~l3a=+KPX}BrmO}6ms9|jyzauI=%#ZWinhp7|9X4+%%k?;nIPiIo8t6`Dy;^E zqpPRmalA{Ly=)uZqV+d*QXlg-0rg~t^A9|r6`@A+Bo~7Z`2pIrPuq4lVCh+9k<^Ho z(au{M+IWMx(*9Q)#x_QgKhfY}FurbRW_vFcJVMyes(_R}TsjT4v=5>s`GY^CBZrte z8+e#3tdO{^e9k|(2D0c`n>CyEK$u}p_3^iOv7rZi+xxshC#^154_mwD&K8C>czW;e z2xg`qV&1RNpor(-AwXagw#1uvj#%W)la)KOPo7gXPD89Y4kXf>5rJNT*i6Q(luLy+ zh8gEyIAbeCjDUcR%B_ya(Wg!816ps2dxx78PGa2ZZbbOA3hpKQf7ptirk_$54j-jg zqQr{a@(75ZL>o9;zwbH7Rcbi*z;^A3WBueQReDH1S#nSyonDxRx2unrGS{~*r2?(5 z#*>TE7CYkv<`#Pq;79_!O|Uijlj{6kvp|^$a4MZVM{;mwPUw$)mi}u%0U;*;!fAs1 z@y$JoJxKmLHO8J^1v?!8S9LmffQm&cHB6sm1r6gNpyjlDqbTvKHE75blrX*!`UVTr z_Fe4}KvB+3Je+b9$HVV$|E}sGBv=?P%8=E~W=;Jxts6OROLem!x6KZw2*>E2;^QN@ zkbEAxTOQ%Pk_*?tOU1GO4D`xm-sVJZrR0Wkvn7{=0du%dl>>VGtdxiXy%}1#-YW-G zaAMfK7tiy*a6^qGfZo}zXg7w`UV1Z(y~(dND&p- zw|NW5F;;jRi6E_73ztT$P@WewOsm>i^RP4h?`Loj;Ls0 zmixarTblBYo1K`Trj#9OtryqPr`xyj6_doA_NWg1N^u=Y5&#WZ0->s$m!c)_m6a-` zm;9e%l}(}y)bb2D>(!7>KjH0@A&`HLG<@jZr~7WZRR=HVpa&U}A9fE&JUn_r-Pu1G zTQh@aj7Zf$9}$S5XiuJ{>wFTR9X9S=N5vCV?MaM)YK*|>@3eLTLLhN84>~w92VsoF zUsisi!~n&gszgw1;MHFqux`>#tF@x4-p*ZUeR;d+vIKfWkF#)&y9<_|eH|ksPAPmW zuv61V$dU?ayQE0JVWDIvN(%)v@uxsbhtoTaL@|Ga%fo@J93+!pAmCBLfU}fU6(niXH6CJ}0$n=Y$k|SbO3ngj#QQI8$FCx^f{QlUSOT z-t67De(C z8@zD`FZsWDdCqY((sbR$FW0Ft`suCuwUc6>WiTrd1^U6yw-4-JTY(2ESV ze3+A8Tq}$#v$GP@xb~+&4t6EKB57&6R@-zmxy}9tE0&p(#q@odXMbRkXOF4j zM)&YvBHB-~ORv5e!9JEJgo6&PfacgkcT+YV*H8R%VZb&MgaC#$NURz4S;36VSVkpJ z(y$I;GRCXN@M9rP=!l38JAT8oW;!t|xHC_beIcTB+cd^DC@vr~s4YjU!LUs7; z_sVyAl(7Mm!ZWsE9;kV^r6Tc)g zzdpi8J1{aEs#yT+byc<8yvu$~l1?QdWhP@RJ+mzMcv}7-mfAiwO4sGT??}oXJO`N> zaf8I8)=@~lq4=Jpn|ViAhu@7^*<`DCJDH->)#6PrgCsr!zaGH{>j6(ea^cq_`JcSm}>bC(R z`;X9JmUg)MGG`yIlzOr+@wf$YN_Drvr6ghXnZBuUZ&|Hg)qgvhh|?`&=8qGXCThJT zmfotrCq9Et2S~uyJZMMQ{8b8cf5!**2;>dll{J2CC#sAOsYR^@onN3KwyB^Y3^GlR zAJdYV_6d`E6a<;`O=!wZh~5LvoCF%$lv+455~3KX58dJCN5;UJ5yREi&dsQ?)(o>e z5%;)c3KJ&+bnUrvpn`nfYwNaZVi?QJ{Tkz2d zDAo1a+ka(U$hH5WgA}A46de;|+kL{I?*$&k@xUT}1gH6V9`w;1MPi1gmBY{4lx;)4 zEjR;-nDcCe{Dbr;VhqH|m1*nk+<@T8e*qy;wyU2vc2Qdg3odiBp>L8vOajx|m$Ldo zm{LUS_z|p{W+Lv**@e!~C0=4|VL(Awu7WiQimQtLb%<@CwI7k~us|W<%l!g_1j#f` zC@)XB)qNCCu>U)03FM1;9d$TXY+dm@{!W9~j7*f?1TK*j1TJyCb>So4t%s4!Ezx%> zxhU8uK=>kHAF*N~-XjEzI)AkT2M8)yKh7EGzYsLE0Y8$9Y_J~Gv_*o9hbqPdcy!{DLU$B! zd{yXRn9Z8|fBY60hd@7OovRcAK{Ot6td){fpF~yogPmz}c zTq>ieYsTe zx@UB`di+13`_BI$DZoor-PZteFZh|SvA7q7zt=#ke=g8qihr8u8!rb5|Fb$^{b{0q zn&@-v@=p_e?%WL>5|%X@|Bp%HF1pe`dEqyp}WzhclM~QhtgVZD@yp?wF zHN2?bzDBSh;>9v(Ow_BjxMd*r;>WH9k+8=$C79QB6kOi8v9a)i3n*V@+$(#xqk5Md z^pyOKzQ2RjvvI66k&3THb*=&>u$S>_Ks-0}rckGP0Mbms3nu2{8DH!Ts%-L5lOG2= zp(=eXYZ5XO*o3cFGdzAr;spQHe7y85f8geSQ82%+(f$d)G#2H}W}E%XzjzBYbp=hj z%x0G@tZJXi)>T+6q0WAqUjSRY6)(&7z5RF1h}?=CS!ylx@*e@r+!$nVq1y9HK!x;KFuDBv)7OqZr`bxVGsUkV#jiLOHgrm{lT8pxed8O#Q$p+i)s znP+72BeN$*X-My_M3c$Ni^}E3Vai1;#N0UH&f+8<-{Lbs<0{_}_!-K1gD#=_{=b*) z3TttNW6*I)HUcWMfS#J;v~T&}$837_Uhms5!$y1`qpMpz9xe+EU|%|_b*<`d=PeC5 ze4P8Lqi_Hkaj?$eYpdDD7-a;Fl*kgg57@}HOAO9}-LE)^Lx)#3D!i=DL%GrUx5wq* ztXZCTRvh`-&#n(b#7Ep8*>Q+{MBHd57Y8bo_oD?be$(Yww+;Lz)wZmR-eap{R`)+O zj-C)?D5J|%i6`Ll&5H%qvAv6Iz=vQw%Z5b)T=rG_QCC#QO60x3J&l`}C4AM3!!JHC zN*0`5-0)-eqvsdKs-Gl24qQCBLwSo~U^JK#)4C|70PS{uru^^xnvzsSnUg6yDAq~U z`;{~CDDlJD-Z9v@3E!3L@Qtu3g{yoTjG=P9jHjUzY-Y*U`)Hoy3gx|}KE^j37sIFD zzc$-KKgdrU6MT{pBZ_}EkyevJUy!UGEbGE|SomaJHm^b3z9E%F*6k z1>m%WDCNeKK$=)SveyueGye+=xnE7vr#Hr2SGbC#D9g}an z!xtWum`tqF&rAk-RCI$u!5^y|6X(8_qJ)jZ++WKlkxjI6Q@6OR2oYEGr6Q#LU}VBW z+~h{12dkBnfAbdXfPHIgbj@=8{@8ET^H9$Rm@;Lmniv~1veV=}u0D5_GRlBzjtXs)9ZgdL|8ZZWjwO^ z!2F}+#4xY(t{2SYi1#v$_pd`R2IO8JQ!3vR(t@{`JGnqMZMxMQ%rV|fsqCcYZEBv0 zc`L6b<6C;;*(vG7cSTo92^9#A85DwJ!Sv*yy^SbKilDQ6rWN?gOc&=L)pss z@eTWz8YmaU9 z-`~tQ#ivf}IgvHxI^Q8Dg5lOA2gJm}bm1~BIYtc04RS(5xF#t^T;tSl z3NM|E57}y*wcn24p%6)jq=$vu#36+WWFXvMW7GP})TD`gw;Qr}==<*C@P|uNPtF4O z3v!m<$AVOQay-g<@7|PC=JV{7U!JLs4y0`tJ=irU^j|pHTN7S24~dgOR_S9{421>a z0!WnH2f;;L*W7pBt@f;6Z&gxN9b1X8*zLA?VWI_7$kjKXQTJSSx+xmTZU^$C%@`GX zJ`D_}^{{7KPmYwBtbSi!uwf<;tK=!u3I(3ziERY(JT8umv0vo{MsR+}I2awZb84>b z+?Y~y-$~nVZtxYc&&psHe@k3wP2*_Ah>Z0?Y09%Sq}R=@MF%~B5udA@(k1PNX+peu zRcBPSb;|o+%*#{fHdAVkcngkXK9PRD=&%391`M5^Y20_IrF!4q{i#82mR_5|=2@tH z%O-iyqj-v}T*gK9ZCqHh?>#Fswsby{PcZZ9ZIpgLjpadR;)F(< z*HYF~f?_+V{zT%QPst$#4Jqb}zUp6i(#@F%Oy)>dPYT_;25US$kDcgD{478A7tfaB z#-PSC>WORE*{j;hB9&WR*cNk0zOBdQW~;7~r$cU=y06pkhtK6t(Ia)e z(>V-&gP=_#BG^0&qJKzEt$N-+#iz{SN-JHD^XF~HEgKs6z_P{P8oSc z)ZJd!LmS@`HYE|Ab{qgh-3i1~bLH$WXL);+ajuBT>zh51jE1OhO&Q-sop9cnW3etU zk$Vo9w~LFqfAHL#cMS(0d19`7RC6@7`8-!<>=&1r!tKdQxkHTC+^;Zi$|*}L>~}iU zG^0+g+&lvi8-#z-4i{wt_}{tHv5jjI3Mm{sIannAVCJf&$@#3f4w|kPm_S=D=MzVZ z)WYu>BBUvT`9#@qoqI^0JCF^VJKt#3nx@7~hGUe&W9BorSQ;B$ybL|1Wvv~gF_n~x zodq+zKXmavQ|~=aB)~T`#YEyZoMGTdmT!6K(8TSi^dgo(*US5Qc6PS;B$IvN-dy)3 zllLtXYs`)9dN62q#%7T|vrt$*HTG<@D>dy+IZwU%TTUPiN}HMcJSt!c$1lqmIxz(e z5}3NFvo}J^CMn9^2VgX{xOM1Dm`?o!jH_)?j;%x7arz)Li*e}(QsF$Ll~bW1t7d)2 zT`@l>`$QabvMRr*dGMR!p_y@ZFh5z4XK8u`mg#z7o+jQfLr&~#dPe28(_1c-kDXK6 zjqHzddw&mPh=Tfq=u04e-wO;YxX4#rUO|^#I%o8NF1QDq7&Egg)oNLn0GTFWd{rS{ze0O>u-{oE5(iKD%Hu=OrjUZItr=5lh6HPo zg&5G+FC2)U8FL@}L0X$qY1?lv-|;xxbS7^9HrYD*I?J>s4Ch>3?CitcNmY%SyRZn0 zJ#GX=GRA6f=O~C9M`mihCs$j_x5!hKjx2hav$CbLBk5do5<}l~ct|m%NZdHnO3xzF zW4%V5j|i}SZn=M}b+vzwpzk^NSNA~`jM?>bp_=GGqy-uM@g6WLS20qjb_~eC)Yby! zdOGkQ$2NGiC!Ju8P6R)ySd(Cg)Ii{b<6`)e&fo~XKNoV&o;TYo=qqDfKp{iSz24GI z*E(_%1I#zkpT*%Gpv^zmffs)8?ka>W@Ys#VPIV^o15%q=2CCdKcR7i7)8?>^Q0K;3`|`jvhjCfK;zPIEHkm^ricLWBmbkV)UNZxr=zyU+BH&(X+r52f8@Gp7Cz2@uaRB7QZ2sp=$W!^; zjF<&$zxA59KT#dodnoebg6DpWL~oq#dZzPqXOvnyjBfl?mUj5eDSL3~pLq072~+~t z#2-#3P84puG?*6Tyi);l*-$e{_Wk#^d$X6yA%!hxekl;}cj$ke-1+08gX@1a-GR*5 zmOU9G7rYrRfrkffu-;#vvH9P1!^An3^Iu{8O^H?U{D#%Z4A-7VkVkP+iy61+nMXq* zPd&-wb{<*GgUFvvjk1~x#cx1$#$Ju~f%v3PR)PlLubQi@ZDK*h!%}!K04_LYcEju5p@%t9UK_G<3PMF!wR~9)G41%aEXdj z`2FyUj-#%Pwsoa;5dt59(G=l(8}k{#?5|(W$4f$b>mu#(67qD&Smt@<5k@z{{BInZ zn+2ItU#piksmgqQz}WU}v`D&*o(p*@OB@dw3Kt1`vMl=7u33GVcy|gt=Vi9(0jbpW zDt_M|dcf?;bNBmI3CPZYJq2CS94emZBz=&T_RXL-y5Hh?7&By2lb)hY-Q+GDEPlos zFiKmyo7%FL5ELJN&2%-o*Zy6d_*Nmq6?vUKi~V&im`v`!papTvDh8=2xRZLBGySqOw^HVv>`yU3(CGn9*XE{`$bZ9scMVjQo!T>G*}U z{ncgW8&JJ2WW38bO;}HwTt&o;rM8^8j@IH%k6?YtPW@vi^hf5Eel?ab0!=noP?_9% zGyM||@OtNT?;9bBDO<>Y<7unUCkv24mbSXai=fSqAn&b#IIs8PCUXA9Nv(rW1D*f<3U8pi-XJHTfS=4sDno)l0SD=pE z(0bTixWN2k{!z30;0R^oRY|K_nSy8{R>cc0{8Id^QfO=)j}NLFYzlzt`NG+1_rb?< zmR=Bb&ouQiMcba4OEl?Ng91Tn+3NT8fo;3cwQO~Z{9U@YGT5YSqs@LR3v=?{Uhy1LrxA;cET8!v4Y#rl!cdM?J z&&v}#7kGK17Ez<)cE}G=VM-2GU6|U;p}^nKOj2`64vp3J61{$N21qxfl zJM5tDAdS3bW#iNl(O@nI84|NqL*Hzi;6<_vNZj$0bzEe;H3VS?@xUpfGO1J8#i9v zno@^uay~9lGYFES_^EKu=ES^qrPSGFV=2{HP>E3i_~9&1 z&y_{Z?p~Q}H6d-aZ=oR|_h`M9c4ta-YJ-{ea3w-Qo}2#s{7+<7*| zWc_9>z*Hcm4L70ZY!O*bU#H8AX9Pl(IMRZ#SeS?$Wq%|_U)U3Rq6 zvU%&Fd$np6{CRBd2R4r}j0~8MikHpmhIHvg?hIi#2!QqK`&S=*=4kPQP?crDTWbg) z$)3F+Zhs>BG>u;vyHxA^7ig2DY}_Qvr8_8nk9v*Qw`f5i`6KFk1;3m)J70IDWo5~F z0`i{eKsLglvj>P9ybh^`w=oNKbH{ZXa z)aT%MB3 z@t?h?lif~&mO-3ku0J^)BaBT>e=KbFy!8MpFHi?gRSENm3ul~m?(lK3NR!ux3%{7p zvXtjzZ=a=+ybai#Bcg+aaefbZvGb`A-^E57Eh&CI|7*?&jFe@M2|0hbm`%Y~88uEx!S~SS6A2^Tx@RyF!PHG5&M1m`P_Zo0dO~|$!j5Zs zgmQV;G1FVQ(K?lw+I)oyBlU+5(RdV=I+u~UtyJinenRx6{hE{O*Idx+#*Qp?--o#*zRzXMd! zi6%Kk@6l%kkA^l3#iIE~Gj|g8$Ex3){pxuf-QzlHquX!G^UvpL#+^Nzhs(c-Q(l4j zI*n%7YIP^#i5U2JMx5Nzq}HvDID+-jUKWfe3)Tt?V>c~^O0U0dfs%kG1g|E+%L#wO zTpZ_-8r88-8Kh)odabY2_8yM|5X`XXrpXWT_ft!!o(wo;YWi8!Fr$(z*R_n475}Hb zYma6-%j4PYE~gL7p0+4erlU)>*6m2kVY3YusM~$jS$cjg&rcx7$s@GOM zT1uME5=PaVRtQ?pm106-C0-Ro>X8s+ZxRWHY3A(NKlTs#!*S02=Kk*ees8|t&;5Qs z_x|`9_T5{kh1v^nDuXvp9PclJS?IA}H`N`{4ELc(6Z#p&6aQFr@rby=9lQRK$d$YI zMdaX>7e{SOYV37Xwj$)tx5$3(wrH6{ z7{yu=rhL)JEQE-?1>pABNkw|YffX3{jN7t6K6E%{F_44U2 zLz-ieH7%6^8H9QC&N@v!S@q#OUqp9AerRlqVhO!VhuA*8z^>}Y66y}V-j3>0G3Of6 z!nljklT*XQn&63pc89Cx-o(*7Vwh7PHGF$HQ{ZNfI>|gY3bvE^?tw$RrG)Bo4k8S; zSX;r(rh`;DMqekkd12yhAN!h}gSl>S0mur~)+5RTBF?g=M=PcO#r8~FKHRt=qDbyy z@-CzsDp^MPSt(V^+o_kd75^Ee;HrwO@cV2JvM7xa%QFf0xqf?Mj#VlxokJLpO^j@8&Pc$@sg7i9>!RxK z?W{PeB!zsZs*UlY-#@0`5|cs586Rw{@*4(CfEgodV~U{_vkQxA_eH@BsQ6V3{w zvnNt%O4YONn8tkXJ{EyeS1~yY_e*0LgVITJxO`tFdjM~GO@Kq{cKWz643aFmIf(m_ zV;MYc(@wPQu@N-QloRioL005a(1SL`ZmldVm-q&LeE0lh94;T$b-MrGO{S{M52sxYIR* z2D+`W1)Ox{Vw)%wUiGjP9^{ss|56WLp+_qz(Q5%IH?oF%c$8rv8X!_obDmC)edqU4 z+F64D3zkDx5e5Tj4-7GT?cJytL&fm<_beI=0L>D`ZNUn7-Ee%1XYheq1}ftudzd$o zLzhkyA_5ZJRZiZgP}MsfjElXi z>sCKC1laX`qyE_V>1;Z0kBsuG^YRuw_IuQbEC#(5bI(~d#TjyIbr!$v0V(E8!%Cwi zgBduUX5Fb%W$Mzq9aj&^bacwT$8(4gv-k7o)jr{KH*3QJx4B_FlBk<(kiIvM7%X6s zUwls|es}w%}-q+F03yRg94w+G^ORi_((4xB53}8nm`s(M!_ozuES2L zmNrhJi?|pq&(@(5+`&jHOf^tW5xvK#qlr?;a+%PNkn<_7kT5P;Sy^qvMAH2@y}I5? zC1$_iS;%9~OWbAeXB@wdKEPK45{X3hlZ$V;8eUDEW54+R&#sY8KO+2>KpzyiT)jXk zFPpaYeVPYhVr=Xb)0H`=5r1kCW(!5rDto<`_K|%`B@iLfQc_Y>^3O2L44q=g+Vc}} zlXHhUvJ4syP~%zD7`A7{rE)L~zS@vMS3XFXiW>#{u;!7ck)8bv`%cI5rJf|>dKFto zQo9=(to*yBUonxjhIQAp{GwK0u?)LbBl%p?Ql6{<(;lWDF zlZOIS@VHYL^H&-m&(#H?{{Q+hp6>yPZ1jC2e#@$XLm)@rd>}(}_*jPga;Pokq;JI^ zWQ4CM6^Y&XtI0LQThY{=K&`zuRCwe~Bmp@QpO$BHLjcWeyk*g0WJC+pEj1xpr zuq2*d1P?|RT^NOlWd#4&JRpCqoe*-(Q9KLxw#Q{pp-?>kUdxq_=UvjPFAvO+wL~Kn z0?kzd_kShe+4RKV9Oc6HY!~SjDexbE4uhv~U5<%-$a=FQ#Ue|p^5Q6QG$}-8jo^u$ z&t4@`pm?L*;<4RoQ_jAXk0Jfa41(EOnerU6MMiHp>6=j2o=FN=YcIZF477FpjM%O! z(`T{tsI}|oIcl}V+9RnWfxUrih6aJ%UTygBHsv(T24=^J&AvO5+8}`UE8TdObrfO6 z0{R;W{M=ELEf#PT;OUjGLqd|5^(O@Mt6CBTI3BEhAxd9qIdNcFlUPu$;oaAg-}?M= SGJi_}u|8vaI`7o=yZ-?yD^9ln literal 0 HcmV?d00001 diff --git a/docs/images/datasource_base_info.png b/docs/images/datasource_base_info.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8797e4132fbee922d5b1918bd9c2b88bc63058 GIT binary patch literal 225595 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 z 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%0D?;icxga&m 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

a;zIQ^%?Yu)pxVz zkIQn6`Gu;l`SH{?+=8uPF~Wf0bF1W3LB+Z%XYzq`CnASMBluFKp-1zb3q{!{S$0?S z;{2AqDT^zykhn)iLy)y_!KC|Y+pT(;{>te@gVrzi|-0GRH*r;#PM(4bi*~8KL z1lcM@(QUSlecaleNTOm4Zro#q0iO(YQlY3nq&XImFLj-RG&2U6$o%$t0p)@Lb41M# ze)2ihE2$ca_%*eKk42B!X zbXjJ{{cJP0OZDjJhMZrtGLfB6F|`5+yYBfj^f;gLT)GN`(mqh{)CEwqRjdm@)S_KZ zR>t2jXdS4R6*@c+arhBqR(+jU@VgVP$&pce8w46kaPwh(Mw&?6b80@S=*dxPjL~zi zj(z2{FzcR$v#ys+Xeny$gg$m=h+4maCEy>~!A&DCaNVSjSfz}09^E&-3x8x|g<=o{xtdJhh z+F?&I-IbQ;R)PMX-K#y2$dL@BsONt9ya0X=4LX{o`|)K)SbBSGy_WX)!zfWJE7l`g z@3rsC+|V}PR#bfDD&|%yubs+?_^cR!s8KgH{;AoSW0*bmf;Z2^nO=aj=jq#v8p}%1 ze**3p;uJ>YEqADBprVO+#fB}i+k5w?26|Fa{D(s#8B|Qr^(a4oCU?j zO{TnP-PPQ~zUo-nt}_l*3O-lLu?Mwu?MIiV6IIS^SeDfP{WbcXlTZ;CGDS$bR5FvF+!Py(>5R(iiW+36QSky7?dfO^`{x{=j%Q=EoT(QartM z)KSPiBIsFl)+p(*MdnU%-nQKxeRR}2eyx#FAY*ebTX8D%#TK6cLrXAV>1L7$& zpxa_w>kMv38|{ULST!1nQSQUbXI)N)w)FfchPyc#h42cZIwSEDrJ_E&Oilvqua6O(wjW2 z%JFoSR}xG;<80P!n@-QA@w2u-VZGKdy5rOnmsyYt(&Gl9tX!Og;*#AhGVf{Y)*W_d z&mH|a^2)fGpM6Hq81r@(GrZ02zhNctVrbfzp3>+;ho;HLlK2wF;#Job9~vwbU@l0+sC( zw&~|uCmSL04Uw@7LV)cLF)cnZD5baw6?d7nyMNEKBl~f~SH2(Fd97_Ok*(c_cV=Af z;DT=5ntF zQC~YSZ?XwD8+SFE_fhT48|DZ4oGR(pDoMzwl>o0OBAg^lx~@@6*P5HsVEyvUtG`}o zLk+^@G0+tvzHhIeNBfN@gA!n7k)i96A?J3^xRzINe{r)!mx1gYS%jkK@Fz0*|9SS? zkLk!*>72|V+q!^TqOx-evR*uEia*_btXs22M3}c4B^n3>v802~Zdq$_dGR|Q-S@8n zKBJnSQp&i$uSwGXem7z}xDT95`4rIM{=UZedoCOIflH@Xj}EKzxSaL3X%T$$r+2Pa z^#3AGu&MAeJ|k!!OB;EUY^Me%b@j%HsqsH?tlvnSA1B_g^6IaWA{N>uhlS3({Jp`_ z58Oe+KD9wvo!(J%U@xcdnaf)dnQwj`rUFBvy2k}>`%n^y1dGSS_@D6MMO9yLB`Tc9 zhl(!+lNAl|p{|m9=VBs*_w%l%O720~f1PK5@A$X+dH<1+@&B7aK4sKDco4#vINsA= z9S}cJXjg3ubeHYx1!?+keiFv=C*Hhy(+nUvvH(`q*CZh3x7Imd0is}r{d{AN{l3Y( znI+$R81hyu3stl7SQa0CaBMyV=wtRTF5&-0YQb7SqDLv8*cn&F+qUyN-Y{_Sl0NnO zZeFv-mG?W=@N=Ku7VxPci93%q%Ks>b42pmH=#SjR_%D?M7el`hQ~nJL++S;fFPbE9 zH}uzd3IE2T14@6*<=RgLJ*)FbKkyxcXaB(cD-1(lQ9<8{NbCPRTlf#$|Myj3TrKmD zcK-|BxPRdOwe#9P+Wl*cm)y!2K`y`Tx0@`5Ix#KS$NCP@Ml?byS_O8@(?nyLHumC?SUVnRmb4@8Un) zPyY7(JO0Hl?=YoLs9wxi_sK@>P@BAHa{Sw^4*tV~9}`-8_+MN-A;L@j*pP~l;!lB- zJz1H5PucSy?tsa>Q0IR!Kr_`DpKh6Eebrqf4mD|(Afe)rqR zS=oOBlPJpah+0HlHfJH8^WeW6Sq+Nn7?E8ax%ut>5YW=S6FIZP8$QiB>-^in)Z5?S zl#1dkw{paH>HtJqot?-H+|?fCabF+BC?>tIyW+3I{fD`fLfm}g#?L#;a-*3OiB+63 z>E(^wq2umXD>8KE#NOgVOmK}yia+hbZB$Zaz4lMvU@(_3(OG<-zHk%rlsizmVs8SW zYu}{kZ&EJu!x!iZ{YlDd7N^aEjw^x>a7Ug`#0zX+it94%u3pqz|7l!m``-oPadHr&l!f;Ad3q$>B>>x?2&on7Q_>wi-RJ8zTy-$Z+zbm!LL4$!`Q zzprm^;oDo6;P*L8?5VQ-X`z=)H~+M2?P_4J%1CRefb`UzFF=sA$bG#w;iaA)Z;(FW z2@Gi?8_d4@Y4W`S_{;F<;N}6IAKAa@#&6M?MeYSUR#O8Atp3=emyPsIOYRySTbKfN z{MdojVTCrj*JI@KR0}}!XE5|U)r-W86ant=cGqy>&0jRO1c3NFd~}1Sd6y02KRc2u z?3J3+lu-VtXS+L+`}Vym-6QnQ9Q*QFE_zB783hFt(Lcvug4dFFegd1}r&#{C==r%} zbChr#YHR$)>)bIa+n{2W@cvqTO-b$`)$SDXQrY#-+naM&jbWhZkeoSC%GA>*aQ_$Z z;kGmU3YWEy)Q=gICxg12S=}TR#%+&<1)a_kC?gJ9@l#eFwR% z3WzHU;A8#g;NyQi1^Z8rTK&E(^rt z=7}iSQ&mH}^HjvOaIPeP&!5^Z%|)x#>=EE*Q*rm*ss{S)fv#)+CjuH1^bRzX;PwmS zLYwbjF9-Z=TlYV~afjT%bo5u2^H0k7KTtG}Eo%k^g93s6K9#qwwJCn~eny&i?ETirf6+RcD@|60aIrDOyN|Uy!=5Yf zziMcNAKFsXRL|vYUVU3@dFk4m_*-w_HmseCnVadBwveoEDuw@2 zDns9t%H_5qa%lIaIp8BTB8fTO}e)Ml@ z*uS=T9NiFRr;|rbRsdVY?~pW)(&^XfO1E6M?{PEUKUTgs>sdm?KK>tmGU9>9?mp5_ zE&t`0bgqT~v5hvPIp=A65Qo|U@UUbO0zeEMoy?=+XJP2SsW z4w%GZgDsx>F%{kptM;efVoc{aNd7GvwO4^wIh3R^kRu(hvGIt8@y;TqTEp#SQr{~Zv75j!vW=u7N*v>fYoZKrW1!fPkfhsRrB8 z_Mcv9^*e#*`KVe5?l>kJxRi2;674;0;Z1qE>SSKe?FhTAVOA2Ub#W{gH*Wfn>e z)>Q%qMcO|6ALFp1Yb_WQ(gkU1SiJSV5lylG`OB5I^ok2d(ua)*-E#eA>~6z(7>T z+9M}HKL7i7+xGjr{a0Hxi(l9)SNbMeqZn8tbz1LNJg-6nGccY=BW8U?bGXq0 z2NN}Jt7D{NJZLx2Ul$q5@~@H8*)>xq52zjsun@89Tk`=G{WYAkbB7~s0R5VSI#`%1 zjnZIzZCh!=z5*HZM!pJQKR`fMw&q~*uR}MW<}0c%3-#N2mVRqJZ?sPZenr0D$1h~O{%CAzKk~2_yrJZ|5+HBFl+KZ^UcoKA6ygLEVF3)F%LZ<;0 z1#Ud|XB8DtPTS8lap=!Y+!ahHVB$WPGwh*&4y?|az_q-X(1e9!y7R$uG?kzh1-QWv2dJr z15loc>X>tY@_aBn6u1Cslmh?348P_-th(ehB3sjA1p*yEV{Tnl>t3k!53)60KZ~9Kxwt9KQK_81oKtU@tHY~1rg!%>b2eCs&3Qn8 z*4vHPd+Gd_ZbW)$6o9y6L<|z@m*iMrk0GP@=}4$ zXlC#u4@|ZOCKYg&zPh5FT~fe`Dg!1@nAinrY?#^fS1bA$*s7gbxqpouH`)ULIZ5gm zG=Q8O069N=%;Y!xqf~Bbf(hM3@s#RRT7&`y3~YJ~n)W2{0ik@&np3Zj|DtE%m8%0! z`pV|WLhbU(Mc*vbs0lO%ApixSM?3q+{k3+N&Qd`*EkC%>24j+(_1D`ZJNMl6kgh?% zz}nYjp)^pasNINze-y{%(5Isn!RcsP0?eG<1(~;D=6v(jCLxVGz=%*lqxjp3$8%q8 z^h4!)T@DtxoXxYJFzws8-#)z6groAsZhVrO78h<3)@*{GQ;HX7pFsjhH3xTl_oJ7} z-M+G^k~A&=ZmEfQ_Y7b--un1xZ483&NP~5Eu^DS$#j~-5rB08}z3*)=-!7aaa2nEB z-4kx87LdvOQQ>Y$yKm3x8RiC{jduNeRsrH50ezb5`%&-ZSBf8IUbZg#B3H7BvY)%? zw-+su=#a#;C2vl82B+5?lOfe8mNm~Ctp#@*GdFLw3Wdo!I~dH@Es ze9rKQ6y*-1(8G{ppg3_h6FDLIYWPkJhZ@hxNQ32lW?OF@`@mV*k5masjNyC`;5adq z!HwbBOKE6YJj@*5Wi@Y8VG$4bAqm_aY5w_+bb!7vF$Zs{=$Zj`q$2{)sCwaYe~jllB&n-{Ezf6181` zmR!OYn>j2dXL7POwDU>Tqi=zEOPMN{i2h zBcg>O;tab-z8h_9{l@#O$MHgLPpGiLq^GQzaXc7(Gf+1Fc z=UqE3B)M*i&KGWqW#qClq8D(%AfJYq@bS~ynk#)9jpW!bP?4d5W;_QzjZo8%TrlAT zGY*3rb+VUI(X^PtTpd8i6xd*N0UdJ;_$z>WC&oy?a(1Y66U6>eB53Xq_@QOcWQS*`I^-dY%~o zQm;x&kcD_R1Q5p@uvS8VIDT@`U7{oD%>?#+&Id*0unD{4K4(#YJrvK5N4}R_{%Fts zRd?otE(;6%0`wANj}h5BTnHZ(I4{%K)=1vfsR#1Tr*LpI!GV!3H;btm^TyQogyk~i z$7arS{PLAF!~x{&ea`58!iwTbgCz4{H{oH5=0jQ#3bP*oXAYWHG70_q;y^&^z)h7b ziY5ar&XT&OL~Ix2c+in!PZj{`EEbfoXro&*#>4$F6F~`mK=^1G{z>QuE%47QS#D7f z_6w`|y~2&K$HDh6O?YD{NAgkuXl0-_ImXlY%M9m&p>jsgx%4OXBF zw&qci;6`+UFygEkibodl^y5$kK;z2Fw?N2f(1q1%u`1U@%F4wdh7`0&dPMe9koP z0&dP4`(`daLY;gybL>MV%BuFl0&6JLVYVNHLeiQxt&UhpU%+b<8j;{`%eNm%?<#`t z(rjLpROG^_`AZod7^Fs?1faH)jm_E8z~6^-e|FC@{R8G9u=&L&p;3Zh#6zExpv&T* zcrdK%%JJNYdm5gLq`|2ejjCP4fe!#g0iT+}+A;wM`?rv~%rIOKRa?+w zrqEMMq81-pTktU^rXu&-8PJ&?dhc3yt$Y5t*?$Xw zc1v_Y9sbM(S;<;i#yM|hwwOwh8_?N_^rPWW&e!wHdBq6oTtsw}$O;=FHKgfqxoEB$ z?JW~UBu2YuwSOoI?vTpy%B${bSX|yPswF(317xtRHh_JmvbqVm3UPN%%=` z|7sPz4ue819~6q`?YK9RIesD#{U@NDKa^&l)ZCRW6qi7}dv|pBUcH{?d)J$}ByuqE zjmWsx^Uk$t8oN5G`?UYH_bcpsYS4!FbqzPFlwhj}@QE6F-iqP-zd-vb_+JS=i7#Tl z{3a0j{(M~(2c>1?e%-*&(t>ubmrDE{^a=AK){R+Ph{E^l5`ne`W&JA6xDe0A!2Z{} zrAUmYu4?|&HA(tX_dNN%H3stFOnuI_1X!$9iNesZj-BL(Q{(}6OGWQ-l-;Y9Tilq{ zg=isErxi*NJL`R2F}Rpcr~X)MnpA<<2}R6#5IY1&ha*oQt(qc#ZLQ2@CPz9+Z{MUr zev4SITA6Ef#&_`T84%Y&S{6Km>c=7@b){gDOia3vya+#A#xq}@&LhL>B;w;m%$#uD ziSZ8F*$MQz$;`?k$|EfwB_+y|AZA(u>7=PlEWrGio9PtrXtuziukBz*GPl8@ZKbB$ zAaxu_y#&(vOd#^CFr|LyEkDdnR=22(uf3UsLNo`U=xiQZ)l7HRN!Z2ZU=om9%5DP@ z1UsQ4bzf!DWH!jVtdO+8&(9P+C^bNFE`WH!?CQl z4_yL)d(EABc?Z$~w>BB`Dga-I0Qbty*mY>|Wq0`pQncwxqI_mrjLT#<`N1>;xpS6Y zvqy)nb7(h%?z|pN1*gUYHr3Nfb=t(MRrW8^DT9oz1TcRinlj^l0xaJ?^=2jQwJF_n z{?uyp2@nrSlSw8^0L5eEA!}t4p(opESP5M9ytp=)1ZU$YBI-Qw*I$m5>#7NJko4))mkNgLh@rrPEC>U0ek0P4s z+*$gdYl)0keT7|@F7tq>+X}*Vl?rkty1ZK^AChVyjj;Cm@S7tP?Dz0TxZ1pfuL{7UjRW* zf}o0H^ToR$y3VXdwvL3l@%NXRZudr6K(qOg-oq9{y8+&LCo?}DgL2vcWnChZ6CTr# zw9ithAngKB{guS%T=x{JX=1Yc;GNy%#}B@5&JDr(6UMc=&K~np*3+QN?5I-iuB98U z`!k_{poY_Q63(|gLBd7uuof_>C+nd&@t5Da?T@-3`p_&&8!F} zeOYwck7TRH}BexGVAW^=thMeNt@|>An6KTs;t$vuRem@Am}W@aFTU& z`)NZr*J?wzMKyVJN+na04FrFCf?!R6H1kHgS|}59wEJqv%Pq=;Drg+I1@9 zQ%|wWTJ|cjacA*~KYTAn2Ef{i+uDHHx|%oJSVf#>!7hVHT94T^*&O*BxYtVv3#M#%KZ-vBBl` zGJ~}H`ws;P^ z8OW~@%*P}3uk^&52Apc8PpG3LF9L~a68WEdNrbcGB}@U32rRd23{*Wx5rh?K7ATTN zT?a+VK#_~E(Kh}Vg_3O>3vg&7B`)D+KWH^IHg-^qc33rMXZpS(X= z9&o4HbUaMl%27}qMBcO+u%UGdq=tlzYbjICgIkmN6NBn0>J|{F0s;?b>b*YgyrFn4 z+T~S_LVnt#pLsoyZd6WWJYd=~uI9^Ndz!wOHBr9ocA}h!Lc894Zr}>X zaEp}A+f}A4imE@CPGzxSbTEdFR>AzSPh!iqhV#H*H6!DG9O79HpDT!=!>Hp z(KsjyD`Xz`5}Aa+0yGq-;BG$l1Z|%Bpd?(p^jNHTV9F`xCSNfhs~pUx)ON1Vcy;X-Y-)3gEg=fxRD$I zy!WaW$Y+9;psCVXagQIJc-5b=2FzunTeSAMaQUzxf+8xO>q(ZmjLwgA@q%6CGat$~ zaibrq?F|jfS>IM!%iY1u;y?|07TZqnghTZTWe470D+I} zPN%c#D(qiKVCow~MPQ3s1@qoW`f|@0X2LgK%<$9x@-k2jT8O@(V>epsuCr^CW!;`| z<)WTH14n4j^dwU*WAbG#FV&jPb1P>eSlWHYo4FDY#YVQ!_Bk->uwX@461k(NrAp)% zG*`UqScNDKIzT(5ht&$xs@jN3isRWFxU$9|hz%V{DBhOuy*(UReumvf&Zlh^%0k#n zelVDs9aw_~VXJrxqWL5mX8D}i_l<-eSlDVx<<2S^lVj^ouZAh%HRe?qHV_Z1{@t+A zmLHho-_%Am!7Ol#Ge_4CvWT>pjI*_X)HV7bjF;`Sz#diV0YN$BMVmWPK-shcIzYon zC}Ap9u8dE{GmHz4ngqd;^)xfbm>lUc-W)1E2xSqMFvc3~qbpU)!p?olascuWAY>aW z2(~o&3tjQ12~F0hChv05TbLC=z$0jlEagtUtmIz2%oY1NN$`Yj5c0LuXmiw^I`wi` zb@jp1Vs;GFg+Hg$?l*uhE=L+-_|@$5rc`5cRIa$dG$BlPWh~}IWamd^%-20y`6ZgM=nl4 z9Yw5 zHcjTb9SdiDf25Ldk>kN%Cli?!>Y=vHn>f1RY>8V%_1I6lPf~>p`#rAvfra6`>0^d)x3x=Tp1Z+IYO@CnA)mnpG!wj z2WFbUFR`*?nF&u>btkxE;n{#SgRQzCtZKvG`K~%li$*Apl3O@(yY?$x+xIK+%FX7^ zPYFu}8D_~q?{HiEmUMk$j#c+)C?+R(w0U^3cyiZFxeSzp)^(n)wWQMPu&SLp9!L?t z#^gSysv;XWwon{Tu*EU8@R!lbFRO@@D3|9|9`XYmJy=~oWtOn-0%_kle48AL7fJh>KJ47q0d0|veALK z5NBrHr9e6YYq3gTl;vnIrvNcS=Z@J;6u4lW{sd<)qHV7o*Kxb}Kux%pint94!s4fI z$ACMLpB~w{x=^mLCTv@2AI$xRfcrjV>E#Y6b{d9T#t5`H!Cd0ZMyQ@)^094e1lDks zx^UGt(e*9uhUq8sAI}mV6`~11)j^o@z?!sF@O>DxOpGggXhuKnBRr`UQ+%hWM#?>V z1uURCaT(B3#UJ1BIa!ED1LMtfC)gUIl(*g>%*({#+oY-G9RUV)z7n=Zbsl0;7a($Av{u z4L^5Am#e+G@s{m$C01Z4-$5(N$Oi5<%oT}v_zeEBgzWREcZor?mnt#Vv}yU~DV{4% z=7t;nnb}zSxB0?#$xvLcd)0I@j?}H0m41%*DvG1Ty%XJm1a=YJF?I?ZUm5Fyp%L1x z$Zot2ImZ{ok4$b5Sn7FL-8Ytc=O^gsad3K0_PeC%aY< z*AWI$sN*)F5HWbhCX)D1&WP`IE3r_}-qvQ~3{Y(4TRpB?#G5j}E`+;*Z?~CRFUMQP za9yv&MS|rDAB_ovw(r?n!xDBn+&9+pch-qxbHrM>3Jp*iM-9=?$meevfOc_VWvS7( zV<_3huSW@+r`+ZM4x+1ycE#h11xG5nwlUj#tE(3nho4FWr-*$+#3mR74X?J~C%Z*J ze{@w}83S8txDXINHnp5K?d#nlo6kBbO&`AZi2d}+379xx$z&Zfq$Qmn9FAMuKck%2 z9fok)!5I&{v>=@E;EV@nJoLV%z%zt1FPwS73kN4o_8P;P7tXwJ=7n>Xy2b?(I z!~rJ`IB~#<15O-p;(!weoH*db0VfVPap2#F1Gd?}{5bplWeFqZA5Z=34j*R=u z)5AVu@7cWHT$?*wy(VJSxUjVYh=EfN)N2p<3=@3$55CW!HQq1%XG4hKgL`lsWA9Tx z=Kb}zrySpKc%qCk`?+_0=wF_n*ZY!P-yJ7$r&*lQ;!Gm$oJ1cgII+bExz5SLIfpt< zE%kxI|EtoXds1U&w>^r@dRWkZjn$}ASiMkfPeuQgnOS!7H+Oc=AKmtzdNm`@UR|s0 zw<62XZ&CJCWL~N6e`YpoF1JUem^J-#uAh1*qq_ZA?0ZR`f^R#+S1Tho{34Ov`mMB~ zdsF{P<=gjLtn>RHnXHn)8}a?~bk?E&{_=eHKkMI^X0Hx@oSu&VWS9JE?KJne(XPw; zbN_rMcUr#-2^8wKN${m;f_O%@B3;Vv>wn2$KR2i}Nx(XLz@OR@Wf|A|N6nxQHV8h9 z4u>T}1|4#vJdX5Rd;PD(Z#-^DYP@5{2R)xO_dxyPDp)Bw6l`oe`}$^~n%T9=m_2bD ze&H;Wxi47q((lry9mQw7(I@L~^AkNx>pbugiUsp`2 zx?MHzF{J@=-+a`2(73mgQG;IaV2)bpKGT?WqH{Tzk z*u}wRj?kWXplRqmci&42ck*DnC66hU$XxD~HuRn?=XJ`n-}ie=$){^8{wfWxWmY81 zw>(zMZT&aXg~9~4)Qo-Nt>*);?BxxHbHF7X{E#^HyG6AzJwPA+BpiMp_zHcpd~+Xj n9|2)*mHvO8D_IRa53N~om8L_!H{AbcFH{|wM7s&RNTtaDHSR+Ew>sc zO-alw0T-lHaHldg13|@o0dYgc<-NG?=eggkdH(tR^*i3<;g~rD;(M*<@;N`(d0w}V z+u17rr2Z2GLCS~z`28dVtp;xurOOq-pLN$=Bf%dzzmvB6A#$VU0Qj)XbKkLj5L7^1 zId|bl@Og#LALsob=+}PP|8h4_KWakI;imjGCUtkY@c!FizVgLhpcn1>?=RL zX+?@r39o@X;*4)ia&~Q*3JGhQoPR}sAxbK+q!U=$L{H6=%W|JQU9-RW^`4V!52(if z{`iL#XMVV)ux9_B4nV2nMA%G7~)s2NZ}~aYW4$h!&l#dw|jBBAlZcf?<;brJEZh~Kg!-YS3PajNl3()8UN!jt4(O{D`QH`#YB9ju z|A%C#{x8Y2Sa4EkyrJm&^|xKjc#hwgw9Jo^-(McV=W8vQw|OI!{A1@xSveKuT#1`Ts0$LNY4%&761!wf2n7BBgSj*0JJXq79 zY3lz%EDgOhk~MaiP7^$)wMLW&U8wrPL|tpABcvr6Ig0Y~@hsP=;o7dowBAhdktF<` zv=Ygis+^|2SL`JQhVjuI;wmVvE<-e4M7v z5*NBkO#7R43zpm)o$dFu?MyJrsbuWgWY16>Us7|*^A+pZ7NMGi$eIyK!l`N|b4MB!81V4;g3AG%=vInq zRFpuGh8g+7q0V>b6bjHOx6v9<%(P~g=%CS`%5~|^XPiW3a3Pfz>Ks68-Po93@;NAt zbQZHs@$JA!R8&-tr$u53PFnjGHyH{KA!PIr@+$q_?1t=Z%dnRQxbVcm&q4O=9T7P} z3suOhp0+;MoeMR%u;-yl@@`8+<%XP3$~6w%lY87`Ar*l(@9lz@oDVtB3X{)9-fd8h z6l{MBr@s)YAmzxelT)1)Z+&6vl!*Qco!`*hYS+X-bN4^K3__;lqa~My8do4$X=I~( z^bQ?^JsK^{zO|@k*l{E)oUNFo2IL&=bRw9p$gr`osbU_(JfyHh`nX9xEi^uFPU}z7 zJo8M1qa|G(Vo!*Wvyz&n{w>lC;%=3fUtI_HGXI>`&>W)cbS9{~Kw##}+PMLHsl|Wp zkxPTge6Z1uc+xT?s&(2E?V}!55A$Hc;mZj7eCCq}9ydZ%=S;!Go!4M5Hbv93*{M1v zKZJvg_XYzi&L5f@DT&uJjOegoAEW*?>hDbVeWQ7RCFmh9Xnf=clr-~kp)O+eT)ky6 zRP_L-8WRFhPsyYt*JrMrb>(I{e)wz^YU5JZd3QI2&ZN4J)F!nMHH6xT@a_2Fi(OU& zs7h28vckE(>nA#P3m^7U+bra-Quk|frB+b*gxB-Wbiv5j_E*?pnqQJSl6I_06-$zi z1WOq=IiA00T?^zuRNsYnJ!6CA;+f$uW#yVk7CT#7{E>|rnre?{J-SWBSRAxCTS!`r z9yHpySUor<3NtTG%b8asdhl`Fv-3N%Nwe)5OUL>it-$aO95~6QiqX%>^e=Zzi^3O! z>bV86&COTKR20~gaz1lA6w2Yp!z9!AHZdkH#snQwh%Ik5MjHeQd9AO4lx=J(sy?7} zS@WS%f@M#$j{u%zS&|#--RzC$nVlmfXCq#x)%q(kHXUSOM3#HduMugjiQ(b!SM-m5 z`gkW2*;(Wrif#Z4p4$q`{0w9D5+0E~HamYKw8i)2Mm0^bWA#)yQ6W2jX9$K{tDSNO z)%AITEx!1+n(2r*JCu%CaxY@*SxIrR1S96ZNR} z2FJiXWTu76Bxy0-%#V)cbaZ5%ob0n(6)CWEF6N#B%1c|1+_EtGO0}l|e$vWsYQLbU z7?#VD9*!_6ytEXS?cD{XZOOK}N6Ap<~i1!eI1&3H=g=d@- zjkG0HiRLo-2cRBAnX&1_AB@*mlo$>vU$EGMN%JRWl_sBuEF4!MrZPxtGy<5T-c zmCaFt?eE0r21MJ)+*0X?e2=#{6uUSWjDSPrlF*(j;&zeLC-~aje2vyA&u<1+vJqlG z)j~)J8WU*lgvS(h4doe&8Ro~*KREE-zbF@bIbw0Xt15A*HlymyHNll4THh-8^E_es zWk08ZKq}Tz=`?Uh4{bixHaJpZdvwk_YnKPkKkP#D%b4D)6%=Yo?~2APo0}CG;!vRJ z>NwSQkKEQXI`4{xCYdnfF#27>b5y?us$;N-gA;B52F^%WH2B71zP`2#7(kVSOv4k( z&$HDb5s-4KplgtUz=`yxMyz*_&8+eeol=gp2A--aQLmLb?|k{dtmHQyUTC(&lAUu< zitKw|5fh~nU52?7T_!G^NT%9zDdAlAfWZlx@5M(dQPr>;Ow(6mUzj6ps0tvcb#fxH zO11{eK4425N|b&@lT!;BYU^nm672ImQm(We zMaPZS@x~k9cDXFh55p5~U%)EG3E*9e`rU*j9@6bH97;#QtDWX+nOJ$gdskLLg6NLlRoz`S}?k%7G=5Y2RqF}=ki_%Gg5ZAXou^qL{du-;I?%#eJ?#NqnM zzN7gIDLi9W`HuATp(&>dJqp) zt$E!nH+nIu=`hz?TbF<_-V-l3J~N(lL?W`LS@JMSHw3}Ck~L8SK?^{G2TFOxK?{R4 zFlg9jB<0vv@-nCRhosh5bDK%ADHOCxG_w#$RZ3ZTkgy%2lk8J}QNClaw%l(MdATN1 z!7f7+66!Nl7{OpZR`oL%n*+NM7y?-&!j_l6boZWtCC+-Pm|H@GR#l`M z8O^?}w~Uo|gCsqje<>^DfSu73dXV_Ac(k+ff_F%B{{+sw4Wbr%?|eO8wgh#&9ECx+ z_t$M$uPXR!C_Tc$2TIDys@O@Mq%7h*YB?>8#p!_+s^5yn5zCPTN0K$m%jn>9EEl+0 zB{zA_y^_eXE7yMnN zW#y7;i7(Jx!@4{6X~3`Nxe1zI?2Qx@oW#EAgq1PjBp2RsB_)egpQFx7`%18o=3qu$ zW4n}DCdyG@6rRz6`YOkn<1Dclp#y_O9N^ilj?}RZ=LR)SE)jJ z)@R7$gb23QlD+vCp1q*J5Gb#*+MchZAW7#wjSjwR zZbqV}@dGFAu@j$bPAVC@o+~IS&1<8YkpFPBL>J!kaSnqtMV*al^e$OcaY~e?PrTgv zBye{F^RMQOXk&sc;(+o`k{rR_fDFAAg zzKd!X;W^ZT`Ax`=cpua-aZ*G5kg=rJ5RIrN*sUy9C5k&#o>3Npi3=fNFNLMf zjCQ&ecz~d$2=;7h!bt~*cXk>uNsp*&NfVIIrQX@(T}q%n_L(yy;HPGi3Xy;1RW^H) z*81zQkXa#R0RvD_TcKVZX#=hY&>BP!5e)GljaF0s@ zxbjkNW;xg>pP8{{_nC2$Zd}+RM; z`Y?DANyz&LD`im?9lB!bNmar_YBR zYhe<=m zCgI_|!?#vQlqX3g%*1e<@C#Cgg2vdB@XJBFb{#JTZX;Ow_)SXIoO71oQ`@RY>FjK* zX9k`&-EoSYBr?)6LQ;BMaI+g54x)jjKHySt#W@&1x09V}<~lLO+uoQ_?i4P>^Q?{! z!)7An;bU|>B_Dp0(E1?U*blh+qZS9bp0D^vW^sSFK_R;bBENhWX<5X$e>$f#)k|18 z`P7GNg5$a;xFiM^eca?VIF?BIx5B~=$WF)!313H2*ynQY)I|Fbn@3q(m>6bUrl>yRuEaz6+nkio zR&;J=vDzQ5IyRJXX3i{JThOWRh$ED|@|~lptCqj)YQ|D-fp7<7fks34;r3I29$FAv z&+ir2k0sSgv*dfJu6j0n4{LkZBeUaN(Thie<9n7;r%w_9N@d(m@MJ0nXM}|Ze83CN zPJKSDslv*V#ItI(O3qorVB5~-@s1NV@nytMV*1rK!Tz{FiH^k=n7y_&)*SEjCnr~M zQfK6HFA%J~1oPuRMb%!AGCfS*oDRdHBrFbd-GoZn3j#m=-Go+_j`% zS)yXAQi9me!anYXpx`4L-5zbCZqx6-r+v6joJz}J_dr2K-*^>ZtNtBL%3(|+7EVrm zPW?|jc`WRG$yLdM@2AHI*>G*IKH|>Pr%#8&9zVJQ zrLOX3yHdFYa-$4Jg?n>dreHuOa)fIn&PS||5&4+N@iu>7*aI0?#B+4IU^d@&Z8%uE zcgDira^8JL>fPswd^7+}Po;^uy9O_U0^TKhor0UUkIoj2eTKbGw=kMayibCA zUfPOWR0en<=3m|s_ka>Mn$uTDGSA-JA`6-pb_(EGC=jIg%*&9GUzHydD{iw0nYj2l zl@JADAgyOL-w~8q70x{yM%^65-3zxGI1}Ue2D5mNiBex0<*!kS)%X@LeG1@is`4GaR&BjRwn2d8{MB5`$_0bY~HHl?6i{8p%SSTm&!kl zR7P)ApaB|1A|i69y869oYp-$*gc(*YdhT)Rl8kFm=-8*WvE-K`#yu>h>ivuiIFx$J z@G}U|1nAY+$pIO34L&;47U#Ur)C3|(UXJxl#`neYSr?I4(Ffx0qf#}AYDhf->xgxU ze<-(>jT%jp2G1ETXjw!1fH%ANj5&n zq^%tS4n*L0o5W_q#ciKr{)R6naNaqVOc6@-E1MqzgVIWk2szNhg-rj>xXjgM=8Mg9 zIl3wtN8+9d?v!B5sbiys>@sdpJd3AQ<{LQM)=&kMmfw52ypHNH0igYzm1+iRIMGyM zg>bO!n_c@CH?ynrN|}bco9P3~K=UqmSHVYCdc&DpYIi(rI;iF&byr=k#zhF&*yb-> z)ZZVmR~!9p88Xswd0uq!Ch|@VYkO8Uu>XX8SDdh>gxjQkX0tzuqphU0Ue8s%%mIVe z)D&5k{WW$~gJQxvS5Bnv_KOR(PqjG3!&T)@{)^cb(0tvm;mafkgBK?X zuNqHyPmKd2)&$eO)0zSd<_5e(XD6U6&vEHt6!>U7>rd&?DSS#J6y)Va4NW~9cUz)k z>cBIp^wcSj^%?NBpMoz@#B*~%NIL)oJ}jNm`7M9lV}gOFp7v13Qyi;Civl}i(*fYk z2iPB3gbY*59#zjF0UyR-Hv5>A7I|~o?&sPEmzzeX(ByphWeZ(2wU!6g_O{f4X@9Z; zqs#=Ih&)U{wdCLq|pUUJ&Yx$f#E?-4Dkd0a`pH=$w8bFw93= zM|AoMiafe#q*iSgX9`U`+r&oiRA8LCYz%O?4y#W+vlF%&iTr7Sm+iVOJwluq%{`Ot z*mH%kWMW5>057k9kRc1sm3EwhYsTwk0glRK8J&Xz5f4RuwwL@Xq@o2n9)kolWM=mVjXk0&uW#<}U0y^TeoNn_E z0OyR&mmQ=2=Ov4YlgaDl8@SC8s6QW-{4zR-G=7L`8C<{~;8K6M8gkSr$GEH(V;-JY zDd5r&GpecojaDq^>Iuxx(`|jW5gP;zGA$wi0W3@eW)J^G7M~>>dK&COAITR=udlX5 z0=oMHHP7k>Il?Ltgk?_`&Vxgf*P80AH9>5IVyucTdp!li*N=|gY84LTmu#UaA-P^R zogXf~3~6p2nhx%fQSC0ywBj+0ld7o|dku>z>Ykgadq#bQ37rxLZHj*1ET9e={AX^m zH*dl0)<%5*vB!g`M%d{r`8pXh;v2USxr}gP;H?d-HscJ1HEn#5Du%(IAH~GV4Fl$- zP|yOaY_VksGOoT10$gakxEDkzAR5B$A>@$*HHfbB!_5IH8c2pRkh&sY`3|W>XAiSc z=8dr9E&U?{+sv-DFLdWt0_KcamNk)E76A7klNsD=kfvR_c@s>7btVEenu6GQhLB|I zf}AuTL~cW0>IdwUDNh8*U)x$+u$zq2sk;CI!qF+1C z=<+9@`u_YSVlljz4h-KJRI0k53HFi+d#(O7dRhWlrc12yL|A=G{sv88#N|8uw>hd2 zweri=cd)LSMRbl)S@yO$07i`MHGCnxs zVTo(pHNj7H;zz7Ak%Bv~#pAHwS$)oym^u6`-VDGl0Q7U=7(L_(vZiI=?v2XC@>$Fu z)+H?p44WSQGnf@?4T4ueNW;gfA<5pQF;s`KixD~}fk7L&_zgTyliM}Eo%}pyRiGaH zd3>h_(E8!|lki^%`@EE_n^=E#UU5=3E&J=5Aw1H#B-~FxAJ}HBkToDUD??e@DqVbm zCjjf)@-myPgD#Vej@!UZqUx;ZYF5)omIqVe$1c^3As%WDJ>HOY`}WbKE)6SXd4Smaex9#!Xb#*c8vE zXWrFe-oflk9$%ZdQU1$HwG5{)Q^4lCg?S5#u=xSIu}-DTD|gkq#{X=!Zl1$+Pj)eb8#pi|!@C_PaDhRxwyyQ~ZH zh+bEJLoV2XN4@TSlc|&jyx03*jB{r}sFzWf__{EAFpN`dLLmSNJjTYK|IOGq0w=OyOO##D_>%2(Bl z+q9wHWj-Zt$RE+%VMV?2B*?qfZ7R7fXl^>QDxO1(b&kec)q1)AJ`=H|Faf ztiYBx;I$jPmX(IK_m49@H8QY5*ajY3$Ke6ESwA%KC7RBswIAn#pL=D=$ z@vx2seC8a&sd(xlw|!8g$8!vg?ir8cnnZu02?pK&SSYI*iWQH7091i-B*ST!mmj72O!s<*I z5B`N94iqM*HmTXhRPZT*A;=H{|H7np1!2BP!(0P0P*z|pSt$Q^H$c~_5u|-09*XEd z-;W^;+B6P|{ZJgL!?lneUh$P`&Na<1!v$&}@x_W5#?pz`_{3Zu)Fia68ueMQ%7F>b zBCqmh8x#5v;elS<HH)!r&gwXW;?DEf0(B<#U=!RivdL%Pb@R=GS zOv4lFK3q~V=k&C+vwH5n388yzZco8!tFd2bX+y=N^A#gsv;XlR?e}dCpNwCF7K9EXqZ`;~B87Ur#&I?%ZAZ z4qF=?{d6r2C;HsMtD9Tet{8ueZ+#UyUoloR>-Of=6~6^~qMD0N*`nWOV!}eGxqQb} zlbBc&iS^@?ara21A*N?CFL1&?oM8c?)##7eJC%;X7MNjOhZzHRL$<4hL~F1UU9RKY ze7Xt}2d%IN`Yml8%dcSUN?VYW)ekd;^o5p~(ti}0pA{Ku`Bocmx8xV65YA+i+V-04 z0nzS}R$CYL=jT&1%B$;6_yjn{{gL5d8NwMV8AJ74v2ZB=MdYu*Xf7!HFg$Of0ZFWb zoUZZ4w@HIp?@i}59o7msY9<82Q&gm5yER!`QvibZjoa+fbrz)rRIc7GR`c}~=Uc(# zGvzDgJE|J~X~C$27^7*6@S+(Io%?7+adS?CXvH`Z#1B47Zm9m*G6N#7{MFF=gnPpr zTUIn}bN)bCY(;zq(tX0gxgp3{zN3tFFov49&6S-z(FdpJS=&Be9jT}j_WB&{@-XhM zx|xSetfHWZ<&Nx0^qzlIL)2+!|$MP?ukB(GS#UNL&M@+GWwTx46 z$VL5oI|>4|vUzH$`nAG+UPfn?X&(ThRSPt`+w%dzp! z&bfKVwHarODhY2fM%|WS*dYJ)PSRkI+;x^xb+=?;hMAF+uT%DykJD2#@~2cD&+Z?0 zyF-DY!8=U0D7i8wHwp}XPe%5uo{<`$;RiTii|~z)gVKS?OGL_(nYs3P+S_)zXzjGk z>A`NcjwNx@O-)X_nBk;!TbV^oT)bu>tcGLXe3=L?35GN?4uzsE%SJXfGZUlg*qh=k zkdufP;b-G>NrI-gK7d|KwQ|{VupGV+FK~bDtg`}%3?v`19+&J?N@BZ~Wu*o+420>9 ze<8P6;fjghn>IkW8PC7}oLu-icLt(j>-X%@_^53G-_!XSmc~qs972|r`Fm6QOBSiv zp0-h7$U#QS&t_V8vT{)$S&wTVQ*A-*WT)@lRBgx0tq`?+Ra)xw#%%W;&RQCqc~_jY z@`uLOBd6l^^pJqg=NIjU2<51TaE#%H!9F|5H|Hf!R5sKDJzvM##jT&j%pG)B90S6{XoLxVis~GL3#$6R>oPRo-_7!ETtdTERl|8uCVDk zt{iD2EITbK3~3inH{&lG?@qe{afJm#r@JgGMLWpbO8cra$1GV-By)+KT{+WQM9l;j z8buRHEaeX_l&rGcPHYeMnaHh8gekF_9}4^&=;7U;2QB0049TCI%J|b3T{C*k%}+?J zsx0mR-f37fIDJAqWK|k6Ax1sXjuL>3#@WR5^QPa6wIO7M71rzuU|qM(+}v`{x>b?U ze0NV}c{at!Z=~19tllCdWDfOgc2-BtmZ$O9Cy|#5dl@dO%S2A*MUxEgt%}qI22}8- zZ1hWlp1`I5k?Ee17CE2!fXc*>I@CdQzCww7l#Z4OIX%b!xRXiqnWU7QgEitdre`W5 z`WE{;qp(Z9!^qKA@hO~F+HPX(?rdZZp?iMHYf>eu5mV^VGC4wO6R=*0Dijly%~s9A z|JX6gtLkJ%nvj#7bavPqL5*P#HE_hxDHL%dviTThT?zk#M8F@!linI1d_g*> z$nf)R{!##lz=~97Et7Gl3%T$sM&`#983TZ~!IDUQXS38nhJ+t7>PyhENe+tP===!R zR&DKAHs)*R^vL8OPkheallfZwnboMIYJ#@j86A@mdT_GSd$R3s5nQMu-#IahytOjH|%XjQANqRzUMu2+8%(#&n$NU2f{ZX!W!z^VU@>}{tTMAV<|3ZOeU z9}DW9u}e*ve)OqIq({J9f;3m9!nUs>Ja^qlbBF3L{*yr28EHTiROtDL;fbQb;4JkR zV}-&;tUrzgaAnz3s_mXEbS#TN(nV5?c>HSb5lxUHh9ECEmhtLZS+2oURm7C_#LTx@72RXuCH2Q=OvOP1s+VlcA%flq z=H5NJXp%x9Mknln<<>m}jSoV=08Op5tf(3tot7Q;ffRWFztK8nzhHvGD=JoGbY4t% zv^MX}tNhtif$qo;K23-fNY=4WXj$)?{?Ij0Kw8zxkCofy_dV!X4-(FbsAJx7CMmb2 zmB$O!gR`tA#`cPNw>q)Jq+H;==Q$qTaE>K}_SgwP3}CG0^!crS!X~X?Ufyf)0B>V~ zn%8A^nihpP;|XyQ&ft&(J@rK?GD$(+ZOIClU-+OLnZ3K|g4Z944EUO~qnf8`xes#* z=aoQ0gC?hSks1^-Y_@+6Z;u(j5J2i0ERQ0l&zX_QPFAeys|df#a{?2oB}?i$Rl8T* z#f<4uz2C&yU&yvNSg&WI{7`a)m=F60Jb6QIbkAw|4v#4AVbm@})lkYH^-7$B^2wpD za4aWuRV3;Geq!Rd*_d<5e2pM+a|iOE=u}&gpBM5%5!}Z6-gVh4C&E4>W zE)@j%OtwxG7dFNeFvmaT@3v@zf?i2nbs(0MgA1L={U{#y$ao_+`te&<7=+~Z6`)I9 zLml}J>KD;en0<5sjWrZ8N)uAPC*+gT ztBZ@Loy z-U#Sn?iO%XCU-etvNcb1R5QZv85r+;hO^0Wi}KD3XSppf0{zQ7>@l7#(3#FF^HW#+ z9|MFrX}vT5W6Ht~CUt=Erueb&^r|$?U_MHc6RS5XL@YcH9p;AV!PDc{j@)Fyf-zVl z{$OFeL>A=8_86t={4=NuJS-aR+ zU_vq~vYCtF0!yZ9LKEsS91_~m5{lct88n&}zk;#<_49m)du^EplJ9M7oOToiS-1;? zZ@U`ii5^?DGeb&ic&wv;BWKgxx@WTde(cuTod2d66X))@ah3hnXa=0;{3iJ2fNJO| ztWn39pE_O{o5(|iB}8mwQB810{EyYBkw&L^(*?Uqe!S^c@?ncKY@yufTus{ZhNa16 zk+<|H$K?9YuJi>dHqXKWNA?CE_$=AEN9QiH`n6TDCGJuPGVfTG>;S(Rg?Sxx>2pmb zNa{Z}Y30$?lE$iPj1utiraoOCUMuFp7R%s}@)=iX-T zzp&(A_imx2$$6>CySX*?*!gVuhN|=RO;L}O?Pu>%;YE*4hD$g%x81aOWyVoJmUt&2 zg3klb^tD0oI)L_*-=(F%*vsj*JG((;$$X)#&6KxtUbp0S?Yc@!NT^!MB}P7~_V$Hj z?z8@!@Zv@IH{BZhYG_4jf)P9T>S`YWZG7ztM(%Tj&}pT}>koVE_B>p-wAU}cQ99*7 z`pVuTzPhj@@!vf8kTV7_pZuxXv~xSY;nM1FakCW90nc;&P>BAA z+C4>6x&5qu33802J>X13M-sqP_X)e@mOg2|nKC2yaD%+tlTEl+3>5_i^wrD%BwBvi z4nSh;o$8Lfy>xYxSJRHIc}d*}Rjf-wZ2EaASdE;y&ry(z1xM05F3?ou9)GibRz1f1 z8C^iYj+_=Qi>z77uI}RdI&N|k!=dOc+ay)&PfNS)2dN>TTNvo}f%K#2m2U<{qpy2ddH*mDq~1nTl?#B*bT|tgOShlDO-M! zaa`xReO(9ZL6R3btGxW{T;j;z(NS-?L8BdVFaHE1`Q@QT!EVce#apS|L)*UYaO9rG zo86YQwVPh<0_*fkqDJBUBtq!dGTLuNJGMNSmbX@xg18J8BSdukgH4=GCm!fsy zG}>?3jvZj+)!p=$Nw2syOUeaf?a_{}9`qF1GTs5*iv2?v8j+|Y!g>vTnuy4w*Pe3I|#Scl+{Vp#CbscFcyT5MGD~oPl<9%)e ziEF%~-v!Ks(L;|@OPD=$Mp(J>>mO#3=#DksjvEsG`-hP|^gq>N2P=QW`7TKy7%5sG z&7j4vd!GjOTdpo_g@J!``PVJgXIEJ)YxI5)DFmXn^0aVe&?dvVubX(1vZG~_51O>h zUkB{=6JJ;Q$`b*5NyK}u9|3nLi${{9pUTVo;d#P zn9M!v@wCSKVWbcgRj)iQJc8QqG&M+(8_t^}JKxakjj4_{rx%0t3s>%ZzC@==|)>4y9Mhy+f{j%74`m0gQq6|Yx^ z(E>{*mTkq|Xo~mMy+5+c)bwi!dbzEqX#L1tPPl)jzfA(?vwsQq;fmx4*;Kme=Rk4a z$NPw!fen)h@3P^IW^ws;`8XHW%UN~ZvDPAgHPy(>Ce0EF7}=Z z_$vvq@$17`x6b~SeLlr`HQpHT2xnP6*e2N{P3Y$M3O;wmQi%mhu-kP**K$*e_Yb{* zKJhQ$s$Hh!+8yr2L&HBUl?+Mq^`^XI=-8$_UkzQia2RBxRu^_VFmvMOuef&~SI|_9 zzFI4&+WUn0rgm<(v03{z3igNI7|?hQSIx`hu>J48y4(F~n!~?VYOm%{kS5a3>n@W0 zKHvv)U>u8&3u6m4p6UKfQ+YshpI)+aM*~8Zr=op)HPX-zI2LkgpcKY=o8(!W_eT}t zU4+@?Y**cOS8WsSmyfH&e8QdY8~t?q6hZyahgNh*kh%{mOeXw!7txlS!>u`< z_D`$q%XwJLJ?N3;%Sq!h!BC7(Fu0GwP$(1%U^5mcZ*WKUUiEdoGp>*O;U3~ca!w97 zJ-GLMOXergoRh6WJ-I$(3tApKw9fmlNSYA|us9JmbGBP>h+S{EYVIb_GfZ!C4>6Cv zHeU#v9_{=*knnv|dni>8w@|P-SNni<=&bP$E8d6J__00>Bo_NogRA_>BM-XPcW4IBSdAu(g3v+(S0PZujCW#DWp@@VkyrX6H`r zpyeI0D*?)&Z;u{tQufvO%?k;o|shmIL{3;+=?+M`%A9|17247v(CU}!LU+(31o!>V<^TzWLajg%!DS@+4PvIW? zDOp2-v5V;IdSm=I++TMQPm>7)gb15}R~Mlj-*x-9T_W1SHzmpA;YYA&_kQS&mfKaI zz*XxAtxNm0+iq(X3JiJT_uu~bUK-P$)34TeyZS!-2$^;lo!l!0xWJ+&Y^EWbyJCNJ z+R@iniUs_b)jD>jC%%99zWIr;)^(0aT!pRKTEJHp>2??G9siAz_`?@qM|%$m>o8V5 zcB_1K*X8BfIb<0^Xv#2s;m&Bt(GKGQjOVZy}c+k^xO+; zt zq^&vatGo8pA$#y=w;A@Af85fU9Te}JKm*z_uq-mKnsuKuecG4v1i?$wAyl;Y>5{ParnloEX7ysx~_!(v>cp#ION7UUtM@W^P%HtC=`@= z{Etd-B#eI_?dr=(E}o@trM!J~7(Jx&)#$l5I$1jUXSGs8t4ro5+^}P_nO(K*om~qZ z(~FUoK@(JJi-{9Yo7E$9J&*0!HxoKAe?HXLHDnw(jpH?G7Du;On$@H+y7y=-S_O?V zpmX2viI&&tl$x6lP$KtG#l?>* z_wOPu=Nz#Q-H)ET`afBjk86Fx6caeLpPD7cv}27IeN!?HqxJUa_;P-G5~dWH(oaJ? z(CR_sG2PZ5ZARvaO^i%dkDxbQ)cwY`P5RQOhd$hEBdjYwX?-Di@Yl@n{r5qiq>Sm) zx*&@FeiI)P0T3t-$Pu~uIzB3%r`hc4 zrcnX$A<;FW5lOJvrudE~-DN4UrC%dzS)b7~3wcH5;SKRe8>?cGcP2H8HXs6p`a<4F zowi}(^vCu$o)O|OHhKFh?GO{`t=7vlgGB%=K-H+`OsU;^$0FelVf&B{&hc6JZlDMH z0RxBFveLpn*K?;z>6h`?$uE;w-6P*m0!vQx&WfhLnk@+f6 z8UApUriDX#=xGXaQ1_R~gv8X@Lu^n3e`j?BKemblD(719nDsaz_ct_O`yVi9z+WE! za(^rE$y^U0;w3pEUtpUSPWz@jow>_7DK~NfavJxV#uiAqm83;&>cloMtE%x&8Th)I zn5q$}AHvFIhpcQAq#7qiwS$Um*o=GV?sQNWN-%glJ?>}l0@MnQg?#Xv3=tFsl?J6! z?VaRI>0TsG)@HhotYC)SRTO9z);o8z?~fk(gx@x z+`Wr955zfeRw|8^<*lxYq?FT2H0PPt)}_N$-*3|WPqzob3BWQ5sNnO+ibiA|511GnWG#P!RgoSPhr9`>4Em{+X2no^WR(J~JWWx5^~ z-zr(7$mpCH7_S;5zSwEYNZ|*O`gP2(Iq15yn}8P^{FsoIVuDF5Pl7=@R%7T7t*xH_ zq^AT=$RdoUulip5NH}D%XO8+A>(QkeaY~mQ&^uV3n9v&YDnD~wKF-TDf=^o))dqVT z4dmt`@$y#swOa8|b(o2F+X*1^_1bD(pFzt0LnJ4jBtFZgg;%tU)zT>d0!ArR&<7HwWp(}!y-UE&5x^%8psMhB%t|D=eoho3FboO=C-{Uk(R#_OG*(f5 zb+$f_Ka|3&2iI%NXs`&SteVPxvjER-!w3|o@#C9&?A>K~<%rG<3uEL%9By;>Ezjh&(ct=@ew=nCX5j+py(AZwy-U|}dC?b~vaD&HKvMi0? zMQ$2YVjo~P5A`JCWW_lPr6J0omU>6|--E=2JFUT>LXxR=Nca;2Sky=yxa@^`*k?Qa zA_d&*V6hMnHeXMLHT0++lq1F)bWKYJ`>_0=I9SI+cB^0BCT4ByCCEu<(as2>2S@`8 z&=n7Tq0+^Ud&A!WTCk;`ZiC=t7f3pPUUV>L_C4j%YzJj$`|5_I*{v(RGPWQfUUIVLkH#?AaF%NP>eO%P2tuvd^MO&dyjgOVI}`!Y%A)os`+VRnq=$ zXnOj#r1nIBA^a@5N>(Q6RO@<=dH>72`y_{~^F> zrsya7L#c$wrl%OgNipX6>adiW`0!H$;a*lfMdumA`ZaQ+J&1}n_z1x;>cFDg_+rO3 zvzcA^^1$0Hwk77zR@Hn1TzQZ+P5QdYX|=2}xQ;YxH>ooRuIV^nRBP$e|CuTPr}o!J zkDkdl&^FPw#?@c+0894D8)^3UvHUgM+?8ti>t(k#SlNNIcBf8CAMjkR6O$@82H62v zU+m&S6kJlM`}06e4JZlUss%|Td;?h-zb2F)-t*>OYfu^X94NgGs|3gIf={E2iy2Fn9%@^`soBu!-VYbue?VQagytlTm0SGPqr{uCNAeoAW z*mGfT$-?LA2%ng&h1JJQlp+NI%%MC!rBBFp`H||Vz(}w>8+yKSuW9&M9Jm$3y@8~m zA?gIz-Lwh17R06^?TCErHKoX=*5ijkV%-}1yg`9Ma&d7bTr)xQ;NJP( zT$j*`Riq|$h+iB=36kBy)^|bBYf{JFj$8MkQD%WxALNY}_|9p#xFqO6I_9C*h9~|( zw;ppID@USMq9Cpl+WyCS9$1i!(gm+~K~vm@-in6PVNmFFZRYtSI{AqpeYG`(XOK#r z+J?VYvg4+lk6q|>Cp!1ki}0RF=Fn-VW?@`uoB@7&0?^PnuNOihuc?1|J$HHExE zHXFUgq=Y17&Ns2H0+Bka6|zf6$2T^Fp61*Ex1?lea)RoEhPl`apo&p*#!7ah#x#H* zY6kfmwSLGy_l7*zSFDVAAj+P-f7_sJUXk#Sa^|sfy9C_!<6d!Pcg9SX50v)g(;4KV zWytXFs5uUR5>0-2;3}fx{~-oTiIwyD!^AY_NwXI+2;`qYp0jbOVm=I~u; z(-Pt5y;IawP-ln5dj-HOQshRzWD58!<~>Owg6v#;3F3k)?4C1Au&P`x{Au}Ocmb-9 zHwI30bSwj3QNyHYK`mWYo9TLFPP$UhML*^p940FR3z{3u&@d@KZvmUxPqt>|IpWl# zy1+d#c2rAM*Xni)h+O%6Cao-{7Tg{Ns%c4fTffMB!qC5c!gPu3PMGc#4M@i~zHP2g$@#&1@7%UAl$kSV@TYJ5Z)RB1;k}(ty4FePOCcIWecu1R-|y>xsF>V)-)paRt!u4yZD{Aa+JEF{ zGmffNSHII}p3KUiM)D_G%5?(478H|ecD&2)gowFU`tye|L$AAh)ne^VgScgVE_Q`Y zZARNAi=O)kEup|ZoM~l;8XAnPFnG~=xn@U&s=1SvGjgY;t)p#)N~CVEzzP4b&M8v% zb^+eb0n2xRac8cq5!B$LYxA*3UTKlmix5wY+G zLvfsP|H0=r^u$xql~}rB7D$IJto-e0`tQhC6ZH{rU^1Ns0pW73!3bboBH&zrXxza} zT$K7qbs*gym-VqJ95$br2lQ2p^TXhk+iwL!w-X|BH=T&dW?NAkfI@>(WKgtFo9rZAnOi$tu^IvW>V>z2p^%nYa#Q}&vkK=F>wLhTL2NKK0#9_ zCa5;zCY*e?qXP8c+3dyvTnu#nz>b(XC4RgCSI25!Xf${3ZmzubA}r|ef{FVk5@+wR z+}~du1<3IFKdmA#9CTvS{m3rp1Gl$rZtc?qd+mBKGXSm& z8^|bq*P2-D1Ti%hSrn{Z@M9>D-qip7pKgOx@*D7spK!3pzI4UKxK!U zv|`g3{-5VbKPmHR>VuoYs11Un-PUtQW#RrWWn<5I&O1KwJ5H8&J&D|&U$Eh~o?^Pa zMzg-PUqM9G6(`5Nv=;|_hA?eim{d3^JO^K)lZ0YXj)XF2PYXu_to4Yfw|*+2(HP0c zvGa${FpcJIFc#Pi64=j^J(n)2zx8Y-EvQ8_*323%=9%S1sGum4@$edWl{z?Qx9AH) zy+pEKo)bQ(-TGJY-PAUB+Q`|tzI-kRs22jZBH?vk=EG<2YZS&JiNLSml$gr|yA@Zyw8!eb&-QV89onDPJBD3uWab3 z4;2R(yNhiPOz|h)(Scen+^;-#6A{(U0J1CWCH;O-^AZQ9Cm~pm6Z62-dB}tcT8NHA z>mTYQaejN>)DzgTCL+4(-fP8-j`Gm}355_^D`?aWl-V1^1K1=ra7+i~{6z@w8pRW;K{v2(71rIg~ilNafH@Ub+OVw#mXw3SMe%GmnUGgBW` za=f>8o`o3efBtd>-eP>fzSvMYc5f}~#XW4%(qWbt@JArM$7q`BTbsmRHt9`1ww7c< z*@{c>HiIB0bBAtVIErzON~KRG+|i9ZER=8(?}=_%L;>MJWpi89vsZR`K=?<-erVQT z0{9Dm!N3hHkn1=O(EG2QW}2I}^acu5yKE*Mzoy_RWdvHF z>)frWM7%(RBMy+`qT*NpH)L}r2H#|;k3f}kQ0wrahGU!IwPmuhhJfoIy@YO`>~J6= zT5L@!|KxP|3+<$xf~Habmc}KE$z;iQq#i&I&K32U8EvSb&n^`s!Aup9YtdC5`z*)E z`BO_pN1&&7SRv})8mw%i@-n{|M}wHbv>9d7EVwqkfm?bx_t_m5l#4*xgM()C0QF|Y z2YS`hK+Ik&n z1`=Lw&|l!1*kF9I^}9J9UcqY%zvTxsX7J8ksk#=a)`{c$k))Rt)>1xeV_!KO<{Fdt z7{_yBt!@nPR|=tuw%NLvi|F7AB5t9SRKD6~M52{>hP2`lcRht|pZH2faP>sDTJelBuo4v-#93LOw2+fJNY3^E4&HK5L z=xzC*+2`S=vpt8WeSq9_NF-y^iLq>e+q9sHGnGpAiI`JP`G9o8GEFC7+Tki}MxyIv zlKEWD6Sed?$|L)$m0t-weNSM7<4wq@bFL1(C7=KzUUqC3M9ly_S z@24sjB46Fk+`$Q~M_LGd%C&reW|NO2rm6(VacPf%6Vd^PPE6oh zsGLm)(v#@tn;=X>7&ity2LBLCw6QA>pPZbuP>i7zr>FW}*GfC+tc=5pm{X}9X|u0P<2x+2~b{JSmyqxaF#Iv?V$R|%iXy&eH5i)60^urEZpi@93Oy#h#jIU_&nPeN zY|jxGOL<`ZkYQ)ayx{XKSdHe@FusTw*KL=eX>f%< z<0Ke{(AiCS$KKb3#`=UUf^NcfPs&`g3|s}fNkwt zsb+D)8$ff?I%n-jd*5_ps)Y-z#NB=?JH4e{uV>tUL=mejWb%Vz)P?tJUcDrlq+rn#N%RB)Uq05-B z-b)t#Q5Ha|K^a9Q;>KYioLmq3$wd)i4$PN;Y7E~B>IzPnw&YS|7SyD^Z9gc~ zX`Sn__@uZi&jmW3(*eYRxo7Hj;8av5uS{XQlWnkt$A@2P%d#Go0K-0-W$JWX5vsZX zf`XNE>AWaN0^rWBuzD%}OKzTEs~MnP1*ij<--2kmNwcFAh$N0I7!7Z5Z^Fd9J2m#x z;->*ss+6PYnsySnz`+1)`E6R#0@6(C<(M5Bv%q>_c+%84_7S-~Or`ivkUS)`Yddjj zgUfdK_SV%H61qSWRH}uz^+p1+S+Wf}w~ecNqfi17t9rSFJE8MCxjf@G1xdNcQYp`; zS+G4t(r4zbHj6!jHz)*fO92c77sMu_!iYf6QoPT~#@iQ;Q!3`?(x{AH&PR+5p(k(`!$tj~p6j>7G~wVfQ3h80Ztvy4|4`v997x zBbI*d3lSc$ohsR?wTOEw-53}khO}cbLru`!Jo1~xC#WGxqw$yh0>mY2qWD{o+z2xA zK3BoXrRqe@%VCz<*|0@>Qbwfov7tVrU9Q-oLg_cow+j_8*5 z>7{5>;qwbaMwnl>0ve<9O8?`f3=_aW?XUh2M~PPrkuOfelo=)8oKD|^Jn%O2cE(x# zw-5)(G=O)J2Kk<55I1x*2LKUelrRb^iu$0D&-q7F148B^7q>x&fkHlO3FKk~`5?hW zG-oDzViqbZ5CI2Hshy}Lh%XT~xV`K#dF$Q_I*AUYCqb89cw`z)yYr%p2#EAD{G2^L zYD(`vz58J&=`{dJ*$71k-Z7ljJ)w+ow&Y)P-R*qZdC?!JuElgyt(&J-Lp*i@ePMh- zxrDT$aH%uq>eU)>`*E zQijzkj6xh0R!i3+_(W8EHNgKoM^*iqZe8IG14;R?_--i>RR)tK4iuS+)?ulxgUHTc z2EKVO282f}wD-kM`ETDp)5UYXY_$dgOxj5V-05B8OZt7Q8e;?&Kmv5gA?_9*BJO*h zND5;ebFP`XP}x&l1d~rtsq_1(+haQ3D{TwrmEP{QPp6&%Y1%xhVv_2oildup$1Y)} z1`e4Tt>x13in$ENg#Se&frUyIlPtP*H1YJEUZuwYa79SmJv!7x=xmdex#ldm6<}gc zkgOH~1jQ>@0QrY$<#VWOdV6nvR0W>~&{7~;AL_%#_YVc5L*)wL%`_MFk->+`e6`bU zkXXZs^FuM)AmLf!s??L?Kps#Jh(*@ebZ6kRUQdI%Jy(Ap&~u`Vl{Kmg{?uKo zWi6)*6K}fxkzYPNI$tG+3QU?t{&2}VIKJJkvKRXL*iav>^)0c6JLPccT;}XE= z0k?dEfCxX~VuJ1+op2oUhsbUa69S$_-KXZLa3$bO-DUERI`TTpK0wqu%a>3kPe~Sk z=!y-QQ>ijGp`7~;ZvaDqpT`37W-vXe$I_$3P*i*O?aI!ad4ZNHdiH>uLYmlLv6)Nz zxi{i_UZXBTK|zE}{t_j}328Ch_L|5CMzF_2^2Kv#(GZa1pZ)4Fj@mxWz@)7phJ_fL zwT!Aj32@~eIK|XT8-q*>4&N!_o@}lpr$5VRGC3GR2Aa`q$wDre%TKYqgygsa2~8Ui z+N{fQmQLaoAHpU5xs-yQ^X$2HVgA(j=I%eUKOF-ls@=n!`{rv$1n@)7QdtMBK1#pJ z+#WD0dB)Sw*n2h#-?@oNmCGqT`-9<5mVr7faiJ7p2_W7!er>QF-QBCz*0kqQk6iZT{HK{29xsx?u+<^4H`AQa?Ufk6Yx|6mWAqk6mBl}7nTPK zg%Y;mWo;RZ52+eCIMRuAL?u{G*T-vimmaV$jrU!knoq|!2{F6=lWp5Rha1nq1u^x; z5b{!d?>t^$Mhin9h$qCR7hP4GnYxEZB@J!^Q-LOd8r3aBAF7?!<(I&0{IS?l8@^-( zT%`b*p74{M+01?RzFM2_GNr8?pvxBjZhxc$Hgr>k7``F}xyKlht*)b)_6s~F-3UTt zJSwW|jw&a+w6>}`ctCFtN%p-v^*z84=@(F}aU%@l6nkJc_1Rhx;9Ak2d<|Rc?nXs_ zHWJ%ugUeibabiCO_v^ujgoAI2%-3>~n^~m0WQni|D<1@zt!|QFc-o>?FyM>xb8&&S zxf8NI(f;Jn!Kz5eQe{?RnenOJHm34-=FmX{H&0S0*Wqjx5QR8SFK_`g-im-ywBQtM zZN=`VP~l4Gp#+W*%Rm}5NmB-XuhA+rAV`_KR-ELX_&76rCE=J>QIE*LoLi47WhZEzHjrvqO}1Cn7xvNZ!deQ??_)%?i8>>+$)H&GVwR9A(QF&@Ah* zI(qX(u}CuAsYjdujaO(sb;g%j>c3X?~F^Ltptyhjf*L)#74$@no z49Ig2{TYEkphww7-9wESBlBH0zmfsV7x(n>n|;LXaI<6gVM?G)(Sd#sv|3q`a@Ho# zGOt5mgKgp9>0vCzA}P&G{@N@oz0|@cDZ^sARcs4m>LCXv#NhMv5z@E)t>O6t9?E$S z`^*eHp=4YuDKNhGU4sfa1(RC=D+99|2E-1hRxC0&3epLseBc{SZZO38TE8@nDo)Gb z*?)}u2lbUs3!XrL`c4EN&!ODR9fvr)i~*$^Mgddf!L73)+s(SEP*qTFG44pb6@8fB zLB7S@`!gRnY0TkoOICtTz+d)w;JUBfb=X_tely$Krnam#>)Is?HQ4#y;Ly04ktb{& z#fVN-Vf%QA#$CY82$@g?2kJU{6BGn`Z{T@9`+Vb2p~WowKzwNOgl{KsBbwk26H>UZ z5D8sGu2ewR3tjPJfwXr3U8Sy*I}p zbvurGr-Bam)2+IvOVv)f`>b)OSmkpp!;%r#I~4q#q?9Ttr6J_Khz$As-tlAT9w1{6 z?)s>$-!h2JstmV%w8Bg}(AG{RjLR)tTwFK`=mwhy!@!^Z#-Yp?S!bBoP|hY8!Q3)S zfAHu{0AO?zP6-GqYqP?`%1|)w_@9`|+kvK}I9c7j!S};)>~V$H6`M0}@s)ZBmDj_) zyUX`CoO=;=>Q}W#YFi%Xf|l$`X3p{Aca-Pm*PQl(-s(48_kCb0d_GM$mL+?hwF)Y0 zf%+t{R}wa;rZ)6dRD%z*A-dG~AFaJ!fZf64rry5>;nVpTLNS}uaW2GJprX1e3GSfQ z&~F08^YSt6qHo&57`5fH!Lw6uYf8zei})xCi0$b5ogoM4L078W6grx~Oib@s!FR<(%h zjlq#Jii$l=H?dI-Q)C+}&7Q=rD3{O>GFt20>W@m6hq0wuiBasEMcxfTdr4N~8tX|{ zz5o?iFyC>g_?^O4ZQDQJ`Nn!{;fr_fpu2Kqbp5rfAczGNM!3I+8PNiQ**a4gzK3!?%j`gjor z4;%JtQcT$RZ#UwMOayl1SX(Pv@M0aBiV2DQ(O57SMUeV9PGm5sN-32p^a}c)yF&u$ z1(p<$sAdjz1NNl>TprR3&B?;cIGkZjHMqKpQhoCOVC&Wj(ky6ezsSgr9KXMAsNtTf zD|o#D#0aueHGcQu#P8$pPuN<24b*`D;mg1Gg8_t2sY?w@XthaBUo(LM1W@MC?7iU7 z)kr!KFQ268$eMMoD~GLwu`CH_b|@&{pr9+4ptL(XQ`&jyEMIbK$&x8V*~yaq632aK zFyq-43Wy1ENvKv%DQIrokX&x_ZAHbb5kW+hza{EIrPWY)swhe(7S7h5<_y>QM=jKK z?tZ!eem7P}p;u*@ zUl`pK4<5E2dVCL_^PxxiQ}q+-C(hWbpSX#vx2|@7k$A~tJqENL-+IuIfBmSrCCC{j z_ah{SEB$Gyky@(w8T$11d4NIOmsYn;1KN2rheZm}A; zp)hc%oXzFT(eP*~;4)KHbr8eGg}s2*SykAF5MMxSP;sD?T5(ju*cy2mXHk{Ut#0hU z=AYo>!dJO|6@cwliCj#4`E=9`ux{AALv*HjigvWEWCJUw>$r^(&@98nSc6%XUlv+_qFVQx%>H3K^sN-c%eQ3 zhrISR?+RS7sVbTlNpjw3abSt$Pkl!LK-HO~}q&z@$HJLgi0&fwu(p-M5Nz5L_$av$PvH&JssCT?E_gP7Bl{uB}*a zjL+l%f|DTk*@TWB3;uMdU3lZ6AF63yFw7rnR9%m94DUA4GUB;UbNJ&{?>7o?1g%fm zZ&?!#Z!gNtK0A3e{6wVDt;^v-k)W@AeX$j3`k??1I*kpY_wfa*wnTyPn3PDwsr>8G zZwUwZKdixQJ(T0Lajyp$^tN5&vb5JDwfkC8k$3t*{6sOX#OAkjn-E#qFbD_15k^IA zw$ivAwPnz7S$&Bi#vQgm2DiA>M#9Q7`X$A9Nih;1-)*K8n<|>R6d3PN~WTs-l0u zvRr@d;6&<6p~%j}pja^Z{&nHXWZEIw6idOt!^xsyY)0t@o-rU^#26)?bz|o{gD+v! zG=m8{aCyWrNn;3Ce9LZd&fsGQiCHwF3XKL=9N3h3yyU;E|3z357$z_PC;_a0Ti9xd z6o2zFO!>*=V`h%{)SrR!!)WIh<1aj-e}2PaLHVbG9xmommvS>o>y|muR*|ai<$zrb zjq^$96Y_$uJHpgQ=!yKO42#eDX~%x!xDu&~c%dp^P~DEQYy6;H(?momTd;>|4=Ta+ z{?76j9=IwrRRyd%{YEh*{>?_5;n;LZ-GZvp!x3^)o9e+78K~f>Zf~LSRJXS*7KEP3 z4QXie@O19O%ZbVw<2C(hZ5g1iG3(>OsAzZcorJ&nihHX+>vy zzLkEaJ~F;vX{A=Z4NRJW#KaMlxi)aaQ;Mua>r~)jc_5j;w+?f7W%o58cw$aFhVaPW zaZLL=MC|AVb`Ho%Qa_OK`cyHEJx5R`2rqdg+!c?42ow2CvOvT)**r~u9k4@@2g)(0 zXvk-Y>x~NTtB>5$a_%{ICJ`d*$IJU^#jXnvzX1C0Yuh$B@>ddqWKHE}M_?G>YviIU4{~x(2Y|5JS&o_LR8^ZqetKc^ypIFrqUw?g+`O{~*=$&8GoqPUh$Cho) z%?GJ*C8hBtX~hi1vvsJydYw&qQC*I`<-3+doeVZb=z`51JCLR}a?)1mc=d6Er!6Ew zCTz=5Zx)(WPsIeGtQnUwj@Pb4l!RWnY`OkzK-$%@yX)X@{?SRxQXBCd243iX%jIeR z=d*241-g=jlitANM2)PbGvX+eF(e$^MN?yo_xMHMFZLuFJY^%9-czvnn0-5>;`n?` zn+qRJI|lPTHiWGVAvV=IurIDn#gI8B+;a!DR@oDx78^4Km)fQpn#${^J)I!3d_h9s zXf%!5!62cC;m64)4ASc55*9a2&;@Zmt4bW_BFAn8dXo6xB0`4EDS`EKpJG%0xz5#p ztkYO2OjR2}X1VlH^9~=zYTCsNx+grW+Vyko%`-Wc`);RYhaOsKs}I#k!Ylz+^@{e+ zzM<)GjD@!IOmn0|mE-TLS^dU}?GSQ9gGLeqCe7&oTB&7EwbsDql%gPYOVZRf%5*Iw zRgfsaa&_-ivr}KwV_UbiOF=sc-Bmg@k9*w@>Zj|#Z8j)6xTRGQvCtdWIsHoEOCxY5 zh4j-hQW5Aj5=Y7DQ`ZQxce_Ztgsdb9Iz=|OY&yExfA9nk?oYqn2_3HXU?1XBq*gUBEQBtQN6kICx*e(uy9VV9%D_d+j@-*57(u4vpAba zMlEB%2z@5nf^;STk|0>7#CbSPKc3y!_RI9SvD&(lXcsMG<$+~N3R`?$YHkno9hQyR z>w|`x^6;j@I!k_!tRObMX;;*J8f50tZROM+Z{Jc=;F6MPkcd^vD=+xw)8zq9l{O)Q zW@)?L7tFP7Fb;v#xxB(oJS@)MS?BC-TNL{CcJS-~e$8LXEJ==8w*-xYDkeHGC zqlw&cBS^UR+XBpRT;U1`E23ou?M{lR_pkt+h4pd#%`Ze-v%iIR%fJhTSP}P7Z6r1f zeIek_0}k;NH%kT!M@)ejB= zS>^Y+^sS#R6OVed1DzRz?c%c2tSiE&^+jQLyz^K=g=3FDB-U#hAO6D%)Gr!Ih4G&| z?BLgN+LbqH_?zt7DQr>G9o0GN#JlAjsonEjZ{_scudY6*Kl4J*_E3}%35n(Uzu%f{ zjl8_IqSa76r*rhxSOhncVya$VGuF=`3V9KWgMm2+qr-{1gJY00bAeVcEqPzoAXpMz zB<5rx>JY11UJ&F{f%<;?EpaGNl2cM5s9f#eajJ41A9xe%1O)5Y`Nn5IhWA5eqWgVe z&L9|WMs*~UIa0P1wn?%2q5u&LsjDw%$@v%d}A6%DQ zBfwClH$<0Mza)M(8VYgnYuQFvdU=7M&p?B_`;8&J}X3W0UprjOFVth?m+K&(pwi9VSt1kP$un?w zkWS+JowN-5VXvuy%0lsbH>kJj{vZZkDNoyPRevx3w?B>ux^T_;()}wSDy;DpwI}pB zwn-xi38(em;L*FQ0 zE<2BpoY6m(ZR>JCzSi=}gF}xdpyt5MO*v7o%O7rqkR`X3WR>eNgk)AJ_dLVDVYjCx zpQ|C|tl(xIw|muiwdy3RtSA}30zy2n`B&s~5eNXM9F3RK1Dy+FN7T*gwuIi&ZK>5q zB%qh%z{C~|ARxuS`}ke5Q^1uKn5I$(5i=^S!>Td#WV5~LT1w!7EBJhjp`LiYhdWCw>}nb7p@tE+Rzt9dCl=h3P0;YcH0Lwn9rgiA@|6f!E^K5#ZRVP>VAk zon=8CHU$=&n-==uX+0jmhFt}CrL!{Ydk1^G;KM^WZF#v zPX;rpz%Md}7i%X<)9^9#eI!csYr!TQMk=7<g~g$C)60LKM->bOHP>9;Uk2AhJAbc6H*WcC5*0B{9- zMq8Ty*A2KlN~xlcy%Y%Q%!GX3Z^VG(h;e-B4eIc%iMgUnytm|bRFt^J%9NLCQSpF( zh4DD(2>R7enm0s5e7{Yo>}H$ueVMmbw;%92y-oV4+}`XJ;4;=7OYg4f^H(zNg2q(A zc{AAv`$LGT=k#7-Pzl~FNW>YX6$@agMZf&j%Qnoj12Qwwaaw2HijYnaxWxL~rCG_3 zNqxhknZC83dzCCcz1uYNzNG0ykX7*Au~(>V>dhAV>Y&QUwb0jC%YdB-(@v=XcBU#s ztw}LHjB7I8=bKrfHX>Gp-i*6wAju$nV`&Q^Bil0B#ZY| zGq^nm{QSGjI}xkJYW+G~77l(P4zAT)5I^y7JR(HvS#3&EE;MAaubg%(u%Lbm)0hyu zN~zr|DkrLLV!}_qFU;~g`x$f04jwkRJhHJ+RC%hIQryPv&)xarkSxkesm&(jj751* zlr-7A^g*1f2c9MYU!nTrXeA`O42S{b_s3!nZ!xt3sU zx!pDhIa2j)`pMrjz#V}dtLMXT^08c$m7jb9mUBMe=8PdMEV0FC_@MK`Lk~-V5v}(` z^~wGNz%6)t2SdckM&TQ%dc=p0kKrN}{ly)bP}y%{o0a`=EHZ9k)WAJsw8!8?2J4ty zn#mThlnRmclJw%a!NuNR3k~`*)kcbvF`P=yQonkK(5K5uK%Th5vn2)iTo8d%e7r7x zHWE8~jo^dB+x?Lfo%~VspfGb&ZRp@(#Y?ehJ0&|2p#^W#&E{ZCVQQJBYAFU6Gg%mU z6i1ND;7(Q3tpqs_Q-*S)beCgDudg(cUB}H$)`YrUEE4_Y~ zAM0-(yt_Ww3U^!mNhj^wG~dV<>$tk7kzd;;pJOy=BubxM4%EW-oxc?=jAC!9>8NQ0 zuDsq(GiK8NcRP(-V#7qqM8S~%MF(7#%|Dn4=>|R-rE2!XI_5f!6IqU9H!ldnv}vs| zL9XFLCsRy3hs{%|SwtEYf##0fAG0%+U@Hha!IEER;m(d?3`A-DM)|-^a|JfxY14Uf zQ+8@c=bia~X2wfi)9f#M2EU6rqIHslfG)R)oUsG@U3dWL1q5vKyqX*U@$zn~${)BH z;3Nc*=Ig3m|M0~A)b01^RNCza^(|;9CXmdNUHwh`XxceVQ!nis zyHm_?u|jZ=ipUL^kWh+*&V_51Er+QqWPU+*=Y_!ppE^8Y$&-OhSs zD#*=b8EV}N@tGj~w#M&Xg=fVGY5FpdXM|1b^NR$J_C0mfa99CQyYs{+~Z|LRMRfR|o%ys+}$wyd%}W;n4%|MS7`zb|e2F38&J zpIPE^4a5_e;I79YarCr9t_$+gNGgg}Wm?B-=lG@nSI_Ki0MgX2_j)rXOyv9r^&?*4 z=J{v4@47n+p9Mre{la|ngerM>gKjg)StRpZP)KDByq*K>#v7nabFbPp)morpKIncRZjilUxpgMloT|1wWcO7eS!JK?-~pag zt+*8cTC>_?{M$S9+`d`<(dlb)!!A`FH{h!Lh$nb}FS5g)Z&q)vK2p2#h+nNk>hfPc zp*0w~|9a=s4c57pS07htK|CIX?mP`vnh$(W*$4WUR%jaiBYNN@eY4UK-^C~S{ogFS zGuR`p{aPxZNSBOcSaUm$v z%qu1j{jZi2px%tR%{V9xxD16;}-r~Z&6&P#&RuY*tj_Q;L3xBUqY!}2W zCQCOvw{Ej%Ry#!S!)Z+zR}t%GpL0zZT&{|AuQ9=w}M53t* zb48;38^AJpO%-x!qT+7s7;{zwgS>2qeR&3D1j)QJ?AAF{?r_&;o^ebnyl)3F294+} z5_v+9<~J{!1w_CUZt~cF+ft$<0eB1SG-O5~>q6;^s7lsmEk)n-L-l5zK^`%c$Dg}= z;iujfJ7y_4c=|kV@%RRX4?;J#UcK3a5s}4S<0N1t#U;P}c_%DJ4@MhSoOb<51}mz%f2PCLf80o7aDL%PoFHSF`Vg~(K6I5c0p zsDh@h;49KJ@VR)Zxi*A_B|t4R2Y63tucglSV*8S@IXi2C)m+AT%y&4Uq@DFn#iU)G zY9nr4@*ttbeyvwl#b6BzY83U>aA5sVG;cCgTiN<*p7l~LV8gEU8&Rtb^!N=fj7wmM z%>|Mm$R|2A(uckN>-M@J)&+5=ZGo*)=JL~|iiJeI6;ghq;Cz~DV#tcGfZ^-ibRbZF z0yd|G`dXc*_^wH?@2wF?e1DV>#uTxml?8R9e45HC<5}G6)6cXZy#H!ZADmPO5#%cV z1NH!$gN`9TnlC>xXLb@$Fo>y2^=2i8keJ#gh*Dlq8|n4awO4(WGJ-?!Nkhnfy-*-|V_wASpW5gV=P$gg??R2`M`dkR zx=0(T*dNg^ZRi{QW`13n252`*ER$mjXD)S75Bpt^0wi?`%|y590mkqPT4kFnDOTK~ zM88JT{NJ03#HF*+EU022UwLxJV=?HbX$oHYboncvEOimX`}5Ad?*8EaKD={Pjf}>U zbta}Y4lj`O6B9j5A&SC2$P9Q{e(|gukBfC6sDZ(qJjIz&G+V$48BEN9*REt7(M&QE zH!ESr7^aPr(kb$=BS>@~32;)Eve-9;+8Z=~<oKb99_`U$IH%sC_5>Vv0UEKwV&SbV28^4?5T&wC1)=>fh&e7;_JYZzZYJ+9tN zb;T63FGXRj&DK_YVhmFUp7*NCCu>1Kub!qp0C)qcNL%-ldb5of`{oecDg{pvkqbMh z#FQi*m-*FPT|Dx=$dT@N*LbEpB?)w}oYyn8(Ax=YxG;0a-2~(1k7uwGJ432)^e8Oq z00^ucgbOD|k7klGfuMvNH_(+9nn}n93xh`dBhF{|I;o8>EtQqGKRl)rCWn11YK|z_ z2o9@E!X(}k!S@0n9##WX??<4 zsK8j7&R*8EmUzp(Dh-0QA^raz8s46#Mt8;;TKfJ^6doQdaD^BTMG>GI?f7%e7e)s* zXq?j-m?`G|K9&4V+6X=Y8rI^{{!^bOeY$5*nJYcdwjbl?xq3eKQ*YLMDG!n)+?I2h zDAuSATXYE8T4>KK7vHE~fvKbK1LzGq0Ul23%Kk=r1EJ)Awy4=)>H@gV1jyGk2@=~G z{5U%HI!p_sL@nA*r$#INZQcO)B>niI7i4LYKerQ{o>WhU?Vz(R5MD zcs^bqZKT0qRt|jQaqW83*L9mBWb*T4ir=F?uXBWu_0+3WgbdNL(E}k&TtFH? z{FWdyYt8DFPx~3bn&;uH)Bi4Se*BH8th|(mc!T(t2@LOmFsDdkxEhBuEd*;VO6%7% zLp+>$lK|L;EG3Fsx#erQDpC_~<_)3N0lcQ(tnqK!@i$#m2QprQ@zr^vZ%Y%l1(>(2bp$2%%DUYM z-=WpStjfQsc0#>*`D=Yy@bPN}-s*z^QwMqBG{V$e%6@H?+eCE9W6)l<1K4ND(p4CO zG=H9=`i@mQ>xI|{W`fHrM4Rz$Ae2U=NENePL{*G$x6o92Z{3imicv<(tEG?=i;p$& zlM_q&3;hMetB+^3Ac9cfttoA;_`}Xvf~KyUVD2*ed7`P0GmdZFv1SmQ@gs|uSKz&z zPxI;e8u&?et-+UFrX=91VJ|X%>XQf?BrWx#~U;CM!q%oWmnP6Q6U$At_%v0>W*Ig0qt!AqAxp)-A&?yX;PRVj*?LpHyfZYfSxV#9()4 zMI^l67~&Vc-**tKl+0|X;4{FV-F?*?qisG-pw~AJpZu|*^x+B!bpDRcM!)&H*HUxH z?=Ga3q~It0>qy77WOinOO`1t-mp|YiQJ?^S2tU2FX|Dx}2mlUCDaE8Enn`rNYN2$5 z^;LYC7xugiaQlV%@=jNb#UhL6N;|R`_oMK7J#|yTP~F`ypCP*nHnuq#YN-h2lXei3 z8KEdcKysaXFP1+8llTfa9zQ3-i0WBZ3LZ1RM?jD9*GS5Ng6Wcf+b-mp|2R?Bg&RR7 zw}W5209pVxTK^HsvRq4K+m3|Lnj2VXwF7FEZf`@B{zZmw8~-wozis1RTLFIfdpG{xjlaF< z-(li!SMWE4_#06DjTrxkhJT}izfr;e2T{S4No{CjlY_vCq$f}i;i)+VwdD@7cjdGv z=1ebV_H(1ul<+)jg)2pmL`zi75eS?9e2>jjQNvrdOjZqorsJ!vT_38m_ulw|n)gQd z4_X`GkLUZnjgM9G-kzPFrfJeCMX~&l+Er51n3j^%wu^14ZOe)br&H#V&ux5h8V))I z44u@QS8irpK8zXcYAg=DvgP;C*WHK^^if&?PbL`lB+tAF!#Ep2144w^SxldVG4eER z7nEFHCy|)YIvHu-Yj+lkrDAWUp6HUaRrJ`*+|&uTtXTg@dN$u)b~z&hYG#NZ@|kKB zw&qXEq*eKNGlT^y7xh|n)DdOir85|srgma4G7u8`Yk<+=2`fgN=(^>%8rLnoB_WoX zB?D2zl0JgemcH?e~AO*C%`i<65{sqGUD3{4iYN zXO;=51+QaWMjCyG?HK+LukL|A3gOoqI%0-h0@8j{3rNdWc&8O^x{vCqA?aJYg!M=8 zky+HrSe7{o$iiNllvI?f#E-?R7wBmO6Z)Uu1@VGT&n5HV&Sj0Ymbg&f3iS|By|w|3 zK2v|tF#CoAoCF0`yPhUh?b?qorybJmiRr6nq`4V8;(wHTxG@iE^D@zUOrUFVp0bzX zL7_3b{?C^V2_eP}&m`ogCED95$?i9x$o}shfp^#2{ul4=Y?GqN-qLsvb!tA0*4r<5 z5Wd<&_3;aH7kSGJp)7wau4S&JZZfWyRiUT!0nfiPpc;%ktjoy%PgM)o+;y!PoB8=7hJ}H zj_6#JwKgE6MAyUdu*=b55+gkjZvzjr#1*9r3IH8?u=PKDX#Ej)IMe zaNKL*C)ubu%CdrjbBpeny2x8aFL%8uy5#rg2R_=`IhQONGB{tG%Twa+zg@~}=Z%4n z5BSTEZ&Siuyc%l;$N@1rmpS#lJDY`he_BQox0G&Fp&1(3FyXiZ73wtE) zglY?Jy|7T$(xTFNhIGdQr$3+d710$HOF2%SMK$`;U&pmHM}oeJ|JRqbm>HKJHmypS^ zeHQZPnj!oL;O$%oj_Q^9Uz~#K>7wE=3!UE(;5<)Q^sJ=2`0XTT4+TjV;c1ij%KCwX zmJC`LX+`7J$OJ?J5cd1Ue#j>=dU^;aou;j@58sG)m)R$6ZBTh6k*$bAg4okU_rh`9we4+QoB|(}Xt8FREBhME+CM`m^*E%73 zDT+;;bPP2nj_>twYH;8#pe!iL^ZQGQF^pQEp>p2Lwc6nn=L_16+=>cH1H~UAVGYlB zu}wuo#8^d|-w~gv>4jd)KNr>mBiJ*I@8+LwERgb@QL!6syd*-UbE7yV#ib(lNt(w- zdd3jk0d@2EmCjlNNcQ%aKN@q2_*MBBkHPOx{y2EIh}y?~kUF@)><`_jgJX$aEEp+_ z!C-T&rSNu)zIt=L2Tqd4rC;iD6ovG{8WXvt`m6BrBy})k^<=?-P!T<}K;2Lvn@6@2 zmagVdD0QHG{-4k2JUz;4Sn7Y|L^twl@9p=2X+Q4c(F-JfqO!@QN5X+zR9&U49_>0; z+@&}yY(2s{W-MgtgPQQdQ+7!yv7CQ=RgRD38k;<4?c=GRsJyBRMe$Z_v-qnQmpkDh zjGq$P>ycoHTp%~~;e}Or%x#4vxG_j9Z`ouA>!2d9%~d!^yI)%IFnnB3lTXA=!#f0V z&F8f@2bE1D+W1v*B& z;?}q)XzpOI$`0F0CtXJ$(l^qpGui~Dju(w~)($3CdB$f}&L!Vk_g81^7i;Hec-*T- zb00a$6Y-gYA0s~1BTh1Qfz{Yj?9(JoG_%lgHJg8RzT^D-;&jJGiZuml%8N!h$hAp$ zxe?2%HuSiB(kKKXuIj*3X2y1r2Olv#xDug<6+%qmxX16R3}gJ#YiXfRI1?k=Yp(AR zFL|9WZ)q`wDasr!L*ENiibcmuFnPk!iQ+%c^~-DtdDMk7L5-dx1~h?pno$kKy2phF z=M@_2f1Y}0q&K)goqQA>9-7CI{Hjkl?DtKbYYN6iGb!Kx<>tS_8B>D*vV5gU%_U8J z(XY(cCl=v+g@*kd3)BH0=kXvnYhz~SU~q*Mb315wFo()%vw_dlA``xck7S-LV*pfb+~xLGS?C^2^1pP}wV-*(^=j=<@2$*{E=Cp;1-v8h-lhRS}7 zNjP!rJQyT$Y&LgR-rz1(qciy`lP%cR7(Lmo{(1otkq0*t(cg%Uk2|(@8J*7lOQ)MK zGX-xyKa`X2+DM4CJxabG8wM7%zu$bP%Y@Aw!P$1c=l8o}isTwaF@D9Pv1R&$;TPxl z9&))h+6tNy?Kft+jB>ejhxwV69W2H^SKH7%!qY#&=YDh@Hn?bixbJS=&vO*1%bf%t z&DlSVbaM$PHx*(-1N&5=iKH1_3`B!-918IP>t5&L+v6$=mmA8y(Hl^wd!6FakK zPl!}ND={F3JPAcvWyVeSRc-6?S$Y!t$Aa4QG_Rl!l5UsIw~A<@Hjb>#ysLupHmpe} zUFtmnS%kAF55$w2#s`N5>SjBtWpDYemk}N6{DpX*e?4+i&0&H)*_`zMu=nP1Nv7}H zu#Gd>d@F6&a;vGv$}KZg(H!4$eB~x)jsN5DnQNJ`5jnd(YbvX+umMlhs){Q>Cm>3^fu5jNXw~qg%(CayvJoP31BgRTekOr-YcZp4|%wWUP;pnIkYSJP$O3dMd#J_Pz zE@jTbs9jw5hdXfo^&RTL*@m?#&X2%_ObxLigB;%%s$kZ^MfL87?I%SPjMA1Q;|yg5 zOTZI9TFDcK(jp3V$FpBoE`1ED4(2D_R-Cof4)YG-IRqC4yVd}RUFrrKiCe|Y;7+NM;=5~>U7g)d$5$n*+=8Zi5^GXc`;%KveQ}ga@2pTAfiO2$w zxw^=8=F54WT*=z>borOO(d`gGeS2S^Zb&!9#@2Cv_;!;w0^|-0l)XS3aCspaC6W~j@&*Ec!D1|Dhi4=OHX}HREZP606sWO8}wv$eg zBVLGH;k|+GIR2e-{z**az}BWw+xml=_L_s19SheN`>z1ip7J=*gk(ahuTsFWc(0Zu z&88Nc<*B*fj`2`N_tlwOBamdV%zKmx;x;<#?YJfFh`^j1Zbde<;a33pZ7DGh)n!)i z>z9^TV-?{!I7kKiAt753r{9FnC{n+)-_za7m(XX_3zVcrPQGQl4GiBf?ED1)+lzrc zBF^=$jU%DotYX~cog5)u9ldO^ywtvyW~3{&!8w$TFttW9*;Dq3 z-hR(OdHhdnxLNNAFf(E-)YHr_V%lrgw3w=JT`<^e1v9gRgjec|JbEUMazcrIRD8xq zac=`j2{d(={_(7{bJfJM_<^>*2M6z(89PK+Dg`2m&x&^-*(`MVvS@K2=oBg4GR$IXWK#iftyPWx9r)Tl25p|8Crl#B3 zi^ZE&SI6eqf`qT=e$GJ$xMPGXzCc;P|4~TrZ9Q(CWlp-ULZ6S5EpBK8m0}vfp zoi|7i8LLbx01ECDhhwxbh{!iI;DAw23BbFXjoQR=^kg%!OWk2#DRH9qq>@a23BrC} zXop3?ke7*@m>ABxxrg<1F%~@;!Vcd%_BcT6J>2kd$QxCSsO<##cqDp)tT-vZM& zcUyHNh341mgo94=@5I&$YuWJ+At=_n#dq@Wk4Bkaiu~@g+C*X)5*yObYsv*l`~|(e z0Ff&C}5U~sPR;oAu!ZKH%^3M zrOewDl}19#ZT{%L3xh12;mI98a>l;`2%%e4qxp4=`!k^>Hx$eon{LrPM$GcVe-ZCNXlEWodfj}3Jz@wjBiP% zSme2CC?xHo0msl1A46U$Bm!-qJc_EcHLw*2ntOU2=&zQZUKH5)p;&7fqQ==-oeoLc z16y5RD(=WWU_e1Ia8RV@+hW8x7SKVbc;!vQ*J10 zCoU(#RDrg4T{5EtBfLMz{KgX2uQ0o1C2)+_h<+zI1|V$iOXBO$5%DOr38Y=gezO=? zlqzz8NP#;(!cQ9u-WNPzGjGvo7f;y++U?196Hoa#Z~20gPdk8?lmQ?eo1z2{IT-b6 zOvQoQ{fCq609nuZPoe0{7XD<|GR44S;nAywMpgv2>~GN*$(KEF*nydjDLFlxahZq7`Z! z2>6BVJU5CPUjZKBq@7^6w{%EdsV_t}eTLW`GbIFiTRqLq?%c!y{)Cm{;o-V4AAx?Q zp`~o6`98S>`DR#j+D~`N7;70Z8ZrIfI8dxr%hsR?X1uYa+-e`OgiI2uR;lWcP}Z@S zh)eZ&ff)=@>2=Pe!#ELWt&{5+8vpT3+y&UJb%??2T1e=bMS-8@;%{GEC%KGMNc;%f z!fZQY4g>b!0?=^ue-d( ziM4bWFcKZWNT{!U+<5|6w59c{q9`7T7(9AY62xFI|d=*_)YRz+eTUrXMvJfCX(tw%<$;-cW=uYa|_9t>ph z@3c(bbq>}iqCP-Rdh{Quoqw&_WR!nV@%`=!xgA^zQ&`xoExrmkQGb9Mck!LQ@0t*~ z$5gDV7icGCV3Z&!m=F>eG9O~7&lM*$BpH_02$z5<8=0nU#jPudyFo}1X863;IFYeC zUdbjla&)>r#YJ&f<r#6YImgE_)jPBaV$S-Rev-lg$@;wWn zj!0GKMF9FN@}0(d2Fg2zJ*P1}iBl*_5nx8u=5OjO1GD4n(pP;hDkb6(?=E03pt<{T z80zy~v^*dpbi7;q)M~B*7*5;s6@4$C7#4`UFCMy(LiFN>LTiOW`aSXp{N}PY#3g!G zl3gBNA9B5?sOlmF3;|*?69A-k>z0U%P%hZ4A0-GJaZ~wW}E3G!$n7UU=>ku5#jw5b=j(7 z%)#P|mf5>|#F2lL$h~Rl$pu8OuGeU;F7j_YxU84C9&~k#er2F?`m8pgrvEh*y z0Y;>^QidStp5pYLBlsN2Tx}fXqKvTAeoL?| zrjBgMV=z{M=W9&~)|xND9iKRIMb%1#l-16<*lLTq=yO=G>+qodoltMHs%2tzC@e~$ z#^0Qr+o$nM621Es5z&FP^L$p#J!(U|1fm7R$4r^M?6|T1s2>{5Z~`XtU|no{DMzL^ zIeR9V{s~tV6nswtN(RcbRJs)jkmHdp2Jek4 z7v9?SHJde! z1d?fwlxiWhmpL|5tQ;&Ao;xy`4;m?(B&UMS-_3LFdFgT^@_+$To%VG|=P2<~6|1YG zPv^GcmPB6NPLxMVDIEIdvg`=D?niMGWQ;r@rN5~K#tZ zG04&G8kWOGOUX;sZJ_$;xVgYxo~?GCOG~#Y)tNDi3x1!A9Z=6S;*xevEm;4x!))EPs%^VLYZx-x(b_<(+A2b%Ot&cLR$R$AN3#Qd1Igdq@sJcnn;0j@ekf zHu&&S4ONAu{uWUEEJ5CO6hecpQ>Q?ZNsyVNB>+8Gk@{O}TScK=L_YbjBI4^K_DIp$ zwMt#&g;X$XTl8FO;EjS&pSzSTAY;$5$XXUFP!3uH%-5(Zp?Le9xshbs_!bc3C6CP^?mm%M7!>{F7>;*?KbD}9imO4v>HCx);1(A1=7f0+t@kZJ7WQ}}_Xn*U_R(cPQT4O}P*|&2 zE-2{}zAx(`2ctt>=krXlWwWb~>T5Ck+?m?C_+wU{Qu5o-JGj5LxLK}paj#^kc5uM) z%N&&HR?|NOrsoTv{I)@UzDAgUbVp)Mt$N&46k3o)MmO9b_pgm@BpcE~2gM)x&SRM) zYQL0VJj;dTq%bi1*Fm%71v_RYB-_wxKH3FfgyNMBg zhzISRe$4ft?i$N&3@pF|6Pg7ZloCQrXcL!%H4Z}NrFI{w^rx?vmjVh^>)f&tw-+5uzza4hAww>! zD+L)Th*=aO{K_PrEYC<~&cAa`9Z?6w8AIFX2NyM>oAW~}V}oS?QQj)2D$!c)4)+IZ z;qJT{5vthgWm{a#rv)OyK+d|tNt1HUA$ZBBFB15}+WT#mv5T{?{$Zs#UY(inR%&Wh zOMb@i^|2II3PU;_Y1zV^0I+2B5{tkmg-?c1U!%;(#xRJ7913m4T8Ql!64IS#)E8gX^OiaYG!ctkwh)c0xw0Uu)zS3->(!B_j zxLcmvL!9Le_Fd5EZ$9Rw@wsIDGIUbmy1w!@Z#C29!HUH@>dq3EB9s9tT=Z+SMo^0m zqKTuu@aajfGgDvW2jTJ0eo5FYSF}daWZDc7X!4noDyVv)3z&uz+c0*ZotY(TXKnj) zA8rok+rX-WyuBkJG^)w~^jV!~*z3oxKfZ4x!21akD85=KK_OZV-KR2eR9%(en# zg?;D`b`S_{8@90*y_qh@*|X%}Wtu#L7RN4?orJd%%n*Ph|B{W!k?{)Xc&e}H?A||@ za+&K0c#jn4RWwvP>5i)n%&ZtV#1fr;AVvZNc`TFmQb{O7>BW--=VYE5f>p@*@zk54tiyR01%`AiYMoKT&wGK*9TBj znS5275Zy0slj0;HEYt*E0XijRbWat1k?whyrnvcj2Z3so~<`|Qzz zg81NMQu38ivt%ToWfj`i?q;sHgdw)ARN#QGpRbT-e_QP#8E?CWcV$P(lcV1LS}&7& z18f9^P++~3=fK+J)M4??spw4u7|2`>tEjF~T`d_seT5-vR{!28K`PH{W&%0S8^Ux- zeFn+u>vl#P1YlX|s8LNYXTuIQy6` z#}IQLUkQ-;Mt5tsT>``^#Ufsq_gzz9iiuXx7DymOKSHijI+Mk|$lzc;(J>n1@tx@% zFY4ETn;@#ZWN3F%CTOP(Ka64b{I6H30Y+{uFf0?zZZ7Z`*WrB z8ja%(rnKtHT8aUXf?M$n<#i8|4bU5%$$4SdH~mrd;6ii-y2ZtfsMx!v`gEgO5E~Le|grwxS?9{`?IJZ{`59!>ubbzh;@^^hX`bN_Wx%9~A#~aIuKhe3PT+`Mp{8 z1#5{q*(CdKjdQP}fkYk?D7fLBd1HyaU?O1yRXlrFf<^iiC=Gs4_TP0!f@9HE&VT*l z%M1XHkVAnQvP%b6aHZXwu}N?VsU6~DY9YT(K$Eal?9yUm82|gfR~=b!_;>vD<@Hu8 z31+pPa@M1qEw7aM;-0G#bkM$%=_O=i*x!b%^x4a4k_y$sNro)`%2KYu4vUB=-re0y zmFKdlyXtWw)ZBzu0{K%McB6b0sAL+U%=?R@D%`B305_P}-b7T-zB{TO z%!kymZ?`s$wES@!O^NwZGhV;)=fBv%Wf98)wy;ZG9bN)F42yR z025b2X$N0vtzfu+6?*Pnyn%bH3KT+aP5#^Z+LQs?y6|8HfvvtF1zM%bL^1p5!!o!X za76g6u~bwT*vm<6qkVZo$7XAQ- zM~TD#F|h?mp@&V6;X-IqPSuEK)@^d}N`ggDkrIZgwEw>m|9G^)_*<)t71*CqRQPoN?^@CSc;EO7hANY3 z?7rgT!N9os`8UV^vFs8(U%M4Jns0oO?96{ZSP^ct;y-owkUIbOb1y2VQrv?JI{N%B zt)zpA?6(L{r3?6cVkT2QvSV(|C_dG;Hv(66Xk=-|Je!;_}l-VxYMrb2tlv2 z;iF-L(+~0~17Yzr zbuX|mtRNFuN(Eml3kV>6hgQZZe>l_^1LW`5JlMl=9jLN~72OvmUsy-f4dBDA^{WG>FGy$S&krj6d`5tyIxH<_0!zuu z5={ah6)9g05Zcl9NAK_PCx0Y@fqh+aB?C)2Ysu{dKK%8)zZMXsOEYioJl&Q3ufhD! z^aptaF4KWC@`~aDadkHJP#6oqru&15ixcyB*QvaW-~+9}z;%jf`@^6(`eLD(PzLnY z8jcjb50=|SD6Qys`L&B`{bCtAbiT?;%XGHrJVcLs`)yTOZi$KC44EzT;!mh|i8=aN zVg_z&veo31rYWxEGLNr|JHsun6Vp>WbeEU4l@EAIa5!D`{8($3_~!>Nz?{=MJEJ-5 zkpnaYt1hl8dznZFveaj|-NEcWXcLJj8HsDL8l9yBCDKv6cu0^vmqKZhNptAh+PoKZ znS`epC$EZ(#JUC*lIwz7Q%V@&AW%vNr^fuv8=CDyAl^9!Wnd%+4jY1;0b!5am1X%Pm~ zTGuKAEj~+@I4{yJg_9WDl2y6!C;?$@92=)Cl90e= z!dqU~$ERYooQYH0o7C}aBzyod9avglDyiZ9IRC^CRjP5qTwYtLo{T{A%5_UUs<|S} zb^paYZs?LQf=FU9H9;_$qRM`Z3IlvLhrjwD}3+k0z}1IwQ^J;F(sh22+d^G(}+#e%qrT z948h&-Xeaw07DZ@H_D{RV=@H!hdQp?R`H8|W+VBYidIz1cI^Y6OL3-;w0F)etDwC` z(IMwOGc!}`O&?ZH6*8c^AwZz3NdN+3Q{G$I8ULHErMeHm>F1+KLP4dVG3}gdjRiY{F z=j4aS=y*(2w`Cv4{LF(29h1t<8|avY7TKeYJ|D2`f|dQcyOk$~wlxsjixeTDQ_1mC zWkdjyT1VsmejA6Y$h`wim+eOBv&7hC9-l4niGCLueeFy*=~@AESnp0EYvjsEdbQ0H zugYGX$A=vT6DzOq{mf4vdoa`ABjg;98#h_;{>j-jAXF?s$BW#z-{3JsxeJN!W-hUnGd*pyy>OF%vR{ySqO3q6_nY-)ncl za@Dh%BllzlTC%WuqP`eQZ(sE+sCuu><=pyGwe#}&HJ%Hn<(`1-mO1ZA5rL#tK?82` zekZ+R$e3sz7_K2!X5)Y}0E=ScG1b?y!rwQKwF)kWkG%Y!v(SS-Kh2L|@A>X@IxIje zeAX1THr87F;-on7na(#y+&j>E!ZLX&D5CjFODgwdkGN?94L8@1;9LPfKo^bjh!Qpc z9D{xzyv+V3Wuvb26J;VYXIU1+cC-qYBmkGnB5!#yP~dq^Y8kX_kaB@yQAj&dmLwfw zk~}hj_+WV8kAYEz%^YgZ!cwSq1AwAwz2bYD5*O`jBcma_I2^Z2=)|LSB7PtZ;G91iskCVWfa0p$y!zCyJ2r$ zi+h@s_M2j{0D3}w6~sxjE{MFor_@HA(oJ($&b|t~j-lPOE!mQ{m61`$n}{HMuMXQM zqpR|rlcx%ou~N>%|GX9hZVa0`>{pPkXdLJ&%p8k*-+pW?JY-Xo9fWshPNW@U0b1hu z#M5phgDB1c%c-gL%gV3^b`M?<_GjPRz|PIL8cPc$jS&9xixAY5fhB6P(RSpCL*(CZp%c zbyBrXV3J7Q?IMlvtvcHdV4c*2w)HSG+!~r$b?9p8N z!}r9!BzK+1XS$*<3{|P<+o!~fzR8Y!U&eTBvSi=pZZCMnRurLvYGC(7fpli0jn18< z)E!p-GtPBFJK$!g$`Rp<`l9_f=4+APor@&dW*K+iYQ5Lu8WHwow+B0;V3+K8-(2|ica>!s<0E2xcwyB3pE&fq?^iBkKv7Ew2EI!D&CcXkFV|oXZk4pJ(4=Y#V{dKtvaiNvvZA$ghO$#_Ta6 z=f;U9={1c?f~NbS(&#ZkU&cQ*IOxGJO-0M755Hy;0jFJGKNDDb+_{`~w*^WhPTOz>ofj;pZsXhz zk9P|Q-W&wWeWbitcfHUFmRf3Zc_bZP0Oz|&gZKJ71OOf*5>#gSQD}W!SOo{(d_zI| z7nn4J%6W!A_gWmcx2HGoc5dGVpy`tzU;2XTk_u=BFK|36PRE+ z+$fbD1@Xs5st<$=RY_&q8QQ;SU=qc6P{s8EldIC&!N959(n)t%5m3waof=*GZsFh) zp;Frk-m$}i@3y^GdFD?8W`FDhsF}f6fnK9P6IqMsuhR=Vf9%WYQ7dCHV~N9N$RE%h z_YIboF^17B#5~Zy5jjB4N3XY&CZ#*ez-R4G+~31VJS+J2mJ5y`i^1-Tz0AT@%JLBs z6@g2PwY)9q`s2^OWyAuR5=scFE+AD1YR&2P2Cs77aOz+PCLeb(C>mUVwA=r6zL@3Cltp59it5ROmdjW&=k2zV_>WQ9=Q^5(%CPU>Cp^{-Z*;?Q)kexFAFmxc zYv+(MXPft-m_s)EmrMNi8sLw=8L?#kmLpVU9!~KwxmrN! z<76a=u{xOxaam*c##;M|5=9h=T)iU>+{yx z7Ad#?S42;FdKlR$~MC)6<3-DA;3$@r|q;GgaCA+wyeyGL95E zM{k9oZmb@Kqof(M@~|Mt;$TFVXy@rrkR@}~8mMW_el62MvKfCm%i=QF4(voLBEJN| zY8U$+n|4u5SReXZYE7kq-ZvXhszO5AZr(1ve@+eFXU_DjUKo(7Xb6__Qo^<}pIYDF zHC^O7R#{qG1H1ptX{{5?K74BU4{PsE-{yTvo&-$>M1^J zmqO;x50nOK1f9Kol|6R$$T9l3Gr@<~nT#P$xyLbb(E}wM^fQB;iG-aTjI>op3KBF` zMI?D^+SOaUz~P{p_;#%}=Y-|jw8bjjZ#_C7myV}ILbJva%bbl?7jY4T!rnx|-0=LD zql^3MqoZ(6&`Jb}^WpiEg>REk&D}pbSWQ*mHToVFA>JF8d(w4K#~BsBNEc+V|XN z(lWKC9p8yRg*l10pC0(`;4=jU+5G7f$1WNRHQ6OQj^;xt_=kH`@W9E1TPn_a_TGfo z8{KgQZ&{UGja9{|diT|&p=M4yL^+1d&?~E}wu%>e{D`4FwO20L!MC$Ty^ah5cJ5=9 z0XmX7+(Lj*5tF}Y_<7`5q9dJa?Wz5+X-sd({XNJHneN)dCLrP!9`JY&kEjw|T(Ihl zz5pX>A^B?!ZaPKPGU*_pxP+Vl!k|;-WfxE;ZrHHLCqXezL}c_?b}@>E&O#v2%!g}^ zw-DbMgM5_u(D?XBM=ox4u(T9^rl z3QX>@D+3k-J!Pd?6mL?QY#QbAwA$ z3}+AI*=|=YYI9VNxP+sA-BsOKka93cjl11c;O*MBZnGwVA+oV!Moqm}hKQQGP16^v zTx^bqx3j|1;AmT>j1QSlpD2$OTY}62ToD~A20<3@yv1p&t~)WUPCpR$ny)|F@2g-I zT-(BRyZ}aYGFk}E2!Jl=X#rK`8kOKw$JiUUkt~ZF>b`J?f+tC_f|`5kGM_hoMyp>n zM+!do4IcVrq8`0NTogzY!tcVDR#!b3KNe;WjdEGC54T(c1GDkF*@pWC%@*aI_569` zZMI2PT|uJvyGcPyHeOUUJ>&vWBEc1I52)k-_k8?qxV^xG3TM^Tm#$(*j&04aw?<8V zIFf*Bi8>+O1pkF%v=06-@|q!QU*-1G4;r%EwZX_&;9pK{Q0df%|8fhl``aC$7PY59 z6ZVl|V!t!9S8%cpa_vG6w!m=OEva7jzK8nTiD{Hq+rir$I+f%o2 zH;xsYApzH1m__nx6S_BFZCd_#^?SkMFn)js_-9^Y#rxO#-@Mt=a!CPk$5-{i^pQY9 zR9oDwRlX8qEl6Gjc$Ho1W2QA zuRCckrv_;#@@NxC)|#IlZk_PtqSvX%LBne6HozTwEX#s>HUVSBa^|HhH##38@vQ~4 zi3lf!1>CZ5yKV2`jD-lm9SZ{ZIzOd9AfV-R9+TxHv&%(BjAH@tm=%AOB>-~aQJoqN?Q8MKQ- zVXSmV1FeNkqMSkac|?PQvdOW}lkNc{N=3<6US{+hFJiq6&CJ+w>}j>Bnm9q}J3n@@ zHvxmP+H+d#TV|iF=w3Ogr($tqaAF7uuD?|@YH!Bd+Ro*{B-xzZ(?xt%x{p&9K1o2t zUkSG|3NIYGux?CZHUDX;{Bv_!u_1bq8t+V+QF%6s!1g<9L`C0;l)_o#FH6oO_7Sxl zAD)7y_g-xx?!b9!tzyqbUgG~>7=&-ud%?Og>TBX6*9mX34tn;s?Y=;|krbEgfXsUY<1%MR8gL7K0UU0H6m`cX5lLg{rgmzjl` zqQjP#Z)L%~KeH)B-ta^<8*Xg6{W4X!ooutW{_Q!HLa0jk-6zW*^**AQzwh}VogP}f zvm!D5KtNq>_C292W5mXfS7R8xyM7~>a_tIb-J6izb{@Rpg=+A_ibSRI z6D7i2Ty)*{R+QGh?T>))VHL8@F~7+#K0nL$vPF`9_BQln3N^w>_3^Q_)I&m@JtrPy zm{;NJD_R9l@n;)ws6MFQaQF%FCeAM?t6U77Bw5^?;T;H!B=qEusi%h?Ak^Es$Q)Y^fCo zxWk;6;?BqbTXqyR2IkTZR65iT|0wuWXi-RL;e|frpL#Hk4zWkw=!^g+4=jgu2e&Ld zEndDC`C~>19tz2Frs&m`Y-FM87sgGe=gWFajTL9R9n8$Fv#Sk7A_ucF*KMaZAe*W?^nsv`#kaSoY}jn- zOa)PzRF^Kby*w~Y+Vdf1I#X^Q8AFEVj6_Sp>042B=F8K|$+890c5*&pPTzJoA$e&( z>!r)3>GWaKpGZC!aQU~Y?AjcZF@bw36569v=Gk-4(a@K@P9U_L@gU4IU;#pHCOeAh zaUFOI^>IhK0P)#QqXk+uf^0huIZ~;0xJ&S4$%bE8i+mVn_du!1yo%G*btI^@bXC|B z_N}9Fo%YR&eXL(^Zlr^I(Wj_t&|p`Ra6JsoHBwP<&BbQ{M$OJ-*IaAJ(T6xWl$3V_ zdpN;*N-u~@>Tq~LcrNZ`Pk7z9x!pAt2P6_6@!+xzn(K8k7upW$?Bab8|c9+~y@<=){if&S4Uc}Ye zgSspPo&_y~Et{q2&Z=##UP0#cK{Rp z956g1O@gZueBwvN)z5cZe^bS%r|(bVByrmM4c;9fqiMRy|6$q)d1UA}ugdJ#4JADJ zEoZD2c9UfbT3*bOHj>J~x9)iF^dE>IXkq=jw+9{?QyX*fCV`og*-_lUBz^ZwtIszI z!CBHWj)n1-hkI%uS=|b^yn6HiSL4s$nS70zv+bU1bn97OnqUUZT};gy+}~F>|GG$( zwA71>2rjg3KmXG^qco$UnCE@>7|Dxuen(Vv{S9#?>?C3PEPVCOEv>whS=9jwO+TIj z3(Fj$ujKp2-#=flmpz7-Qx3$?!|V|WFrq!olXmOg9j#WNAGjLP!G{b?>t^r3mUN4r zIQO<^WV%1F+SgGAh1F5F1FzootXSXVq$n9IHQx71P344c%59sX!AVb6!rj)LTwj=C9FtK|=d z*8-lac~=y2^T?AUahzHfp_cew2xc|5?GlajO|f+aE@Fh2mE-(qJ-wpJFc@G@iLA0g zVMwYdUivuwm5U7~oUpOOKpZVc{?(t~wI=h@wMRZ_L|AE<|9I)WR!5iUerhCA+<*GP zIB#?J53Tq$3J*2hSAE`|4*vNywU{?!q`PT#+E#rjJ}xIWZQDRM;c!F}y+265!w&!$cM~A<{PyMBDS#Rvbc?g21@3>e6BXN!=N6!SdH`sYmDTHNk zd<21gy#4i>nG+lG(bzPUq3PsWY`j6W%2-9jZVKt2@9tTn7wR*EW|yEy6B;Tkd^1aC%IM>G`M>u!k`z zFt+B|gq4kCwv*!jhYzW##zw2whT+1YWb~?LL^t&zk zNol!$B?s`>8cYvzrP%KyTY$DFDz>P3=?e#hIYq2W8$rzSogs{SJ`Sf57H-AcNu1;tjp%;!)^!0d?8Zt5J7Vrq zTk2UFC4~=LUpu8(7~>OBSJ^>c|5v9Tur5?FIb$_drpEliBE8D|lZkL^%!Ssd#?3!^-)93f{`XSttd5Z5^heG_ zc!(U2;d(U(bIU>a?I6o}zQbzO z?zoX7_++?uU79|#w2ph0qN}J`YePQ34s&N&Kd_qY$c2vJJ0Y8{^w+k>#iA;-=Q{l= zLdsBJhvGwneGMY%^vmVcvkB=rhMC1sozrul&6$yGUSHR#JuY>z{59mR_2bp znr~@>C+w)i1t*lb6s1%p1NA0f2}}BuPhGB9cVnIR#3Q-O%(xtkUp~NA<`eUer~Imz zn-lR8Wh$vlSe0$$PJ>7Uoer^jSWt=|mD8M-m8ZO;<)M-Hxqx*W%()V~8=kita8Nxv2lS%ArcIb|nPPha zN!0@};K)wZNpCq~q-a;K$GZ1Y*UNQXM{%l8AKVtIalsm}kd%xC-ttDRIQ2QBohAW! zukAC7%wU4Ho0Wo)h~dWM%Z^slKe9eYjyS3}KkY8wmcSPLs)F+J8%A^?qq4keN(D?; zO0|8iuZ9~N_$grqP%*wuYttr`<+yP4L#4{Ct)B@_yY72g&3adHqK|ws?7;^D5k!ev z(--DwoGBf^&Gf8;+KIJf&0LO6Ce#(Mi@`naI(n5Og<~!e5Gb2NN6|g$A8-geeiWGb zXmBdQm>kTaMAp6b1c!z9A{;^4ONCV?tM0Ffy~^Iw%1o-&{Yl%A32n&7UJorFIoq-M z3qcojqIj(%o|4`Xo1B8RgM#-za+ZGIojh&z6jwwpDh=!#h$wJ>7p_@BMc3c~lb8%? zLA{^MFHUU|mg!mA9%qd&5hyC@Q?Hlx;9$36?d;7eHbI6!NmPsNFY$WR9~6EG4f^h; z-?i{vAA-x9>spF`R=a$uVxD>+DaFg}D&&apVQ0bgOt9MY3=w$1^#7`b8?C^!pDt ztkd=cWP}fIGcCa`wWXTCj|~OkQd4Vn>x>`?zdjb|9VtUYzYXx3^^H1r)Y9sry2_n< zf*+R+Stlx3mQj)W;-^iXmPkI7$uFQkEj1r`as=$XtyJ zx8g5ZAIw{KB=%#2N2Ki`c9MQX@3jbq^k0*{`}osi9_LtyFdD}?1i zQ$ii`=9wVpC9v{&g=(v(c=Ua!njo-vb7kLH_Pk^Q?QEXRpj`ro;bRPs>tQX6PDXea zD4Lo(>^VK-%EU-CD?!C+mwFEhqDn5X8)IUBnm51Seej{?aReI*g3>^%EgRcNyzI_ZT3G3=&5%xsXY5T3 zg0|N(<{W$bHF{=KO+1Bd&z`(yST3y}18ZC4g=GT9Gp?buv**-Vp$-x4m3NKiyx(3Cos!%vySZzWnpIx2O(P=*eeTQ^7BKzAF;6=F!;%MyWrt(NRral1p*vgyK3o$ZcQnAuF5YFu5_?r%uZP*(pwhY6>t5x>(3&bIOg532 z3)jPngU3DOaq2qc-YBx4ti1j(0#GueIlmVVCIi(O3++M+|5YW4rTCra(6;{AiB<=8f^; zy8BnFT*rpJFYQ@(P}gkGLESg{Y0Wx6ph&=YzW=%vLnX2wV1@v=-u^s%|zqQ zflZ(MBW|{kd2V{TF?-&rxolL_qr=M;0Fk;DP|P=&rnR;&(1Eh3xAy%%2LDu*O7S&) zX$Rh_viV+YTw@@7J+GsiZ037E0NnBzsx2FT7@m}a8mp&4qFkw=-5{Yh_hHGy?Iw=v z`h&Csu|7MGt&6_vx}_X`Y5Utub}5PXlJdhXO@Uia3j5pSA5L5(U&}1%wqZ6Q4xaVc zy=vD3Nem#fM|ck(Y1H$l2CO}!eXcI~896d9Q7xgW@NCimyfvncwH)ULtpm6(@>Q0d zwetuleraNW9L1o^z2zdx$yy-S!HPE@yS+y5Dxj52DjisrNLr%$On{+o(A4QG7z*MLTez6|x+VFFO!`yWqLl=PNz0+lS4^ z!TdGZY`ki4Q$@P^*E=v76b=P$kZnG|9MREz*U}jSZ)WVky5H zPHiTZ-&14N=7N34@1c6q{`ZrB00HvBIZ;;ABCsg`hgW zc;xla+MzuP9?4+=2ZnVxyO0M4h=|A6Ni7eeP`jhR>|N_IzeYkhWC(dj(6-BR=MD(1;ZfxlMKxZliNL7!n)bQ# zb|=pMdOuiau>Fu2 zMrjzV0BB680m{UYPmnmlpuTGH%fBO_Sv#K2W2T*+?)+&R!)7q859I)_S2tF$%>t%5 zk&3EF0GS!0#)WNR9`FnlS*|bZAvjhwuLDM8)$g*A-g=m9t^(l3i_9+DR9DLGj0!g6 zSzS}LX?W9P$_sXBpfxQp%VOUQzv;LuT?>*B8)xKH2EFAyc7@0T<~j1`CTQSq;pM2S zeFB#e^LsWmhiq7T^9g0!sTU0)PHS<6xppJozvOL@Mlb|v?|<-2j_uGOayv<;#=uRi zk$s)aex^_JT}yXpj*SLDYES9R0|6$e97vtl44v z*(~EjwM)RWw5h$UnxL%keL9}HG0I7?;L72=Qsbj(dj_~3gTh+uXT)G|%a>E#_swgc z>yU~mPHf^yOoyCJ`Xbl;lu(=F>DdG1&p!M=?7eqX)7jQO9z+2L1R0egRk14~B1Ni* zqBBYp5s{`KpmfC0Lr_pan&Ti+L{LULp+rJYK$;2!l|XG3G?|t8U z@4UZvocsIz^Zl-we8zY+|EgKU({8n0k-~Jc@7HTTg!!<)SnJp&i^=DLn4WSe>Xz5yN($dP+gZl@6e`@b%UTAzFbl7Z|8q#>^2eZBC-&h- z8B%875)-@2=+n_f^)vGdG})e~q6>o|=6CPk#77E@P1ahn9}27JxDy703die6p%Y`Z zR3F_!r65A&DQY)CJ$nS)&_tBB6X$nwzUeu=g2h@yIqpr}(Q)Z!wS$A$+z0KF9Hc?Y zqaxQU2Y7REJf9F$c_;L&wa&1$Sd_IrjE3!6xe^yOV6u9gx_npc%nGm7b4cQYSYVP_ zuKBbZg=h=7?o1)g>9dE16sqGSMDx{qdHfOEypE6v<)7s5Pku$UH=jZ;KKIGv9HdIo z?iOqbQ1iD5m54ie$oC@rBBv2mY;Yi4Mg2mZO5QaB0yL-h5@G7CX!fNqnm@w!m1AXw z*M^;e8ALGp$w7I@EH|K+66nVfn9&LB_&EAH z?xjuFufbp(Xs62#P8wz(f!RP|{gPp^P%+{?_9toD&s_vjLwX-DPhWDy3~Yo*`rkvO zAj;A?14LFE`M!yJ8RD(?);dade(0Ek zCgCe&jJrO$A)0<^*}j+;GL+EBG#<0u)gnTJfo?^Y8fj~F34eU*GrY z)awowGC2g$>!yz1*|0#P=TX`QZ0%0xYgJO4#pOOTzO^CsS0CkUYWZTp;nkkW>aocn zWr0I2kiPklHQjyvwS|_!F)+T7smtB(>)(=fbT0Tge1asZVRhN5O(IaY&;a6?-X{_G zmp$@wWE%A1vmrXx4{}ydabc_3>4LPwRXz-P4FAMX@IDt*CN3XoedMVknB!#u98S0cesDB5+f-a8+_%B!ZSxM>YmebZ&?a~HfZDS z`5a9|MxCOB=XHL)!0eo?uMZaTMVZ1#{wh~HegRlxQzMg8eR3&RK52*8){m4zXfZXV zSo8^Jz2kyDadWV9W`3ko!^!Y`Pe*(%&Fei6Te!QI<})cANoq*(%U`FAbeL8?wz}hK zDtez%IV(ku+^ToRB9|0wuO%(@esy_yRrj-&t72jqv{(TtLke%V_t3kqDnDrbevoSV zP@L(*z78hp)u1CCkl?%d%=sup*9a;6Q$U9Lu%7Gr_YmZpx1?)+?{@a=WmlAE73(B- zbS)938&~cjEXhiM=38V07B~ge(@4Lnf7d;BeOB%$=SbP7-sFd46J-wSzxy24kV*c|{Tj zy`Tpfor4+J>N3+*JRFjmHZyJ%_`K1e)UIaPP>{tbgSe109=JDekJE(rc{#1VbnZuh z*ih8@M{LCN-6L_Ewsh$`_YDTV3ODX)YZ38G3jMkeNJ$!;Y3SDBe$A}i%W~ZtB+k)e zgleeGY4D0k4d$i49zGCW&?z8keCKsTn9MrhW89axsThzSCyc7(DvL|uZ)XFa2o@)! zGlWnZW24$KS-2F`QNp-@+KXW;be}%5v*MG`r*mCWgy*5QelPv%88?<3DlI}&ZoKm# z-Xp2GpWi6un%J5o1j4!RES>Qx}|$=9I)TMxR6`+NnTf|=Pqi=hwPwR>BHlbo|t>Fn;zbB zRF-pYG!1XHO^3c|JC=ocxy%~$vSi8ua^w4R#l4yVeVml6dEhgI$Niyj-hjsy&J;OW zxuMgtaeds6FQ_ko@%!iW=(s|>4OZ2(e{s$TaJwh>HCEAgX(v`YrUyzK`%NcgOW*a5GFLufM!_9W9jhP1=%sgzZ_;F%^%E;tikQD3*dO!#! zYgxo(mcH|-sp60YB}uEZVu70!TBkCez+A*~g{dKxvqve&;p0mRrM(Y+MZ=zlrdvoZ zbwTP0+O=Nzje_vTe>SIx`U^ThuWf(p%5T@J?78RVmUuLPjRfb8k^B>D03C3Ks)lFc zRgRQKf6-h*vK6L=&_(bg4_h3$6UzYy+^4j$wep1D`eOBKgASQ^N{SVH>?^R(Gf>vI ztP$L8Oq6uacS@6v0HYhspW6GcjRn2#<5D=gltw~%SSHGvmq62(;}hqXdgRr*LC4(6 zWhii6-5gc#I92iM;HR$+w?G9Z!k5{TDu{;JgBKc7wn@Y^Nz#Mx(dqb(#=ejYCm5m* zVGG7lQPR{X?GnHScGZZUiP2b#p0vM*8|mQAwZnTw_HqU_(RG&mi+VfvZ_=_jcw3Ft zx{Vf;4v&}SUk~Vmj-tamWuAjSpBM-hG6&wEgdZ`90 z$tk6JialLKrTk;z6V)Ax_z%L^N3v8hIMq_@80Z`0Q~W1>dKOCNwSFPDt?C>Ml8>+P z6kDB<^f$AIIF{lSwB4j%2WFR#K+WZ}6Jf?9l|>pyp=OR;9H{#q`j^6nJsqKXsGmx9 zIA^bSWEqqXAaDUic2<`p$t!QNRQrT;#7?sIBB5&3?h33bU<&TWe3!5;yyCu)PtJnc zriL%moCF^joG~-0$2#}vwdQ;BPsyq|zS1AeW%##y*Kx4->!5admccusMLQGxcMx!s zhx7w=zbvSi!mZVMOz|^eOvNNCJPn9Chh%L<#)wPDfWpL-cv|d?5cxnL&WIV`*qYCO z4J_^;2Vk8hY-6NUi?rr4l>{{U-OHj=B48#iawf*tJb2S851vgF5EvmKx3Bl#&h{wi z)+l)EPX0LQ6HYKtXA2QVr?eCt*C`kcL&|k|Zura&$2$VoaqNMkRrYYuTta8P*tMcG zx2bvH;Qnr9(G7!IS;<3JQ$-`1g6rk(Y+?Uf&;-Ci|V z*0sPYLh67*N0}}@+P5?hWm%8u<4VJs)Lh5>@H;~Q61z^uW4yp#U))vV++Z*3QGYG^ z)EkB31`{tJHb5#!QrWLUM?bS)0oL*0f}; zxd|@$3pcgIvd$EKLnlbi`=oL4`mwje;6Q1QFKT9q1i3)e}b;E6Q@pW61fnLO&WG;E} z)|tYa`^?Vd$-lIrWaKBXmTYY)NE7#h69UIxvYX?Q3U@efzmxV$wFb5W&`O3o%#Tpp z*sbxP0ec-t{#!<$jYh%bqL1w5*rYbIj-dB28hIgCji9@u>3 z&2W4zm4pr)wy32pp z3l6O;J+hkY>G_Mb4h6wokjp^Pcp5N2r9GjmTfNmmB<@>0^)~Tln z(xI24r~lRo)WtWwRIR(D=X**(rp52Pp!fZE7^a+pmV5A;?5)x2RkZhoAZds=p)Eed zEO_Elpo_@FA-;^I>?c+!*ttECTf*;=mE$lg9sqmpvpx+J(Le$f@vu70-aTt&8E_kn z{4p|cG>Zp14j5h(G-5lUCklaQKN$9O|&3pH25&YZ+2(H%HK>*=-kFVIk&TS3A? zKv$BFmh0SPZCiFiP?l8j_DWk6RvWSV_St8GO+Z1DA=MNE_>bRmY5l)tz3$!&pQKX&R8)uB;k=**=0lhw{=*hMl?tC^^w&Qg zREPa+&7G=kZ5HFMQ)sSBLE7;qIz9TTf=p`q3#rv2r`#q*LAYU^cU6`LkshtC|=dB zU}aYS8`CGDe$3FBw|;ARXo^=CyWI^9h~TfxCl=hc$ZMap3Ibqht0R$ObkOsXZokZ1 z8G1W>baKKuYvrt(;ko*2@yjqU;&ph*{HStD{hqGWK?<5Eg;5_(_uLf+k>MR*5+gz2%^otf`vsY?jAw1%cuB_xgpk*20f1QnwgH*{U< z9Spo#S@0&8b`ha%&TPQ^xO6r4gk+#xAT18nA0r+@1%<RtuyB5$k>8qlH7NjJs;x&Ot~R-tVhH+7qe`|JEl^vbvoz4P;re6NLmXib<4O8t4@ zfP0P*+ql6Bb75^*l&>8<26LX9;t2;^dGIuMDMtJ4=8#X@R#|)}#WfJi_LPj*0lilk zHRS10)ojI09kdKil03I6X|>qi6)7d*>}wPi;v|s4lVba$sjQ`-L2FIkNH@_d^o6P# z{9To5s`B8FkZMaYOO|)m)u}C>K1F>ITXrrg1isqgC|Bu)bLCMq77t#am~I4PRr!6_2o4hM7W%>f&^4W2{?ZG*JpJM$>-n3M7>G|O`?%6MTZ5ek;@Q4{ ztSHe@zlyu%GO+a^+G%pM-tV&CF`BBSpDu0d4*?#ReYZatVD&do2^Nz=?a8U#Kx@~f z|3*OtYp5q~vomY3MJXq2jyl0f)v0_gZZXLdlM@|(tT;hn`_ zy{SrJG7pCGO9u((yDZ-iWtWk;z|x*&h|{SP)W;S=rpgw5VOVrz`P-tM1{e>1T< zZ_VBAPR#YoQaO8wp>NTAn{$p?jx)C3$uY%~eEsRoR%2@C8~3^=pUkoCU-x9f8cpPn z+xbXxu8cGDIm5v$>2_SUmy*_xV$j2C)6dzkb^;5zaTEchuuxsgD7f>GIT2OGpHJOg z*$3`HNXTI|ym@>SDb)UL8yD}WS5uRPpUsG42dJ7JaTP@*xe$z>qBu7(C*)5KS+N78 zv()r`?485c<4BkBCCZie2M)-G*roJN7I`hQTW?F!&M-7|$(_g~?E}yDoko1u2)DCK z$l_gOMWuLp11FKD_e(wT)~gcB;;eXixdCwsO(w!zCUfM=stkPr+=&$EM}r!Gs;tbv zsV|M;Do5?EljIu#lb$cCk@929)!tP@As1?a5GOE7-opzz3P_I66-nMH0v*k| zoVM7e7ck92=isfP?b%r2GNGVPf_PHO+}8&*w)q;cEO$T>P86*vRUj(pP*$6e!GsDPXii2i=TOkfJPK;68?hl zImth(jgWyPLX6W!j}5k_7HBMFEzlb}f%Jy01jp6s5&I>_s8dHLTY;}*l zjXE$UZ>3wUOi2*hD*}u8sBH|tym@c!Y~*>)4zZF1ay&U!KfM~>$Mmh%cZOT2g#%2a zuJ*ncdKcz+%pDO@XVpijG(vtc+a;D;H#K%Nz_qWWVZKm7p$ETnxqDEIrYGO#higC2 z%ZXUneW>1*HcE@<`i2V5V*~u(>R$@T2m;moPMg7blWVgLk1Wh!Q_XIH0(Q+;cC_lf z4-)dV_djP|(^;&8^T)y#_rTIDG>tiu&>I}IS2ydMWO}+Xi#y1UVL$hiS0jg=TdA_| zX^nj5{Pl?z+Tago%KvqUAtow$-Kg6yY+LM8^Y>uCyPTNurG*@%)y~3XUsZt0WFKe1mpH^yDj7 z?GmA!)VIdvsy5#G)v$Qq$A&;tFSd5dQYp;=Mo)U+`NevNAt74+22o)rXTR#_GCf6~ zDjwqb7G5~{MEq*Mm-%nq`8jU_ZuF9Vgz1W3#J-mzoJ!oo3V#zo{4J%ZiV%>=%gkUA z?pxHg7%dMvL*KlLlMag3*L~}yd&0HT&)iZK>qG3enW^)UY9gD^eZcVm&i75ZLAUb~ z?Jpm328e=rZQQ=o@LqrLKNqek03vH&6*yJ$9kcR{cM(v03K%{f&-WA7ktqwlV14g} z3*cAr`mXb70z7ALbWe40A8zyBHWl@Nv@~kWHXtxy0*R zzO7kxgI8m1VfVp14&{DVssc89_gK5ZBl)&|<*!Gwp#=Z`>ydy(_@_VjQonaS{`pm4 ziEn*xF#OBMJ=+%@`#ppXFB1RtkL-c(-3I^q!oR-Y-wqP|&bacg75v+@2;{4OjkLc) z^lt~v|JsB9Z@RR95160+N-}>Xng4Yp{a2FtAKfgX6~a^heKUO=U;+8zy@O#H$_lpM zCHVNAUG>YjO^w(805t#ig;xKto!1zjG~lj&YhC<mhJB!>G`t+ zD)Y@B0mUu<{R{s6U;W9)Jax|hkx=u8-@UHvuuXr!lRpHQzkA(H%Zf7EPJovG_fz`6 zdmUK7TYoK}^8eurNDS(;aZ`8g2>8Rc`+wdUqLoqb<-MEZ|ENFtUHEM5V-@dN%VSSxyXwvb&GS%;b^RH5~AuIgd zbNRos)O2Q5--Y4r1C>SPwBN0KGz&lbY+p^e#f5Wvw@wVLCpu%3o!E>j@W2zi z8=!t9*s?m@4YM|`0%%T2<2nhN?K^);{;fZQEf)5Ao4?=_O46PGFmDBcM9_YO8W)@v zc}kFXKMjGD;q%F5%9J^u%{djHcLIX-;~o0XgoB&w^)39dhTnpQl1_dkB9#3;+8* zS=i%k+8z<90(jRr{3A4)FNv_R5^d+?qKW46cFq%yK;QJPbMwrtBUEwb#P>&& zFNjcee$h@Tu&!-yI^`vyLIKe?z_*Ey)fP31jkvr<8w#M7+&%OJOagDdi~J)0L*kNU zv}fM2?}W^q(I*$$eBf-t_)+kMLNDRuEa0h(+shkko|;cSkvu=L8_5O7CMsMcZi-n> zAN&)zI#o>dvmyv3sU7Mc0(|B9AdUU`1}CECN77TzYYU$Pqu1^60Vf8H{`A`lcx{42 zkRR;6t)rC$7Sj`_Aa!=N?&EuNaFS;qaAo}EPc#jkg8bXSx-rgdtB`wn0RlOpK@k&q zy+*ukc!+mc#Jzy|;ZL+K6Oj)DcsV0mU_cbB1ircqQ}D6*x_5;l2x7sXfV=CT+9OS8 zz;(;My5^Cdf|KH4)e~6!Mu*^ZaGNMqQE&mdxC#c+y*reLth&N=Ii+dq*^B%<~L@peJVjif)( z5#7|6x&z)VQPBM zyn}$D(oToz&;PbGDH`HM1x6@KiSMn9zu#`{OVxBVI{-U*HQsqp_|rOaW9NPRdcaBj z|6_Rfi;7Dfo}7OTrmJh~%NWPw(pf=tt;hFtL&aSWv$1~*hf5hTy??5HG@XgeIXyWP zC!xTa8;CQ5O&pDLT%Wh@uueMQkThOCY-R0O6}Afk@qGAC>5ed(s55&9>%7?~@9b8- z_HwU`d0uo++Cb;qic`9f_*+M=)0)?1juddn;QfYwG6_ZI ztmcV@hcUP;I2SHy7TWhQE?OSzGt^Ek*X?6d@R+(VrbYNd2I;sdoRkLa(tPJ{yjpyQ zSDsy&CU%tYLA12~De08U@s@u=SH3$9PG~7_QEmON-~U@u_+n1$GKR}(6$_t>Ja8zp z1R0BWgmcC!I*xm+ccm;#6WSOpn1OkYYZSb+W+J_{X7UwbEtJby&ZEltl%iRb37>EC z9V(8p`e9o3(chXX-^E@x`BTXw_vB~Avt{CsyUtb+e2LjKZ~jKiI@3p@G@MwM?m}I$ zhO^^am8;h8*Qi4vf`XB9RsTq*<#M?p^2?O!PvJ;KoRqQesk10aJKv_U;ZWezV$<#= z7!fElLhM>nz2ueF738T9H1c2~{dRlhC!xG7f9z=;{79dzj|raOLGCB3wU8RY<%r?9 zij}a*%s>bKc;N5npmOkIgS*GF%%2M7)K6z3g_?||G=x8TH$x*)1QCeA!f6%9Fd)Im zLj%?Fz*IE=d_Gb$)u04sXR+#xacn|%n2&ikzgA4X0jl|GH`zhXdca2_YIn0oX#;BO z?Z=Z@@O9NaBhm69Q~43@FI15pTeIY~?;o7F?hy@UzECL-ZKL4Ep%yW!VUZqmCiUQ7)h0$m#X%Zfls>F zY;L1+p53mt_M(Msg+R$g4hukeC|>agvs z{M-1wK81|(ydeBL1|`tKq@78sEB-o-SyDi z8TgC{tJKfsf1coV04XohV9W2VMu!j(pD0rTd*Crt5o*deA~cp_18t5|L01PW3)_`? zXb3Z&`u|964=9I)<*s-#LN-65gKd(tWcF;-p|X;l@LiQzWOU>F>$VYK((<#~^&jip zRJ>gQ9NDZY1df9VM~jZd)v8c1{q1o0*n&hL5f)VQ?Ybx_kUJJ@2D^ovefr=jttmMT zzIZU{uIqvhxznsvH$^{Dc6EI0rN7FJ`lW4oD(mZ8lO9Jt5kDI;D{Sg9Oa_Ob%2u+t z3-IGrA;~N)>n`2?R&S5S1(j;g$?H6scxyM@?{>{?y`NL>K8JJq-IN{Hfw2so2^u2r zn*9KHsXl)o5Zaqmj%{3n4wgdWIYJPANSVBVjH(-~M(jH0vj%7Q+r zIo2XER_bm#5LrU&l2I%tXSPS6!MwB(eF4fh3PR_)KXHK zUf{0~U!D2}Wu$Y=%{ejnO7nfriA3(ROUG^Og2$hCxjl*S(QEd%s{&g*&u00_QA9sd z`pHjN!uRiFsfUoc;W9~0Bmi(fh&LuEdgFGhUQ`u0>iy}Fq<#4c3Dl!IOJ6k07>-<8 zw2r!S^|a?c>gEU!a<%^2mu~OH8lHVv?(7pqKU8<85EqAQKOF$kdSA`6p$SOzy7)Py z2V&LP8N}J9sZu2XU>(>UH%nQnebT8a;9;bmtQroXj(vV@)P+&ig4wp9ow8cXRr~z_ z0ADyrMTX3f&Ft0|v7sp*o~CsQURGTLqLAovj`>(Md49<$~@o7sl-Js~QV)fblzjO_g41`PJ0J zJ%P88B{Yfk1CU=sG@c3(jHRmMJQcs?B7ecLW5_T%+n{#kb9A@urD3MpK%Q?nTNMTP`%tz^|)5q zk$HM^1RsQY50pu|$fv{y6rPh|%B9CU*oPvAokJi6fA(#U)0>1L5P<*};07>codis$?j+d?NuXnyx zhk9S$EL{g!EesXVw?y#C-e0m+&Rg#nwbV-rh1$7bY__|5IzJ|)j;p^1uRY~TO^l!% zp+fF%W+0*NDh-QY!Py6cFdQ4dv?WL>UZ$y6NZBnV?Jk+*87!4`bkol?Sm2fjdMy>0 zg)6P3d+D?YjkcXW%(mYJNrZN|2`jCIcIzzzpAF}ik@F)_C-mvsqa@!PK|Sxa(7d2>SHP%^o)KlNxwX&Ow@PG8m^_If*M0k16!0FyD_}NZz?f|K zPTP=1`%%amaP+>xJAJ50Xl27`GH|IiX}(FQ%|VD=j19b_eD|@fkoKg%Z^o~=rG&m@ zCU~|GOY)#cDN%ZRSch`eF-PLde$>ptrQrG#f6JnIM9D>vVcxEu9{SDfKumbWluDeJ z(#0@v?6KdLx8+VmOR@}@>e8OHtJww$G^tAjEZ=GB4D z_Hcw$i%yHGpRE$l_oC};Dsu@K3X%9Gl%3*5e!$PvsM|nc@#BneanD4>0F=XK81>AI z_j?ROUUSH|*+OlhtrH{O|EaIr?jS^#Zm|Rhw^#;-qdIly_5KH6%4Vt8UE8<(BDA+} zR&&shQ1Hitoqt}J-$WDIL>g2r>DuScEM?|#FCpzoB6SAb)?Zq|LH5348GbRP+jc18 z?FeFS(_q$6P=4Cs{eAH9BGNC9Gw6D2$ktz9ExmEgOtslBpoaM2WN95IUv|lEa$q`pYM;OqbHBOO-}WQW0yVt+2tj%& z?IA^*8sST%_19?({RMi~+?_I~Uqb{SzGbm|4<#ML7})GFsh#zQ%S{IKmv*sr9X3#N z`)bdu@RRk*lX0`TVncCWIY|gyfx>C3e}lSPu_QI>i>5z|jr9y4{;gCc1}Lr*yvPf7 z0jo&?taKJDW+}a41yMe|ECT5_t9;3F*162oo$d8|&S@jjt~P*n_N(*_4`*Z2iqDC& zHR1wYeFflJaN9uFbmG2F+lS3A8A4@k@MZCx4)~Li-qw)njupFcEkynNr$zs5>R7*} zSFJ%G3}K1Kt4AKT0w9^;qN>K&|H7_fAv8;M;a(K11O0vlMofdp0b2;IS35(IKZla;Co@Ki<@yY3-Uh?le~fIRW~lU%O$W87AAdw_R?a z`r?Vvfv$`Mh~MVex|lO}qdc66C#fHKP-fvqJy+XvcX0`S*#Jv?kpnXB=VM|y!-HL& zm`5f_$gZcmPv~EgekX;j=i!a??vuA0C&A)och1(&vH*>&_BQ}%F<1@d)j@nEF}&An zRr?1K2t;F#z>hB;G^r|mJwP&YCWc77?Z-1(0CxA)#X8HKwAajLjTnikyb6DRScecc zKV#5&ug;rfO1!X>fP-CW_gAQUOO)I>N$E_2p;jB{O~L96(u!dB%59|m<`_DAfZwC{ zJrts)Z_9aFt(6E>2#_2d?LUq+Sp@F07fvN>!N0f#ZB+PfIIDVsGe)wmXVK!0mevL^ z*d%Uv4t+Nxm<~#a3Fdn69kUfsDef>BX0W??rQSVsX~_1O7dK4hs{Xmhe0glNU#P%X zOB4945I09e*E^-nHdF5+Fsk)9#Ab6cHCm@-i3aOayHo`rj;Ea~Hvt}v zy?^pBU9V!2Nh?>UjeKphR#B&KF7wgyYNw90kW3E=g9R!22YG8t%G5)B!Tt+j9 zZ0u9Ru(I*HytPQsE02^?+;t=oA49ug$+3_5=WRD%l)mHUbD4FBD{X?F?a%BR)3aI{J z6vHgot>Lpc)wibC)y+>*l7Bp#(CCYU8;aaKruMp+{VGGigL>l#Dvstsaprk7!!K{s zPUgj4t@=$9j?M5IYFQ-dZ&PgDbk^RddC5bS5>+qtt-o)ir?R-OlZ|l)C4_BG}%v{n&yCq z-MLO|-_GpG-7{93l#esB9BB9c$a?4m?%N1b9#$EyN(#!h)$LbC9d05*-AAkC%T1+V zYD`A5qMw4Fg6b@@Rpa2R`-5YX7_ACFg)iH|DgU-yM?}5ZL@0?{-U=Lt>;3huVfdJC z`Hl{fyX#AG5Xl7N203%f0C$g4O*_%MP;K3AwUn{t_0m_NC$4H=9=m7^0=NFMtsfB1 zX(j3pvsE)ZP^PY%qxN=&^q2rlD&mqdyiyh3&?&16I*YzIW(U^?_xm6A|$XNOy~&?~m?bbsK>AC6fe z6u$Un2=iwGj*`)DuW3)vv`{*AE4{ELNL=fK{0%=0kPIVQ{S=wG&7|}qrd}Hoan>j&BoMCwran%@o!K;pZv z3hWlS+uZjWCqhN3yKt;%zQltS;Jyutf3k+9j1Z(hIjGE4`o4Ty_N2a3W{A1p3^|C0 z=CvFq{fNxYg{xqS?duS+ur1Xsi z+?Lp>GVewUWmru1`rO*3bWYngdbLFuwnkE&9S7&#S`+BXFRHY;9@|r`=|a#%c62Rk zEv4$IcsGK}c(fd$S}P^=l|~DY{U*V+E(jaVvr6LyW8JW(yK&$o^L;miTTvI>_pY&D zPGSme46u`+{c!fTcOovW#(Tg%zO`1a0+Sfa-{cope?jV3g{kMgO8Ctu`}TkjPS}Eq zJ2$2I9#gLCo{5Ic9%vd=x)5HY#k)$SFX6_wcDy`nVgE3-fzF-6mOpR$g>Z8Q;;Z+$ zQm^Pz7*XiHdU{>P~nO;jxkziQ_CIdlI|Q~ z_iwX@8A3_;c74X9=P*acXVeZe?Gl@+Ss&Xx2`sQ?S|58wDU5#K%eer(9{j8R81(Q zT@M|oF&HXB1z^OvVp)-YIEjB;hJ|$Bi`4ec=Q6mfa80$Lwrz~`6^^nGw-LJyU#%*q z*`_4K=5-+m<{{PU?5N0Qgbm>nyDfa3Ro?CHZPzYRFU<(qio9+33$cQhF<>a`KlIr< ztK+O3&R#voQEyIN;P8E#N{pdmDXe+AtCn#Zt4DvfIE0@>`uOr@glOFBVct=uZo>(6T`&I1ZYmmNB1nG0lU{VSSs=- zYYVa5cut!LT6|VH92gW_*InL{N5kD?&~38ToV1U6*|Up(5Zv}!A4{w?-F97UqLWe* z^c34+3iC&rlGKGMO_?gN)r>^#_E7?9wL8v$?ZYiYVtY)rg8imabW&`=`U?UmWxgy% zdqfrORDl_qg|}Twj}AMhL(m{Km^04`K}KOlRhk*1xHCp`DBe z5!w|9*n})t@sXBDUnioKx+_O99c}oOIfAv?@Y#qoU{ef%xQ5rea6B$dj8Ku~aJ7r!E{F&FQCr$M0bfzU_(c@;^oaWF$#crHsekZ4_$)IjvHbSHor zfi*;n)%qq$#la^!RG7)AWKS#|f!L9%?3RZ|3qv!%7)W!H%RMurNn4m2lwe5REkxx@ zZSVhT=3Nc*RcXSI7iVTQI+sWRM2K(kjt5_a77!lA3WU~f@GPA(uUE-(bLmxps*=zT zTk%zs@zGh4nLPNgO8h1kMMz+1+G4DO=~|j#Fvzx`wt4or^etT<1~H09G%O8f;#sb{ z4%Bcrip}>2LY;tdiVTjCOa++3d(|EL6k6wvO&K43`@+5<463f6Oa8Ts1z*)PBMo}G z63}T4Td8(gz?%S?9ccBm&YZqn>7xZ>WRTVZY5@GWoWKrWY8*S<9d@_JJF8#(K#5yM z!`z#r0Nq~F3p%l>Q2c6FzMIzc?wIS>HLr)hk1f4!2XF4`D7i=3{Z{XUe-*A>I;%j> z(l1N3*;{&Xz?#30|D1JiD)e(Lea~_5l$37E(eYMln;>m2fGF*ohD)8DCfEet47Y*X zTW^W5-Xg~%y9s**PQQ52JX#9pP}^9Q*WKJV7JoT7K2*=5=l&z7OLtI3q}=c_Z;8E$ zXYOvk!P3f>=cguX}I}UhFu}wd>NZ^aZhy z&yK1PT+a+#e`{jk*oUt&g#={|)^Ug<;2Nkhq$e@7stE0Y6Z;SfxT^9BQju$>zc7S) z0*pcawTVx~o`&e+govVBA@oNX*xRzm@wVXlk%z)xVdsN1TsLD;#1d$Bl@z|9Q%H6X ziG@6;SZ!AnE>`z}$?i6|>gd*O_sbHs^SBky5E zt%ZKF7pW7wLZq)Z1pgR1l+FE?hZ%~x;8fPg8(Glm1M%UMrV`N4ihoEngt)*nfb%EN zI<4&B7c~Q8f0Me*Z5N9LuK-hJO9^0SqIYw@d;S%*MZHtMAsU>{+?Fg7uxx8Ymxj?u z5*z%QjXbk^{|kpoyO3j0+QQ#?arTQ#0cND^ZvDOzKIcZ)0%)DUv;@VOB77ro+w2;c z#9*pnNNi(S_rysIZ!If?i#e!CNFst(U}$Ng#p!wEnxN$GT>;iWW!S= z+@p{TM!%%ZX-xZXf@H@@-M16i*&gvNl!Z`SNix2Ub9%fnxvg=Hh>nUhgxiD|R_#Cr5 z-BkJ(m2jG>82?ZaWUi1*dxH+AaeA4d0kGQZlS7*tYdcF)EZe=J3tqK1Xd@~}$Ar{# zZKRN>wPi^|Y-)kV!}JU(Lh|-IC@yLoutc80YX*u-n%{yDn01yb33!XqG2HdmN0JWJ zYL;{j<;i{P3EjyJa2}0olB$9IY2dhjmDIniLaPS$8u*BaCt zYzUJSf+yL{6xGWUcoGqvj*GKC8@&2=2}5oQ6?xZ6Xw<~kc0r?u>gDc{Ymz|d96z_6 zJbx5%*SoWHM<;EtyH>NEn!(Aa{b&*hL~LO(C^T*-&BoAaS3yKhq_H>s>9cSM= zo8cYWS*vS!o#ibMsc3*8uUBm&B%81UKCy}hM{5;+BM$4$jTp&PmS-%U=7W?y@j%qL zy3P5jI%FLA@5K(C7}9>ZTdbD$Mzk7b)UrRBP0CuSZ?z9pa6pF~v+TdHIDIa&`ctYG ziYWFKFS!%uvXKktSxuhhSyMT&crqAo5{fN_mx+<_f;-xq*PVi2MxO;2pw+*6^oGrf zdB~IUw7<+jm78{<=xJ@C$%Fa`BfBJM|6-^BWKlKmcex5@xHR>y&cdDs%TBH&bKyy z1yBRzS|T2(Vb>Ndnn*(REsDLV98Fig#DR!zQ2JXP*SmUjmUk3~`q!fexWmiv`+lG~ zEu{h8DGX=X1xS;{m^m7c-haoW*@SPnpy81N4?LWlcq$%tsf>;-)C9i-zhx1b{0uXb0*w>6hoDEC8&{5X`l2Tmzg@6%jF&y zb1hPs?St9@8U?njNbPoHMU6Fl;$N#p(6wRbjHYykQltBlGR3qcI>F+VY56%+Q zZ1*TVAD}5ni1+$ALY)97n1E(fzT3*$zITQlBnXP0?fZA)_w~Y7<}5m>Y5sNb-3p^4 zT4r_SqEe+`;IVoX$>mMUb=n;_HM(R9agA4wBA_+~4n=MY_DoG{cmTNjL9l&8azM+b zUH!wOWB*nkQhYl!+#(4}T{9zfBm?-twNRcDpNM>n^aH{o?cnw0i4_Op43H`JWWNgD zM~S~ug=-pF@;u@7Df`PDu4nj_fa_oi#H3$+#E*EB_6xWZ*FERDihSZc*<(RQg^`_n zt6sjtxgoU+UB6yO;)M2q zoqV?3(@Megu3BB9FeGA6%P}LDIo~y17mNupEpvD{A_Ru z=2L>Rf{Fcl^s@T;tR`7Rd2<-di|Ka@0+xj6+1$o>%R^`eM3;|ycNFWw#2t& z%vKHOa_p5@iw>)lz*8NAVy9-_3>yRXA*1u{?@BjXjYbdI&|Bi5Oo8(@^?RSIDf)93T`XE{JHw zKZt%C5VM31S9XO@zjbq1+x{tdz0YBPa1lyUeW-p)FMfMqR2as+&p( zH{$^Z<} zp=-D6+F_hoy~AYgLM?9cj*KRf`t-8n_9}Vv&%F)WfKU>J6#6(wXN1d5C-l`vORt}JtX2b zE<#hG7FKgxD?`?;O}i3`s~oRJ`uCpK>j!>dIJB1rpc|1#+eKQ+y+z)@fT%C!5>T0+ z1RWst-7TX-FdciC0YMZ3pFYYRT$A;hC`6e+q#(YZd8(w#&1EH;&VYIx+g9N{K)Gc}^I& z-H6DTe{1^eH6eDJs%hh3lD35S0diqZ&9ypV#OL&@!G3T>EHU8f-%Gr3_lDky8an;l z+F_vH+Hor2xwBvdS+=UV9!zF|D5YW!NC@;?gGrJHk~KF1%`jja_G`;x*_f-pQv@@OPK5J*HsCi2q2kx2%)604UQ}#UMd?jNKuAJ| z(1R!-y$2yc=q>aXT9Ugqp7XuuocG-O%J&<;F>X2g4`sl}&R%=1HP@WaeC9JrRd1Q3 zh((!#gs(y~CD8hK__qALNMg3$!nXv?S6yk(x(>khEvyfVzjGcgMZ|EsW&$YDKS5r~ zfVo{zs{Hhfa)3|qMCN8Ld6lMdp?ag+HTZXkz58mvo124LeT^&RG&woa2(2>W)5j^8 zZ~hsA4mMY3;NMlmw=}J{*Uxt$P+#C-bJRkajdROPBrT_kW!~0EOBi*@402>l6zg~70jq|)CZ`av)0~u-deUKb)4b9p z*<4La0Bv&YSj^&uG5gZn_tlGPzKj|nIc$^V#LUE0|6_gVp@;Dl39*MTz0iTcx0m

4Cz*lZqrB;n?Bx_Pt#F=RvYocc0WyF3zo;yPnEQs-eeMkH1>NP){89A#dV%dC)^KRpaP2BvhbeK;6N=p0L{E zDztKatJI>!^pIN6^}y`@*Vn^WR=X9xg2e6F3P_H&8^KoHthxW9#n*9hvZ@%K*qSJw z!nog!yt|K|Bopjdqd2EmI=9=DJEM4`coZI*1Neql&MI=@9z~2wmw5{XHm86L+^}w{ z&pwz{A_y-gEWbWi+HesvH~r`xR3OE=yfEMFo9(sI`oj0ySIz{N%G$sis9x|3NWkr@ z7>(qseX$7Xf7zo+@oHkiXIoOcue(mWRE|0MUWeA`!@^`<^Y-$&ULJ*SQCA}5iE*f4aw!fT-Q}L!b$z54Od>!5ba|X zh@$(pHj9N5%9mUjXf94~X4o%%z{Wb)OG0T(O)t>l%zTx;x*4<_mu<{(n{(jlSb|ZX z`E#PTT7b$(a=v2s-HXDNCG2*^hp`VqL#`h^QIsN>;8SJ@RM%jyTju^_HKu*?XZ@HH zLI2U&o&z#9_?4@Z{Fu<0YT$eT(DLqU;eM1(s47@__-g#at-~^}OZ8Yyd>y+*kBEji z*EM|Y_Bcm)u|soZb49~37LTbX1MO4+;n!z1P71s5mQDnWJ)et2Z^Vy1_d?KDHx3rc zmRc9M^NT(C%J)^PTU|U&6muytt@m39;bj*vT*^|;;x+-k00_5TrQ5BS39{m&TA>ag zHenIGVPC55eM~}9UR-yRmpnFEHb(`6rQDXdpR@K~L1BhH*Mk=~XO7^jpUMnToQ+j# zKE<3%+jZyw21CR1s%NyOYfSjzkYjw|AvXHqT=8{AUd__YGE*Tz9R|V1+(bfM($xFa zin_8xFw{N^pSd`y2zgAZ&ufK4Pl7e=EreKl8J#Dg%vZd1|3(PSbhn=t>{`?BHV$B& z{HuLkipTRd_4^lBrSk4B41`>1SI-;AZFI2-(5zm3=W$+#E@8i1Y|*SehY(0L8EYs21BH)YNs~ zFDc$PV~>t=OX}++E=pP_>GRG$$k^09i{bWu9KE2I?d?A2c2|OC;MB)ICv_F@KqGM8 z15n%q9=BW>wmlGM^VQ`CzsU=3esZ-ZbiM^{0{G&yb0r_}XbHXYc+EGdtU%GyHjeCZ z9+v^L(1Eqd>b7VSzz-eP8QQ#|nj?~= zG+t!s8!rGk-ZAy--lmg$iE}e__uMqx^J@6Hmw&YSOe$^eY}r5+IAx_CdRAOJbpPd- zqsC}>(Bu3Ym6ss6ONoZ{5YBxA?L@uNd+V~`XH!xRC(VAbQ%Oax{|S7?TcgQ$<+gTQab z=?a?m5jtHP>u!)g`d-?IR^$5=YNq^Akz>}V`i7@m9~;ry9xc?LyF84X;E?hW*I={1-R(q;0AFg&=p}napf4M`+p)kMDP?o;$+O_w7fD zzb>#U`y;EbzGSq|jW+yQ0OCW#Ch66X^TU)2+eji*id-0FMwzzEID!PU3BXxR_J=Ha zlh((1c>v!up7ANRT6A;?MLutFmeyyXik^42d~?fZoRDaCCD!`^HoIiU2hdj@3GE5%VL1!5NdA;5jt}<>80I~jF?+Z0B6yy1a(u0=z=wo)ltRSxGXKYqk*7A%~D>Yeid_7b2{Fe4hE%u&e z4c-lYLz4kBa(w}Wm$^Qn(0%7pGzZoDWd62d@UZz;mg2PRNwa4yq@1jDQ*vlPT9)%K zr^9kOJfr7;(TTHJo?j0O3k>#%!g>Xh@ErJV8}(-rFBrb`Uy+{%nBk2EPMklY2z%$E>uciR@O}B^cy{j;tpyt9Uad5z$cemR?x`KF1{~E(~0gpiw zv`+v@<%P+k+;!?~adB%^+&zC^DX_^|=tyOR`Q`|D$1}`ZIm)F-(CGw1+*tu6!)`I{`sEx|MH#|fq&L_!1u)2i`va8C0G!@ew{C z#)00U-m_J>J+a{r zHf-q^G@FnmHgom+H2YVB_@(;xyasi9X4`ATfi)@ND$(0iXr-~GW!hWH(_rD9X?b3E zO+C=Rt%BNYjE1cML<}sd=D%2j`u&L!unCAWQ8*T38FC;y0|Zymu10EDd?vd5fa?k0 ztzkB{eDeMg6KtkY1BWN5brYf(J<596h-_Rilrdw2Ca%UuKM6eI6TF0@@6qkruN>LT zG@j0qcUXQN#c+CTznt+VK8G4+iv{&{!@bpuB4hQu=+gDgmpJ^Az&VwB4&)-JS|Euf zFFyT0k}p%Brn@H29-k&o48e5HP5S_d2K-TWLiAbUDzNh&g z6&E&xtttKLeS}s(hvdk|?|;6+W{4vcCCF2mOC!Pj^oLKrmoot>9m<}|h;})PV2+zC&b=-#?abq9_V2m(Oe8`iMWn!58LGPPh^lTVf}4B^er@J2xM^Y; z%&3Q@XufPhDjNv{7J-KC9tzJNf@HqI@C6s8DI#6dz2SX}R%93YhzHMR$#{Zio3k(< z=#6)MPeA=4RP>Rp;1=hGn7EnLW(S@jZ=coN#ALjc;dGKeoNxxl+?DRN+7m@|n*ckN zXli~eJLZ=v?WTpHgeAB@CE>N-3;rQ0=x}-G3#pCnpX^pF?yBoTo@sokqduNLk?aA0 zEJ>)#PZeMwj|^>5@o0O2{LrA-4;#M9>hjJRp=DXxA$11Pxl8!nSy z6YdSXEZ^;V!apXA&(fyB&kGPZ1#^2%@YDHxj&}YphrN&oIc*L1BtlfEF-PP2)F}v% z*yCcf+IyOx0~PEIO(NgPdC@OZYjdZi8;;zPbegzdd=Fb_b3`bF5a^hQystFeBet8q(C0A{8kAZf3ek;NmsE^N9DJQJA#aGN|_mdu1 z#k=;E=oGVVuh4ym!3upf@SVlAx3xi3yJ_Y}wPy|AwDHU2QuUvT37WsY)&6DI`To&h z_($@?gg$Iq$gSk-=%YIcd$Kp zVc_~N^%*6U>1?JwC76Z z$^~d4^^?mz*LSMT0tx>Z{7Lu+JpJC<8PQbzjv;HNT@vb^=JxYVovu}9s{g$G+2o*(=w_LQc96+C>w z-Dp0ZpyJ(F8AzXM^`J9zfvhen<^c5cT>Rkag?_EH|L47-$N55HZF{m=B?pZC1%JCw2lR;TeP zR@pFStBxZN6d4W)OIln7GGr$^?HQv-a@cdX!wS{T1~tsBzG7(0u97AHOP?`;Sa|NW?!n_ptdxjepaZ z;ooe{KaC37Y~dnW|1>JtRlzUtH%)PVi_QPAZvF|h{s1`r;l2D5X#Ept?T5W(*8b_{ zEs~r26W59!^qJ$xOEtZ3H4~#ZNyMBBkIquv_;Ki=V}&1m*243{{n);K55Y(F1JsQB z6JE;c1~p--&}2{;x}KP!#SqDtqIv65>4H z^iuGS*(uC>cCoZC5BUE0sh>Zuv}pOEV6wh6xR-z! zlfK;pfU&~-UX$1!^PWEEPkW`iGIHo{oL_ltQETGi# z@PN4Nb7=JuCPg!y!5Ri8Tj+r&Y&aV3Z?OB*wjCanUtl^GVP!U}& zTfna=$CEHSQn}lN1n!R8XU(SNBXwlt@q`k7l3vO-`lz1SDw+en&BPaOk z%fL?S4={!OwPMHp#4ck_%HA2(*f$rX@zj5>;bEII zyQa6rRl)QE`hC=v%IjA0ZgFz2qsgTJFb9**CqzCEpRQ`P+UeUFH0^iWoIwSmz-{v) zs#%zPFApC8KewpI`&zdjK zfC()=ElNG*_C0dQICp0j!il<07~GA8;VHN&tnX_m8F}S6*sg7N2jeuXcWC6|pHcxO z{cB>E_d=GS_yrqTTjnBI(w|~0uV(jX?9A+m?xTlP*If(_LBWd?jT8wLa32iyj_@-_ z!~E=>4wDBGgrBKk*aQBXVD;IurTYM_Q=5b1-z;{z&6sr{t@@tFd_Y4V)*`XBhU1Vv z0>;^Qyy;bE^$v~Y)j}wRo45P-XioyztVbsu|GQJ%GDFQQa-WI5=ID$v=i1Egdv_@G)#s+2 zE^5Q#mH|+E>Nr!S@z=SgJ*pdwx-~j z#X!jdU3kvd!)oR!E>Z2B=2ijnw^g!Gb5n(WhsQ26pRSo5-Wu(a8pl_!i(app9r$pz zO557keI`oVZCy)vE=Q73ZvoO83zFD%^D5>9#pi|7QGCJQbK=8`Fe&7y zW~+C;)JD6OWcSC#IipaCF^G9P(hM@A(fE8ZF_-B(KDQwV59Letab%IcL#Spu_8@+z zHtd_jhsUZD$PwU;U83_&)yry`=_AP5zjDl+mYU#+a(B;B@SU1Nx=jB#Y2)5(m*%!L z9Y=h|LeU?|!rDLAVu2^Gg!yI5VU09bqQ)eiyU`;=dCG<&lYv zB6Coi0CzHIQE)t_ z8_hi0@v*_DV@7+z!!nvkm^4jryl^)<0fAnx*6ziD9WfO4#1my@>2|B%n|H=l8#VJ; ztjm^Uzvxz%qk2R3L$_9@(lX%eIvx9)F+Lh^ikCgD+?``wUwCvL@NBiz?jw&kPEXaR zmblIdb;*tcVF2S$x|DcIgK+f~@hyCqDJy6_Fd~Rrg)8NuW7fNDZ}7u}mCj_a*MzXh zo6uwCYWbVR-)@m61l1mk_wJKHr5&1{gX0|03eOhoO8jX*=1pmcb?@{@zkP_FX=^h3 zLT_q_6z8Sp{;juS)pQ;=IF@|IH`vbO6TJJq2t)mmf%4U6EOfs4O_Qe0F3r>Z$~s{) z^sc>{9E)R&kaA+5e;^AmA1#fBEHo$!^p*?qj0)?60|e6M951K!EDnv%>usLK2B>h3 zt8vVyJH_glS zMKCh#3b#dx}uw_%gqm$$JwC_8Ql@Rw)7n$>) zxPVVT_37h%iEU#Tvx2)glN%n&DqPhVS0*0)#r90@Jd4=s^Ah~*zTRTe-PyRM@koj4 zSE+gvW4f3~@oFPqABWx`|3M!MeLV>++`hfdl7x?9GYx@nH}MkbT@jnC95eVW8Sh!% zOcqX_w8pccq#`G>+=C;Q#&gvp*#g67VeiX&ygxh+p**Xu8_RswBAO^Hj_F%_isguS zmWaz0zC^($xoEKv(Q_Zj=$vBHnFchrIdPc_h_T^Rdlwn>VVDJ#n$A3Mib-_~vn1i%h8u^Fo#qlqa!+;_o(YJh zoC2ioIBc1x>tZU;J=+u3^4R6tlfNA-Ridmmoj&U`S~8!-liJ|CA2>K7o>Mj<);`*a z;PE$=(qKB4=N-sdFy?;!5>}qtWUpEC~vUId9DKzGS6Ca?uvsbUnWYn;F zHq7)E@n2d4QMj->soanG#OL-_@7U~2jw9OG3;qfT+gsS59UJwlU_|lL0Ny3~6?RI- zaF+z1l=8r5ssj%u)d}j|YQ_U{h(#N2{yontt<8KhNvnijXW?Fz2s-%f-h~Sa+@8#R zddMg)jz#fe?^H3zsotDT3+=!Nglm@`;pro>jip6nVl7vNPkhwDia~GhoPcighZJs; zbzgG2)Yr#4WBc+LBf(DS9&dDo3_|ZN*eTnY(w0+kL_!-SyuPlSR4=t$#YC{_j_6HU zc+N{De0Fj;>k*xwvlWI<3*X^^==9LiuUYdb*8xZ1RX|pq{Ai{7nKTxg?@b{i*z+7c zp^L>BjRgO@W$AyA-QL`m-mP;97Kzi>Kj93NbJAErp0KsdKuKw|vbo zC;ryra=T(=LgwQ9SDKP8JB~KeXtqu;tZDSI0{|^L@2lmEh_~8FY}I!?S-r6m zPbDxI2;WMl){4Rur>DVW95%T^b9o-!-Hxwk+=+1|2nalLABh{^ajQg*IeiN zF_?G^WJ4`3%a&;%<-QTi#kbbVca@NA}7&+2VO+B5BKa zDuz!OsY^Kke9U%kZNYcFilO9seY!fufP+o>>B+EZbBsPZGh9v$=7+KDdbXEIcsYZp z<-n}b&p#c);+a(V2;mPm%t|D>VsD7a4O3Uel&M!5nV)@z&4O)pWc1ZWI$QM>B)!Ao zob|7GmSI{+FX}m}q?+9$SJ;~`lx+>(W|a>CK%q*m<9JgW<(Fp3O{)dW#$>sVSdU4` zZ%+LmrY?Xz#=Vn_R>}=ib!y~*y$B4Jo1VGq zG94ub_UED-hY?Xc!_Qi8icZXM z!0;0D$sBY(g7{1mGBlftoyst3Uz+1|B{0}JG$%0&>NSeMSvR^SvYBbJ-pO}on4)pd zbSR@7E2V+N^TZic_+TI)q35?yKB19ZGno8nsC!(8x331Lk8KmeKKqNE`npTS>Z;v< z-_;wI42=_Ta-z~Db>sV%@t47Qqhp@Z?NL`+E;2orvtJklXdXOulliPDQ(=Q?_vv5-0vg(C#v{$aS@686UkzXEAE=(FIcvSQ;XXd5}X=SRf zIq%lN3J)GFbwX>EHID^%I}<;}yPQhFTt4Ko)#si#@1r*%@EIIPL&7W;a{ z4mPw+j%P*(6Tu*ITcbk`oQ@AyW3jvt`>R-inZK%1OI18LcZZ*6mSW<4R;M3D^JK*F zqc0TEw#Pi?o&m*2!1nZ{)Ey%YDTK?IG-|$iCu7kalKQc3CDwPEr`Sz4&F-W3X6PL0 zJBVIIG;8$FrK=RvcD9owioH#*yp2cGcFbWzZHdNx#-R4l&!xppo{}ZlIH#^OA)wT! zK?PZHGUC1}1IA53U{%RIC7}j^(l{CN0J(U-kVctTV`6pIGr91QVb22?bz*%>wQUJd z>=iDO;L_^Sn$1ALrUPr_Fl&sk7A9!wYnWIZxA-aon!cEEy+4}8X6av>1hZ*%Peil5295PLka2UCx^cuOOlwdMsO!12Uut`f zHy?XgX5zzA=0eI>TK3ouI>iF?_=)Juh!^-N=Ps*~$(455$k+H+tBPp(NozGu*o)9q z9MX>Q^rOWT)ta8#^S_!q?e zC*pc*BP#OXH#L=kzGCYaCB#THXP+9f!fw9h2rAvys9UIQ0jt6Y5ZY5}4{OK#-}2s( z6YVS|u8P&tzc(WyqK&^sKS7sImedw1R5DshId5ssDuznD>D9YiR@IZWm0lwkTI=K6 z}0z5xvo_3tHN$9bpZO)MLf6e%?Ht8;Tum(ORY z6P#Zv`iOw_1P&e8lMs+e^_&5k1-~M6ZiFH8`&0C$qS!DnfKB*mHReFAZzWf zu=Lrg;=*f1HUV0Vl3z_nehM~kEV~#m4N|BBZL0JAE4JNtd9$` zU|N)2HKkj^gJy7+zr0PJ|cd^FA!F#;SST%`3C(UY)_d z)$|qg%#_1oggEK^R+v}FQy%v`LZgV0uV-a<6o(3&;ku;bI75)9cTBkIY@<}VLjQPb ze2GWv9hY*`?{Jn{-MV#p9^YI}`J?J9=y>w_OkXmUV0e9ohI)3x`>k!a@erPyx?SkBJe%ZQS#@Yf`qlIJ2_JPXHam3LQh(cOp0~b`B*{N5 z31!RMe+;aQdxJsc{X6l?~N(^?KwJ8!d?{ zt?=Lo!l4Uz3-Q(Q_))g2PXIewpStp-K9a>-Uh z0IQ*aIczFQ1;h@Mk_~GcuGaU>n(ANVVN42q;7pP3OD(B({fw86M03eppGAbKi)1-m zB`8e|YGC&Ay2g|)fI$f$I0a$EQZkbaB~GsLj8$)~T*DU2>bB zd7m!u(|9tqBlR3rbGCvU$5ghIVs3R5Cx&-u!>GG(PK{&s&4OH7+VxP_ZFw@rS!4Ji zG8M-XUJg<(N4`GWD~d{T6c^>05J4CrQ-`0M9Kd8t73{Jr`vCL{%+5DbkMN$s1YHmJ z=RY?onLS{58*DNTh8EstEKj|@uXOQ`nH zLbV-23->Js0=GumT<~GG8n*LLIR{}w$Fq;7x3qpEEISg@nusG0DmL1iYiyZ+`lNlg zF!9)3Zb}2Xbg(t~#z9^6WCW5)4pZyVe2&Y6TlcEQDif!=4^gTYAW0fpscn(dFxcWT zFd-zbS0Sy6Gd;Sc&ZYAr%9A>>Zd}%%?Bs!6Y>@@fj%x914f>qaXY?q`zNmk9?Cbc$ z>!N1l6etIhZif~FSr4hAP}WRM_8ybllmh_$erGbeQUppd-!cY;vWS`VXTF(mE&=*Q z@}VDU`pUgMs|eDR4`(9FU&`n1!WS&h#RZ^4rATf$Xzchjko^J6D%`Q$HraMC>MecGZ>rz+A;=wx6W9fzhF zk-SAhR%ruZap-tRGe>ZIrP5rNus3STDu;<|CJ|gCz?18bJ;_j>G8Os#Q;kLVV(W0q zIc!@bT7`*xH)2q*UW>S>_0)+p3IsJ+)5<)b60H%d-&db1&J=iia0;0L|B;w}VZnyR- z{W3|8{`3l~KHD>`b5?5_r0kWRZI45@Q3yGdsjmlsQmo5tuVyi~rP@O<1M)kb0T3Ih z-evb2Crmq=#_?Y$3N^8<=NQ*=qDVm-v=_tLn=h(cpD4+*J5jv+?DNA9>UiS=1Y2G5 zc>?HvOCJgL%D3@~FJEmo*yZ15*KZv(ZnG=shWvjwyjyW*!3Ss6`>GE*k2YP5Tamev zf5LLSVa{Grd|hEdufQ%2Q@1NCLD?f^2x0bIm&`7tNjWf2Wt;9jsGyP8v~ea@>tF?k zCVt`KHHvG@J?OLQGZ*K8aA2$lihx|{3!z+;?V%ij_+@)6`{x}NEe~$3A!)eMOk&;&++<+ zIfe5|VnpgfV{^(y*qMFJ5$duUd*vcsRL#mDFEN-VRO(?mw%FR!e$s7FBQGJ_kUM?G zl-q(u8&Bnwr-KK*p($qpvI-$rgiCNUmJ_+l{cb=K$Y+sVvflH#eEkZ$a056IX1X${ z4ueBHTe`-J#nbsvtM$eZjW6ps%C#TwgBYvH=yw5eF==WtjUFF2*N%S9Cpv8nPbyj# z@xp|2q(JWLX3mTjRRyp`4gl5lHBad`sYajQ;D^J!rhjCAQh;}T!!_64G`*-Mi|Rpq z@gTS59){Z?h+RgT-t*0-Ae)lBQi)rULp%0Fpmhn}#FZ}jdO-5o8R*^eQth~(^Ow&i z>XW*g`H!CSA=SAjt^Mf(G0LT%)nL@TN=V^goh(4weJvd9>SgZ=TFy$p zKV;p}u^m&7a@Vk6#HB66cZFe!48}%hfu|fOU-t}K$I*;|x7vSJ$NvzG%P#6y@g!IB z*=oR6Rn}A&x-uP?6lXsda>K4k_BeyY0VAmpE~R+YNNsYB_PqFoqpYUOx$NQ*&k4wI z@{>cp%+$@-1^L5Q*DUh@B_2g0jQ^f z%RXx6ivaiN()J}_)0f3kHGRLH;md^`Ym?aCK?mdu`1bt*Z_e+QKnV=7>kA8-)5%_OPizCm<6#TeunLNb(YPY+AH$rPuMVG9>nC*{;OEt67>s-`<%vdesSynf4LqHGll`et`! z$rY3*JRDatx~zT_shETO6CVSP3m(eXj(b z?3DY41co>F9LUnsQqh?SiXp1SVh;QWeNkyR50a>}D_uAR8`Kt*AgWe?Z)7+@p`(e= zAs@ICTO+GgFwueq2W8*1`}yM#seH-R5fRXlBY<51kZo;4LF4P&6l)+UZ4VOd?-G)# z+cEf~ROwTbn@y^U`xNIZ`fDF*o69!3S&e*zkjp(c@@b zgG;Gu6dbIO%q&~gQsTlmg!=*XUALgLXD+Val1#cnb@_DPTL@43WqOg>O%0_xk?x$W zl!@h+?b^A~7yGBeHZ4w)4D09#d}=|A;4}-m}G~% z(9YNQDN#GZ(cGa05WuA```8pndWueLQpc=-WrV!zOT>*c2)Pd&62P=9^$>nL6y+*#j$rNAx- z#q4SuFh?teG2v?X^f-^2OwhhXiHDgtyv-!rP*2woPOHNpxh1 z`YIb202+8>H6c`}x$)vkM@gbNaJTJBb<)0RzpBm{Wa#k-1xJUaLPqp4;s%oHO_;( zVJ*S`6EA|!L2${6ld59dM6GrNWtKl;y2ZcGwy#(a$mIg%BH4iVV3Y6wWG&YQE*PV# zj_oum12Wto8>n{Bw8&a@S!>E2&nE@~rna1j$uc(p*}lc5)A{8~guCP`WG(?cF`WXP zT9DTvNY9n%*KiyGn@4?n^R&reHGU<5e(h`+7cT>YB{%MvpP7GXY>Oi(j{ttXhsC9%;>`N|6&sJ~p>E zC+KS7ifNta%GJXRUq;{;^4Y>o3fh-^*WT3hD*9~Tsrt{$ym_ zB3aKntsZQeT91_z%Iu|R!FIc{Dy`rJ$QyaPLPtbk+f+uPOR`XT3Dy39hLkPlRJdqW zz%*{IBe`E`5X~C$QFWrsJ{xKtE_qp&}%Fss>Qfu- ziLPxwuIW1{;eEjRZct?VgW&pQ%j#v4~Lb4L+sOcc+JY(?R)@c78mQb&b8L1*tcQ1`g5g$C)f$?tM5u?eJXT`Gjm1CO;O=osDP8(Zs;YI(fd;U z51Qf&DrP**eeHu61j-kUM8a)VD$~?Oo@SYxrWRB}97dPQ45Osx@}&G*K|?JKHi^hU z9=)M*_m#0nTc6EzTqmD&8XJ9Cj>>*RJfzAAvz#uSjA=}+ArW;6bdeoAao07fY#QG& zr=wtq#g1U9LZnmT8+Zn?s zu69gk`HbmHjDfV*EH#U$NY0b)>KDr;@Hq! z3TtBOllkg{AdM+A0HocTbV5OTd+O2qrSaT8*DiS~y9S zSx^q_-bWKz4!Zze90vH`n`1%=kwf^d^V_ip3Y#uG{L`;(;Cp3+E8fOfC!j#ohn>=Tp%`(^Gu)5GxN zP7hKK?v4>`)E9AYS_h7H{&6}LX}86+zFNwU9IaC%4x?p6QQLNYGB=248IcU*;y8(~ zRBDu)=9TMo$@fM}EKnYyqZjxpFIW>&HaNSsGS~N!9bX@C#v_5_xaD~RBt)NoRjIkG z;@3+5Ugco;M=TFbpxhw>P2`Vd5s17LG%k?QPV^G+i36v$ zl8X}KcaCGI92nxtTU_KVQ_YAhGYQM4gRUc;Nx&nb^OMPh^WK|Wp{~b*{D%dg6$~~I zA3F8R@Q+W`W1Vzb`M&se-*k&JzqOTpW$Q`+BKu_sPBer-qbo5RDCLCE??l<_e9-jO zFR-|HRmh^ZeS(hx=2!bS^vZ;80N17kO(s>&zEzZreg_ipcFByoaQ3*F0(>wCikicHk~xCG2@(( z59)S)ivoX@N_y>VdiZhC;8p$R8_lu0&6Ar!d)J=(H!EBmP` zI1X8+Y`q!*u$dDt+Mxm*!y?@&WNG0($;)1ih0$JL%?kA6Yn1F!O6Hm<%OXts2FB$b zAgM%PS6f1c%0QSx{qM=L#ellha+pV#u4@tC99rqT%7>uv{!T;zgq|tQF0U^ol64Ba z=^T)oT}K-^fFsub>HTzlQb56+DQAWgTEcVnoyoz~2kWYtzG~(u%x8s}M7SQ@sa0*E zN}nw}O7&e%f%>I~6ouX9E)*J>$Oy|sHXwXDLb%~eqn~<9ZWL6TMQ#%soLYr2zf#NA z^0HP5=3~)ix0F(zSlkN$ICqFhpXkF}`4CcI{Y7ajdVyZSz%q zItSH;mC)4g08_wkXqYaUOD3wCauk@A?4x0^N2BqQuA^P#v(XekY&{z{Y~PvC?1jD8 z{;v{;Bqo|J&yck6Jl>uQGupZ9P@PX5Cr3^CGF;Q1la3ESUThK`PC9(TEOd4>ETWJ4 z(ON3!l0FGZ@h)ffN7#Prc_blDrf~&XssS-a$e2+M~_;*{~VBs z#fG63&-Fa#J&!WnI{=Yvm*d)7=M=a@Zv!-WM@1CDQ2+{WB$Z_NDo;LXfsl|wsCWu& zH@$eL4_`ofz8FHtTbmm{I?OiJxU!GCmV&O7HGK})%wFEvLjLF~LcD7~H;*~1wQ}+R zAV5P!AMZVXe2CA9BRoP99)pkkNVvtD_Qiv);?jwh#Nh2nmQLmj+QHGyv z(^uR%gG1v=_0{rheb|oE`2t-Jxf;xd<^#Yx)DKS}uIl-$8$0%Sd?a>QzL(BU9K-|! zpgD9cF^??8G#4_Tv5pUXc{(P#auYj0It9?w6}|Ow)?2x3!W&}O_eXm{Z^rajEAoP0 z7Qwcj#`?_87H>XI&&^^6jOny3xD~_JiCiep2M8=76@MsqdLNs1d8p{?8 zUNQ&rV(yx?w#?_KkD88xyBFIPrQ#bLERpR~W@857FIPNNIXSzI(Ir9|=n;3#dZWgq zP|29%E`pvmXZbl&ldR3Ods0kxXC!MN$*d}dYK-oL*}gH+$q8@eZjI2?u70f-v~6Y3 zn8v9JvVRTu{H6oLkj&5_0KC`E_V@;b^D^c68_o7c3F6U%k{-S9l-6BmEBhafo%lJz zdw&`smPN$wy#P-Ldrzv`JofiWy{es*e+Zlz+cgj9LOL7-wR*tm&MBEX*;SO}>yC6& z{P~q@_J6Ey`_Q{sNyU3Ew`t@5b2XIN%?8Q=fbZkV=7;2GJ;^J_pwb}Mp)~pkIdlx& z8lV`zHTEQw4Q-b$&4C07xLO$hsoeXgMD*{g=l@)}_rF((=yZRXSW(LWRO|kGg|*q% z2YaZN)vvZW@#%I|@$=uSiXHwNrJmWgxbn6tS8zl3d3rGmW~hMIU~y^u6b-Y8!HJLC zb+<1=p8j|0TPMDn>smqe`rEjMmi#a^h&u0p&=L41B<7K&W(m_je}P`ojuZj7fO~R} z2Rx+#*x(i*)f5b9fKd6dFLfA5S%6AfqpfN5f8)t>Cw5!tI=wFio!z!M1~Kx(hor^^ zb^$e4*!vQH@NS^m`J~@#=RvtHTiLyM+Fv0FK@SL?)_rvjr(eA07Y&j;*K*gRed&V5 zpg%Yz&NH9mr#J@HwXa3{UIlmFVIi>TLEZ|_hs_C}J}<3eL3$p{XUFZ~{lOOmG6tj} zk`C->!c#9&(Ri5QI}-W}$6crxI-Y^0%gL+VKE%;5_*WCy(5=Ab#N(||26P76C=Y;w z@BOD6UsluW9N!22a!q8PET|{f2KD6C6M}gEU-9;~Zwd2jN~J*(X0SES+@O1!i!j|b z6aP|W2mO^R?kOZ8!T9xR_N#Wwt^+%eEBJYH=->bQbv^zyR@mprofUQd;iLC?ceeWe z@X@~twy1CcDU+B;XFMjK8{{gHVwM=hC3$^){kxMhGu-u4o$&g$_I4wa&UDpegicW# zQX~6J?c!*?JmC2J<@#+v@;}TMBDyf4y-#lpZj&Z_OPmO5E5H=Fb|Y%6n9l z1J#Dki2bLJL2@`+wD?mI>OdT(EPL+}wYJ@1%YIc%9iMIhQrTZGfxzu`1YSE((9uAI z(4GENzUJ$@g(D|&W|p=ck&cNCJ}F$lefI2GXHz$~LarM(ZU`FN*=2F<-o4v+a&AsI z_aW%ZhRM{Q17!-4k7j!ElmGf1z*zkhuwkFhTT2KO<$buXdg}YdNy)p#wnoklh)WwZ>z{tCTlf(0IK@5rO2x*Dckq9DZ~IyQr8rec{v0`uOlh--~jQ0TK~$ z-L>|~!`w}JM_?4fZXgV8^s*0@YeG!jzh38eZ(H<88ZRf~OS0>cyX^Y1>!SSg#5i`l zDjkUe+FDn?ag2@8!3SdL{>F?LT*=xNbNK)hU(gtpm+pxet|R+Y=bg^o#{h{{{nD3% zopwx7qu|`Rm_0HB_byT>!_J?3p;6UaYDnjmEB!Z?M`7gXGPbWA@-mA$1|00 zH{@v6Up?{%Q@Yl^zx)aCU+g#f-9f1T|L`DKEOPl>MKXSpuqY}LgZ|fl;rVVbp@YTK zTDjDgo%KK3>Y^ho6uc0O*-ILI+f~YyJi{1n^o@sYB&BjpE@z_mFv7r0q$pB}aWy*J za%_TN-R%0HUNwY~II&KrU-iDi97xo58Fml6=m!0>ul_%e%D0QE0D9utIsI*_b>hO$ z9aX&>6x>Jjydoy7klw=JoOdj29m3P*+ds)q$@J^h^nP-SvbqX)SB_ambet{M93yiT z7M$n~YbYK*e>r@Pzi5LZomxlo{sjiJ?lFNd>a;>s!uN^`bI0P~)plY3%_-Ip1Y;Wq ztA)Jb*WS|S^V$%upYKdkmc)-b zk!3@QIm8Xd8Iz+L!IIzUCBD$vf5Xh16O1GkVc2tmiC&r(%p*WYvFDiH(IOzuYj=;VE#zjZHwq5U>x%ZUrMcmzx zap{eSI+;S4Q75U&jc6*T&zD-qnm`7Ae*Q!}vFLb7c%FxWr@Y75RMIDvODU_$W<6cL zo$;UvK3^hx^6oo>_38VM?N;IzNe-X;R%THul_KlPo#a>T1uzuU;@wziO!|`Mnqe&` z%eMcV^K-m=``Cct-vtE;+7QM(54EqM^Kp$z>(ls(JLd{ClR|p$Z@n|tk-n=`7|Iz` z;qOa~vKts#jK~T{O+v{S1J!92WX}XysdO(G_L^(cOULpdDs~p_-DT&Jj#8y`!IjJ& z8{yyaxXXqK&k`fuz~)j#fUq7JA&yQ_hm+qMTrs$=X^dx5Vtw7$^DcHn1@ySI zT;p{ijFCfI>}IG{rPbAXrAy*_tTOtCDizGCC&&iHgb1$cl<<^Qk&`K_9SDxO-mV$t z3jYY~(K+YzN#&(RVhk{I_zcN_E2{+zpRq?t+6LW15Mh2*$2-Qqc#Tc{@|u^I+mD1E zoPbiG4Nu7?l7+h~__LZ;8YG>MN|I*6f7x~3Y#G++NPVeQI5yIRn0 zovo)yQ@wnKP6{{J!8?u4bY()O8ykas#jDtJD3X2QhA9UA(q%bFU!p=#Lu+t!7?+1P zRi>1X0EIy`32%8%`VG!UMZD!ZGAni)fOhF`LoPA(IFwmlP&QXRZ{_NtCr}4O0HDH zB9BQw+WQ^Ck$B{KQzvV&v$*ue<&jQAwOv~T+o~2n+z@)2@hOH>Qd!_{Iy*mqMb`cn zzRY7Fpy{QP9iFyaPq(X09V?Lac%NQFv{2 zUd6g6uAQ7WJ4HrFiCnt|c zkaC?sR_0z6`#2?Bb%JR7LchB!=Gn@CaivYGv7qpQvk)H3!$%!rn&z;I&fJtT#=C{B zcj$@WRQenIypqm18f}6=vpdK|<|1F}R+!NgkPCOZRi3mVT;R4R>H4{K_&vESF=Y8u zh}K3)APxL?3B`U}Hjib>UZii7QKzE*6kCR0S#n)VL+42~qWwYPEo2ZnU}EKEy|>+= zXW(fT(E9TUOO{ifoa(sX819{KR$kxVIuv_p_Pr#jnDOvpEEG5Opm&tt`LR)6^3AwT zU$XBg=}@qGiJ^N!t}+~A2W{B-7NtMel2ADyYIuG~#j$E)&hdQXLQh_u9-4i=etZwn z*t{?q43bX**F|)G_9akeK)S=8)C?H@S^4SLB+wC<9s!#3LbpGK# z=M?AHfb#;MC93oawR=#d?Rq&xNs6kJ$MM#m|RC2nA4LqERSCXR7k;#mz>39l*z&Ytpd5pi?5+$#t- zoH^muqnE|Q+I%5P6rg%w6^9Oo4vr^QhNjx0d>O41b618-vgQ#}B^C8HZ@u_*O(|px zF2BI5gYnB|&>--Cv@E%G==0{sd(VHY_ZOFvB9P1eWpbbqvh|KF?Kw`bY&Tt~Ig=?l z@>v`jOA=yG!C&mj=|>7-tas~NUBxXc30s(CxE$j4i$Nb06E>$#c(ROK1Uq@VN^-1C zqsCh^vhB5jlNk450U@>UC?pq`pEz9RQ<^3`9-Xp!&huyr&3Q`R+L(DK37v)RJvXAF zYO!JVh7;|SL!9LAnyB=lyytjp;NRUr;CE=$+g-w?oI+Dc@u?sr%1l79XE_~WRzsR0 zK9tLsQV3Sl>tyLfdG}>k+FEX zB+FQsOBr4z`+`^3kN5RTC^KEx-v_<*Y~^FdDF66-9Myz*A?ag$(|#XAGRNET=8xVm zk3E&IjWjgnoLfO`0c9sT!}CmA`P|#}*%U#rey`qd{itDEY3W|@*#kB+N!Dl2=`ynZ zhrd`olLLFuA#O#lANB6tFXl4(Wy?p>ZhmY|fs`j9yP6Gh2AboHKGZD9ypXs5tUq~P zBt8>@whc(VPDeE8k)nug=*qbM!u*W`aeVrzqXOUp>y-^i_rzR8SvQwfl`<;hI^8cJ zhpjLvhaTcVRGg=J@?_-}sK}0R8EP3fN%s-d=z#kBCc zkb_f=o8M&3_@`d4fW=`*gYFh{S5|Wm)DqjQmq1aiy&0BsciHu<%~cB$xSim<>`vQR zd$Qiv@H0m){qd3hCeP~n>+ec!>x0@zMf!yaxSQcRuxp7bRyJRwn?)+g(F25r?zI|GSr(;q7bfayy4iQk5 z?^ZB;nqI2HUIG1emHFAlGic7E&TSFzSaDAvEi%fS|53aBi%~5y>L%OT+S$kT)5WC- z1oJ7a{g9debz9~ab6n-r+^#qiG2HGn_Hy!4Dtm77qpXH(p^7PGg~{m^v#mpwq4kK{ zz7?kHUFc$AJ$o0P5IgtohJCVQu1p?hPnht(6ykRme#ixg}E^5r4t#?{pPfeFO2 z_p9W&%z=yVpj(G@2$QbPJS&1YP7o|y$bj@s8!I60iME;f zrw*P&q1xw&+2X+Hg)%&A^Q+Kh{=1^io6Y{bgzFMBkbvIQl_*HZ-kiS?lrkQ|b$+F% z*`WBYOD{+OrliMkOrdc&THEDrNl+QJ%#K7}ap#9cH=*OjAi`dKp21i9;#`mP^AHXS zXZcQj`jI5-6;Fg0-F?r8?4h>jh5Ot`Xb*JeB@KtB5DIR-SYZ`r)s9NO3?=dSRdepl zyJWY}zR(!AFAMTAvA)ZSSbj0dV6NFyk^_55A42rzstoT;c6H_7`L=oYx7+X!nc99c zwl#j$lFH|j>9!8I&)HeW$&qM7WtlBGzLX+T1Wqic5#LZhzN`4*kIiXi60tkhaOr!V zNBfVdM`<9~^d$!a8llT;hkRvAu`OpfeO7pxbYX<96;t>2CzE`aQ?cC?=k)bD*jyOR z31!qT`;s$_fcI!c%yal3@~Pe+TgjX%N-rw$=ZSoMV{B$o}_$kOMj)Cc{k!ot{b=PA9$ z;Cc{gGZ`t$^>ep8ygk`GHg>%YzOw4rH|Oqu&!iua5}Yrws;n%p@bn*Qv+rRLSpH9v zQ#}>0&Ou3U21E=MjD?!hQVw||*gQI?7FVjA#`Ll{{dkOFFXW+;^p+P{AY%KpVv=wE z>SMEEw;~uDxQuNC)thn~qRCitH#uTvvJ&W|xG?mlgse+84GJnO{yiS7t|ls_3geR%N4~ zSn0u7bFz1nDGo;zg}A=J)EYp@IoB!WX7;^8XZtt&iMR1?+G1cH{qC}XTxrO2s3ys-zj53Yp2 zX-;YL>T##P6kDHKnVb|w&&Bv-O4S?L6F#Dj z`ynv3KZoU`%$Gg)#$3i7!5&12wgY8~kxd^64;biYzm(Sshff%oMDz?FtbO5J7ASI?}6Q_CGK?|K;KPI#=wgPo`9QTkXw4wvQtG1 zobUuUJFtYp$|z|ghekQFdt#E>#@jlIa-}-#we0UIPO{HC3a*q@y82rvBTml3RVxNw z*6VNjLe+xVrV?^9kOIv1r;RR^bjTDJq=dt}!b4N(t={>W`WKHL?31I?&iif~x^j`N zxMVYHTG;-?Io*2aXv*94F)Wg?v zn4)2|=X9!}D4GADV~mN!xzdWN(j!;wnX9;l#@Ajj#&{a1-_@dhcJQ`cc;7OFbzpx4 zml+K|AM}eOS(tyl{X)ciq59S#@q{*1lNj1U*y~DDYzQKa07Ffu6BBR_k4wT9OLXdB zG3U}zgL4};4PGKhnw3^T@H>#8aW+B9+c497jd5)&E@cC#fr58=ohR!{4Z(Ttm6WOD zo$(I&*MIUE2q|L4Zs0_eYbU&C!m`B{lmO5o+!obu{IX(Qs#o&+_xhMGBi27Gek#~y z&m7mH6k7;$gq!sj{1=Xd>@3#SP9Cw!{zyepW*EXB#}F&%mh- zLlb1Vi058b#-$*lu?d+XYL1zcX>4YiThUVQD@G~_$xK=iAe_d`wjyf92Y&$AzODxS@ zfp+26g*wDLt)T<^Kxx&ZPenHvl<|hrOq5Eo^)$!SczLWV*oPDgj^R>os|FR;Zl2Hz z3Ope}3M7o9Df%#cc@`U2hq9gWDDk_}kC5Bh3z!h-Cds7JZpuz;|>_1yI?Vc+;?uq#W8(?WM0*s_{8o zOfu-TAgTi{R8CnAZ8r2?EV-2J9-26)kFvhwkP@$4%4Z9wB{^lPXEG!##d+Z`beH>7 z&QX1luGF5_ugFE|G-D-um+q_3kV<}XGcC=G%P*X^NYy^;-X9P;yOh4S5DoEZkUw%| zFr{iS3fN71<_8{`5p@x5W!X9p)*`Q=NqdBW6wbO|{!552Rvayk=jP}GK) z`t;7+q#{6QT+BpXt~7K}EP7`(T&Y6V^JUKK_0B_E>dhYTacNasG)#`~ElE_F>F6rF zZEjNT@^*!r18bN@8iK3h?)K4F;t(JsY_#0DC*@*J(7QNYxe9wISQJ&B!=+)wqpbCo zITJ5g?|gftFF%;p|6zibGUm*~6>ZIbdw?P-w#qdaY2H2IO#OskeLf&r0Ue%xJIS77 z*CFy&*qftQ9o8$bWfm00ggiy*bcN$R%r8Fj-`ETwNknvGlD3Ou6@6u3QBDYuK7=>7 z8^I&!%um}^hsDv3Sza8eBg4b{Ry$+;wHGWj0yM%UE8)6lA|FtUqij?is~XH}_2ERm zLnZC&+7B|WQFk;Kl7kD6^fh^!U2YB@@0DD8P|-mkyJykz#m8u`(8d^p2OK~N3h|Lz z3crho79SuOCvdvasX|>89;>z$r0RIG^z58UxrnE7t!gD<8>z$SLaP=RX!a00+rqvB2 zazMb9h#3qhc2qjlUeJbsip7Tv-pt-=yQqc=XP)q4=4yxk$TW{8*)c0va`AMdENoKD z;M{bjf{saAm91}~373iPL8w%ueV)y-L|Tgo>Z~3%a^R#be06=gUO79x=%)Velt)vG ziO1a+<^5MP9R{UmxA4PeH5JNaV-a0g#dE+EA=+-9$FaP+^|nFK2-EA4jSAF#MGqWW z9odqCmlRU7rh{N%5V5da*-jy?+PeV5b2HiYGTT~lWUVE9_DgZ*&f?(&56i)cK@Qrh zs)EG$pwgbf`#540#cYNeIvZ>i66F(Ru=MDnsrv zPWqnHxZW0++;mH<$|n`ykqg>+x7#Sd6sT{#eR=GTYCP65-lY6G%|xG@+g24A$NQGB zW*MV1`PphgS(VFKZ`QI5Y;=!N!jnv=0(@ueyH-ovSF*b&D$k|n&?O0T!ourQD!xSH z%Q#+I9tMxMY^M*RV2R}fFNV;T@R_>I*Sr{45@v8h#d}IY7MUB=sO8t4yd!j2$OTv@WwmTUBe{9FT{l|GOWor$f{BaDF>Kw^2Vkf60E zI3>C;2$Wlt&wCEd?%1?|Rr})WcI zy8bwo-Qk7HyTwcJ33t%soYlKorQ7DxBQRE@8|AM@iRQ7@J-A1sS{dO#k_kJ)r2}jx z*X%|tIpUB#0!T6!xzAj2@6ij4SRo`xJm-8!Ulb6&(#M>`W%W<5AGrd@=Jx8o)E$=X z6BjUHhZ0xAPYH};jn7Gy4p!S;CfwW~g``*BLlziI&Q8slNzQQ>_6D)fgFdEuIDTlc z>U@+JLc*}d8t%Yo*V`6(=$UKTY|2QX9cd0HE=87xm6V=K$%Q=zPLfIWp+5hSRFs{= zhe;s`RA{2xRO$|Hw)2+Xi4g$r>+j|uG(ce_k}%^Q)5MQf#PRHsmQKIU=c1vPX>K$j zDr%@8L$gj!_{^7$%?!Sxb=$*X!JZREKhe$Ei?Zy=~d(}$}iE^%{S#ujlxmMGjw4GPg$wrDafA(%D87m5GEWkHHxpy{E%Pbpq z7iFBt-dSR(;=bUZosALDvC8bw^=NXqa@Rs_Vc~Xhr2{30)|Bzs?nds*tT!9Hl`>wU z%Zc|COX;}u-KVihMBV#xB6ik_Ug1@BOKL%_Su>9unidG6Um6aq_Mq863_5}973t%I z*pk~=a-e>P)t=&&BUeCs-V#q);dJ-}e^TrIgv!U(@z0Am%2!O5?DWhbTpp3%Z4!l@CzW=P}8>`17_t z^77?_>6$HK$7uKXH5KZ7ZGBW0#vbO;*A}}U&*o!^(4SRk$w{xD%s96!Ck4PpHJ|?V zR72}dYO5De-?0O0TC*AHiLB*{?=uvCH-Zk@nGd)&@kXpMt$&(*dKLSxVTk|g=L|Mi z2jqtRmA(7gQm*#*+T%@(ftuJ&{?La;OqteaD(3bP=z7@&n{t_d=@2fiK&4|K@S;BrmfS;32~+ zB)Iqhc*<7e!&Yk&+j%~)M&J4a#gBgnaXC`SiIw<5?*kKle?7kh{uiu&ryqbXW9$M} z44j6=y*~b)X}GrkB0weq>f_WG{M5gC!V}BG`C@V&U}s`P6#P6U)p0wI5^D{n-+%M* zB*EjU{1=aB3J#C42kY_1#63RBvGy?EeoB87!r=G&_IqDZj{oYA?GN0J7E$`A6`)AELHfA@wapP{s`qe$lL>E5*;lxE}m!((K!3RdI~j1${=VO zs7_WG{PnEkfj=_$9xs4hrmegOtiOP(SO@u#Uh%0@Rre@x;7eUR|6|Da&WS&+IG$r{ zhrIGLGyMvN+#K%gj`+DSU2X|`ek{v>5$omf*W-|HfBGYx@Xp3w$OX2#_g~47tdZCT z^%yWW{NsY&!WjH=h1_3HfBuUny9=I7e=$jXx$IC(7-&nbO#WdY?vL{X*T4HCZL*dL zfp9upM}OfzHF|dFl@Jok+vz9*+KD+YvGZ-{dm;G#2zSPM@x{qi4XY4whS1bogTEdD z{`+r{_ncE(gTttx3DLKcf5;jzP3m=I{K^8yh*xwQs+ULK5iVFd3}lUiBXX*?&9|6K;d_ zZX?U%MG0*x1?+$EgO@&f>L6RDAhidXgR0;b8Xja#>;7S)>+Mf2Q~ulLDrt$d-a!U* z!)U1-C{xTY)$hq_;RlB)7+-2X)ojp@e=*9WrGw#U4l^(WuKtJi z^NXjNWvxR%1gQ@wYeC%`4&nMx?lMTcyDIIGB7M4hHljqhA4jOrFE5Y~Vzj)h=%bI~ z5d+GL6R6-K;5&xD>S0^N51iq)s|zZc(Yg!Iw{NapLyipiEMe={Yu#FTB&Hhout5&g zeY1Rb(*;C61@IlrI+^mCCN)_Z+F73)F}teI_X@3Vl2X38wzKkOYydPFxj^YWY8mqG z@K5?`d#|-`;kLe+^5ijSF9GKO{#_U+=X31dR61c%x3n`&fL0>sqxi{H_x>0g@1Bqv zJLbbnHAY8R(-wXWUxk}&8b(Yf3lk)nX*zv8K>I*~VgE9yXtkf214vNDvhH`WiXIc! z9Mx2AGw3yZ?xpu7#k3eUly!Z`gv>W{wcpL~3`CZjwWyQpIZWrhB)w|`GO zR;BKBA>wF`{^P>}yc^%<9u(l|Cih-(G~M3N&488wd0Gvzi`D@^n}&cubht;(?6KV_ z^d3)e57s#R$0s&km&ublGRmyI|9Q}r91uW$Z7YEm(Puju9uz#oxyD)$>) zRsk`mMgYj2elr(;SZDgfL{P-hWBQN37oKEO^LlH#`@wUE`EO$>6FvzZN$&~+-HL(Y z2Gpsody{oF*KK5cUSj*6qi!AI25~m4viP!e5Aur{#iQ;(y|SZtW8!mf{}KE0$x3E5 zsx;O)I>rgGX!@^)$4A)AvFLH4OWiENK_VMuLhP$}hh>zVnL4iKJcEfJT*rPgHaRK} z2y&Z8&*#&#wsoz9?VWC_YYUN)u^#a&sZTqVaNb%*M|mKpCBN})!7kNJh@A+uF6aks z_?H3w$NDh9TsKhL`vdyNCsE6OrS^`K! zrnAVQU(CHr-^|ohi1XO^KI=hCmx(0NJn{Q7r&Nf$!dQVn-*0@WmP(wIK{U-mWd;URcJmuc!4zfjb{A2 zZMA=Q>@TdgZ^sR9|0Gl`H3EQJ{b+gN2-}y6whwz(+ZiJf3qWY*Q(CkBOLW%WBIa_} zff|8=buxU=$(o2v$tOUiE}?cRu~3ekhlZib-srCb+|`n6G!ZNvOZ}xn;1$#+>S) z((osa2!d?2GXl!eVXmh(bPh5SOEeV>wa8YWOB;K~Lrg+gXfX4MHw%xmNzC*4r0c9K z?1lC!U;hk`B*@d9?V&DV1p^2+zxsf0K7337kH{TZb8zG%0} z4PheKiizEx)r5)%^o!;gy+*UOmBniqnwStX0L3FC8S0z13lh2G8>jjYhHw;Yhi(Jg zp(A^jXRgT&y^;QJR$yECq#FBKGJt^v07g3d73oLO{f6|biU=V9xKZhr?bi5t`Mv;( z9>_!bcgsdu)J*;I$p}|n*EZ7`RG)leF{RhNR5HCqvg~|CxDz~k6&%oWw^-WT$c<6{etyRM zcK6kO_cGZ*A6)Tk$DV+~RNDu=ULoaQ6>?*BOGD2#b2qM`*d1Ia7w7u?D`wY~z3UQ$ zG16Z2d+)AKXo^SvCIXxkK?B^y(G0)%)#;BUzDV0{wHj3Ku|s z_ljrDl>WYphc{PW|8Zv&oY#W@<)@mXyCdzW&|K#GELuw(u8Pld<(^}`hY$~KZ=ftt zB$l$CXJK%%f58wOQi_iHyp^Ww7tW{LP2HO_2rAX)#CO)&^vd4K z(S;Gr))^59?LRo0%w7U@k-!HT7boj6_D6`W$anOV{0i%M44q(yIzA$Af`Y zAnMY*0+4j~QMVbLo~>6V`>>VYb=hmdIj^ttK!Emv@RyCkoDNW*&fVO~H9O1Yhq?cV z>qgm3Izv;7U-SEnqt=HR<>%$(^xd~@+t$!NI0)B~vFW-Qy{sxld}q94JNMmTIo>{2 z*fMdHIt1NnfVfwd=We!$X)Vz9Bq4{gPB_Y?zJZJaRB;(tE)2lQTNAc4USxvZ+! zgU9q1#x&shmFYE1!4l^<$a5)?I3`+>Go zp@%iy1&-&l#hLu>t)3TRHiR?BZJj+8SVvfu$ewdFy}Qae+JKgwJZGVY7M>ye)PPq& zdaYI%HC8IEE0UN$i?eU@JMnv`4Jw5>Tg+U|pSz$=_ZQ_V$V0y^n?KiM?O&VweC*am zlBQOu$g5zI1hGKsId}YZ;jbgjzXdRI`nP_+3;n%DN?ej2V7Fb|+KsiR+BxCThum~C zZQ`@|P3s|rbDs&o1WS(zq9-cIt7GC7XcG@b=0kOcmCW z-U(P`Wt6Kl-C!@VC*LFYKDXUFb4H8}@+sqhxYYOJVT}p{=AOO;n0u|fbA)Zi_b**V z^nTR8e3y?lw^1EEf|22?b5$Z0RtK+DjUt4_X174DYucAD1b74Tuf|ya9M*;UPA<1OF;P+>a>~@&$cNAvWi>-Hp@K2-!|08PMzX!_s`zZSp zvDepxdO@G{F8R4>pj&V}FX(;L#1?zz@m$n13S;}xv;Apx*vl-C7Q`CE-@^T7;?YA( zACLYpFe?{~9~z!s`dkL2v|lR404lDgT~>OZ$(;WWzHZ}&r0ozXxFGD_4=`TYw$Z>a zPY^{$(mq+?wGYGf+a$!47}i&IA#SN{E*vx$0%=C=hwhEhqONr08!%(MK`+3#jeJQ& zSnn(7bt4`I{qnwOglbKBvuN*Wg4XHrxy-RdQKQI}C~(jNzeEOgFbFZETy=dC%L-4m zd%_t>SsJL`sm2I|ga@Tuw|=~=vwV5c*S%)(VS8adkSGL_*Kp%4kYnHER(=;)pHiG! zvE=qU%iP~y{z^BVvJzPSM_!q7=!uw;N3%PiU@&pktVq*)_*A5hVi6lHB znyrodQoC`Hh}5?Crm}Lj@AiBG;{;5(&=Rar(=;{D1Fhrl4oki{mN{wzX0mmD(IX3Y?kvB%L)ZVV z>K-|V`J8y)`u5VJxB*jJxx@~-3lmWAsPjfRHknHmv{>RbHaQ=$OGofC1D@mkpC~!^ zOsq?K5644O5X)p8KXyOL#CxET?W|V7YoEva6*nDWh8?t1P|%#zIPU_xT2}{P+RlMZy`J^ ztH%!Ut9?>OKcHE8Y+YvJ!ScIYejbZvks~df8$jw+wAqHUMW2>2N^nAYO+WiYc`zkP z3>ec>hElgov52dA*Smd2MQ_j`Wdro<8sV3$_o?t8*uq$vpY=Q$6O{E}>I3Rx+;Ug` z;m}{`HCqjMeuO{_(^-a*AYj2~{~*a_sivj>p)sA%sdL}gjQTO@qm9s~xW6Yes0C+*jWNUd^o1q&g z8ohu#IX-vz2GI(>Vk}O2IxkthEPosE*$V`O0*x-VQK#?csF1J2=h9|aqN$D<8kNU9 zJqZr?OOmZC^G=Tez1Uj$+^@yHCkddb9=aJgJqTC-@=?#>z-8|H=gSmBDs;F4=UdHMkQ~2ng1E!$8|e}^m>ot|hz|S%46m7eLKV$o z>CF-p8&!SU%vcJ~Q4~xpf5W&5WDiI8q(pRLdPDPy62ZYHuJXmP8PkYA^)0@(=d;P)Dck`%xb88|IHpfgj*)LWI5JBPCn3=QLlw;9!EfaehB>K7c|Qs z5nrSplH)Eo_4^%n#Gzn0BK6D zn2=lhMrOT>P76vEB1_QQ%-yyspcQ zm^)G(7)lM+DC6bQMqf*MHZ_Zk&( z`?PRFy8FZELVN@PUM+n%Bgyf3tzJ}gx<%+oW!tM}-{Zrn6!P-HE29x0cv6o>Ikvns z-}op}Fl!|+ESDe6?oiA~vz7_>&c55$W0(j9bmZPvbhU32bW#KK-PSj4{=!eGqc>7E za&NT}lIEE6=`84N>Pu(eyBjHHMPbAD6~f3K*{)U2F#C!XHz(sx8MHIdUi>&R76TXK z^5*v#dN_g^y&ntLT79fJ5@A^U(v0t;=E`?RAj4@}d6ms@F zS)$7Mr2(l?`ozXAhve~_9Rfox%QX#Ar;{O&=YL+DsbMMtnI%b@`0?g&*3ds|8*P&9 z(HB*sCy%*+rqG$;p+NR?aT$pR;tc%1H<6m;*r{4Zm#s0fPN_mOxvyBK72T8r9KtFY zrDxQ7g0H~Y^xHxwwQhUl8CXD@WsK`P2ukCcap#o{+`BWAUUT+6&G|k#&(3g7pLM{-K4aXREkBIv{g~A7HZ5z;|p`$ez+S$@q}GH&Bma zcby0@>g+{88@5JZ)PIy4aS+9DI#4nh4L{Y$#igFLqfW3V+j3sFgf!j*wt+sI5cT4I zfg&?MnISY>^*?Xo{JeOjfBC2ll+yF>nJB}pMY0!?YeNkM$;y!qHl;3Oce<_7#_KE0 zYn3^**p!hD7VmN32&8q-Ol9j3OWYSETolK;kOyrNX*~;RhRgb1P3jx+322VxpWs1h zh&L{7zf%{j8N{0(rKKIc$C&0Jv;H8utYW0~D^lrE!P_ zW*Df5zV^=rE1fl9s6{~eLe3YJD2JTnU#quQBn!aG(W7i#&WumLmfUE>^JNBW`jb^^ z`VeUB$be{XkVc%iQaAddbwRteoRNv>)-d&7YjHMpr5~hCjB_n_P^w5K88Qc64cH@x z(Ykkt)=4Cz66V9JK}FCsgP#j9&&q+G>8rOqcb=<{=Hz^&0S}E)7+9>kA6m35a4g!v z8^C@5#}!L7o!Km^YDl(24{HRNMF7Z~b(&>!7uq!|^dv$}KSKrzK9Auh>~Eb33DshQ z%yiDOSR@aQs_~bR;j?h7dc~2mP!0mjdCgvOaUs<|jfOys3GEy~y=4M^Z2wB=1kdCh7>2kCi@0 z0fDaIzrRXnm6BpzCCoi;rRf&_8fcoAXuf{n4Gux|Mf-xPOrB_;4%|>c<83?L`U2gm z$Y!EV`Tdo|rotyYIaBm&sMg(s>5?t6qd+CUsMx&x3aMZK3Fp+7HxL*TVYqAg4};?M zX5aqszOZVcD7ETt%PfS!RXH8}&P<_9!>U96y5B*M7e_eo-V$~Gyjm=n=#%ClZY0N@ zS9|KfzS(qX9Y?5CbvAzo*pSjiQ^*f^b=CCqiDVN@{*ka7!j}cCl@k+%A+P8?2vAQl zZaz6_=8iG@P5?15m1gAoOJBB`orl<)L@BQYJ_uw0j5}ythL2&9bnA$D8O(trzn%Yv z8Zz9SwxgCUun0_spb`2g$y_Z3usqI=s37F;bLg%DxnxtkB-!v6cJ%5SZZ4gAS3 zZPfqhhVY`#5MN!{v0atZukAYHeR_m$6*~2Yq{Vtr9v?405TTHz z;Qwya>A?H?LH zp%lWVUKDyY>(;B-c;CC~h;jN7J;=?0nUVsa1&_W>U1_t;{p}MRNsHd^kkx<(&8KsW zy@K3wwDR>?&^a70wClYkUE0!w3j7$uW=MWLikHf1cQt?!SBwsD`C8sfxP$;rx=3*s z;&@(^I=(qfWlN`35~Q{He|N8VY%NW8fzrUmM!U5E(bWBc;hKg6I16%d@{h&*3Jq&&|nMvV+?P22X5m5Z&EL&`{5-TtOqQy7alVx8o1r-CTg}P)L-gA z&R}Bg4WUy;UwDAhIFH+et`FK|x!Yy}c;?ELImgswS5dPLP^>6s-C^=Qc!$}2$c0LU z1%LwN)szgc9tlsKTskeZkv-l2Lg}-;uX}j!SMcqkzjGO?zzX`&(YVeTtipkN(g~n| zqVAyG6y1QQ8Whz8edQaV+iev()!*806fDMMY38#`-mX#RykxPGsY%S( za#90R6Kwe=)qGzjK;|yBq^tW+$}f5MUE0g67pVXa$WYLV?1_piuv6{@fi)(H9b*~T zxu7q}Mw8Ih-vujt@S%c1jjx~K=6aByn3p-HzVvv+om$O|Aqh*JC_3^xroJOmJqnt-KYHv*k9I!3GGC`nE`P?Keh=+1hwwLxt^AnW&SN$qmpxiCE7|6J zgB57MeYgc^aQKED`W9Uq34;$3Z3$+dEraiFFafK(zp9ZG-6CA5KwQ79g%ZwY;kaQ$ zt8~mfDBRbZ|KJOkZmR;a$jue3Y8v1*Y1vs50ro~-8?h~uaFOj*{9i^1tR*TAGrsqW zL9X*H>Rx_#cAo(4^;5%lF8|uf4YAxQ-qXk8L0}5!&21_K4}%^AVii!W%rb^DXYP5! z^r36rGx)OuJueJ{c$(XR+{D^UghDQDWFQ70UmF$VjkFw7W69KUs4WF};8w%9hkB9= zQ!mhFIQ4hKw$v+=>Q%8TnTRuqpRI;E=xOl0k9=|-#l_~=mBC$6qcbvxQnVcm^&ddj zulf@$-&m=N7KB_v`F<`5sJ!pZqJXU465_&G^Th`caIsi^$SYsgM<@gC$m||E$&4gF zPS83EAJ>)&Xv=j336MqGWf$MmyD=zO_Jl7h@mbgh1nlIvkY?h{o!`DguX;wocYSD9 zb|VqO+{^DNEnk%G>`HYqq?@3sbsLq93Zq*t4QxazHo3O9c^Tq+tP+MRcYPZ$SWFpr zqkrZv1D)BkC21{7B$)J~eCp-iR#1ZWQi=J_uRiF{s>dIBm~$+NzdunU-LYLbNczpK zs&{+0-jRyj$*oYI-sjRN9#qs*m3Q%^;9*_u;zcs^mp)ZQvg@D*t)JBtYCNqFY$OWq z(0!m$G<5Yfb zd(5U|N0nWN$8dSEFdtR*Jg3O?@l|`#fy3LuEK955pOutZ(z91t!+}-*P=l&EfR3`% zKftB9p;oIdc(_1w4f7;geXBl~@@=WM^IXcatR6%J)t``|y^w4WrwiHBs363i^@EKX zelM}U+bc-8*;r42GwN2p&(v0qe$e6M1e7K}rAZAF7bW70DHh<^5>$^jl*yM&5N`pG z$tx%$S>l(YTB`*O)hi+LKk=8-&gWUqeevNE)T-yK85J6O;cCGnXVIyCLO$B@p4{iG z+as8tQqvuH?^Rq~3ArJiy#XNOXE4}{QAf8xe#V0C)LZyZdW{QdFoymVA>O9HusQ*h zr)L2x@w9>OudVI6L;z1;v=EHiv{b}SiTw~r$ZtK9_^3qd0T;lZ>$`Agjln!D!`4M$V zQYT|z?QyR<4NOr8tyTq#bH#+E)0nJEAJ2{6ov9-lAD@s(ns2bc)_+T^C_+ zrvO$_b9={}eY2D?;l(AX*|s92HR7^rdfl7-Vd7EYM`deF@auJI@^AKsic4Q9`P?&C zwwWv$-kkGIvk1M!8ZW8W*J>okT6A;FVI|6I7n8i|(uNt(vLDzXtqQ=-J;XoFCXU`v z-pHMNE@@eUMJ!Q2b!FGBf9{NrH1qI46W8}C`=*NLw6cN$j0UR=;Pl(gvQ{hot}p1T zjjI+vr-@Y2Qv(DgYWV^=zS77w!7Ul|Dls*GR>z$RX1cQ!Ek#5AKE<2?se6NZYK%#) zSgfcf4h`_BCPidZ4LEn9rWEx6wp30>a5r6slS`TKQbE=ryDrait#fO9;uxHRl5^2WXy!XsoGBNZ&sD)1XwwIEHiq>mNPI-nEI;E7WWu z>KNarlupL3Eh`a0LAarZp?v$CMztxfmSgC>3zxvnE3crz)GSvz5mJT`%a-a3Cs{|nP9dl}wM7AqF`>ghE zoJ4E*$tagYZ&=X0BY{(o9)XNXOu2C7vW!91p(nc2#Ow8}&o(LUaHwRer&OaJ;`eM4 zv}86eyA&L?pGq<_@PJ)w^9)Eqo;6;3p%R#i!ieJzY_>GLCe2j96nWTh@fv19UEx3lvc+v9MhZ(3Uijco7w}fQ2c3O-djb7a)2tT^N zopn(})4{R7Apcu!VC5%)J7kJwYIlz^W3TF^kK+zhrEG4@8Hn|XZTK6A&)i4;(#_;v zWzHBB6$vv2_kpSF{Byr6aZj@Sl=?ryE$B_hq1b-!zWFH9X#tajHJ!5;aZHtBS8wgE zW}%<%@g?NzKKuk&kWoQsAyd|Xl6<`(xn7NHpRW&DJkr3vfWIfKFnuQTZE~!+aKiKH zkL)=U2o~iItovrE&pn2za#`^AS4w(@;xt<`y@%!$t07iR$DV%A-$zR)2puoN7C;9w=HP zAfp^+x$U;+8Q#Zd4jVNm7B#TC7y@Q$S=aj}e7!nrlkn^P%BhI^F3}b{#3NovTlp(4 zPPKucLF~y771_Si*(5~~`z;W|EWpuTTRJdvovNSl2piUEm^Mmbg}(p;JStja=84ti? zLHi(P=IvU^5^{g#B@FH+Ef;WYqS_~$&}C#7$`2MD%*rYcAX!5+ZY zL7=#u*m{f7ep$Km`x*Fj0VWoyRtZ#yk~CZ8tEMh4JU1M!n7~C30bAG~uOGM?R{3G*IF zf1V61J9xjWuzYAQd6h4}Ovme4OpxnM95u)n)7;jG0B=5&XCgj#zJu36H>jH12znW~ z;|A~_eojAQYp*`ouBAn;INS*Dz#X=$X%YjR7rJEg?xTn>VBy>>z`|0~d~)XTsyP6; z_sz}F&MRv@%{~6Z5ojf^$*vVv49x7qI$9$I;ndUZtP_$9;mrTak$n?zh+hzs@%i%p zsy1MOSGi0RO3CEqwkhc>ON^jhYa_Y^Y46cHQqs4~ws z)Mx3LS2JbW5}1*wB}&&15A83vHxA1O=p2Mh(+GBz+%T{fy}Fc?&X7RBAs!J+<(^@P zF!YvfI4gU`ryxL|lK;H+;h*W#A?cOT>MzaT@A|3kcaX)NcdYfInbkGBBy77|?$g%O z&J+Xt4`~Qqp209c;@R$VB|exO3f_;&IZqGMOpas#JKV-7V~av%(W|zM(xC#!fMfx1 zz_&5F=5LcTzSLplhlhLH&N}%NDcq2M4!(n5g}@2zq!9Sb*_fX=7y|-x1~a z`b{FeIm21l!&cAZ_5kbC{?r!pZ}pSYrnqbWb*1usiW?D zK3RKf8k1Eutw9#f=3YHqezh=|A>`d*D$eBJ_vp^QP(B%v>VfFZk5*n5Fg>n*2MA=d z<{+>gOToBR40@UXAM-3J@k)506_|TmDx}y|QSB~yOA&U4ec`dE$=1l@725sgp82i@ zj4M~9e+-K3+eiQAoUGbi&tGC*)k`pH;8Ix1xC{d7TRVYRM@D%P3F;#l`{~;DR}fyN zRChfD)!LNAC!b`*^g0F!emz&QdtKeG!BkIGU8|BzPFdON?+m{2ObYt)Np$i_-B-t^ zMkO>@;F3X@9|D1_o=J2#T6O^fnsLd}OV9Tlba`z$e8m#vsBTL*{fN`xp;ZIFuzzsV znvr<_(c>v*BBZz%yg{FNQ|rxa!ihypqxqydKpr`BHJ_mvHB2vXtPRfFYeplF_(oyJ?dF-k==jJ0;yRfQ`;r;Zy z)BW+D9#SE_g~N%tkcF!0$34_6!E-ESk@cqJAt++s-oco-WKWur20ikutZe#Y#gkK) zRPJp&d^e11`F2)jp{W9$--u%Xh zIY9J=UT6t&wF5AVU^?26{)SMLaxo#CeJas_gXr?KwFDV&O{6z8ovv6wqk_KqB|5sT zQ)UnA>E`CB`zMW-mS;59JtM_@3aa}$70}L+xl1DHNchYa_rzqc@D1=M1{&+?VpXPX zViwUMbQq@SYnVYv!J3g5jVboVye3uU!#q^3(!nZrwY=nGR@8tLM}7;0f^@a3!edbcam_rh#qT#uf4q=Z{ddZ!WQU{@(xmx{PPi$_nO(LdIfLd%UGUeU93}4NIE>0QK^H9k5|DNMTF5$zMv+ ztyR7zz-L|jPkv`KT3N|lH)OHHr1$^J-_asx#3ybvX1_e@fdPR$i&71oMZWhG03BCS zxbX>y&@j1))bZ@|zmy&3QIosnTg@$i1~4Ixy!~7@NFGCpSSU!`VsRvJo+2jPt*4t9 zE$Ao4Lc@6o`N-jLaE5#B*iiHN_>i8bX6k|hVAw_#oY2mKO&#kmkH}I*5)Z0khWrP8 z1##eE!_a3jx%tSVklK);kR`Tu#eHrl$(Ylfm}?~LujlZQxY<*QF7XC_{u38^Wgvs< zYep*R^FB3K{X5q~t3{LBn+1#Si*q@()ru3RARSAGOB3g zX8odCr+Uh9*M3sRgVZ2tUAGmByHg?OBevq`(b{hnRTYon=5A``53d6~wbyn}N~>S% z4@h%}--gYR^~o;I3$e5}PM>{Ln>#N^ae1m}L;D!;=|YkoKQwW7!Vv`i2k#|=(WUwnyZwA&Phrd8b`JHSq&~`9VBZ5%q(Y?PP0d`yj(_@{B;?7>_%ZS2XD3QW4HDA9*B)y9Q4?c@czTM>X%yMHdH4 zmxSX7cl%u!uO15L6G{3`X>4A5VUj}C(qQ35q|Cz+`2+`~5dy;E;}&7=1A0C`h0zWN zt%$|a#`b$3al{&|wIRykuOEy)`cV}f;!Mv2ffi!)cTL8ms%5+eOx-6Ep?{^nw<7Sb zeZIrC$Sn39cZ;Cep>m3jWedC`7FvNb+oLvdVibHE4@)!E#5&`P0D0K=w8DCAd;=$T zv%l?ZrF+()ssP58ZcVVq6zldmx=ISdu6k&8IDD^(a`Sowp$?d0=VP2lBU1ol$&cziLU;c06Z8nNW+e(p5j1n&JId|F_)uiEadsrGpU z&#$N)*dAF_&94^X9BG4vm0|FzTm`?y@g6%Lin3dry`8{%(HDB3?%%a5+F4=C zV0Fl>Ow`8%HQ>;))$Nd2Kqeu=G*adaxu(N2B`p`UH0~2RIgYaP9%M`hPHmnkgXO9q zCg*AJNiwACYoy1_*d?ltD-qP9To0g*dCdnH{aK+lH#acHTCOs zjvEPWAQPf)3DSH&iduOP5b@q$22TDq+atw<#Q6I|*SgvSaICpdh!(Zd%!3%iC*6r{ z_qw2ncD{=uXC`rP@GQKubi$dsea&czr`?FrLjFPzo;{XmVIlt6F_e5$o($13mEuOp zd*6=`A|cLPej<*SmY9w?i}73eC9+67_;LG`LRq)?>vwE|n~bROkU)r>&518#j_- zqPv2y9M&G*eOy|7cWLhbB=he+9!ljegWU0_8Xz%8>^DAsSPoi2IWfU1!iUe7bhTfE z?p;@7+aH9U87L30yzLv>x;x%5$Y00;&th7=F!WTz=~P;g)|UQ!kOIjCOSTljyLm-v zOAsjM(c6bEv#jFf2ed<>d(pY;HEUhDN_79=VHUqx4H`Hq(SOK@M~N1UP=0$Qq2kKl zSNYK0{Ab^pi!^-mOLG@mG&4%Ed;xDJwr5BLPX^XoVm5xqy4HWce5OrGb%wmyc>Wh^ zv>Lrh+=L{AW%y6+oF z-z6h7a%_Ki@S)(1MEU^M-M`gObp|s8Hs<{@s(+id2j?Ck7IUVvbnMHyZ_R<=MQ`V9 zU6a{zmT(K7X8U25@a~BI2l>t}3+ukndnP`-{nRw3JXGQ^g6pd@pcg$W9TAgi95t!l z7=JJOE0rSs!Bsw1EgCVqyobPruk5^u>*@f)LNz<`VZbA}BVY{<>$ACAWNix1Y`x`! z^&%iBM{%h4!l9*&Z6EP_E01Y|`s+}xz5=9RT@d#JAi53*?BQVV1m~FrbG^`g&6?pZ zTM_`W0@%#acWnRknxR|;W`6U|BE8@ez;SH^$k|0@Ims$p-EiW=Bx~i%M8f_$ud)Pf?{9j~~>iXi+dC+#- z`47{sm5&Yj8;5mF%EndxJ@DnS^sTsmU{+s5NZ_$Qp8QwxyGs6nKI%YQg8uvzFQRU# z|L4BzR%=R$;-9TT$yd8R0?7T9`0ZNw2qfuw>&1UR#WFhk-%s%yQ2pOe@&Ep(i13xb zp~r#5_9Iud#h-lFTjSBQzK;Is@naR}uw0{{l5d?aPF>owd3B5W{?%tr8O=EX9h9NNAzt6 z5EeaB_fh#Chpd)sAY&2xDQ-|@g9+9nka|hnlVC>|)#Xsj_2@BF(3e-FQSW0DE2i)x zvB4W0XekGby|QZ;u}z-BZAzZl=o3;uv|s+oy&0V)Tj$l*G+9(+G2`}?Rn zVJ87hH7i=BUtt^Rw9-^+CW z{TBcI766Co|7{&fxf{@~?|zb9ULXlSe|#_HTaF#eR+|DvkQ~hdn@EwtLU-HQ1jvZn6auMMWE+;M?h)^oQ-9k+2tk zE<&CXUUWQU%fy%mWrb#g)OEglFP-ZD{4S6x3|vxV*vZ99TXT@$oDfcpQ5lfS2nD@lXFQ%S{jc;9{yK*jj&BL4JewDKOm z+|Z)r2ZnmHk_T!ZDE7`z?-l)ZkGTTCLXeXL_^h!!_qJO7?p~;`{*2wJuz!)3g>t<~K7P-L?FJ+yJHL95;IJGw((5EO^q}lV%LIXy$5KD~&SSpg1ei|s z&X>6!Cl~AyC;=Grzm-oTlmFgA5+zA=_5UZ|!u{1M-&$Xwh>_DAqndeym!k@S&m%@9zj&X>_O6>XW%Rny0H#JtCZcCNJu7T+ZU<#9&cxijPms#&>(Z5} z38JTEh~@)SE#L!w_3+(HMx_Q0HJrOgH>}qINgZ!g&BBSWVj>dWIsS$eHakAFpqVjL z&RN?wi|KCol;24#%uo;y$;ptcBPiKuW=0jBhBlbZ$OvTf>fuC^59}1g}Uo>8D z%fnOq^c_Mc4kyZGgtVYUC&Eno{R(!`uKa(wrb9ZGh`47AkFq# zXt&TwZBo_{&c!`Ue6n^98o-22tMsYoX8N^1y-u7J44C4)_N{m4#5VM5RxRGXwmN_U z=g2lvW)LbC`eU|7dF5D!l|Lafcq8yP!SRQ+5nX36k2o4JajZ4K9`82`+b0HQa0{-$ zi}W&vpDBhf#k>)o&Jo5f-Y=nEJU*bvQU8sR)G4D5Kyz2XrE2`p z?rz^@^y0%58KMJFxvxhO=*6NGs2^)Cpi!7$IK>@Z*GL!2H3L6x5DHYpWfSBZd%3t` zTrm^NY)X$F9P^OWIOptL6E+dip*=X7o6wz7>;Yemb0=jc0;uIR|NaT<$DAxxJE0<> z`%YHq;zD#5Z_>_N5z%8qs1$a~*&B9IP8P*vxm?(9FcS)3nXI{||IkIv>Su3{w1^lr zWh1(3D?GT7u#q&YZ9&#;x+I z;?FeaW)uf!SBj~GZIMNl^Y<^g*isxf-|SX3n%G${q`J4E(!h_;%3JfWtR6+_2qW*< zqDCEB?fehd>TOPUF^3%CEY@H(b7+d8cN%N$7)XzrwvnqVsu49^OLIIQWS@5u+l4+% zkNoG(7kD$E!1*OWrxX<4PglVOjh)JsnRp4*&Ss^c`0-A)s3IfkYuXw1kRMG7nlLj| z6^{LU5amlfjR91-pHZPJ=XkBzmr}XT%RW%o&Mn)_P8_-g)<;FdJLf`ZP+z}lGtbXR zM`%m%>4;WxAkIS^sQLKKzSgFN;$ivr0#SVKL^~Gw3saCF(8_Z)vYN{5?OVZ||GEE1 zAG|0Pf;zVUkXm$8cL?>@T4wpaTJJI`04g+v22DP-586h#5|h``1eel!2e1*NA@BFjU0s9sq^diQO~oCKXN0X3BhP za{-3l$MEoKxe$S$ctSAqrW7A^aLdksw*!XV!tl*2tbCWC6IRmj=^Kd?SV|G|A2s`t zjIZpQa3i)Q`ad4(YS#5T|SL1l&?+85Z~4cWZPhtYm1}#u)flt zRhG`HGn2zg8=~}Tew}53hYoGMN1dv(JQ<%yYwE@Go|woIoA^qA?=&xzm>}u1kjWre zDTR3=hPDflYsrtxQtjczWAS;O{phzqdkqz>@*Ao0Phq&s#=uK^%;!D<+2o{Zwd6lA zEQxT_2RYTGQf(^2f>_TEgA{H@q_*_H{!Hq8R2z?{58?`lNv!FIAcdRlE(sKC98i(B z-YB2KpMDHlYRv}Ln|Ux!_d-3+7j9R8b?kfQMl6eAaBi2j%i{=TYFw1sLQm*GSC&!L z>%%GZVUQN>*Rta4nrlWvhCI`bz%m`V1zLmQ6gZ4b)Wlz{)F`YB2b_dC?oG1=6iU(c z!}sDvv#XVY)6&=mnop4IBLs!u=fA)vV5*WlrlcON`lr{1-S}R2#jpC##e#n!uKf(k zeJ}32mYjXs}IzP{JMg0w6>go58fT1C%zr&nk92=SZ;SRYWJT z?0|i?9JE1HUiFFQg;3Ru43v+=B+dKbfj1~-#(sBoYZMjH3&n?C(NhDNp!sFgy)^99 zL#+I0K}w{{YAi4iaCQqPZg33YH~5yUP`PXVU_z+KcMX{v=J`$bPx6mx+$xu<^X5h_ zA({gO#}jTm#gtc&@bp~BbXB5+YBbmrV9@ohP_45gseu8LP(qed8_%Cw-lbeJ2w7w9 z&xy03NXw)|B^QyCeycyIZbz%1=Y=HKF`s>7H#|Uk8QcTOyl$02^dBg^z-gDxd&vR} zzs^;2XTZZc`jRrdKP^TpqM5v{rRcjF;5|+kfq~K5)n=z6@RfWo!=SApF7T2G-P4{Y zgBj$5RdWwbRZSE^XK;arlf1;i;2E=&ti#Mo!0JKyB?qH71`JsNweHG!@2!YIL1Wb7 z!(RI%>I)Ry=&k0BVBBmZtm3{ck|3`Vbk!hu7A>(S)7IK(t6j6&bQ#aqk0|{)-IK6) zd5<(EB;bg-9=GqPY{Bp<&{M4QtnYKGe=0EgPCJd-w@%r9b=_!d^pjTA$+kaPy_RV` zH46Ku5`-FXu%FT-fymo{*>}xAX}dA9Zy$_!;_0(?bF^!lp|E;OiY1=9PfFaD* zNRom0p-?IJ%#tJmWk2=YdYwpr4A3+f0J#K1fltl6<@W+LPgG*pGBCOz&0$!~5fM;VlbUdb))H$VKuNB^Q}X9um1o zZS_N8ho`ao^XSl3zFj*CSZOZrNh&r>}W-kgW7J<#ojVJDm z(ta_;+B&5H%j9=BnZi&;*;+}K!h*kb@MrRA)f0a;PVkpqe z_c5E2Z@+$5L(r>S>2-PGAEG1`S)2y3`4KPw@!k}z-;eDaNK>V&V5^HyjTdcvzlov8 zJXAEDxK|E4S+ZJpRq?l9TXT)x9M@9R^=AS7EPUJgUfr4>=G>|lOVpy(mfWDRwIWuq zg@p9;h6CMG-0rt+IHb1nS8sa-f~?Xc=#Ie?729#0WvU}KCxy@ z-r|(!qbb5IIe69cnO?Z?e3aTMg1=vQl8c1n|6qpyDA$l0xoQeXVh`$z^tBXb<*k46 z!ds&%EwB&tg%h;5k%ux47!g#%@jk@y0#UCvNRnU)(_K*svaZUqwE!=E81vl2zF1F* z0{|*J3J)ky!2T>C(L~Z8=Vl)E{Ao}?2;e@H%hFZfGL7i)&~y-21<}a|^;wULcA!fu zb>E6QZP5`?_=VYCBAIOXIXP)R#GTuz^%!`BgQofmHnKD+9W1 zm&|8OK^j25TgDFd%ReevK_Me=q_6bMs7KQ_fp(B{uM~?DZu20^g{RMwW^u^ zFO!kGB|5&s`3ei^19%w!Td(mgz-MlV6-!)FhHvMS`s7HLejmhCN1}B`DB1UM-;6PF zAK=op5b^tlnmB62Mm)8Gdr|#7k^)od5d(;oz1AuM3BD8n)w5p{f{MH3IU>pWM~x@+ zV+pruo)Uf)Ck;&GDiRjp6J%C|q@x2$2XCI{mvoW7C{&Ml>b*pa_t^F%c%U@rw=SxW znB|rBuo4Bd3CPKFQg-_&(2V)f-YwJL!jWtM(Uy6e@~t#!yLMhSUVId);fnce~`jkY)l=_9wKzG`fiWPDl@K)6h6UoTI z`~uVb!4eibc;Tj2gkOmZDSa1+!p)B26Z$G7zNIz+bbp zkUX_Sq=>7kiWkY_!Ms^9%jIYc+i6i&%q1nJV8`x_?(kkxU+8OrONF_i?tjqf`n$FK zPjw4(gLUi%Fd;F*pBOKQ-csi{_b@;e$r_yyZ9t0TkcSP~K@Dp?KqIaM7;`y-RwqbJ z47QheVui!6COU(cW@~!9hi%~M^8@k>`-@+JZ{xCrLwIxJMQh|ig@X}Y!Am3KGu95} zl;Q^N=MDSzBUyP+2mJlnT``Qq73g(!erv`sqQxRJr4X?+Aec5AOJ9A^*8G2AN?E=S zpVeoDxX$CGjrD>NTnz{Yv1_OeLjh-emZE{N920my+8U{an?V5}NWtwbt?VIIrm4ZD zjUbtz_cg=y@gVx`%PxtOMNHoe&2>4Jhcb`b^S~{YcPWA!oc!SgZKZy3R`6x*YWU(5!GG*+yQ3BL1k6HXjp6Sm*Fzw88l`CAa)_mXWr_W zw7s?qx#1KH!$5SsVyp*6uU9qDT#1%k^h-LuENm;#B5x5DB668m^by@1)pLk&qDY#U zo3n(x=uTj(+JXs#-!*D;X-KPZ)e;(lKvvtQvyXm8^dsn!j)=-0WPD*Q6;F*u3c<>m z5u#!(GtmM>98d{WaIr4~Wo*mLz7@foz_ex@KTXO58kCp~DXI`wDPGqQGf@@7G}YQ+ zd~&nXh1PQ)cK@CVRdk;iR65rK%#{60PQgkva7nT{Bof^^?-mfTnH?(U2(I$#m5&Br zrpC<{Ay|1H2~Sf)0z^lVEO5QyRtg?LWiOU$%Hw){u+)UT2}W%0fKg6tV64F1=Ld^} z#5=mgfNj$Vl8|D+iHCR2U6i)nS^U=VrCxhHBBKzI;A7CKv|gQ{2vh*@ zOg1GeVjgOIICP1rRR|9Znn;~;V+r#`k{1v-GTJzZcsW{l+HWLq6RiJuU2 zfu)G^w*!h!Dr3%Uy@8x5!0YkG?ONmwMyNJ&B{vRW>->=_bRLwZH_DppNly9D|?=SDRY2e=hQv5`D)Td zXX9qF0)o{Do(WDS-!ot!7REb}>GWeiXhn?1Ce|6O*_MKy=Np=$FMjPYUC#%|44r?G_8|l2gRAqj^IAF*X)>)+SnJ7yT`E{G{2xMWw z$L{s{7gDdS0kdK@DBUZlwN1F$;BVJ&g4!~oYjE9LsaU31lbO1Z@$^$r7O&NPFLKcY zd5Cud!oAUKK;gAF%i$|oVvFqwn}7q`nV?8<@m#U8i}bS@6Rpa`yUE_+EhVh^;4N!j zhR=%0qdOdy7+E~1>3rOJ*Z2IYrmWI9C1Ii z5Mt$;4K7b{02wQ|T>;6ws*m}!i~TH59aIC5rHr__NPg~vkxjfhY2&9s(_>@WEmWgL zN#lP!u{mCn_C$&lua;);B=(#hM3Y9oF?~a~MHQsr(<{e(0N)kgA(XhYfdc5lgccH} zx4kM^Vy8D)Glx&=&sKI6zvPDTex`Eg$TNLzwLaAWB(VajiV;Tv=LhE~1h*NFKg~CB z&E|YI&4Eyh$Ldj~E?M%AaX-vWd)IIxi+tFlZFCO#q&<@pju#h5Z$)YWK5twSK%GI# z0Rub!W$a?6)$*+6#R=&>vMQxXrXWz$W}odOyYJ$_7bz?>=Zxc0=lUL6WgNLq#&R+a ze4SXrY>KG8WDr|fJy&Reg9~w%#^hfP*-y5_k$owx>IVl5N!Gh{LL*HJ{wAip zD57l_2|n$c{#Z)yEFko+1S1kRuByx(G1e;VUd#MB)~YU<S>?nlF?}jeyVX#^h2H zEJTYI;%nGB<{JxS7+tM2R*)nhxHP&H-d+jWrK68tK^;U&yzy{h(!7th>DrL~Fm4SG zLxSj5O;r!qGppjr;cA3WF!u_!Mp6-s2#z2suNOrilI1myPs(NTr$$$A18-*7Hu*D+ zuh^$mT8Z%a$P<|ZCcDBL+aKFr0F^=60A7hUB5p{e7 z6nuDHu03h2$ao1e4Wq_t!iUGtXNhJ8tZ_M-%3fBVwY2JFw=LLr6CHyl==G=878DqA z8b@_aSNr~~WPa!u&NDw2B{N(^8y_S3*pl+JaF^!usTT66P#|yvD&g`fsMrY?v9dtK zp6(sK*8A4yjtU?mu3WTm>gz44BN{qXU@8SLmBFOPRGAS<3XjTDYWo@$_x6Aa?g7V> z9Zf5?hfkvg_+Wp&ZAyW%`z<6Tl#{N?5O(49MtlO%)J?472e!ArVD^0#uic0Tm;wd$ z(xgViPpdX`Sd`#_Ph zhm9{Eh)-#v_lM^lZ!Ol&CiwRs={~r4;$W!N^Gt%(Y}PQCtQDt^%@5ww(m5G4;^h1< ztzK)15xb9?NC^=zWL2Gdtbd4AD`-fc^(#+)sBkC~6({p6VzN|xB;t#)jbI8E@!jP; zc4htXaCcrJvgP?Vwngjt57yz=o8h zg9p#G?o!PF228~EJE^I>3TwIzN6ZL3w9_;E2aeYRh`D$0#UC?|3-<<(8zGlOfQdbm zW?I5Z1wzHkXxgthfUY+xmUtt&8nm>VW^9(;2+~`WBkMDrqSh#OF0c_-Y0~R6`_x{Xf7$>GjcTI&C}Jue7;-D9Rs=^wAN%Nv9UXx0k0Qdgm9kh zne4U;8iIt52$eG;#InLyd@sB}z)*7QV=T=oJK*WVj8G@NUNr-)8MthO6TDq`U0L*| z+zy|EegMATEODu{^j@o3dE z)7apWLTGU-)k$fX*>v!Qp&JsrP$2Yc($g4Db&{Q_tUrH z86x-xv(oMT+6pgC-sU`<4G{)!4CodpaYyEq2JDc0>%G>FHQ|-mOv0qT(k4z^nkLGN zBK!5!{CBNZ#g0rwPXd-D7tM;f*Er1(&aybtzo@VrYuyG?A9 zi|5aY#3lwZx0@TvuO-C9Qwux~|zbYQp1|v`u9yXZ4 zX-;Mesfk~KH)q|lK|XX<_^dFC7*Z?mQ{^tKiV??AOsp;!_WGa_{i%K}oHm(#m;|}T znGz)x)^%P%hVLp+tItlASCpj!hz+HvH|rZkl~jPkF{HH68V#8b_JG>9-Vo0fH=DMH z(C0!7I7_6}h2(RS_fn0VKTRX3AAFflx?q&vXol&ykdVS0viO*#swheLBoYl5Eo5cY zPCGCzYW?6DRAL)Zpf1OW5wPokIK8-qR$MDx(I0+d)D#-#TrYbm*33X@Q>lHZPZ0w0 zi&cu;*p5z^HQBf}#U?iJ7N@2q+>C~wjC!zV6TxY0HQbIRNU?Ungx6CKf({hjfTIo) zG=N~H&A&}v$-;-CZl@tWf$~a5g0pxtcykM+;lSQs)VfW3#5TGh1;-M-W> zU4uY6-mwHV9}%JZ_0)}@S>JZO7wX7tm4^D@gt$xn+@0VfXAO$@Bd`5P;k=(PLI%ZX zyh+|R^bx-UI zifH&oJxKxI1>t5xY#~f%wPjxjK90HgT>-@@UN(5Y;B^=pU=HNT>iGpYN>EangZ74w z>?TAS@L_N5bX6*C{U+VWnt71W>#{vowsB_f=+&+gBFBJ62UXe_=!DZVY2O^ z-~|^{?B93?rfU3BBi)2L0$RK7Q$MJ*d3XM3h?m5^=Ag-Lqld>R2AXe@Gie-rxUjQfEPz2uKL%v z1p`!SonL9i2*_R_oyvk3L%+I$=CGZ;Z}aw} zhF^2fIyl~vO^lUI9y}?;QjK!k3TN!J1OUV<9w-1kRgj)mcaOJ=&%b7;+Jc8Jb>bF+ z-87`M@|NUnD=r9!8>H!|^@scF@ADDNy~s)W<1yD_*Es_#Yfn9Debs< zM4y>Z2y`1O9Ex`iR8NN=;n75_j%E)nd?1%!mZ)%>zlD@*1R-jI2+yd&c-r;yB8AI& zZ`I!J#M*K)rT4vq^^D&iaEe`i1&Cs%7!VC@;?nB`@$($z%O!VcICP_1v(BU!h~K#k z^stPz%wNTd(I^{D6!e<1?Yg?Ic(0_LPAJ}krHr?yi^)EJ4 zAKU`qpoFip2=mvg?)r!emC0q-2Jf@UXEi2sQnQ@<30vW!H zj*tCj2>_5grKTOAaJ|C9A%xLp8a+AIrlI>5)yBJGsH}mp%1Pbr$%ms=|Cy7p@16k? zUeI8PZ>GiXE17GKxu%#{jTXO|M~c+#RTn) z*Y~Rcnw}&^<=5~e*}z#Rp#)+W#a8H0lB-G(MP4-}9mRG2OMW$_9SU}&>SY*2pvT}2 z2NzHvEzSMfeQmRlHg!$`X*71%ydaldO1GRK+Lv@}s7$kU``I=t zuTtnG76kXYkH;D7hwmf_AC?{hMaKjA%q>}!Sa`=S!3h1Fd0nh5^+h4V@?7B$n_`ge z#H0*F56o`BXLa2PV|H;uf!r~&Sj3UtFII$3-vy8pmu?bO)tL7}QU@whw!76}zZKIM zeo7wxnqf%Ty=>;&;%PsI+?fwy_NDh1!laxmr3c?xbsdYfAqKxW_ud@@o>KS>a}-aE zu%2w;V=L$_CkU&EOhO3cfN`as0orCWREr^RZs54H|8)ztJgg_~E%ZJ}c%l`*X_{@V zY&^%Q=@;gvv2cDkJN;;{>|HwFSo~`rjoLSc<5-BDB{irWGEK=1&z|j@KumRIIoRpQ zN%LCZx<|gWjlF^K;l)6A$lU6oXc14SqMMF1KI^v0!9Mp{GMxC*OX2mM)o9}P$|FO+ z*q!e1YqK7RLJWr4LMR#QR~LP!%N(bCarRdH_&RVzU>czw-1AZmL> zh;FIvyG_`aAh)8g6=P2KCtCd^)syMgbF0XO^FFTqR;=JH3=Dii4Qh~^*BadK_u@*x zo7$Gvnq?J5x!h!#84|0`vjiylwqjO(O$W)C?$<)v5n3-^5{=%jEw}A)*mb*Y?b~@3ux|>nU*J2+gemd-yC=IkT2MZx=l=n0C;URV8c3OOw(&l+QnQ zgZoW9SNx_}>$aMhApN9UPziHG!yOcE+!B}>Y`2WJJ2pm1-!B+G&KU$fO#_MwrisCL z!SM9WyWHTR9yP#In^=%sYJ;~czvS2Z@TypOiO0RGS?JZq>cJ9tbFEN&cT@h`!^U*@ zr8(E2)ULU4FboG&li&*e1NKLXuDn%L+xTrg z2bt0SLrSuI@m1j@6S}5SmKVEG0g7AULy7LH>S_`a=cG3wC!w z3B}MXk67eE1|l40z27y|ZPOct)v9*&Y)S0xDDrMuG11%sY68+v$SxQsLPagFT&_=Wsp^DvlJU*z5Q)-P zS-n+yd2zd0c!s}JT!}9D zDU?R-m)YDT)#QJG@w=boAD)Q3;+nns-UCfoEj5@@9^_G|;2Oukb~LB^{e0l`*TqA@ zwLFuk8!-|s+P)@H?^0m@)ar~)r$jY_u zbhU*i5T3sA*1du+f8u|QgW=MThXxqT%5f6jnuu$$%0xj$C`;lWbcbz5V1|v8L=0>4vO4LjSg2IPCT#{FI(@pUAylhbN8X*sI+XTBy zCgPs~=~>6Z0{1RnBw$h1=>h{L`CM9D4i>Uaxk6sKTAqk{ctS1yN)jR6N~TZZym!h( zy~7c+TQ9D1w338r*rnklUSVr8R5)cF&DlVuSPnS!Xg}i``z>iHfsJ48HJG%;_0}?W z{vY<<1FFgMe;%7$A#k6=hZtP^Mb} z0Rh>Npo|CzsO%X?ga{!CA!LyG-Va(!{o300`+wix`M#$+KuhbQ)w;o-Sbp<=7MyfSsdHx*lbZpBAOuOz3j`x>Eo zT(P6#k4osG>$@0A_*q76(5*D(^LUb9`@V+gY{h`qpac2}ry2?`@Mg0t3u8}TEpqy_ z6dVHErZ~B5C>$T5Tb0CW%=+HMKGYkxee%l_~1;DEbl>8EKPw{FC~DGDG}iH13ss!Utm1c@FNX=cvmH@NIQcU@$Ob zn~g_%gI%#L2i9J(+rEHRuT_0G2%w{UFLN}j`~@!HpqH36j(a-m8IN5T`N0e>89)_l zu5kl~mzeJ>edv{1O|-@{Am9%atO38K6{nV1z8TWT%XyWpS2|q(K>X4Tj)%$6vT2QR z$*L9zX<VC+ zgnJZdf7R$+p}_iABV(i72QIKyP0!6=I_^KYMpSUonSejUB+8_cAiyBdatX|9qlg2+ zZ6=~oW+ltQ8u^Xe={b6Wdl!&|5yvk5q<=8)o626B-bZNJj8>PW zaje|=z;6TB$;52SJT-%uoW>*#>h1+!MSb3X&9tUBW9tPl6&6i1HD%w&%thAimdEaO z+6|r;l@N&r0c$rFHgr>0^m=0R*7dSb8JVcpnflG2*Q$Lo%^-7Y={ny&v6js|C3O?R zuL_?20^w?e(^gk|eP<6{I(_}CADNX7&kQ`y2dyXnfNArxTOH$YS92Rlz79B1+Sgs{ zJ&LBwpdR5_OV#{2uv3odv#XQQ*S{70q=-Al=#r}^u=R(eq6AMBeBXVsMr-xaX{gL4 z42%(w)mOOUI^($5eve%vUPHom;`Bh1_adKDi= z)FwdDzD=8(@@YXPd3I+4LYjbp=cRN-^==-kn!dJ~Ep^D1M)cTkh`aNErC(2ND7Zic z#Q9$o+ygP^y^L4=&j*u&AuWqS>!YU9$9C667-x2q(f$CNdM_d27K49G<*HX>#csDb z)sVk~t|?j?cwckhYBjvTwadTP)tUD=PY*t!QC|gB0BgSs+(g?=`P|#7vE;LO8~pO& z2MPLAG?tW#KW5Jx(ii8Cc%H}a3A~vWQQ!yCy=PFDr zz0+ncHdYhn5FPM1iYZ(&)RcH(T_sb%oB7t;3A<6%=gNn}xfyeff{f+fPDl85I7aD4 zt?krex=40;lU{0R6z~NX%GSE3eNgd?AKfpTN@uAw?HDx;lzFYc8m<>rXLDRHCCpS* zj#u%B-{$BPGRPb$iG3n;s$Z(C=3>3rg1v$3iWSu8M*x(f{aKrgQUE*J1)K4r7-6_wYG~vqASYhlYvlB=lLilcS$g@+Csn zJ*Bl@LdDrM)pOAai}EV``S;C?Tj4~B{Mm%1ln+iDj9g8dTqD2J70X^mk5{t$d6q#A zqfJ#G?X6^naRN>qPdjj6AF05#@>FPt5Na!{-BHm!NN?XXKfC-H;ce;LCTV>1&3s}T# zUFu_Zk7$bTWWJlsWur$pF9CD?EZoyzU(h55wkkP3Ms)nX%4&>YBB2qZ?WL4 z3@P<-fEhSlp6epCru>?shR;@R;tXCVy(qZ>YEO2pe*KTD$f%@g5Qns01g-~4K--z3 zEKB^!P^9jVonL0Hfu1rgs+0DpUR1%pc7eU)2`uN>e~YNt)*(;V+ov2M%F2`!&tyNS zXGtESpRf3!PY&bvtk`_z_Ul!L6bc(E>J9yGYkt0mV*R+3bNGlPtz|COND2Wp2KX$U zIQuf-qOZfr8+F?hrM09kW-$Qy)kNw`29t6m=8nWL+>kJW@6kK?^9tBu(~yrty6WUZ z>LP=E^~io-F*(shG0)ty!mz;U37mt=S6Aq?TR5~iFmc!+>Iq0h*k61N!Crdq*F1O} zOl~D{H|zNn>h~@%2+f`T{&dfsWJxoGTmb_Fn)@E%c{H`PJR+mus(@8yV!_Pjql(Uv zVilVnn~IMX&Dl_i+z5r-yDfFS=~f1tL@X;=1>}|jAkf5gSd50Bq@f>=hdMDVRN4m9 z513GecciDujwtLbz7-t!WS!{&hEyLb6S`eeM2p(_*u!Ob$q=L`_N!AdKEFKRq^R(9 z7;3RVFbsqqWC(#MUP_(1*1#qATPQ&fL z-qt#}2y!4B5aOgvxI$i1&fR+1?q}avoQnC5`3>6u&;ChK(e8pq{HJ!m%qF^u7$Ym{ zeAs(O5Q24xBHU*c2A>Q1nvp6BtCCKmM?d#b{vk##D)l@|l9VYpb7c1Mm-5CmZObq8 z>V%h|6OelTsF~9>{e4gFWQOz#B@{Ay6FpGIn;kGy-W+d%Z8^%Nmq%AG zhfV3eM(2Y0Qxb%Mfo34YgX%E6Ilx1Aqlfg3)%@m0JRnHh;7p(%2a0j3?*cSBm9laa zEqkOT8+!qA9akaY_-0NKaf%Mdt)2n;gtLt@ajRNi{#NDl)F*7GhOlTjcC}8;Nie_j z-+|S!VEp=09QEcwF#iy7`r+50km|N+t{aCdv{AO(w9%nnChe!G!7aXxUU7dy@w1#2 zY63O{#N#GVDRK`fa-^ocM;s_}CY0KpI0(~@fgQqZ-HUnZ;PmmAiyNZ9vT#C!VxQ`A zS!>dj^#uwX%*(Yf<;m9|PB6##26#SO+3USP0HNw$T;K1iZ`@G0xCX+H2%b_WFCW>9 zF#!-c)F7KNzAdClyV)LhgW@-bTK3qq9QoDa@=?#2xoML=JC7A4WHYv?j-x`ZOAv^M~MqGiSFtPGwVcFHm{2ZQ%8X z8)c)`2~bNiVDl}f?R;P@44guU)fbWJWqruBZ&uY0#^%+im4bG4xxFbm?QxN7z}O4O z3leiY?`9tCOa@;l1k*tC#cO9WM+y-jL1fpys3C()o2En8pc_5 z)G=iHNu#3l4~HWW?8h%anLstJcK7*`R*(&qNCk7#0xX0u-iM#UY|oq>cmc5Cxn$y3 zc@#7NU~g2DJ|_ExVnTHS#k#mS-p;S^0E0=xAP#@?t`z3)^p@_oX-TL1yA`)dq0$t? z7CLd#+==f`L)m`g5|r45=a1xARN``d(Vf!z{zMNy=c9vj0hq%QpkOs5 zjHZ*8_os;_d`d9&JqKZNZZ`vMMoPY|OiV+Kgwz&vhKges*JO&i_jJdbHxQM8vLYrh zh{NDB_yfmgp@g?Q4qNi!u)x8eEVcs)`}u=NClmdBB<^SU z=HL*hO-Ga%v6SOPtr~HPnP5t>)~zn^h5JgpBm1X>=zH)Q+dr+0{e?M#;Iin`m)Rem z34FTE)N2X?1u`_?)^l{4;gq*#nC;^b7+Er33l#YG)ztE(hd$j7<{_ad%C1^cBabMY zrg*M&a&wjnk*0>-oq?X8+Kowy5VEIJ0!2LK0;rsrW(r=c%WGYt9Q5CA<920qK!<)f2)|`BMPn&{0`3L^c0VcADAfCAlL7(0Le zAmx*hmn8gj@?2N9(TbF27{(YawZMr`L)*hB=NU#YAle1HpZ;2C_22R9|C+DiFI+8% z-L~do%WFl`q}LO=55E)-!rrYa`ghD2bjF5<|798Yl>_+yJC*@J=rs)R;43VR3xMUX z;YF3N8;ifZvuACQGHmOHVCCp-r3)h*y#IvT=PwLYfZc^D52)eq2~SW@84c+`*u2QHSw=(%k>bmG+leAL>)v0}CILRKt(|_9Tmo{f2KX zimj~j2dr#=^+^H~0jU3cET31i0Ong7bSvR9!d?M-%A#OpN3fpZ05DYkw)(>Jzduw? z3_WdVVR#NRvc%QC@-x`s@}sTlI*}`0B#{8Yl&^lUa`R#6VeUyOuEv(~JLii+|E-~C zXr~mG#T!pQ7B{#Bk_p335q-N+rO5j1qpa;1n9Wwh50_ZoyBJa2Gb6V4p zal#L(;=!0*z`;k*0p!_0RU73`Ip06|%;LlV4muYOfLv~4um&vBu&Cpm9D=V{<^C$! z$no>~Ick`xhujs*A)Sn*3zxOhR+dVh1kEv8UZ(aajM+jmmq)?+j6MI`7irGE&8<~L zOnz?+q%<82wD;5*j~pvwUl|3DKBl2f(q0vubMBmSl=glV2Q?jK*;-1Zs|HY(Rhc90yk~ zcHhw(K*CVp!UZ!uPA7|q;_i*+8Pa<+i&hiXqeh^l{B#oMXzqJet9r7jk==$JnZnfb zO(xc~T@j&~5b2(SXC`8xR6NN>pCglUOPN2gbdV)Nqqy|;L^~H9NYUAM9C@?!l1lg2 z&w=3U-Ze}2{Sg=2U)ZMI8Za`Xn3r5N`GiaHO7c|Yh#MJ3CvWrP>z2qM!AF-_1lI#&)XiR9;$#sGKenyd}{4X80L{QTjKl_=TBEoJ!23Ta(@(v6P z;V%qe`PB)u%z){sGAm3h3r>f_$#7&<7$7n~Ia9E4Y1=N|>VnBDo(!~q7oMk5*`+^> z<_&D0Iwis}mVQfgYPVCcMA#Wtv~40CHKe&3-^ ziDXCQAec&+W55b-)zJDuKjzjqDs7BTJ6B>ZybZ9p-RM9ADRTd^xR3?n3Odp(d0ZEg z|9s6rHlO8r9zoP!S>T}s28#;;!450C+=1c)u|XbCFadmPs#9Eu-&D{C=_NvHhTuOQ z1M;=*B?W#T>*t-Q1lL^R?-M+-D;c1ubDlQXcowF>RX*PVfJoZ7LSsCsC1{f z?(7thG9{O`k|v#Ll{{D4!IZd1zQ$_()gyq5JM<89Koq%_C@Yf{?(1^9H53+`{z{5? zJ`eYN2Bz1GdWVX_8z&0rxIOn?`mQMGxKpftUK89k`VoCMJfcUv8faB3G`rie)04`w zeFsn%76$nKXc_)&e>>OptH4_n8E@I1rDw*}^*o!uzkWgl@g>@qR96IUGDpaMPT(_* znS(5!oTlAGs>5<(f?%*t0-j{~isSdSD&H%P-@msB-R27n^we)v^(XD5YY<(+I*Ucv zT=ViM)-zJZR;OKnZ1P5(8wujuo-;|b^nmFA8KC9;+SwxmOk1hys2VwLIEc_!BJ!rW z{cbm;K$Ta`pLJ_-XKD;6Ld0{XM(o4EE&Kvgo{-OyPd;Dy^Wr{M;7(ROt0IrQU*)^FkVv6(!hwB@voWca7 zo`fI?4}f>f;*2NC_ByE;%EVf(7BPR2g>flzsATM|ZFjaVtl!2{=O`P*fuqTAj3 z2JkZYSuUi5yTO&uwY;Jn*1-@&hE{;G)Vm9wQ9j1 zQ1<106Nmn8<*rP8}GsH7ouHOniT0&=;4hJS*@gh<$3O)0KffR7eAzK$99^YgC4t0UQ zdG|H6V635FQh-gjdYCEe=Y;lY#+M%s+nX|zw^(n~!&&_RIKc;4Lb|@zGS3f(A6sXh z9C%S>=llS*u8O-n!1pS|AdRIE0v!jm{L#<#5y8vtzQ+ND3bni%xNH2f<12%1%qSyJ zn^8?!p1@6sdYT_^o?8f#GvjH33TnJ%=i49d@7br)a~a~`Ke*`hMM3owpbPv;lI=BZ z$9oiS-mpRLTQWzb2@$ZXHKlJPOsz-TsS_7NYf`Ts!Zhas%44>KGEvIzu^Nu$HYW9} z7kn{Tjc$7ZgzM9lfwvcRu`kms=a}GeU3FB=gD~89bE~r6lR(E!usxKfN-KdMO9}oQ zZ0Gp>CwS4>bpVtusE|wQ_4bgcATRY~F@Rt}5N|sz-?cvU(D^bFM0VQ_MOa3kchuH; zypi9TmwLZGfslUE$s1MNT%@yiA*;aZ-N}_LI6TW*bF|7rr$bz2mqr#p@Jz=_?^`t` z#a>!CWz`nidJO2Bx4ZB22b#-sJonc=P<9{oz0wmg0HluT^&K=*S$%?YCI4n~Yl?aa zVYtrvEGZ|y&T)DDsQOk?cTvaaSQ&B?EE6T&B{H!{6*yQJQ74b|sxM6L-@m{hgPfB` z@F$8odI3i)Bokf*{?wb)PY-!q*vo-m;RB+75b{<_l?mb}b_zzC+Eq7 zKtklT2GJk9gd!mCGp7{vZYpzlHO$F1L_aSD4Mf7tu{%gM$Eb^o+xOkM;N?Ej6W|PD z#GTr@(@h*rWxWVSQ1n-MSK)NP8MHwxtcJ5zSQ>_ueHV}f_%l~D4*?UjVPj@c!&Gp` zt)a~Y+HFmbAjdFLvM%1xztE?JMw zIaRH~$E?sUr=aoAbR-7n%nmhPe)(Fq`JU!zrjelr%xuX3#tjc~)Bxycnah%fR_WY{D>Sr^6xO?rQ zjgJ0BbJ`J-crCGCsMGJ4wln>cJ;b%0AlVe z_e<9Mf6~W|ff({j=M5R%9G8%1_n$;tnqrAGU8zcGeK)0?eEdc^EzT%8sFUI@j`Q3L ze4U9$d10XCd77sUWILA=iH3h6v<#C{8yLqEeoF<@k@lcX3DU79Lx$@{#@0g6pV7885Bzs$!=1|j*QeL{)S z-h06yB2(4M%ZA%^`z4nHv6| zgh9`tKio*d_-)6t7rmXH@sb>osRN&pL-!qBXM@;X^|JXh4C&=BsNRkg2V|0>4kz_u%^)!br+)W zRCHwK7r3O@#m`JO;^J&xN3!S0ZSOU|7mn4Fe<+#!@()bXEf@xrCKT#h!j{|3`l)Ty za{}c578RJU7GLj847lNYC{NkQr!Pm4l*9HqBfkQ3BT+*WyF2dUY2;0acKcP1b3jos^^H8= z9|WkoikwHuAN@}E5W-|1Q}5ySmp$0Q~yjTeki86#Sn$1!eenQ{i2pCH9V=ANY;` zp}6`th+jp?lFTnb6XP8}7ltkZt66budB&9h&r?~LTP_j!SeCH zLo~bS*AD={58J%UPyNM~*{`2-Z{MJo70hMxoCf+o>?lRp{Ch}#FN6&H-*8A2)M3e5 z=N?ZVbUB{$!!i&sMY_4A*=XmSwcnVb6x=Jg+{2c~@iOa~`@-;pu~8&Nm7!hTQu;eE%zb zo+kQUKxhr0t8tWYGLn8@EzXKm1LVK+er&UTGaHVDb5dn?E|&BUhbMy?zAP+0mRz8w z(K{--Gb$Ca$XcK=Mm8(w525+ZKn1qQl}QjWzv1rI0fJ$V??$ei_qnjuI|se8njeJ7 zZ=gT^zR%RWzqHYCyF(w&vTH#~(mkJVY=57?{%arpbt3bQ&;JJd@b@CXf1Su1(YasG z$-jr>jYQ?^SMu*6`S+0YE%@Tk>&gEflK(g)QrV>Be6o88mL-#YN@P`_BuwF`&y$M0 z{2eO=QJ*Ksos@fib!pSpb7s%YkKaDKs$zUi%0n~#qVp+rb(izcpYL8BSyz{O`R;l0 z_p$m>E55W)KV`OT@LOw<9m}~m2Za?nhh$sWFp6@7Y*m+~FEoTDnA1ub@Ox*EMs&{f-^I(e`%kT0^J5R{W^&L)I{%=1ucOU3)SyWS-=y&fXp+l_dN$of7z+lrABB)BJ+Ox5p6V|QwaME2`IZ`?v zy@OjtQ*%+lQ?e%to4aFOYnb~o?Mg!Wc@qHZk?(?e5y&NlK3o!?Z5xY!BIr4-snB1- zxZ4_5o0`22u!~9t)TJR+TZWQN?rhQw*Y_>UGQ_rQx6TxK;&}Hb+_msF+}qKbx&Cn3 zS&ufyp66KP5?$G0@up*m9BG=-NoIB{ahM`3Z^<-~s!~{P?YFm#2aolC zCyS%jdr5@!?CyJ}ZaWa`usLBPYj=$<;X8RNEHWQmaP)SQ+}^OmjS9L}!8^P)_bsaV z?LEL?G5gT%M`6ZJy$$;&_P4MC^$3ieE#2L{FhQIV^PUT;E6lpK{T^svl~;r`cg@UN zi7BqQ`iiVieY<*TF7~d&g){=A$@MPjQ7`9uC^^w5-$H9EYA^(4B5uj(J|Xy2E1#4< z8m#oZ)w#5@mORPXrR_3Q#!i|kHxDcz0Nqqi38B7B56#3JdP!z8s9FIV(;gUNUD~f^ zULbT;1;k#TK7-awl>d1erfog?(@o?1$0AeimVd6Rv|jG;{DthkRqdq>Q_b^rThF~U z#y5bIdDq71bYGaVT>EN(1nc;iON=YyWwl;;DsC2$1wX{oaaP`BCVCI?5q}=`q5|`idM6GIIWq2Au~yDsc&jU1gobYr(&kCxU(WB zZ*L|dbCnRKjM6dXl_k&-oR(7GY(RXk+t5!AZ~QD+xMtjkOzgQl zak}QBiud)gQyos1mPX7kJgiRS-L8j)mKDY(b|j~eslJ&0$dvs2_61WD)~@=}y_}J; zkZ!-r6-G$C-GjySk_o|zjZ6hNm0SiZCacLzhg4Z@yUVm;an~lzP|dLm{DS$tx}Ir9 zIIA=%o2pP_mru+i*q4xpR-W#xRY2Uv;lvI_q$i~w2jHmL!3SQ=J6Q3h^&*P45@Gh@ z%%h%|+f+1~Q4CL-p_D%*Qde{Hh-1Pv#0DNre0G`st@v@DmL=Wl-o)c=#nTbLsC-%Y zj}ErMqCzkq64*U(FO&>jbJ8_h)rh%#wXCVwuA5~vR%T}hE}P*?$+NE9{yU2bMnBSL zo~ZQekMlxmR06?LI<3L^I5n@R*UiKGX*Ys=bSavmVUdLxs!w*hV7fu`XPRp$yRI7} z7Ib6!XY$L}n3E3c5!Ci$N1VV3zj`uOcC~?wH^vw2?sD$Lu_r1f>(K{B7kpv#{jqnX%mvKySks95dL^zntCDBbGL3~`Z^O==QOM^!d81V^rck#=z}wYy~E zB(*D1UrWoCl&us~+j6_%y5v#i7`L+@g>wd~8tp@NT?6&}vK6+SsAnyzI@at0YI*I_2v!-j zb)qw;tE0^o)u}t~HfGJCodcp7MrgAR>5vn!suH)oJI$I{t>xC+D~+Qa9H^gt z>E?1JE?wlp`?AZ1p~NV+RsE!J=l8Z@pKns!+W^r^HpFqSmuvFxkxB?|1x2&pYHQ5l6e|ak)wL9DgE~ze5eB z4WB^`bV!Rzjihxp>2Zllm6N;f<)kQ0&i<(SNnd1S@7Ic7jsCRWsN?&V53|bE*TCkN zxVOGD%ppIPuK_yW_gE8a*R|Q@A4-TrLKmA#4eNF5tFPBul%>5oj^@|1Rdn0{4%@Q_ zkYr9=FLlzxed;3k$UyTcxLefi?14~6W38c+J<;*Gl(@%0M?45CKNO00`qu3i_zjvM zm_%(g;0y@SR=COfkl1N37Of;Eeqym<-=vCrYoN+fLH#E4*c3awf2>nT1*^V&1eyDl*i&zv&w$) zClhYWIm1u)q;F;Gf^Qx|Ps$yq(hgw;jx4IlN6@Q;kCc%&-5!h1)3 z=p^yLlDND6RpShK6OU^xTvq69$}T^87o+n-B^TomCF+iK6jNJ5M2N#{6DOM5>iGA= z4R|BWK+^zO{UT~2tPN2`kYmg$IXSsrDkSZ0feCW*xeF#ABy4^H4?P+GF9Th2n;qZT?2DH z!FF#qwQvvv9dZ6CVS)As{zKqaQ$=V1%rHY+RH_)EY)H!d3Gk;vzo8-N+CmSJbT>z0 zl(FBj)Gt%0N*Jlq@7DURmnyUu)#uQgl$hlmrpn*5QTo8Z|Lt&b7FLGs9xU@=o?Ql) zmwrcbK1Nk2KE3_J(Vonp5n2XU^-$Cx+C>7C64cAOnrY|Hu)rE9Q#XJjQ!(Sdj_@}sP+?1 zPdTFoozp{FXUDtOR#R;5*f^H>8@;6NsuioW6>D_6nA}0wk-dqbAUv&=+_v{T>yIr%VRAm-_b}ss`qtPOGocN1IveV6a@^I+Y$9-Ko~nJP}Ci zIlo|hFV{IjiF0&0K4Z+kf}U5g0sF+shtN9d|A=w)8_dARITIu(%E>BiqvbVfZ;K-} zkoPXdgD9!^h%AnFC^(Yldu))_q;y}i*`-R}M)i{>xjM6d7AJrR+63vD z+Am^vAdO40$^C_8>bj^R6WOEaJI?A9EYetZU5I6e)Ey|64AkE>f%(S=MsCVbQ}cWp z!5?$fv(Yl1d^zzrIm6y>umU^52t*B(?f0+JQf8+9{S+*_I&=JbIlu<)D)(U@1!w7&z@?6Mxj8*n^dknp+lEIm zxhoL)B>%Grv=LUe=8ERA)sSk*#MhmzRL>T7awP3tEjlrG)wbQ4iH3k2oY4 zs_V`)$%}`~`zrFCSr9*^oUXn44-7&hER@>dIB~&y0D!X0Q*-($D-_i=4>ICECC;>{ zcx3X$wREF}Br1iW9cLm+TQX5VKN6`H{1g@f(zEOYmoRV1K-p>E+44flcE*yH?Z{AT zE=MceK@wK#KWK`3mR1I97(AC>A?%wtcf;Z?0=G2C?Q*|VT)XOYcbQutW`JtxWJ5k; zV2V7!2!Y=o;tPw~^0gk1a;WG~fC1}{Kc6oFxx9s>yu^=el|C!f?;;nK=}d=E)$%b? zC>ISB(^p%N`0VG+U0tYPf0tuNLnU4N^X|%)vOTYOeKJU+v}tGeY4ru?8h>6#Zu{#l zuo#~#a@r_24A&d@QBj{}Juq4-HV7Os6b&qCC+*Sxq=or2+^v1AwIDdRDjFHAKhzs_ zfqANz%d(j3Si8>osX>*8~U zLWg#7(~lO>Ha7r=7s{rcd+3KDj0LjuseWuisF{ePY0Ksk$FJ|dbGC*}Gaa|N(}h}) z(Okb(a|+4|aTXkt==jgbMZizpYP*7rW}}qJEH2fR=3|?w9a2hGCv+9HZYL6orh=*k z`dUsm?nf0ou}tTMA7sbroNu*{VN=efwD9Q-?Q!)O$B9?N91>iGN!1;jw};bzn(` z>i=%`yp;Ff&7RAJe_!u~EZe^~``?=lm9PFa<8v3}_jR!UVKZ)Y9F}JC!}CYpxM#bq zf*)VDWbEAcz>O5Qy%;OvdHMC1_#JXA^*8S?bZ`E#bST`XIE*t^VVgreelb^>sBP9Q-Y8QenEvzSj&$T z^j5{t`%T3##kGai-T^bHOfR^3CULNVkW<*tSDXL@%NboDHPyYttm3qK4F-}_+WV@} zs6$~^-U@3NI~ULYnkTMRdwIos_5azIun7xw*2`LiCz`=9+M zg=Q#c`ZokOx%+Rv1#lDp=38@D^!H7)|Ka4?Pz6TPf~xE}pv~w2wVZ4v-7?;(xpspg z=reV?C+EY75rc`Q`M&fLMyCTU&9z$am^u;9KBc5;le<=SnOz|7tX$&PZtFxP+0RIAsLj@sQzUHi}@ z9m_n!{ZJFl?9UUQ3E!M%q7}t=F6T|mEDY{;Ms))iN|<@18hbiie8?2_1!Ew@5ujB} zT~|^^W8uiXnf)u3=wOsLsEg$o<5NUyy#rQ2HkB?!fd)W3O?Mdtvw)BYU%Qsk4u*ZJ zuK0=0o1*sn3p*itu(+SRmKwwxO#Cc#CH3eG5zu@Ustm{I7<6%)?5oP(%v=gb4aCkh zCk^y87qJB#&CvZ4o?tbb-4tC1I??o>{9_KcZRbDoZtn8qx&c(VN@uKobv2>Z*I0jd zjlN%1SYPmsvf~*+eRMj>86}D365|0`Fut?1y9=KeDz(~^`6KyS8AiI5F@*ID0WE(n zDR#sMGb9M7Qqb+@`rXKAz6$D5wh(;*8xuMiMzh2qZ%Zc~OU#{XP?J42&f&d%-h(#X zH`_8TLCG<$at+jE|_95C7)WCQnM@rt5liyp$ zDz}iY$+5%^3O2Sxrgl4*9+_ZP^{x)-&g;*nTBem5`NrU>3p;Rlu_zQ>g@BKMV&vIE zoxv^oiypKLdUmG;G6lN=g`{{Rm}|APLU^A+|WryFuC<;KS z-2HGE-7NV>x1*u5b-z()6pwuku~NAr)ew#+^5*)fs%JzKRf0$LA%= zBMs^PrGEX|3_tf|my_{T|3NlrytAAsB^^*p^Tb5QD*elhJJhoZ~;Do1Xbv>@g>CM;j*jWPzQsQ`v@Gm&?hgGM<^WAB#_eYXA`3Rd6%z5#jCWbc)&0u6_jnhOYv=- z6hd05>13uL_Fw>a5G0NdRPEn-IMgrwh_@z`6e^XsllL=@ncvKJ9*H@Ku zrr@n;PDejDNmiioe%@w4#elhd0M~jqg~19vz&;fW_1H3@Dfw&j8`iTM0+&^|w~u+TQrqt8H{@xD$36^L8d*d-#^?)i3=yBt zp|=II*W2BU-&84LqB>mLwgc><32QdeZjTD~d6g;6to}noIM<{8j6r1%^DJDy>-38< zqkyFssmyY=R7ow&Nzx+-w+!#h>g=TF=eWZ9)Pl31cXpeC{uF;lTNsP5#IzWZWO;=o zUO80rhrHX{Fptq)Uh4rq#lUMOC-Hz-8NTp0z(-`^>f;UeI`E)<(NusZUmW zd#tnYDu~J~7&Z97|4q^1ReBK)V0SxcA8#~|LADvmws7ljNu=NqPX=zZD~-iJWAGDo zQA^?qj>jA>B3-Jdp{cVtQ9=1{Lx~0*m?<^Im~Vj2BPqL0>}g{n_`wEDQoWEn{1Kb80=44Yjwsm-8Jlumc7UP|KV`Ci6;leR441_a*?0S#g}@gptF2g*t>0my`%7V2NM zB|`~mG+9rw4czkr0>={MkW~oHtJ;rap9PD{sew?JT2if!;2r%YnMl3O%dDP+fW9H4 zeL2aKbf>0Y8~U9f0HUzm0l@V&OcPwJH2Inq0Uu5l?B=#-N>5DZ-p81Tr)s%vMW6nL zvJ1HD6_0nj`|6Lta! z&RrF2J^(9sn+fM^NqtWGrk)mENp2v;EkI&SdZ`{?Yu<$V>6+EPej#;M8_h7Wq)ey5 z3U?o&pnR1Y>hgjqdYfTBVJoRWWkJA7)KKh0lePpFOHpIQeYWJNpT9gYVB z%t=1=z)esa|le_;}&l|xFv)& zG|DBK$rYW?q>XtR;aYz)Dz+8)YFdqepCQ^v{%F5Ct~DjITrlhSHJ-24W~S!3PeloF zx_QUjFXG~Y0H=T<0F~|JWZ*-w@_ihwvND3Ydwgulf~jYus=~ekH#_0w+vcgIKWc?H z7H~f@XsGFRqbv++Z%Dm!HY?w7cE-D(r!wwFJG9i%wMZBvq!zR4`d8MDuHH%#74=ca zLj84MgqM`&+t{>10U(rNe#mum`)Hu58sN0}e894HnU{7FLURM2(N6HEWBpat65V4h zJW1@B2)L9I|9(@h38pp-ndka*A&Fb?2JeS8I7eam|L&+b$=3kOi!}Kq#_0B=eVnH| z6+01Rb}&SH{_5xca|R~gNcOyX%%XFhl67m-Y8beC)=Sf2lP#WNY9cA15ZVcTkyX@&UqA_&RMp6O*(FJ`aeq({b z7zCyDA-jjC@-wS~&V=yvmc*`?pXD3o_7#To?@-fPJH`slgJSpX5R?RhD!m5Ky_GgR zPzJYV5YHl#WmQTV-6#S_1-0NeJ7QZk1{gf4r}yhW`uR#-+u*^$4|@jjoykeH&Jq3d zFp|(406`~&v9mDn3Naau`RQdI+cM20ZxZ<3oMh!NjHGI{z$4zv`)odl7CgiY!)Ooq z^=CAh%0}9sn`9A|OdWMGqqMaTm_r8iX8aYOmhLNq=4H+?XXA~I*hqS~-A)KDkf_n! zzPo|lBQQEYg5+H;*PA4>oqU*6X|eZ2P7q?|b?HgNq|^cvt*Ek^FA6e&Lpn2NkE|4MLnpuov5eWaC)VG z>e{mnWxAS%z0|^^kKw0>Lj6UWrS5@N-b@d)6kOWM19hUgbVNjS}yjl6I28>b+XIOws!bJSjML z4NOrO%*~zt@Ln^tnGo)5{=5d{FbrUTItWca@?xkOy^*|7qs`jV#OCeA7IUgs$PLS@ zUBSqmP{%PTG%cKhQva=fzOwP-OS?hfz;k}f0CWR<9`1-1hO?f#btXoqEmz9`7(4o@ zC0cozcnHPK3Qslh5b;zx_q+0MJ%Q@-)|IM8lPK>n1t5l2YP40*H15s4FL$>DjbhfRSO zgkRms4pu_o*}-K!E-0*N!=(yM+$vGtyio|Kb3i`^8;CJe+7>fd73LEH&1B%lJQZ^^ zD=~vRlzuAvTo)xUfrb~9%6XzzLz-BKEgIYrS^|NW$s_t`fSYAh=78~%brNyyO4s0l zUHYaj12+21JV#RxkUMeH@opy|P9fD9sZU<@H7P(AF_Ikh)MlhS{$?qT!pg!tadHHh z8Vr$w#?aDr@Z_UqSP-jpyCN}23cXFWn*@2pXjVH$L-C`Qher;~gA8n;E!cYR1g`6i z@sCKshmyBX-8aISpZZ!8K>S@ea-{*D7L^WnATHnJ5*m<4rlq+|A1;At6wA2 ztG}cxo@I349oh*t681%F&IF#;br*M!j2KCaNGRUk2(}hPofbA^3aq4U2)X zcG5f>_!BW)62c8mVL4##2{ITx&lj3c%H)&ndEt9?eHxfm`BIbh!FLTw|&%m8xk+I5cD@otJ&uXdvbRTjDFxQ>#f-4y{M?C zuD`P~t+2~hINn-yNhUF)8Dpj?>&FbEmDan#{`{`ozcTN zRt#z|jiq^JZ=Hb9u+Wou8m7K`n6;v5fY>SyMVr78P~htex}l~g49#Z{W-o&PXr@4L4H2(s*9e0Kg2 zr=^0F*`qUSyB2{Ne(239alJQ$Y2YjQFMjArA$k2#YJLZ}fmKayw5mrY$^XQmfS)Z%523#%NN zfJpU(gwLHUa_bZ!crQBo5mWl;oJ`XaqVVZPwY=7P{xTgV$RTHC`wm^cb!-`EkLh%3 zMp#KUj;f`IiDl;(eLCf|s74XtVpBPU9uAfuGS}v0q>ko2!afuCDmm&snhd^^D>_mv z^y9bY3=;X&3AV|Kb;E*6X(nFQ?#=y-yid)@kzHPtpA`-AbwO&I#nOly2yqU!^G3Xy zp!}TC2eMjP<~_|`UflzlR`NeMrI8b`GLuQk6Hl4nbgsP4yfHNU?MdF4@}5<0u&Q6A z)0t;Qs`W*t5;dEUc9yche)O@vG-O~wS(vO6VQ6cD9&X4h-XS*}iZRZgU7bqSwH*wW zy)Z)O&8ECrCyonl)i#!?sGdZxd~ud#I(35EWllCz(|^50f}mI~TEK%DRIu$b?n(Kj zJWI(eMJDAaWv25kj~@I-d&!g=R>Vx@=WOH|Z>ME!k)@u?n7>Nfid$=4HE*G$ops$+ zT>eJp%hcHcyA4ub?UY!y@9_+Mvs#4+xJ=5;t{CMjV5$aL@En}@@e3o8WNIY4j~%%J zWEp${&8>Y;P0_LlYHL28J${~6FQRfVT%!b*)1nksEWZ2@%y2g*s*B&h5|Lw%(`(m)0xIdI)Zju5n(+z z6UXX6I$~$_vvuie7K993*WdNJ!%}Tnh6ol)*iy>6GjII!{_`!Jf}l;yfcRRb@KIfV zX_coCrq5|%*>$!g+~^M-`c6W_f<@w|*ahKL{pX(fbEK;|xR;p?6Gk6JUIFzrX{eKq zG}dUDj3dhkB?mpjAXd#CabTZ%8}qBsuhzH)Om^QOH<-x{AE)QzOY>&=i)x~C-b#Gl zZ(SGFEUH;1clgaUJ$%bCn>~8)&|_HW?NU!EHzQlMtKlxMnQuV|{E1mk%+@3N+!LlN z#@kpjQ!#GM2yA(_znF0zL2l*8*&r~-DGZ%u5eS4-x1n1J8BeR{B&Q1cZqz5mZWTG{ zz;GvJ_S|YU6T3nF>04V&_h9nw|FU3ejEpG^e|e#ck!`db^;p^-&)QGCZTe5QL@lF?cXmEBX0%i)vbaIa!O0w~?6+tF4esd2TRm%VnwN z;HDB9^)*jLs^&arBhL}fm)&3?#iRDz<8-y^bT61P>XSGU=_7#}@f)^ybc59F+1#nj zTLVKB^UEiaWiK0Nw85xNoWSWwuR;WZeL|?qE%@7k4?ljv)PQ^qyZTV$JjW1`=%3Y) zyx;2!x#88*4OjJt_-!)ubgWKjx2vTwlgW>_L2r;Ry|JwwW>80ViHS<43iRtT{~y-= zJFe+-{U66;>5=xR&{mJ22ss|>Km|k)P#~!b7l?@L5d{J=0w@9^glKK0h=7BQ5S6_p zNEm?x%aR#o8Uh4}fC3=|$X?$&SX-6$^FBSl-+z6yCHL#T?`z-J^?a(^`%u0rBM(XI z8h+vA)w=d-Nm-WfT-TTJHnFM>h0V@r2jm$;!pB-B^D%;7b$WAPaPDlCp9^mjQCL^@ z&J_paYmv`Y)Ox=onMYauFV^EVr1HW?02GB+PVFN)o&+O-w`eJqhRg)+ra=voJ}c=m zMD${mq-hvrH`A+FGY04N~diD$)GTh^qe$oX~mSheO)LP zAWR3#4T$L-%#8)%+%0^1%2;uoFg;oHrLhtw`(i0_OFN7^B)@I8N!UY-TrrpDO|mHp zr`De8)2ii03IcxS4O04b69?o*cqA6Hthu8H8!pP5qIhg4#%K+fX`$Os{{3KD+^q(Y zHYbwojY}t6Lb!|FZExTj70M83`$zqhw(n%lAr4eu9e2vtY2Oz2!m(FrKJ~+#v>)N3 zWIhHnwn6*X=zH_gBx7sz8xV;EtQB_N6pi!f1BeBebHiIJ$tfiv?|0~d5ne%iP-8I@ z$x}@Tilxj5_IhiITkn^TCaUGZZDjLbvW>2XL52-;R?K-$hZ_uY3-)Yb z#DEjKkc#?&YO}KL6QB2+Hvj|g!F+MUq%4GiRdUgn$F#>G2BOjJ+lDKIXxCo4`DtS5 zH^Jl4tXVUXjy0M;+@jxkcu>rZl?J&$2E$@8Vy))} z$j$I501iOI4$5zCtfKmcLPQT(($KaNP84=d^qeEU@m)Y z!V1(hONe8sbh6Y_76bi#vv2oKZo~sbCxVGuS|0HlSwH7rh=pi@Ljx42w^nervegzJhXu0|rwlXvuisw>xZh*IEqT2O`STGOh9JCN$-PXfMol zRE!B82{7Wlc%w3@PAtH1nO4UCiHZFeBaHbRTebn>ftU_!7}38)VwJAGp2&q%s`bLE zpOF$V!YYq0vN0`t&2@~xC$QU)7yxDx+r~~4I~FjLWNbcXHkDU4EUo9IsHI**bnjPD zDEa{9SEHtHsp9;km=OaXQ4U@cR(xw9D1mPP5&%_E9-rvyd zP0Ysdr$ETC0Rmndqcl`5XeRpdvbGm!g`+TmG{tlWoaBvb6h?lenLAS=8C{6A!U&U( zc`&4W-i=A=JQQwa3~aQ3uMKey=*Z}Xg^PqV-h+tz9FCdM#5<3sd^m4zER5mwKX@Kb z#p@(Vho3ny@Pb6VN=i_xjj84xSbcr6bGf#!KL7~_i4<`ycr%+_bhvG}*fey5E{00` z8~MWx&4Uv8wa|qGno0q2pqd8UBZ#P8(4hkLFrNOzG8-VX^+Qisk>6)%#0#H$r&ta$h?t1uvi?~95!MpFA>3cC#;49vym0edn#6SK(1=*K%B!t&@o1w z=qkCB*_(*TurHI0E_$o3N<{ek7IhJPURVfk{I4Rb#KlkGFI$Bhc0wWEtZ0PdZs(Xh}wTZ zNt+iv>KC?KZe)BPL^2K^b}%mYyF!X!l}U22%Coc8QaalF4u-Ly3W4h|&`@c6H=Cy~ zqS~bAFO{%pq6bi`(CzTqZt@)~49`ZGZR}CCOv?vB7CdwC{(9?$D81V$hnv9o{Mjd} zhC%Il3~GhBHyDEH2JdX%0|^=q+12bmhk}k&{eINIGtYeBW}K6W!dj@pCh0By>gyO@ z-Ob)kDyArW#;jtdc$P1yeZaI+`;)M`6cibZt*s2V%agQ|#4q7ycW&s5K#LE*#0+-v z-e3U6s#cuFH|YNmipG>Yj0GD!g_RXwJO(|CVkb-CMil; zY;muOK1`djzpY4?Km7k`n5Pn}&ZJrft*DjfYa!l8RO2^xD6hT^)oU=_$ch(PPDE6kYL(Q#XjbNpY;bCOS z6iu>F*BrLUD)r(La-{qF92Z_Z!;m(8WC}C+y&{;|n(JlM4X5mFDX1C3P6Ar`NCqzK zITYCM6fgz2+8*|)1`lc%4H1HKz>Dg{-B+;8#k3W3t@FTG*r0|vQEV)CK2YBVBQ7=X zFp#Xdxw6icEcp<=ox@-EHV}vtSp(~_4fglVeQkx`}|b((2&~{kRlQ0a(T0gRg!dBJaW5L}X+^Pt&uF%lDw3wPWhU-t?PH{f9}V1h(u7*0hu z+!$MPAkrbD z_&pHPf78P)4#)-FF}cDlDQ~LhjD8adBMg@6PV@BJ^&rE9UoNEllqYGN_$!P zMph4>>eC@Op)KrW%&S?Y*<{|0hrDWz+G3KF&CkgO z7KdzzWo_64hJ(<%1f4iDLi#>b+B5KzmTVobl z%+1$;PFNJXvv1t>x|ath5VbzQwFV`RK_d4LGg!35AUD4om7 z7oyzsQYj5+9^ z`iDv~%5B8Cf&wYKJMYGfSkWl>9y?DCzX|4BO^qW*A_aov(sn*w4%hw z-k8_zF-7L`(kJr?;nF-oF@PUR2Pu`MtdQS}2@e=ksAKoDBi|h!?d}sl6-0B5&oG99 zM>vCuFp*C=U!P+d>iBFSE!HO1h)5dXE(Y|H!a@+`9L`N>ck};JTm2QnBhWy77dX8> zOjD(t|KQhGHR-f73fG~cmU^~RcxuH_{UIDd&`-vAc0$Wamf7|w4HF`X|G3mk2)$#a zFYa6{o%U&b#O;^56bfF#qphUO{`_kq;ozI5xd=s@-Wd49tB!-Jye3w26A2vX>YGY! z9;CCqP&kYO4Idj}1_GESxQ%Gq98AeZ77upo$3=1+f`IqCP*NDuhE3_pS|1FPs&2a`WLLy5i}fqm}Qt!wWg!17Ujn zx8ohlME5m}7rPeWVLiy!pOpxOP?ZAUDe|ki5msyx(SYR4VN-o^zpiKBgw?Rs@qFtAlD6$lAl)i-*F`& z(n5Os^D)xa^gMzTw)oZ-NS%k;RHq-X%w7=D%Pr&%!KJo7U|ZRdm}@>$(}J#kY!OXD z(K2?z)XI{=X^A8t)>={IHm3P}v{?~uGcRur$?+4Pdz3ExmK%x#I>j2e6%OuOMUs*4r2w#$uhc>344$C~p! zxHeW{N-kdw4i*J3fGUEt#&2wYy;tmI{b)>$tfX)Z0LQ*hCMV|KmQIzE=IFAw#9YnS zbJ3mv)-sfhz+9UkNKF_k=CEOlk&D_EtNq~;vUyMJnuXfb*>Nhg5R?SF*#Xm~tnKN= zG|A7Q+hCY%zQENetd&Z1Dk6!gy%j`4@Dy2z6cNfb6Qy2t5K#~nl402^W{RjL)=Zcp zohVz24cPy;AG$}f*1Gn}-Yc2bhFI9#b5i=oatWxgrNG>a8z-^M7kEFHmqL*0CM zN^U0u7qn;y^rXBnyQ!3gA@Ry(v0SIoR5a)>bBPl+W7y}*1-JdI3ur;i#bRC`Z<6Q5 zPS#RW&XzRmPlW3a@$6{}N{UwIa2-~o@jTDAT%5KxSVh9~NKY1|P{)F&u|%FvVCOCQ z0;@z!?SNpKRz#H2BUfB{Ep@aK50PM&wNkoyEM_pWqOn=}AXbzqv3K3G3C&73W($FH zT&QKb3Kawc0{g#R&`s=AgkF6*P{UAC+*lZ77bf8yNJvEs(~Fsl!buFjbSm2+Cs>{p`n*zs7^H2qAIup}kxBl_kEFLc?BCI6pG)66%+OjDAuXsd_5L z_}u~(Jsm19;m=BW10a9DAspe+%?cQ$a_+G#ShP>mKaGJS_uMdHsiOvc^_Se=&o zEsL1boUe$U9~F2HFYe;nC>rl&?So6+*ar49&F{n{9{$^Lg!6%wbpZ>D-Q;tMk~gDM zQgMYecUXEu(S{l<_7ZqR0tbxcQ89&T*Le3>(jUrs(#-_FWj-&XPYr?@Rk1Q2iQeqD zFsZ>5Iot+~Kq<|~mP(HT?l$Nid6tuSD0b6TNwajH6h`)dh>D=5cOGOYM#Guih~g>m zIP2P5+?N)OVad7n4$JA=Fv=&E>ab-cz+#5x!-Wm5Y*h?4)OTKSkNWH#VX~I7gA)$L zF_h||XRtZ68~V2z%o%83dl2*fD>hG7VjE;;3q3G|5@NmoFR^SY2Ct8Hv=eO@BY%g< zHVK=BOW$;Nt0}pT3d8+J4zkLd&Q}_5BuZ~gt{h%dW&XF5=Bw{!h6p8s0sYw`S+(|< zwMj`764jN zg|^>%h;vN-R;l(ElDZu5ZWp6~VV;UUlRhuQtEAUxH#R=nZ*&BJ6eg!i~PAH-gpl!Xb6 zJT4mhkai}dC#3`}d$=It`TE$x@c9=F+<%8pxbTD#m~y|jhJ#IMK~e$G0h(Y~GIb*& zy&!!+U$4m6JlcvTWd-#16U#_~ZgV4JCb>*FWZp|30x;vUc_uR391(^WOw|gf?}66h z?5jSjZ_&Md8+iIFUua+HOz-ZO#h`Y@aw9&jJ;){C?~g~$LFX|Kz(y~JtIC*rSs#0j z#3o=IYo&6~Vi=z*bsSn?hk}8Q(3$}fW`lUUSb_I(zmn`xJZ3P)nvg;%A zr{v*z`AoP0zcZ#WIG8+~9MKE{Xe+Gb^80R&SH=(g9v%$4qx@ZSrNORQ`P<;8E}?LRp*> zKqz~R{p(J&6qaAlaGje)Whe(J-mxp5KKn_A z&z4a8%jYV-g8;zc4#WS;_PKriYI5g2zXqpRy*u<+OooL2f9`U( z8{{Dhg)=*ChiA0t{ZJNLP-3GDjMjxgx>3x%~v%HvG*MHyc}kcB<45*}D|(7eXe z`37>uC&i$lIR|nty=^i*^^^Yl>0)w3(%Jq-vdgl->a*M5W%#{YL?mwJOc(6g`@Lv@ zVp=VC*dg{mT)_LqUvC>SHVMXl=#zi6uAa{t;15RRGksI!P*K_Se6NfQDavzuREZ=ff50v8M-D@N}g6`77U^ z5e+ti(g7HVFPwEA)h?%Xz%&R{AX>78PpB#lHWo?8IRy{Rw60KHi1r9Ij0pOtgKTTY` z>UX$$fE&L@T~U)Vx{a_yqj`n@Vx62~&z2UyFuF>wIY!Xk!u@rgJy);T4=1w%RN=Ia zkK%>8lf9ya`xp*M;m-A;uamNR2KoB8v4kvvM-Vn_zUA6gz6#TC&EBD}ZBIE(d+ZM9 zjCt(&levvQm0Q3P@L+!AzN#-Ss_U`}gh|7Uz}@z38F?!aGE3CZi?6_BWqLkT4y^>w zVJ&P77DQud6CPE@5_Z`i6exvm42)i-@fQ*(^r7+>@ZW|iZ(jIlsFK19R+l6X0mv<& z_2(9l?=%bW zvSkiw45x$x08IF;cLnT zz_ycggdsB>k*!f@dtkdYlq5Ha)|Z<|zh7wG;|91&p+!$4yiB;*ZJtwa>X{dXtsQ>? z@X!35QpBh5(UAixDL$?bP?vBx6aZ;UDFOki6$O8C%CdubnFh2W4ZK??{@(;W4gVKG z&o_Tf&=dB*5cHIVck&i=F~q9%#_H(XPGK=eyu4gx{og|wv8 zCI>*gVne(x!_I%!rm)tIGMb6L+M=Lu5n^$BAR=qL0rRr|WIIpk_k%N7$M?9|i*%Cc z5KQW(s>gLDYZzvyLZ`cC5IB@+&+tn(mH)?G+0Cz*0}nxVwX=l_UD_Vqr5^@)MPQ0X zi{vuY^OfE-;G-zix=ab61&wR=N)4+iHybTlUn?5vu5y z{np?qi1eGlj30E##?_w?&H*#_Wd6yza>Y|^fET4CK8~gJ`@a2mERa_gM47P2Gfk7| z`Ihb7rP;4jVC;O7og73Oyi_p4obd~tTS3Vl>YeF3IY9mGj8korKnnO_O> z&?a*9w{vDHe(9XS9hwhw9&!YNOEOdfF_X?Aq=}X+ z^akWONZWuHpMYrR&Y%CTTu}>nuJ=awnPVg7D=G;ieI`A>O(SA#vTyDW=^BAZeV(o- z5M?&Ce1=**NO3o=)NMygLnoMNbUG^k&uTCC(Tp zbg2)iR(;kn^z~>nAc83*bn9ijt8DXI?bXIzLTOK0MGI@G(TdT281p=EbxyxiISkz% z<^XtQEM2GGK2?G`D3;I>vYO76m3I^3?W`%Z%yAduMRl?GKQI9C^$jv2vT(+~3s&P6 zk(yhxW1j~1qxcqxVcRJ^N%Wr@raT`9kU4*3m`=d}sLxDVaA#P5-x96R!%I7^fnon? zu4=$wK>>idR$Y`_1bh>gH(y`=iQw8?>_x?^b`M(zy+hjck&R_^PK0*%*yOx}2x(Z< zrP;_5gDlBaCB)^Uf}~32bj)buTEqg2j#xk~2vY!U3Y|uotu~^Kk<}39gPwf02Nr=L z(>q%N#6;bU$*ZSpY>}~c#qnBh0NW*rd@ktt4#n?u;#E%%L?q7m18A?TZF1*-*EH}C z)!_D?;!yEDIVrSpB1k(D!XQS8DXfe8*L}<^^q+5(a{gcz@|uMiwgUk0!i5dh3Oi@d zi2}3?o~Y?IKiwZ{x~_goNiFD#_;vEE@5A0fix6$l@sSoRahQT*bnxj+Zq^2f47$7t zn@U54R9O@620HN%!5lzr?gjnceW&5WXCFk^Y-QcYpL)eJ4n%U@Ymq9Cl3VddK}`LJ zN7R`I6aKa-EZ_a>hW1JR(UgXvqo+%%!rznir~yEu5L&MuEXYU(VX$Ntul1$~`0t4s z!n`D#SlV<~kJ!ioTB>YRU654hevyzAEbX|hlm=QUw32EvST1*Rh1MLGKIHf+zD(nC zjn23sBOY)@w;B!}89$o$89JXPc*iaDaoEbvn+UFA?(0v#r}z=x3;DmqdpV~Aa{@>~ zbfq3bSF>B=QBOuSn>}=83HE1)e&}G>?G-*@8Xnlt=Y>kOmAU$IRQ-qCiA8NBXjUoF zNe=+B*xkI_no;7XnK3*;MnP(LNUaGV5#NCT=Qm^g9a8>bF51HD8f9?2K+a%g!0%rAzENzp? z(h-K7Y0!(v0i~>LCqmH243F1XN{JThyDtu(< zVts^;0gMgrAXg^=1QoDa%CvNuL`Rtl#h_&lkSM4bKv1*mHwDv&{OL{L^gp2(QYin3 zV(33cT*6ASwPSATE1$4IfIgB^@~)>peV=5I(A}*2J1Q4_^1v16;|zG)Bhar^sw2Z; zu|rpkkMjcd^BK>TQ> zWd~%y{PfO0VG=TF{tG6d%}Y!|J-;yt&1jn~u}pYG6aM8lgf~XFyYxxQR)e>SMj6rG z6p3D`bE)Qa1Bvz<{zpF;buwVFO8};fKwIF*Khy{Ch4_zJ469j zE+ft$RHe&s_8QegeLy3pj3BZ%MirO^T|i5gb?w!un4)8K+ABNN)+*gg)f+b22Mh0Q z$+4m0na81q{Vt}WlwOY>s1{+Z-|9ryx=l>7S8OW1s^cQ(Nt9M9=Thq!`7)A$;=%B^q`(sy40#1Q?e2#jdZr}7equ#a2BiF&=G)wvy1A$RCD z(%wD79X=`i=7H+vC!C{sL&Z*nZL#JbTk)sQT-xrV99@L>Q7%t7LEET(ZYmFPK5c7} zR4nBWv#v(rfW)$!@(IDv+2*tm*TwybuinY{h3c00g~B#1@e4)C_=UWh@+?C1M=Ko| zGJ-$mHxK{C^q##KDq}F~1E6pZP0B7^z)sup0JB*xG`MS*xhlq@Y73xc0-()Kw5|iBauTso8N%Esykd#}S+@iP70{>jS4R2%t)G*J- zvM2B(GXn=<(Qwr?K9A*h$ASLq17l6^VtQ}o54DoQg{kH=5Y%*Qu4fVT(=ireBJY69 zox$)~mmW0;S+6PW6idW2&>3o}eD^u$kTKe{$4HZ4$U3`T%jgv7*8e%CkWd`9Sp^K_ zF94#ApR?!B--}m03mn@v!RoYSr1I7JI)N4PXAV% zhIt$crWwwZi&6RAvZed|ILUn})`` zs(QcGr|CcThtp)}q9i}O;aB9ofxzi$0@boch+#1tvmphn@_XgyTn~aY}32g(!cJCpu zdbaddW}pVk*?3-q-0fA?Le~bZ@BpRJNn`1pAf}F0c{TKoD;YNVW1eAs!WMcZ9W}_; zOIHc*)_~hs8|9!&BUw{q(pw~ZatHu3@_r5&b5Rc7LY$iNE_k2v0sycJzQP4Xhrv99 zS=&ueE@e&lPcI%cat_MM!^^*(obwVx^ zYjo)MG7mVRx~^Z=oWi48^!AuVX+t{ojLaw;k8GToMIthFXPzI@l?v-~#3WpSgw@|l zof@48yG;-!K(}kUfjIJlfVX4i6H1!DtLZg>)RIF^&YRaHb_`wh*kw|ks;AY-t59$1 z*1igGQ?CH9*e1l6?j)+ePF>6x!Xwr$e=O9Xe}#WQ;^aK}H9%Wz3k0T5%L_cz-jm`Y9rT0n0 zcu}H_EPlNPSf8gBLk9udXqiP%&0TWV%+r@WFvoVVN1%x*GcSQAo;HIDUPf&D|7mlX za_3L1l^tMW?NbkA#Lw9?cR{h6{*nJK01JBeEdKfN@vXPQEBoa%nW z@{2?Hwc^&8TjIqnt@tCr&i#IN2i%qjf1dOOQldhw!R@pvY_Ox;*y^RAR~CJps+1eV zB0ae*6?1KtM9lsZ5%YJ+_|74Irjul`v{KLT3pbUN9n?WLq)K|Wj}X+`Bday3=T4vt zjB$*Bj=&f1S&@pSaY|g^WLBF|4rc5&e0GEZ9zA%TUWm-rpxHqgO`@wkwZg9i;1pX| z1WxyPq9{0IzJp(F;Azxw4gZlIY5;(+_e`HgGp6&UWDK7okh(JyKLuu=@}?wgp@zAY zS8N$C&ZML^a54uo8ceoQi;t87tbP}KKked6p8jpKQ}{qnFF#it!!!;& zUE&z0<4|beroM@O;$yj$UBr2TC-3Xu0w}IBa7y^%Hs?1UI}MF=k@7LPnYpeW*jqRG z$Jw05{KEbI9eQ8*CaO*h#LF*zN8dZ|ZJ-MoQ^q~@={IQf<1~&FE+4y(G8=G+^C|eQ zF<~pUQny@Ro8q3WP92Ctrlw{4OzT)uZsktnG~#=j2ewdQ{f-a7<7`Z;^I)}R=sj%S z%-qX3)dM)3oM{hi#x3G;_WX}leXy%XDWio(bsgn1du$U_cYJyovd_>BpqOOrre15$ z@^LsjYmSRP*)wB{i#}x;y7mFe{Rt?D$D@K$a7AQOq{@@xHvGA>Q15UusKbM-F5$q= z&`ZP;!)uEFW`zyE%Bu-t$K!Lls@1!)>!l-9d_o$?jud3ORDr_ z{ABU9mC;XTeg=V?4lf($%2u45opn&9Lm{p{=To(meZzW>5kqjA z-|wPk9_jGiN`3as`@@pzZTJIblqRqwRl_uHj`?V@Gd-5q)ZY_}0Cc^E9o1KZte z#<*!7v*P-Ax!p*LyIZzP=zY}Ll-iScq-Xz9 z7euy?132lx6kIeoY3k$RHobFa5#HgGVCm@hOW*r!X&p00y?Kzq&NfXKvjx=^$0(yE z1-P5V%XZs!c?b366)XI=AW;=jhjZOj5^$WA+o&&qCrc^xDd>(vg#iIq0CCvk`vQAm zFbN3wP9Wg*IHf8e;4?tLkATO5e*>$$%?ld-Waj!gz3#@{x8*2%4v*|G{02zA|L#w; zT(<9?qm;f2aY%=|2lp91-~ii~yTOk z5Y22$!5w}9R!+@De{~yo^Q?8y1#d4+|5q;2H>k*nQ_J@GeMhZNS?OJu!(GF1ZmAEl zeG2Yd%{qg(kvNnmIM%n|l+!`Ha5!TJ^~?#h20?AHbm9P5GZ4If>jN_;24-w619uac zpi0l3iiasT)OQgo_mwO9m~}|6MJ>C|`_?8va;Yi0NR{})%S@2Krr$tAM0j1S?Dc%M7-JKa{ca{gyPrmafUR?5Y_7*wi$@X6pejk3%5i7lAm`7HsN1SQ40u73zk^JI)1_dV4|N z%KXruEagO*aLvYPoUp_n1SumGgm)=8M!P98^2rB1zjgfiiV z#{tiR25w#lxcN&1NC%lv$WHL|3A84`8l0fu{Rz70=i?67`5@)*WY75Tb)Y=YQ8(O! zlrK1lR3hb~U;NoU?OM7gw=)#rH)?c|4#|{Oynz|zmIode{Sr7_%d^PJD8 z6+2rM92Y#ZS3Oz2g21jyzC~}#0#H~Wb6HOKd%#@X1QHhv7Frpd@1wJoT|0lEt3PEr zeZ^DVA8|^x7V)YpLD9|!*ruH~TNMt2U@l+XFl>!w$c4CN3!H^}1wkp>+>(HYvjje- zRZsh7D_)<0V|4l;sgEq;QQ4W`<-uIw93Tdrb|z;yPryag*FD0?9kUFwO+H0=zN1ya z5-93xmmcDolb@OP``_oKx^&+|8L!XqN$t|4;*U_)yK5q;so6edI=Mb7y7{<{xE}6% z$E~>Lde*mbwQr+wGe7KcpghiS3OWxKSdpi0c&@xn0U2c%v^g!0^Vo9PBJa-Zrh@n$ zKW^KO(>O`+X#+QLe&Q^?3g}4?IH)h9aZ3j^Bj^TtlKbJH5>)>Qw83ZqDW6ysry7@n zle4xCI^)oei^^YiQ1>UC@f7g$9Ve{u7d%_>S^*#gc?P`V%~m}SEK^NSptT6=+1j9E ztpTYO1_Dy$)jJKZ1077PN>EKo!QJcw<*16R-GtZ64@tEZsd6W4Hx=j*-U-}+R)7X| z09dj#Fd+BHA_0|^IesQ6dI~_Cb^X%jEHbeRGDtc_Ihd(#Sl3=YGtv{MS~+nxC>Ic_ z9$M~ko_z;mOQ(3$ad04Z;LA0^kG}@y_hD5W>V}COKK_2fVG6q-R;C1+p)8d^%8CnT zC>JuFg6<}pQ#J$Pbgqw6l`Z;wImgn*qZAHsXVkkFTJbwA@F?&X_-rS9$A)u&&n=K* zebQb5*T|a@NKAwWBZx3rzIA=!L?DH5Ye`J}F_&(4E&$qou(aTb& zK5MV=aR4HJ8Ejz1MkK}Lq`jsrO@9BQNBw({@;`$gH3j$Au?HDZu*2{!5TTdLEzgx5 z@hDBO;}hTsp=}Q`H6`08N+%J=Am_H}o$b1;u0rLMf{9DY&F?i(9a=8ffpYKuGmOEi zfWDxa*QFOxG@|$s$bGgg|60{^_@ga)yXq5Ap1_95P8MSVboKtT%6%jNiQn~=H;Kp2 zo2lEAh?6@BtV`KlT)j=u@jtOzk8SYAEqXgwsZ(D9GhzUwOtkpeXUkU4OWxtMZ18c6 zJ6ko-l%ly~Lx#hwn8yG+pWwj&g$eunzZ2Un(~lDezT6eOjj|r8-HO)%y4~T}rU%c^ zq?(*)%k%M}HUn#(9#^Z(c|0?+rynPGiZD}GW*aa6Y=_~C<$LuU2Nn;0xep*y zQ>zkCXu%nL^!)@&%4@t#jEr}N9^4d28NE=9j7Y%EjFf?10u*KR^z!d&tKbBEPfgf; zlwu8Xo5A*S5YJEH%;KI6wl?9>?I10+phUSqTNS=pP&cdr7VQTox7B|l;$hR5XB-kx zZXk9_<%7Ttd{5;41cwjbvn%w%%wftw7Z_4LIf!yFcREEHpE&cwj%Az6eAPPx15URe zNlgl(;N4*$N`b|p9%qi*>fsqc|IU(Ioi_>31SKhF&z$LwQ~kxnE?|#iJ5DZlnZ@Wj zxr2Ik_cNabZSWuh!uG5UAjs;Dz-h!i+tl{k?(8U0u83BJbwI)Vfr+pH|9o%xDcRTH z%#I;i@q2*ta!&&95#XQCbY0#Jk==<;|Smx$JzFGzi@D z1W?P?-I+dZ-HEt0anBq-><7eDZrD}@pjdU9}P4JUU~D}jXX z1(H6unCBz6736!RC@63;*X%imC^@*BO^4c+yw~!*oUot4p-x%iBke9yf^y7})a{=8 z6Mx%CH%_UI7_VxuK4Zoo7{))bN04_#|Q${+Z5#v$mnd8pC$wq9Ov#!uK2x3==J8VgqdAU5y`hLw$ zYCiB9no(BxSMOXY6DRCvKbW$bnV-vIk@EK%cN-o7XLn(_9Gtbon*opJu)fSEwYwQt z^Z=Ol_kv`<5~=kF-22_#R+Ld-v5|lB$M~a>I7aK)c+_QqE&kGd>yy9jxeY}5&q|Q; z53)23L0){&Z28|toTf~C->SFsloP)3oj0ZFguVK2U#;-~r_@DEP(4$<)9@|`X#YgV zca``!e1~+11B2cMXbq~~iCrIT4)QF=WndC_vo&|8qBrIFpZslG#bx+?l&OgozV=-J z1%JZ+#D{f3nV|=ksA?-nvUs{&_2%>Z?d8pT%FeZ|(JAEzrXk1lIDu@@VGz za@ElV<-(s7K*9lhw)+YDcOQ;}j#C;MKNs}+-m+!xC!C_VyYG)jC1l3`Ca7I|HA7!H z`6A_^pMMjG*O(ws9=FEZ-M7B>;gf)52JcT${c-tkX95LqO>m`HpE$7YgD6fQwTNw1 zGiR3n-`_`9`>ZN^*oHsZ_4v$to$31Lj?fj(v&e`)`M>j~ag4UhTGSmUB0k9KE+DH{ zv*J`!mjCaWS(?=9!Z=*?{VTa~?`^@eL#@ug*qo(o{tFAz1_}?`PDGsjZJ)a`XBw|& zC8!qu$&X)X)7!nP+$Z&W)sw#+dC?=B(wlhappp02+SNXUd)GI0RBJz86O8;Qe{`~$ zhadYC;JVuMPINuC{;+M}l3?dr6dgv&g%s z)u_Dd3934<#uBwLrYiuYe-|)81+=71i{fQ|*(DqVtm1@PF4!Z*0!%v4|Wp||! z#3COCO(1J}0eeiIL?{hBC&nICfRBx{F>0Vh?I3tqwGPT{N*#8t2lxE|!FF?2-?W>(gpGxgRLVJDWR2fyy=4-{;eJf}~?h4f7(4uuP6r!C8+mQY)E6zWDF_MijIM@#O>)imaKjHPpNLqpPJkqjNRKfr=uZnA?wQk_eoZ$o_8r3QLx-r4Tj4gM2lt!8P!&QM>=n&VEF-^G`O(_9==je}tti%cG8h)}Thw0#<^#PcQj7loc0 z1MesEBOnCN9QBgcTdk}E*H2Ete6?Q%q8|(iZ?R~$(I2k7G$531!Babmb$<1gR4K7^ zchiqH;$QbIY)mm>U7};1UclVf$u%i+o8S)jjp34rdnu27t!uQJ9_Sd8)QPi*NUoJ+1lNw=r zMING=1(RbU+V-Bq{Fy2X@F7i9qSQU*o!A8SDjnqD~=v!rDXcqa$4(`Uy zOSVBF4ToxZ?1(qMuP`o)pQZr>t6aCTzZz(lVUuD?J!*_4ZNqJv2*bdNer19lb61pM zeUoZ%hU|ggI3{}486!!}s^POFW0*-;&HS&=0L|I8M=D!h2aI9^(lMY-tT%XvCKhfAgv~Ck#>-56 z$(6Set4|!h`fc^Q?9}OsMq!MMcBS?O%*04fVsnljssoxOMTojPa4G1TS?c#GlJ!gQ z7d#(hnlI_oU1JTaBs#LrWdV63!WC=^dMJRu;nm`pFsEkX2Vf^Nt13_;`1CX8%kz-k zC%Wc+@GF)AgFp+Bj#9^QeMwo%K%h;()aT%8z8;ELer>z}VaO)(2RG}@231eo37DE} zn&XUBI6E_{86039l=t2uX+OH-ay5C4Je|=IKv&3PB^fen3e>I;1^aUPp@!*DsocVN zKb6tM~&ZYgqZAiIPfhb2mlpcp{XHLcxTTTKkTA`&%nFVsh?$S%h@T;x4Pi=O9S z;!e7YRAQqi8vt=-K;VLiC*9CMKE@Ya9RyY*RXXc34{ee1&4(ix2X{`+d=;5=FFt%WNO1ig7%*j?RR14y1vlr;( z6k~VdzMBJ;ZOm*l2hiSJqXFoSsz8%SrqUaCT~!*@yJYBTrV;}%U^M3ji}&@DdHeA4 zBVevT9eqckIHa_1WI!GczS~SoQg%jEe}<*lqYF~m`_GI(MgnY!?v%?NUVv2m%e9)| z4jxI92EEz9gIa~23nNRCc#bT195kbY zBc#hF(63@d8$7Dzd~|GMNKrhGgX;yx7ZuN@x^IL?r4+(~uX_Fw^VbEW1|erEJaot* zIFMa*wxCDz)uE#n-^xF7JL3;&_*P?Ea@@_;^6S2t4xbF;|6FeVkCsl>Lxb)2!z5P| zl1jJiz06#j{H-BJD~RLS6JCBZPs;~`@(1nFURCU#3x&brpKfxYB7Y5^wCdf8Zy!!v zgJGcRsdnMsE2uRINOj9qhoJnq*A474sCvK*Pbqdcf~lQOPV}G8-Ef;aO(JZcj>X^1$;60W%o{oBw#|Rp((6zGwNvXa zp*gN

Ar?>1IT$6e!l}?M|cF>6g8nxMfn*zT*K0WBqmg#I2L~U{OP2?_U0Q0BD0n z)sik}KNa)K!sk%00r<4vxfj>$o?$AJ%^5#^3pt-0x59hF zAg7ZcpK@^D7j=-QNnc)H0l8ij_XzRMHH=yJc7q#9AYhs$dzLuu-M0B)-3clx;%f8H z7mx858*DnN$x?Rtw#@xCM(FH!hGxm_KNxz!v*XXZC-XUVk7HL-CDj3A#KgHtBXs3> ziuR3eixpI`xu)6Xsi~spoW$UL)ED#YTbNT9^{IwoZ(iHaUFngS-S_wEgK{g%(+}KX z7b6BXQ+XsZYmPr-EFY_j zyalJ5Y@#Pu@$I)hqUpV}{Suu0dV~h`xsTU|EhGBnPf<{mJ>=@fuYd0Q^>K2ve%ZXc z-4`Vp#Ow3pl3_``S=GR9;sZBpN}-`S#2~FVWZn}coxGQPTT17e>))98GSwUTpT|_V z5zEms=xPxCyOeNrfBN$@L#~=V-pZt$rQ5a5Gqq3)Vni5)UaHm!>-rk<^zGjI`r;vB z%67KL4^}HhJuBG|NYvxi|4G+9uMFCnSAES!?mpr!U+X`5w%qi4h^@PkF~1|vD;XcO zgWZ!?*1NZHdo#?twL>T1;@3ej|5TmO881W9j&*!*6t%b8>x(pg@UT7;v1)id5~>q3 zK0EZz-CQ%f%H2o)h_}$<$F#5Q$vQ&D)AoNqJb<1~6W=_Qh`GqopknnQj_#AH+ztJf z5v9Xyn_`K=MR6ccHYS!XqE)ZUH-nPe%2(9wGP=MN`!B{)NmA@M1NM z{<|*w)J7EbV9mzSj>AHS$IMjcq`{*dbzk{s29{$3QpIkPXY8RM(O;DmJ?t>aijs~cmaqt^FKf5|f z<7P|qn#|7qzbe8Db#?f0+!&E?s8&ApMr%3Sci0i-?!6JFe**J1SNsnML`@6H>D~5k z;mF3v*4t9#*AlBL)I;BjV+)W2t>vd%&Hs5T0iCqnz(CXJp?B8a0xyBZf|M~{wo}o= z^zL3)`+V5h(Ko4AHLXB@N27w>^lt%&WeuDa$u*RMpoIH0%Ut=&LK z+?NeylD3i=-zNFq*1{YG*V^g+xH@mfHDXcw9YVk%2thSPDr$S+T~guEt;P<182S(4 zu<(((PT1}%fp-*l{eSGecT|&E+cz47fk9DbbVfx4bWl(MQ6hvM%M7SA6$R-yKoCL* zMS4|KoJSB52+|TAkRnw=Zvhzr2_Z@gNq~SfDIwHQLXvL>eV)g8zW1DU&bQ85=X~qD z_dmM0OZL6@wXgEKe%Ey~j|rH*jivc6A~!wDm4BSiwFbat@E(Y1&fF7AhWp!>)j}Wa z{a2<}5W_dMODv1*LvB+`)E={NxFGNO(ejyIwan19j|+%FSO5#DosD#HUmOoyOzV!~ zudvL{z{Ga97bd0smU4Wx@ug&I_f}^GRnj>MVwwR&64XqP{zeg&}uX8?kAGon0~;VQA?U8=QV$4sVlU zz#Fv3G?09F^MmU~k}68!8&i`_HfUDF7?-Bc|1@@CCM$w9laM1C5x7|GzTVI4l8&08 zp!LgSA&~jC_bca%gm!z7gg+u({?WBB1^F~)G&kwEkKV$pgS}@vPCKl~I$JYf?!5V& z8QBB9aTQF9TG}*!kljAK%3t?bNj-jxC{sL#b(d3k@7MEY)Zq+$gAVk}_xLc9M(AK~ z-<)ERiku<~&u@%JaC{2Tihehg=ect1` zfa+`#GPB60_0pB)UdoW{W(1%2*YIOiLLTOiFJ>z>bjSnmug9<$;xsl%rfKIV{jto- z!NFZ5!{!$*5O-^u$++wtQL+pVy=^sCK5N*X5b5cC zTM^ci2JymPOG&ZA1x~LwB_-ucs-zw5Nh?8~FBX?j)U;JH_vNt7qV_q2FLo)RcU2I| z@~idN#*;au#SX;NbEm5nE>>4ENH0=18lOwtZ`V+Zob1Vq*lD4}It--WCPyMLe5E`< zlo1x-&4g(Q+e43O6Bz6Dy!lZxIjPxNEW~TuJMq1)L85i8oFEm}k6ICJXBp@QJ?@9# zb$)t;GhqlGdIyz}p6NUs7DU!f|M42N#!Q@GK0dZJl_5#mAo*93r~Bges@@Rc2kv1pw&4P z{bAqF3&s~-qUcvE5dADUBQf0~k$4C3@N8onwhs55VO+$JM^1%jJhEb6KpnN9GJx^2 z+{!kBx9$lQ_Nhn;(+Qc|l%K&8ysFpJ#l>=l)S}R|O*1pJ13k{xlE>|#B8=PSH&A(# z9y8^3A*rjK$njJSda4E_JIdqE|=|{UA zXjR0(EBpB`bghz*-s~p7(3XoXR_ziLC(G7Adf{elLtVbr>ROJ21yLYG$_dtp@AnrA z?18;V`}kflAC2*WM~%d`#Pw2WaY63KL zOqD|TGE+3%$!B#?kSe>Pi;&d}J+V|~EN6D6usPN}>K0x!(vTZlmNfciZy#wt_MmxQ zWhvt~dk*mLBnNel)#$clhVg%Cy~?vdj&JFNODa&27|R`W_D76ZhrEZMrh{&})`#Xd8os5y(N!ix8&;e8>_Hy-)hlhiN8?6*)CdvzvDcH5{ z9Z?;RHs3xjhC$~MK@I(T+DMM|p>v7EJvQe1n(0H|cb9peJ^?uxr0wAuey1EqbYC-+ zgG9cw5bfJs$U{ZR71xDXHvS_nvL|AOJttK&W@v$--z51Cx5Z*)YkM9V?D(6;vWQ36(W~ z4U6t;DgEh{jJX0Gx$00ERS(uuo{4K%U=aw5AN=WkHqp`_Mb+&@BaxKZWVxQJ2<6Vj zRAr+Sw)V&I(^x`MOu*&ASF)XP>w@qEa&vEa!4IdbR6OX0HU}ULq3f5Iu79|%!w8*0 zOZw;P?_lZ*4d1tqs4BgtVm`)Ia$=)wwu z9c#VrR(_!bFA~Y1M^sh+@sx5IqN%pzxsA{~Gj60WGj%*6r^UW*nJe$ohoou99);~& z{EIFL*KW{wypZ+7X}mOV0VsR#Sm^?&vgGN@RJ+<$y)))sDMIp5t~999Pxv}9NQrvO z&h00oULc8GER7Suo%Oy9XENytV&ev#r+tdzR}^;Yo{S2QCYyk2kyfJaNF!w^Fu-fF zbI?8IR?zp?s*Cb2eP+*A?;xpPMNG@UGSNrsQjjk|O$d^8hJKMhW$D1@#zWky_deD= zo7YD;kkShqJ#+0O{dnQh1DI9fWCy2? zJI7PdJs=0Z(GkxybGjyDs>a#?s~9cUa${~!7IrtgQ$I&mp5KYI!l*UlQ2~B2ieC0S z4WH21)CUK^N;;^-PkRRO(vE@aEx0UQCv}_+8EYOj`CM+HaT&5!J?S7* zP&8D8Io{R89m6@?KHn%VOlcq6aWbRv=<}MTm4LL)DQl|R(f(A$`-l)`O5o!=eXfqS z7)n_)i3yqiIEsUpW!zd<7TXoppJ?(!Rh|8|#yrM=rh9QWMp}i8jwn2y_7oLVUoWXX zIt@dhM%`=)-oAyqmaY#CT+dB%(r4}ggWXHf6-Ls``pA)GYIq0CWL-#L{TC&?623kj zzQo}&8DxoFa$0>7_rdo-Ez`oQH|;5+-z7J7mAi~?YaBm#2yZtYMkgA$q0!b%U+~P~ z1@j`6hr-e7iuxSD0YW-BpU;|NbnK5>_CrXgtgI$D;nazjpZai&&>cSwb?{_C0D$*o zroNVebQ%+wE+}er%;`(jKCwv+{jHQ z5idkkyMSgp@$bq@mOD)abZVI5*5_WX&@3#`J1e+;uI3u}PZQ-HIrrlXA4C(?QSHXk z5Kkk$$phLrxSEc4;lPp6X|DrI1#l!pQ&Olf>G-vMV!Oio6HyHFHVKN9`HhOJwPqhY z^UIuQcxC!$CtX&=RM#q!lXxh+<%iz(ZD0n0h1K}}xxHZHrpZD)$u((KzN(w}J+&4U zZOWxn%h;c^V=vtrxw9R&HamlW*oOKnIUPLB=rg!1ONB}1baRL2mbq+tfpY36b%TAD6&==YNoUA!p6*PH{z zv!S(9^KwJ>9o;S68yjPJdHVa7+;G4UmOKX*m+hEwwf$_t?ou~NT6<&0Rbk)uknbVF zjeYM6G=nbMi*G!+CjFDGs1XHIE|w6t9b)E-y;@cYQxS3$Skj}jDZbznG5d&qZD-EC zwF+GrhmrhUgBq{KH+msZq>ZCh)<@b>&bqe58mDHQX=?Y#>qv^zDH( z_;J|QYZdhwvxaQNVo9-(=%WK^WbIIt)wF-tY&+GTrtV_IK{%9>yzz?3NLm35g#K!M z69QX_>R5vPkU8yT4c5p6qKP|-J3g*pM~K_LBbh)Nab%VFKdR+QX)Nw1BXQU@cT_s1 z)zIt=6J{%D(B(+&Q9IY@v9%L>AoHYNo2X>}I;x1~o*ziDe^^)Fg4@^XuPs4UHD-w0qwF?}H7q2{erjGl{ z&V)K(d%T#ehV(h#ay(7reQcz4iW`aE(%rr@reofAhZWxYp&5w#ZXU#o_^KUJbRk0U zi~ObMu915nr*O+5h-}8DsH@{z!>aymglhZnXNh0U;Ge6`HMx}BL0N^ITF-@eA;eyj zc;-;>VIN4N&k3QAmn8Ys0j%V5B+g&cyWWR%{a((J2aIyTrLSjX{&w}yhQK6-@|%;Q z`=l*4oS-|rTdWfgO%${|IA`eQkYCR6FXjcJ=5t&t;ETZ~>jlR{rkAVBDa4h}4%moS z>$Xh4heMj#h5Jbt2om(we8;yD0>_)=#fLE%y+|+7PeMx9w z`S2J^)x}7iY`hQ1NBbEa$6eAN)F2Sm5XUFwjd{#Ouat&fT8 zyZ2JOGP}FdqDVoQw)-=whH2#)UG9okF|$Ica)#SJBCOc*Fe%!M=lwg@$q+A{7@fER z9MgFFJkQI;Wj-3bsqPY4F$Y6|>UbjFlS&iaio5%Y@R#sA%}TKvSPM_bBM{vw-#4cp zn*9Vy{s@=Mh^n-xfy-32VGr3Q39oICi6v5HP8x&3uVp4R#lh{1F;l+)QwBL9De0yv z{Yo$7x~L_k9gLoMw5eajS@D50v`GGNm+qm>x9^C(YD-lDU#59h4oA~i8)@%#Pw}P+ z4UdHPi(J}sj8y7>tRmai>FC)Y5TSwZFL{#n(~upD!PWL1Gr%^}>23W<9Xy@9FnUF0O#Kp*(qMRC{I`NjO9I!u$c)DiVdQi&@qX(4InU_q#XLx&)aP9{r@ zahnY}#;7Y^QdxF37{QKxGSy$P~7rWWLgA}|j{T^wB?&0*5t$KrM zL(Q+M41@#sOUx^l`I1IqVLr3?Y-7&NHlT#`7xbIq&CADa6x<)hYPLY>EEa#M(%Zfo z_t9PyENqFfyOf-xQx5@ z$2BD^M z=?=k})E2LcS~%4vhO*Jx;%xPjWTDMia7h^%fN#NL+H=b(tW)_Uw8*>N$nL<)mbXr7mbpp1e+sg%<6~InCPW7L7C~MC-3r z9Z&ObUpQl{&}#RDU@eo#CT@(*K@(To7?-!zGRJ4MTIdnc&4+<1heWzuBeEgVIfB^S zL>%JK5c+EBRA)?urA3j33_l?&v#LHe)H_KE!Dj}TsYAEr*xH+EYM9}S`&a(R!A2a3 z3>j-hOv=HRv3YSsuWe!=hvjv=M{9z z_Gg3*)v`Vex5^d6id}>H$OZ5qMw@=3A4saSnin~#J;}7San|TrR-e!wSzNX3L-dC>L5c9A|?p$5fT@rY_3$KN!dZOf8lqQ+A1CG=df!zl%iK^;eXcK$IrY_ zHlylxe4ZO*4C!z%s4|X)Axa*1SklR?ItKl|BbPdvNQwZxw8I884BQ;>JEIjIckH&E zeo=>Z_GgUZ!l^wredKbx_Fcs|ss&W`)og_92W*NxzVN=rQiB^_S?=fEreUvknJci8 zhy9AUrE*d`@GLY7hKsOm3rxHuG+ep~P{*J#)*&2>k`=@%fS(ws8Pc|8ZDa!f_KCla zXM~&O(rUW)Batj(DNUkHsyV^Y2V=;a!-wk|g{}_1%MK?lTI&@}?njdkrAx&SIZw=a z4K%u-p7W-2xv^x)n=Pj)5i-BNBRO?=LRpQ-n)mN&3LXAn*t-}Xc^joLaOXsFic^ld z?qhUHY(V<`JKaq~;jER*B^ob3(KzpFLw48) z*82R@(*uUohU~n&2M_6;4pnt~cgY;3Up(e*%W!8O=jLWsBvF=r*tA}|lg^%${uy$T z657n7V$Oc98g|3HGDZ#lvhp-qEB19XE_@?swjBAEkTCrwo4f8#DWtB#_3+&IRiqJr zP2hNr-g`)iTj|?E?UaRv+g3t?9$A`fNcz;<+W?u|JLKJZ0W;1D?eW{JYhBA4t!m*4 zN_B_5uMrm^(pxaygY6K*hPIQoRl5D?9Pmfva!x7o36(wEi0Zn2d0!L6a+xA~YbuhcXT@1f*}d9qB?#?u~Y zn1Ht&)qpe{M9+;J4)h}rUPfP#<*~q!?yTq`~4CQl^CeCR~87EQr%gbzp zmFQ4UAI>01QrI2hIFqHSBK)eGl_FFbFBpL|4D8Tfi&WASAP1$sPmhjuF7ezrXs$mg z4Z@QAps+wTwypY-sGMu0cM9_ucAaQMdhw~_r0z^38rbhQf3M@ot%l5zq?wLqAXBpRqWyTjA()SD-uG9tX})Cb_T zuB?|$ag-vm9~Wu@S?kQGjS`q}+20+8D(eD@T73#(Ci9wpDQ^^tS+u2#b`$kEdC?y7 zhez1uPDMgXKk#~cZF>C_+@g_&c9lb*L5m{_~0=e;>gWe|rYbT2!q6z}G7>@-hlQ z)1$30@9QHXdATm0k%cz^z!(oX^`V;f9_*#TZy(VgTpqLYgXGsoq=8`wLmFGY9Y()) zx$({qs$Z|L`P2WNz$N|H@i-fkA+(VXte(7(qa(4`H1uDmz<*v8yGuzqo)$PbM<5c* zmznp0Kk@IQ!dhjAurgNQ*os8n9m>x*^=%3ISxa}ReE>Q9GWwFI?ur)wz7+yFm2d6; zU0|pnqXM3-yVqS2_@@6pP8DEGgfNDJh1%BG=v3_g=f9^GL|&u$nA1X!zW(wnbDg|z z-^$UuSM3Ny{p&j$zx4n8+hI4hGCr zU;f3M|9aEk{;d4q%Q(J$d7$&QfBpTxU0d?gSE2gbUmcHso#Ma!weec+0~F`tHy^VR zoQ{0;bw>YoEyU>M|BeIB1dCgK{_k({_f4|(%CbR6Ahv0pfFAJevDfauS7U2F{(mbz zKxcg`5FktYzsUye8~++6BIWr-N&iwDpQFCfBzxQ7yoIjN7&^@Ikq}6&z6>H z8<4XB;SIj7^IcD1X^c+|BA(v~=vYC{F-_IJ`$UTg)s<45_?h&W*5?R`R!!>MIMFh7 zLB?hFoRrOCv!s%ID`qUrh%s4KYKpR13awbK+=Y&KHi#xvvK@2XIDT{kyH*$7%Pp^* zjg4DcvOL%k5WboX)0GW*xm{95|B@ZR7{aF#S zPdi}l(*=}O%MKYmUJxGFJY!7Xi(h`@irWhBW_@)O>_gDkr6p>?WIJ+<2(cr1DstnU z86i=C5pb|>{?iPS^QU1b5+A||H2{<&sEShdD=Uzxd$m-BAnj=~4*V31j zu-b~u)XD8$NKa9@+!{){dqM7oYh7E7Ll}3p{K;CXG6%rS?qaK|gaNdtL~ox`mp3j= zq1hpD-<_D%J4n&i`Je)Ie_9YEi2Rw{msVpHfX%)5^>jW?u$2x_!QT3P_! z$EWJ)prAC!DTqfymszS*EVqo4LCD!GOkQz!KfF;;iS@SM(gz7!kc^wquusCLDOU$~UPg(l zJ;8T!E{YGY?)#Y5$tm@?iFjxtb|=(p>~=R5XF8Aw-yC^U{$$1jUFBOjFm_Rl-*iDv z-7L#E1qALWZQjyftA~O4=JN+Vcpz88qK^PkeOQkHWTUw$e^*Nhk z!)a*pbqelXFkKV&tB=zWoEGf-q7^n(d>D#WCilnoe5A8v_uE$clv6!zxeFUKO^h;sg5C`< z9p|)HJbZm9J4WdJ&8KdC4y?eGWwdLIaSPGe)_4d$gQ)8mBGfbL0{Zx$6ZXVy?ks!d z3Eh=TjT7^Gb_m(h=xjwhF&Ya#Qgg{qf@rYvW)hvFhfsJ(uSe9Qt~l2(O{x~g=AU@T z_jE7yO!@qBQ*URSSo?zaY`3bcRpm0YL#GqC%s{g|6DU>}KyP3PR4b*T1OYwOyVNfeMWG8jxe_HwF+NyYDb?V{1XwV)so<~gQc zAv|1t^_mjcOCB+5np1#oA{xLN%Et&njcYchcPb zSw`K$sUNWPC@mLzD$*9dm!dyaThbrabCO;hUi8S^i=Cau|IB>4lm(eNMrF-LFokBt zT@ZW&QbYRLX&crodI)~_)9yzo&fMm^CXjZCtCMAVp=JMa*wI)NP}cz%OtEa_Z!P3iv2) z?Y~Xe&63YJWwzgZJsW~ji}vpO`>d-#(oF{kL~>OgD~I^5He@@ohdFZa(oH}!OLYOM zQB(=8*X8}wiE#=a37eT%mXtElMkPyGR5 zDKybT&Yky&f4Wr1ksEE9^!O_<>W0FMT4mjP2AuUms$KR?};@`!@e8?6(}3q%kpO`AZfWQJsRMR)onWa|!k zbBt;c4Oin)WcumQ)w%j6BtP{0tTN2i;5bemcrZwpKkZ-+;VVqq3^S+QbovfM8PF>a zjEnZ`!UXt+l?43GKDjfj`22u!XAOgO_K!WRvtn`tGtvGuh!s28}H1kniBimZ-Q z&;jI!)%Nys!*=iv#Frfnsrtki;aosDL^V{0IGD4!%{VZ@Ni)w9%}$kAWFO<4npu15 zqoQ$QYjR7uF)7aj*o;d;6K+ZK%(`_%7;a&|sM&&sEEuvo6@r^}xK6x)w ztVz*U%Pd!old-a-1%wo~=(y>jC^TTz+Gbnp?=+u`Dn28b`ue+aqxudVd&IL@R(^4P zcMRw`ObmWh9wXO&VGe5l$^!B1Ab*$*?nPfYjS7@yNzZEaWuNn{M|p8rgT^*>Hnqnv|{-WL`hI>vHx|j(RifN zx(F)(v?%9vMQfSNmv>yVu4PMMsJ}yz9_=i6ptG|Vlw#=O-(}T;G2Vk^PUC+|Nz$O) zp%jz#Ijl24WD}8{9rb6T)Ij8etAG2N2#GOw`62Oc%{^{<3AG0O+XFLj2Ynzal|PuY33q#Bp@2QkU?4oz#gA2(jY93Ei0+N@h6yN`Kj>DdBWt7tC7pK4HC& zkv#_k#5p>*DCNfIf$AM`1!7BKtzHOo(jnb8&97R4J0?X`t1B$p=y%--A$N<8 zf@FrN!-b85YVrZoihE8-ungn%A6c!sV7@xtnOjcxxX>`j1EuCTXPax7{a)zT{%!lzEsEP7`==sr`RyU-FO%<6qqg9AuzG5i`?W*&GIn!ab#}oG6W+L$xC^ zzOWzDeYijl_f`+ez)B+^-7&n5c-{e+UGz2u)B(b<5?6y_P z#}iS$#f<0S26h%G5h{tH^1M*-W22k9H283 zgmr!$7Wrq)tLI=rCT7<`!>X?GYnC{bu==Sb(n{|uBK$frrh8732Yg)U1JlO^31OyO z7q|~s(^IE>-pzSXFGTXjjJJFX@h9fO1r(JJ=zTlG*KWP4;k!NF?PC(D&crULS7S`q z1;I!Q!}*|Tdk^i%c+F=g#v_PV3^K}_<_9ebYv)XaU3NI9pmtHlIcRzeL=Ngi^OH{h z$QEB~E%<6x4e|v3hLLb%&?l#$_R%Wpk;|>~AUiUUyFSu>x!gE@m1uqz&lCxacCCGW z1SSdUJY+)I>+hSo$qmbN{f4!Te#LZCry=PBEGE2;ok;P?Jm%x81gm~X;V>sU-e((Q z>w_!hv3|XDi^AUEw_6RH&hFT?L*8D`4zgg+KGRQ#$KffxwXfFD3d}^b6 zSBDTp!*q(D1~$BVqo?R;SBRHAS?gWZ-GS!I1dlNW)l;0`hqwS117kVW+!28!(%Z|; zTEqwHLyD~tH(NXsy$~jEA5M1Kc@#P9o=-o+xxFpgWpDo_Jj;K9>Z9j3mN{xdy&pIk zbSkVR%GtIpOU&@evzgA&Y(QkY<_a8NUvrj@Lqz4eGPTp|Q6N~2o-w_yxQyUH&Y&=9 z@=;t|IJ+&FiJVA$AKs&nY#DK8Pb3l65wyCsE-(t$nGib)E}y8Iquo`&9>;))?L?>WSWDvA+fnuO6CQ& z^%{YTWYrkvtZAzsw!!LN-c)~sx9{f8j7webZLt_@={uA;kz%*#G&<~z+95*yzu1Q; z#@Q3Fe_SI3?M8)URDe?uja4|JrA%>lAs}|XZV^z)pSt&v!vS?_EqcN1S+Ev+Y9ERHuoYX@ z`g+TD7pyY#@FpP!h$WON+CkcEyR962!NuG&_0W1r&_+LH55!ZNB05?&lRbz#RUiW~ zmFaE&b-E&^yj}SHqGPFbbs5#*Z$7wiBQxhTqHh4eXl4f?7)6cj?vPZ|NdaH*cL85e z;rRjFL9WL{nlx~h*7t|EJA3YTu_zpn$a`PvW9}B19n1EA7+bTxutgCxsd@i&qb)Wk z5ygny5ENx3Adz3lfz|J!b@k74Vsnzxthz%_g88y=IYc=lj1|!HxWng5b&YQioRx#T zkRA`H)3~A=<}E&-jXvqp;>LecDYlr6E3YSAYL8r#u;mT%dA|5qi7ax=#qveq(l53* zzxO4bGRdu64lv!5oAH~J`RS8)ZYDmR1jLF1ppR9hb@t~^`0b}%~^j|qm^LX9a z;}lHF6ihO{okIv1ZtKCHGJCdg`snq6@S9wN7~pxfh$mTPMDs;U(JlxEyP z#sH3EM|W!jpakvj{bD0tXhlHF7tEWx{Ha5^DJ8WBzsS9E<<}5A)OV$C_>~M=L#9&v zQ8u*J!m}SF3nh7*9gj)D38L7fv@_*TM(#jdC;FAi=7*Q=w8d`EHmLOt?~_t{n8Z!L zW1br}IsynHefGGY?t3c1lDZVcd4281$RWTmOBo4DO#@|)B{A*m+^nXnSMOcO6zz+F zGQZAeXchkyH^T~Zw<6xkdy$`flKWw~_tk7JV}U)>3_WCWZCj(a0K#=+*z#f$2;y1|cyb@_LrQ+eHPtG6=YHX#m^JI}c)U+Tjl zHZLyF%g5hO)Tjv!cRa6+A4QfHs)ew;AOZEGF4;E_jGvZL|Q0 z;EipKOS*bL1EqRS9Ab7rqOW1^bJyX11AT}%h*oViZxzx+mL7ZE3Ze#aDU0<0LM_t-T_XuxF5bjurLnyLO ztq?xgo&bCHE$rDj-LP4^?;>;R4Nn1Q@b0uozPV@DTHZ1|YruX( zIf#1B2<)v%&g@WF^~+Nsr^@aW5de5#h+VrmAmHc|D=c5bE-wDmCP2U^04E>aF|+`W zt#cg;>55HvOS~KWFM^$3@NDIid4L&&=Grf@K&^8gClOU_Q!rFhe>jQ_`!hBtzNRh2 zxaOlER(TC*0a)A;*E*%m?<%0z`S+-|YUY^XkfM<$(2Khu{ehr-#pTp|6%Vi0uQyH; z_U~>@7E_v7@#dDOHwz8dflk{GvduK;Au~*FoJ1~=Ka9D~LCsCC)e7?*GRZGY%~a>Q zrf%n-6KlYLls4o4dQ$ok$LydknZP|-;+zj&D(ui)iV;5^)>@4v-b}MjS!s9ebR~!H zgh#py+)s1Mr!K-V;hU1BgMD^vw?Q1U?}g9@+UO9E9ZJD#fGB&){06&TcV(YfGP zW{r!zl57?Ej79$QTs%Pjz^}x%~0|3CT zMUj4us`}9$ZDv79^R;52MNXAAl#-lq;UDV^nKX4G1!_M*Tak{!OBVfRSRY}}XM;ks z!KB9U9SA6~U(v%S<6{ezIsL!UZ$X)aqnTH#5; zIKaX`sZ5F=hk_L!Z-)#hlY=g7*mNtVjIX0N_-YAe99_rjkifu@^NrwRKF$U2o@5YW zN82>-c05c)rY+wJ=Qp?0IP_O1B%{%wu{2$VKZfqpt zO^Y}*CtZW%E4CF^&$s5WVtfHnypsG}`=U-6C&#e7Ik<(GIMZ#rN0KiyrtQyS3^~*q z$gKQ8YMVSJS=O$fgVu9d((1}~Nx#C>hOxQ<)&nFZ_I6ZiCtr>C%?5*bO-;^8ugh_fwAi253R>dR$&+tX$DIJG1i6Suf7zK$Z7syz?7 zDS9bK6+I9+DAA?2K&8l&<$n(>@z#pS-FaSiC`aPMUV*8l;a~I}`PD{R?t?7uRH(@r zx6q3!XLK(I{Sf@c+2BxVrLnsA^~PPr5A9=~Li5u2#YspbyKGZBNBh#W&We47H>fCz zr)2#`yVZ3wDX5j0#n>Q|>u%cRw5`l38p1=aC}z42ks30z!#q_AY!V{<&(}B4`1iKj z^Vmqr5K6jNw3*gwSqQ&%lZW*ogQm7)D{*pV&0gP!$bZ#>#@7JO@bNq-bCV(OJ8A2Q zov;>t!JSHBMoI3HEA)TeYH&v)2d{;bhyAb^{>qk@K`Hg9x)7Y{%9U0Qh9ko@k353(M`^)lXVKkC-_QwU5=2+YcyviKLFpE;>OUGVfM{J+dvm8ho&ul0hmz zzwNGS-CFP-}`q_P&oY+TgggzE695ovJ(Qp;2K_~!2jEl}}g~J+wr}O1--1RSh zj;;YnqB&}>yD63W3D^cRZ+_t;S(LzU#*@&S0-PHmVtT5|0?65yBXR*?@ZRp{hJt!3^qzpb z{&ol`M;TdrKWF@gN&`gmf4$?@MO#ECx1M|T-MJ{_fvuVR=4Jt9%HO&?lBHRWGB*0J z7*3sk?p-d-E7aK`81lD=fa0N(Z#`UDSkYOq)oSCLvjWl;Q`fzTk(-ne{a=pP(sG3H zErU*Q^A>+*=HqW`u>b0LTMWN%egpWr|4rihIv@WJvCbHqm3%hiKPUf%+5hwx!~g!v zza{a-f6vChCj;{T?b+Dd4=NjUtGq{B99=-AT(cxx`Bf;p=iKz47KUk4V^mI5z%GWg z2R+Pne(VWO%&acdHE#?$iO<<}ZC|-I&G<=NxQra_LdbF~`*X5>xfu7;+I(0qEN*Ev ziT!{CB?bKPjkast)(*KERVtUHP5sB+HSt=7HR~PkPU3ssTZr71k@K_h3%wnu&HSiJ z%XFxCt@n9ft6>H!KRn2`p}0)dqwp%@=(p;62g1+K5B2mjXoQ}6?$1>gn(L8oa}=lN z_q68N$}{cPNzAt|M+pVr*#|TPpy$V@I8ihC{Qa97alz}YR{FmBA=8Kau1+8IyRO9e zuC=wfVq@)ttYo(=_fNeImwb9uxOb>-$LbA&t|!Biwy&b)%zylPmY$}L@NY;LjMcPr zPb2kYSu;VrzOP*wyba=Eq>S7sioNhsujT6l@mmj!ndH27*vsWy=A4JeY@Gb@8&>ws zADBWffy-Wq86l+B9AD`fKg3RO<^Sxd$LALJs%=`D!(L&pxt6O*H!YmbAZhEDwcaT+ zB;1Y*rxvhZI2@GgUI^<|eY_F&D(t0$`+tn}cd)c0qDkl^wdZ<%7B&q(RxmY|SY_?T zjd^(5V(jqR^C84RIhs>2n0W9|4}*{os!!sk)*Ggif7@*6YWM(e{*NcVkl0r5&$RZ_ zio0y*r~ab8gIBv$AJRLnd%~}`SGn;?9MvxfEGE@0F8re`x65Vgfz+)BZU`Rez+~dKEFIF0N?WB&5Uj>a+>xJR!;H`Zo@SqtN~rdf>duxxQQ# zr?R4H(!%L4mm7vGKW2a4w^DJiY$>$nHH>*0_gfx}xr1x*x@}{ha(~Pa69{xKeBG-!|r{vmt`>koi!NNY1POm4TZ; z0`<2wa=UKSyTz>oxfHzj5GKkWYqm8K{IQknu$PQ>&?*ElUA`VA5Qz_h^9m4MIicb3 zsn*Bd81!E)$#=hmZ{+RSsK|D)&XKdgwkMI+wnTWbdn? zGSy`pEdv3?^Pk7wNFkcwyh!AvJY+z1Yf|ID`heS~QChbr*T0P9@ijCM$-;vGQv2tf z5Xg>32vcw#V4FWe=90Ih;lG#n|IOt^2ZVE1C{5&mIf?L%^~nhWsL+DH9(PRtUltfN zY&V;``8XkpzZ$XGu<%h)Q6w_O=zm#;Dy5Z_D57S1T#CYGt<$6pNusgb$L26}PXqvo zh6k!2+f0B0^CJ-${9oCcup!VLQ4|zDb>EK=)OCwZs@lHB&`$tjH_>sG z&MG9C*8L26UTqBL;3A6VQ~ltYK6g|;r$XkJ=nm2XF0wBNur+&EQpb9^VS<$O*QoK*+yui(rLv&sBi41IfC2t+e#8c-ZyTP+mf z`qe1Z3l20QD5wOKJ~shwR1=){5y$@gdT8T=Y~G}jlBIxhUL}5Dlg`4r(|+L#YGDOM zW1sEThP^%Gymvo;zi{|+N zQqo~~ZUd#>dX?N@&&8u$2fx2GO1#>fxTTlcUWiM(^vLXKGc;g8NN#34|pH}dm)N0{>q}=WN|4& z2UPAj6{6AQIGNqIWn*U(1~7++eW9xKxJmV_+i~5=IQsK#8*rp)aCv_ z5!!Fl+}5~!HJO>t+7N-z4>zaY|IRFw?YHE0kLJG}{J_=ec>t+6waszPDDfu(StpWzE?6Id$X9bwrJndb|c*yu4@cIuPia0La z+%=yCE9}5#45KTO56uU61`z}eEQ2>E=+Is@kAnZ$_mPDMU+6uap%hEoqy!VK?;q-2~F{Z2egI|BHE zP6i`2n;K&TbbWmUDu|cH`qTSXwIp9Fe`1fB9$eGwbMy2YbLW;3&T1`Zko9_~#v{({ zXh}-&$zAn)?{Zt*G7z*kNu27Blbx$`T(v;ZjTAZVE4xOWR7_(YU1NlQerKdJba0@C zYwoAB)TaC{N0mi*Vq$~=;xq1hIb8F$JUhklv^VXP~%p4 zQbnB?Y!>G+*42eRE7QGV%#yB6n52AuQi@?k5^8U`n%#;2*y{c5LbUFSXFs(kDIuE} zYdj8%qE7r^0Jdq(_R`KzIXe9P2Q@c{!&4O5UEB(B2>OY{J+nu*KsG?alYd?ECqP=L z*!%mspjbr{lr_6olX|vfb2D_Zb2!t?^b8)`if+Aq*+>RR{D{n3B=k(HITzxUny*?T|x z*)?Exz>`^mJHQ`li4H?2)D3O&E_BX`c|x3iJcLQddZW1*DlNU?o!{cf5I6)AA0O+Z zS=B_1zdJG@0NZKLwFFUt2QAqs+7&l5-qnBvk9R~`&)`&(>M!EWnGp5C)q96_haFyS zuj|>=uK-%UfsRs7o4UujI zSPPs`SGStr=rXroNpGf_huKY*DYl(_3v_LsLG)Pma=JBRj#9u9)yu6d5F((gu@S>; z6WEu+Ke{vG$fzKcSc=1Qq^v5m{qyJ#&w*bs(5E}iM1$4_uK6g{T*PX4aOv3;!6lMg z4gBMU7H^`9Y4lGG7Tm(nzMD70K-i!w+K)Tf;UgTZFvZv z%}NRzW|1fjPZiVWS*geq7i64sH^bM7VZjLu95EOdtQe_q`cOTZ2XL!*{2bIROcZ`` zo!aM{N2IN*X(~;l?9cM!^0puq+wT5y=oK)Q`^pT+0}v&IS$^J8=p4%ObBNF6eAYut zThP4vLA%^X&V}l&w_g#fW6XHqMe2y(WOxdVa=WSWxwV3M8c}E82Q)3Ea)r{ewKfdl zojx>}Q0{=?>?T@?ECr4msY$VubR(m=(fr_0s|_1KJ1a7H?j>Uh6W#~7<8hEUMA@Ba zED%yIouM6Tn#I&W*$ckBXFud6M~c6HeV1 zU^NWhwR|lq`@RxY+X_Cq`viXL%u{YdQb1-gg=hpQYu9fC(Me3=?UkMUEP^7r@y*PW?PCb(LOk-NAIa1TN;GJAFh=J!G z!=Ha2f+X1mY4ig++5txNBjP(w8M-rc&^xCx4tPUOGxqx8h-9n%x(y~AJ*mGQKtq$x zN_1ICjOd%DI-u+(8zO81If>7*{vB%73(uhuia)8fYL_^DqnACSSP4eX};NELythd;57T3}bq47X-E!J?xK1VlAK zg6P;^sw1`r!}DXk_<#ob(q!9g%lou9;QoVxgfTOf_@;w6{x-F@GZdZAmT{=ysD13I zwK*dF_F5l)I?i?FO*Vc{uH;QNQ#D3Z*TTC}@iq3%+k3KZ;uL5s9-yln)v8QVYFN;n zuu>H13Q-`AIb&*m0e7GRo8*-@FIwNrN=|v7uRjzinflm{v{7yLAv?R;@gLve?^=8p z3HtYQNTbcAR~-_zQz{9s7fzR(sYd_o1pP|#SFH6l6yCL8z?2_f)82o`ti7^|2~C;- z-exQ^pzmY5@Lm@P=od(HF=zJ{ot`~|d$3hSiVsru6zvu|wZ{r}^th}XJL;ad-4Rg! zdy_GC8!|}o0V0`$5l;c2$npgW`+Ccnd1mK+c=esvJw^Moiov@&g1-?quX@x#ROhJ+ z{gNGY6mTd;f#Xz zmy}k!LlL)0@$8)XntWkC_k0_65&?Bd{vz}=&-%N=j}GTW-}d3j3ctd424u>&kB?9Lfy`&76Ur+LcB zXasv(W#~~8d|9k2!rYUN)vOKy16n>mcJI>hDK0~A?fJGP@TV-`yDnkcZU9YRm)-5F zT4{g}2u?DH+Om9`?Z?r9_{&06)^F8?ZRcBpG8~GkKiMtY)6Z|(k8K2qoX>XViQR!# z4hmzlX0|m>0{DTJ>|IJdQna1G&~iDJfq;bXr31`7sIAqLZR#{jH+t0J+BXQ;Dqy$- zkR@5M3#zANV_zenDqW@p%20dUpVi3unOs@G5YQQw`u0YPh+F<8vdUoMfiun10;0$6 zE^~kdE*$2_*1*b5C5f8agho)Tt5PiTeIcfiz zsgXvQI;w}iCBG5sq=&1)#A}>!)HkqawfnvNMq(~v*g#&-%?ajrkECtx0-4lWYnzUP zU)~PwlY6Uy=5Sq`umsGwDIS_B#+gPXqIK{CDOuW~CD?GQYNNAKmAq>i7=FFbLSc}v zFLZ|?onBTjJ)P{A3d$k?wzJ-eBXz7hRzbs!s30V$qR0q#g_e=FgyDLMS)Q49-J6Dv z{RUFsyu3iV-2@s%^>|+`>qwL&#TLY-6~@N>te$yKJ=VOA>-?e?z6K&dhONTS&9(v& z{>WqV>%2YWM%Hgj)e|Q5JFZ^^OzzCd5*WpXjR-V}LI+Ij6NjR694<(?smU3=C zm@`EDMRT}ec{I!(Yh?hcj{L{+yCByOoUO|vXIoXXWp%4yf;g!m4QMlSIEERLw9JUn zAgag8Ip>32#}!Hby3*D}pyWOy#lKgD_uxVmfr{Oy*Vmjc5Qpf%j@6qEDkTh}ceJ}n z3)lkz46+DlQ)bQ|%79^a{s`7Pzgu>#+SUU}`=Y|AjrZy;cusrRg$UaHH`%mqnD*8?w zvfvAd(xxBCG}9w63mKH^Qv@&MS`4v%f(z!}LH?M?%s^L^xpWu=!&GI~#?dEvJ@ zrjx#PVGm*&zJiVAZP0z>lq;C$dCH*0F0GX-WEuUuG`sokq_{Bp?L*QWEArg%kaDLG zO*&v9L_zqC1B*zo*E4kwq^9d%Lr&rZ2~G#HdfVWfp~I^cR;T;-HZ-RE<#-|e+q$9OL4PcGf#;^v@_7=oz**nuIsx0XtpLktT~{ z!jun~VcoUu_Sq`mHy^V;_f!Q*Rr{N0T2gi(8U8El>pq?qh!}Z1uk57nbx$~1iF+fj zG}?Pi#%$m}aAW2XLqgw&Y=rgL`IUePQygz=L(@t<(+e%w4A2tb_>y^+M8QJ7C@BOg z&wjxJFNU<$W%Rf?%;e3#Jv)YxsD?6w;(Wo|X!TEv&aor8#8umdMUe`PhZ^wBpBN0U0tt{AumSb%I>c<)ru>TgK|dA75{FxZnD{Hwp?9aN#h` z13w5vo4*G_c(ghr2ZY5K-_{^Mt*kt|yT0@DL*^P92(K8 z9m*MO0u3CAW>yc|Mm^#g9!}?qCvARt9;i@?cn@J%<>jShmYMBIn1$dLG**ddIgg^_v7m~N29C{;=8zC0v zOcrh+z~EK3Dxp>(Ja2mv%7pBSCDz6#BV6X+E%vVL8V zP%~6uCFSoTf$a)_lbn-VPd$>bFOO^9L zq$)u1j4 zWzsawcu`Az#*@R#YJJZTy;sNCYXf`_Qo;q`@?o5v<(UAJzVuJ-;~arS1?1RH_M*_x zwaxNLA4ySw3XZ~U9;n6+OBB<@sEA-7Z2Py%4YCt8dp9*c6UMx_4uwiLD$^QxLi3qM zT|S4N`3_8lKlZ6UD*$K<)E-j~Mg|#qS-BHL4T7d#|Jq*-*S8(<^!KUzWs;SR145`1 z`Cr=!YTH@a+2ZZDtxwuGgDEwr0d-7r#!$*XcuffpVEwtOU-(p3ePh=O#kK}%_91#NtcCjucJ-8+wo%I0|?6o`{IjjO@AwK{*u{L9PQ8YL~R% z)H5E$Y`=o`){ep$17DNrur2Hy-S@2#p$I62=-ltHWUxIWhsm}R_#xbXxj!zg3;{6v zR4hn_YB5{c!X_a}h;%Z5(V?X}Ju55Bh9(SSpiMKK=s|Xt@@rVCCQ*r)Px*J|N=Y&< zzf?PMX2lE$`GVWQzgc{CV+#*YU3Yis5sIsiQ$y{{CwgiPs{}x7vS~FI)7<-XvaH~eo?t2bRfd=W zx*JYSwY1odTIcdiyV>{uz=^O#pdQ*FkyLfP7AJ?ZCP@V#$k?oT>rA4?0y#_??g`Lc ztz!^Y!A$@D?@aJnnL7USGIiHUSPlKz$pu0%HQ+R|#%AExq#OQ2vqiuZ&2q=!0Wi0! zUGB!%x8FLwOZPkDO*d5L1Aj$vTc<3j%qoxrpI&ktc))$2+UOo0otoC}OGgK!CB-XO z_i#sIyuyHmNCP%VnhVx==h{yv(ujCQGy|Ge+v3aVSpmHm zevU)J?MH|$$d_HsGEi5=evPK&84$*@<45qz<5o6oza0ZsrlnbTY-0+5!#Uuy-(?I4 zS0GSy_e@g{eQRY;DuvM=O9$vVrifJ(mZNzKT7nQDdMVQ3Fyg!>w7N)N)UzIDb5jC* zUcQRF*k^aR-zsv^+I! zx;mu4X)SIV2K$n9{JXH#G1yW;mDl}NLL$q)nHunz)~cB1L!F@&WtziaP@|y5NJpMlF?1fiElteMPfw z5sPsp`oJN)yZ&9m$G6)w`kl4|FxmG=?m6%3b2Apx^B5b6g!~*A!BB+~rQjZx$ZP^Z zA1yVfA%tv`D&Dsnw2F}8$n*A&q)p=?cD5ff%XyaMi(T_=h3UyBw2~DkU{TqcA9Qaj z6~ZyL9stngRI8s0_Nc|LF!BlBge^#IoV-fpw4Dxz_!ar|LRd_*>$|zJYNv;#Eij&FV|5ce24p3&$9L_br9Uwud((##k@az zN(qFi(vs4@xK@Ae-yE*403V-6v$G3D?%(sa=uFLcBg!4|m+%Phm(@^_5fdAbthXQS z<$ij7DK0;WNwF!|1UhkRHbPw$_)2XfBSTg$X9ohEu9*Gz^ z8XK_t_B{brHSAU&=XE6YRp21VA`+pj2g}GM1Ra}1mBpqH0Wq(_tck(4@Md{(BMUT; zku`CH!>C%#z)6E#EVMi12>))Em~W>I+MRO8`{sv*A;>Rxtavt!lh|E#{?f04ES#O( zo9^)M?w+38Ld2JaOj|6A*K_^fI4wDD*z0`@b&R`c6OZ=;--=0%h0)!|Ig0lme069S zmW-R@%55*oMV{=wBduWhQ*C6RMdUA~S<8uAJ*_wNg9E#!DA(+HR{TVHuM)v^#(d*k zNr1>ulgU0o*B^sGE^zbH(%1gE8rT+*^OY-=cwcc8E zg9ecR`s*k4x?a2lA`;v{kwRRd4Wi%ceYxxP_bZhgm39)_A<`ogWH^o4m)IT179b9T`M|C5mQCn4+qCErdCxV%{#0ePXwRQP>yNr&qK z<#L13@4UA^%)kTvr`CQp#69|)OUaK=o81!s-x-z=Clmwwz_!DwMvK!*{*$XI*+B0~ za%EU!pR20QUMMDaxM3AB7PgqKA;7rB6fRI6PiBe_Gr+S2#_dOlaZ98yPJYhPUw23! z79-|SMnVyH>PGy}C|{8oe|3$dSC3!jFwc#A6P{65vfD$4$sDb-28s3PC!>6s^f@beYzb(>a|PxFl@7jY{D(?(pXD22pMV$ z>bly0q@cq^kE~t?D7%3iV1j~Atj`wA0v-EqD&SDNc1TPBWAv=@zmtwPf^KM<)`}qy zUShY)1wbzT_nBW$Z*@48wbi|!DdIl{-`nwtk6d|f;c$#V79X4dlDU0aX zp86YO!0~&8D9vH#9{kYwT$$u1u#ByM(`{=9h5p9!kPLP<_)GWS`z3ps#~9#!=G)93 z#ZR5g<3Zf<8Tv>TQvuH1i(%4m{db=ceHYlEF@HY!FIFt3c1S(f`@{L3-@2dYzJJ4d{`%eDv({PXoOM>&`}29fuj@5kSD|`3CpWI! zv5tv}X`}k7KlPcIIN@K}m)8CP|KJL=41j+yyX&7+Wy)^cH3t8|W~ZX9!o>6}V*O9+ zHSpgYE~kv$nV1Ae(cjELHfweKnJOA8|6Fzq)ZAhfHu?Fex?+32xdI_iI?Poj1#JZP*nRm_UcW1A%uyK zCgJ(y8ks}?$A2|*Zi@d^yOn02@PXqKN!Yh-PNw{%wstb>mrmb+KGpF0nM3zj%h>C= z73o4_SJoB@xyaRD4zJa+T0CZ>V}zSMwQx^R#yD&j&#sZn^mGoh#ytH|N$xnMKkjTL z#d7@VuR?Sll;kche{+*{K~T8YPi;7cpfg%P+fri36057;SmgbdEiHn=8SgJTC2Kd| zI767Xrf0jGj4b^k3m@`Jk*g1JseQjY*7XjJ%SQX=?s8}e{D?RyGv8XjbT%R`r9b`2@3PSyiMnn< zh2-21{qQWrdrze@L{tnI{rQrDE<|^w&98kDPZ}n-mq=*r9yw8w(f^A^a}V&NabDtE zr)bO4y8qC_p5IL5M>$0rw_krW+vDNWVjMaGKj>0J->ew};o=rT0DSFQZ za#};@&>B7gU6xp{Dpys3p>^RWwe+T|NR{09^Pi-|A`9ndPcF?j4n8CE9~%3}1t+p( z>xePImL--LBx-Pwsh?*@mZ{-qS2dSqU-FFEbiq+yKcr?*4ssW-NeC~KNphHvY? zB&D!vC-?p47@Up_OXb2&A#1A-Qy5Kr>aa?`Vay=mB6=jhx4mAD3QG}lORJ{+W$z_# z+Er8n=TcWtQxyFupHl->4j+C#PxdF-Q#|R73+7vG7 zd5dFeZ@XxM#$83kGD1WDfO>Pg@w$)>6V8}$QHv;#v;FOCX`K0XsWlfC*!QvDYC6^N zp@?*oBgw+Zo&V+~XEyt+=W8=0sY5ig^sZqVOsg$Go?hYq@BdqZBL!lduKNN;8cx>J@BfuOL@$Ao~%Fb`?cZZ z7ys9D$`!IAb^0y&=4F=BpCp!S;V7v57~K(WXFq$EW^EobXxY*8p zig0>#OH|L3dv~VF_(7(VtGSlIy<%}fGW#La%weAlbWr`Ygsu!EJp=j8fsh1mD<(MI7*`_g^jM7G6F_nZzY z?AfS^)u|16!95pPVk1KGz0EwIQzNrF1IO%c`$lpXCxvLd6>WIjOH{$26- zUT(u=jaM~_=}m*XM>2aZTpr(5EVN;k`zCE|J@GZ0xIl)>{d!%ADN{w;%SKIH(w=|d z`!syr++B08E}c(bvitK657cHe@u0A>B&g&hhF;yd{^hzWhY$T+>#ZdD!9!l*6T?m0 z`txKAo4E3U)Cb}tP)&R{y#3~(sb6M*hKRac)7K8ly(f1b)%LF;?+So+Ohi zY4&BFP7PyR>H9LP2LxS6)(u4Ec!%k`9A-+)TC;PP(=UYy>^Ykt^8`6O;0bg3+oAslb<3i0kxKmFYuAp}#Ty>85L8J%rqZ#QHc z%0f5aP7OJ|)zBBKCrxLseP};D=s}EyJ^`ih)23)1IdrvIZ>Q$&n=r02eRKjo^(`BH zv2XKr4SA6TowU2gSARoeWwy6&n-k}Ls`IG2zoNnB;92(hW`JgWtUcT=wB9nPi z16}ZA4)BF5oEdkC2{jiu5=fgbX=Fv5tXFeNpTG3{6&+qcZ$Bqqr{+{+YkrB0-KnIo zyGaqkV|n)pFFlg-ND{_}Zm@|{jvW%|7<%VcQPZjw9!buYk}%OIrvMt+HOv9+@T*~% z=;TM#AK*qQXb^Nt*C#|#_PANx7q5Cgq3n z;dOMC7P^v?cCXtO!&^hB2e9vO4;p(SO2&0b(by7oyFBH1FK_R#dfx7nP&wqEnePqv zG@^2v+>_3hX&_l#>^uudB1aYXX|qxthqvYFsoEEL`NSt}`Redu1P#Anzv;m7M*}9x zh44wl4Wbl;Muv4Jd_RBw3iqTrX^5|AP*N%Tg?|>j8n-|2(~CcTaB+KU#|n3MzBSMq z(FkE>WsM5-tja#9Vlag>q+-8gIuq2UNJB2Ck$R1#lCApBh1?v(xl1jfS82zX5cC@# zu%)eB057I!+Y98aNpj9HcE;t2Y>vqx8kI`ojZ#=+DcA&kQpbdlU23Tx`r)hHt?%_Z zYm8I9;!>V%ZJ$m#f8`5QlC^RgqwR$5erE1NI=GMh6|7#3q+WPujdo z4oIqZ%=HJG$9F=ZN|C(TROB7=Ern*?4HeubK!dKtFJa%3RlOWVKJ)$lV>ry$j}4g# zOdV#PFry)xfqB~pf=Tu>@4aI( zp{DTRW>RP+ToJK`Y|+KnTJqkIBW0rxpUiF@HWzXs3TN_>-V**gwC-u#oawaaBk~A7 zyy(<&CMkX2MeA#WfMWbzp0+^Eg6G%JPi|PcpF;BqP_Mk2zE5bxz6x-YYD84!P;!9! zbMd0#b>ZwB!dvT;V|r{g%ZC`@{0o+WnYXL9N_xr4Mj zCVZj3M1{q1jX*1))twLb5sDT+xM|%TcihwgKv-*|_Yrlu`H$%4c_+bHeWd4-HGiq( z)MyB`!`JsdDi@+W@{~BXFJGk&Y`ud{YXd(uZ4{cU%*cRsU=2W_nH}oPRhd=;B?5KicBlvT!=gwe~Cc9(#mnWv}eju$4epWq&CFKBwc)$sAs-xb;e>+RtLcB{oZ~xIgd1|Rl5qg8pq3s{W^Wgadc$H^Y z6s>HzZzdpM`CywvDPgRKr0YuDe5kKuXpF5lJc>(9Xu6b+N+gd`>8pO@s_SVtJT+Nj z1@2STY>IAb1@yb$X}CTVN=BG3Yu8g9wGXKJ3n4!Bh7v-qWU~+?k5^wLr}n zQI7!C222~Pb$lpq0zej$|CgDkv3_V_$@MN_xxjkk3_(#>2eQZ%wK9csMUpxpi+}U6X4N1eGXv? zr9UpNg}OSvu@9&&F>*5WMJl(Uq9x~#!_Sj$`j8wi|2YZ84j@wRW+z>(85u>}Ms9fu zDu3$d`sv#EDh+r6t?XKxJms}Nd6vnfucsfOZQCiKVk40$e6xfPAzBWrgyz~9cR)Mu z{6EsF<=v8xCLTYpj2G5 z($B6h(*#yX9?~jmr9bp*r)?X%It4%_QgjOmUOr>9eP3H-gYeuDZTtxhf<;jN-LWaw z>hs~Iks5cD&=s*+K}R;}=MfyVSA`3Ffv6Rvh%8i_x3=Cdm9cZF zcsjltI)JkA9@GsfK~^o<^>p`&<^`?rXw{B71zwySFu3HD?u-k7b8PBD1J?#waMg<2r>5*XgZb>0wPZ78HTP0G*eSGt$MeOyU z0kbTIbYMO4>^ep0xwTlq34Bf4X4ZAH77!ZVFn42LR8jzgH{NtcHnju$sL%vb_eqSP zYvrF2Y&K&6%&`~;Ps#CM26$h2>%eZSCk@`6~15TqndLNx&sHVJ=S(s1R}$I z*^K{MA=)b@&Wf+&WBAdPnz%?uITA|O;+ZwO6q@qAuTy;-6amfdyrg0xolT0PM!LRN znQTuIncKuIOMg1t#rgMT&XDeUi?K3z)CSKAd;h;hqM)!!bPDARTQ>I58}`HP?%Mk3 zj{E+c#O6-aWN&a(@ax?>*T0uLjz4hwybi9rzhXrws0XKdLmG`p+)$|no?CPca#|9Dpc?raR;YDq#YLT#Z;SiyIOf?6U zpd?*Vj!Bb?++?E3TVCwo-?dkrIzYRhkeN&tB3x+$wZvdPY6eZAaGqFN7a5yi=HCV>o!|5kIG4%kcKOc zvW@Rax^QLrc`VFP4cSu3W*NIa@*wY~4I8xnupY4wR|MSa=IU z;USaphPfW4X}Z9}BvSTWoHUFSo$M?(CtsYN28Bg5q{<FS9w$db9CKUVrSoSlip?qY9w%>%FoY+^fO?$PMbCk(i_GQ z^`mIq%QVM@aNUq3BBfUYOJU&WNO>STw}Dx#@E zdWCxUD_5kDRMjXZ`iz9CM#Rlo+(v}+paQQ=_|i9|D>Nsana6O@QK;4pQ5uDHCjC1S z8FI{12QfuPanL)}D+V=tXfCxkHA?oDE0<|tsW(TpAX%6qt8dx zJ>Q|l#7ERV-{Ncvf+kT|?{o}0UrKA_Oh$W3GTUj@CS6VcpWzB0-l06%JlcOsKH2x{(ge zv0`ue5t*yCRLd{tgxQL;NmoA_JSOMJ3G~KUPThP7eD`77Q~m=$Pnqx>MebUYp2W9F zcCN+%zf>NXhkC{DamBxK%Wj>s0#(+ zSD%u!r<5|gptMz%1{ArG#on(}_{&Vs0jP-k1V{R~iWM#0l`5Zo=&z#cKdjcISu5%z zronEaz`J+Wuk7aAR!|3#0BvyDk6N9q$Jr%9o%{ zc{I2^Z6N8rPhAk0DGO{t>Lub4G2n_^G`TD5bH7IMrM<=#SIhC!1_MJe zZ2meIYWkH>@f8S`6`m_~E3APQQZ~39E);8^dZ8ozd1zfpNo(nN4M$mdJ$KxsN<(l@ z>F)m`- zb>nvj^lGH^LOW_}W8*3@;(3vLUVasBXL4UPN4+I=pBVNr*T|ZT#!w?&6fDnzv2%A( z=ANm0eDgBY{L8s*{rBAXaEDedKsjrM;KAAQ-nYa&LVbTXYDR`E-(6i-NZMmh)Gk~4 zUEeQ9YE(NZ+vEd!f4z?WlI=GA=^b`n8yjJ$B(G1a77dT_amEF>A|U2VZ{qkQ-*g_i zSfv5`73m-kG5|UOOZcUy4nqHt2p5Gccgy?ojkgIGkqW+no3uvnSu9*8v&k2?NafJ9NB} zMKA-5()T&KejY}!bY9MIbcR}2u!gd!Nq_uyWZ1K$boC~uA#h(JOKeVo-Vp~z8+^UG zPvg?|peyx#b-M$PDu2Gtwy;@@7}vadFLVVLsx2C6Z%w58tXlFk$<~Vj?1t6( zJ|=<<81`i}*7<|`O*noKsVzAsAw;H1rG3KFe{v8$d-(m^6fVm-$*cQ> zKE}>0efwO0kKA*=mORlr4}`x@B(F;>N9buuvI($zvDtB)b|?ez@>x zyO(y_D}KuPK~v>Kh7Z^(EE#`c40k<(PeLJvfe1cb7v$BfUlo6$Hw4vHo~4+>^M4KU z#i%uNOxhq)e`}0dhtwJEK4JCO12~?G>k2bjCf&az8QSp`mB@$R-pTMaaq&ybWSVjn z|4b1S+ffE`I}gSE3cslC9727UhoJgbVbvc{T7&VK@7%q{pUTf%Hu4gVzLdP_GAJ-V zeJ{WjC@yEk41c5a2NK9EA`lF#Hufzy@am*{RyhA~EfKb#)xT^Maldkin}gRKB*&%o z(RVfdGbs_PW}A$YI9$+d}aqJPJi4ieHRnWF>X`o#@8kY)#0Wb7C0c^q{0 z%NiC@abG&yvsP#@hShXc?tJ%f6+b8!Z5X~}kxdEl>xqqKWGRu^wCNPl0?=-5HQ`HN z4g10QI6ze!d|V%?k>9X;5L9=wMpc}3sOhX$YSAgu**YmiA=UzDa*BvDJgn1^MCtn; zzfwQt*@yq^OCzg-k%ftBRj0L==On3Vjm+O28;{{kL*YgDY&G?Dty$(S?z+A|q-TUp z+%9!rPBjp5zn^-caH3;Qin_@|s}m#WZk&i=(_T&q2rES*$DHJ$<4{-io!91Q-+mqC zp}S!d@cRW)W$eNbp{o^qBey2Fs7!d~n=U@*BXh>~x|5q1Q2Em+<(hKT-*OglLnSM> zj8^-W?9MFY{j1l&HQeE2ttf|?Bx$-#t-(r#NthZ`uY+s9H<3^DYup0N_7myo+rnZy z{#SAt;MEnE$5Pb>9w%}KTpvn!+)B!~9Owa5>VJr%C=2dn{vbh@)X+)eiT`q82`fWB zbt~bJLCJ*T&bGX_!qbbx_|y)n(!m)J)DL_0;ypIG0E?qiBW-gVpMvZH?j$4FB7Q_2 zOd=a0Uc6i^=&2Gf2F+uAM#8=W{P%;BWeY# z+I7N{2_TVY$z7ifIRk-|`lUJ+)D0JT*rKkQPbR~YvNOr#Db?wr9jIFXkA2)V&TjgY zIT&c!A$sZg@0R%Q~7aQSA z6UoPL{gF9+;L45f+Q99rcq;t$nOIzOK=-CESiwo4=Iuq_P1G>>ZwsvoAAeEkH+>v87%5P%&}dB0 z1F578Ks|$j*k^;WxQ8bH{<%*;J|L!Jm!h9j4fyA^Ln#!1eu0!RT90Hn|lIYk_Z8IR?ewUvKp?AA8hy5o2ZW zsFT79)^vP;a6tb2{Tf6MKX zrMJh!+~eyh6DVt58)pyiNUF~iMLeIK38nSSZ6BRms#oyX)y z`b{lv(n#GINZVR<$@bRqr1?2===mq)<@eYj_ji>I+ojNo_Yy4hB@O$L9O4DBtz(k!hs=deCB2En zMApIUb#%vWW!ls)Sit(Wl7RrUW(Tn+t3m@m=kt`488w^Yue<7CUmY z&Bcv|E%&`qx@ixR(Eveux&LFE8HU+{iFkoC28ta2s?0X|LORtnGObqwpvRw+(T0LU z(09awQ6w&-H)#(ck&(e2jKP?4)=L`M)dRS&XW}cuFW?EE>!HtY2^?OIkkHY{y)W(9 zF}d~j_j;x6(Cap1_8Ep~wu1PfqHZF6ClM49F7e5aT?)E9q-rYTG9sL2A8Ff6S3(4V z!so}NdAW)ICpQOWQP;GjBQz9Qk|-Ez^E zVr0RIzmNMpz0*gpg09DjpAG{7tG0gjadyXoKkJH$P!ED$t;?o$$iX=opi#wDBrLR0 z+Lipbd)6zE{3L@XQR~-xE0(9P!9?@_mx+d*FEG&{#CV|q+IxS+>oJR$uHy3-$}!#G zr9SEu@-HFn2riV(UNQc2-4Zn0iK|wN#`~d!0#<2xT742q)PA81Z)?R~crMwXyq-yq zbaibSlfv|OWK(8yy!=^hjjzITPVD$yLo+A_$r-<+Jr8nnff~hJlrFQR%H*8R5A?t29lH7RbJKfCSLs1znu%1&RBV#4Z#41Gq zCv65fY0ngdmd`(z-&^e1l2?xcWep2VwLeM9yMXWRd~{>}7|>I8J@w*b8@HT#n_)tD zJy&tpdi+Rwt+TYGR?7K_aF=nk78vJdcx zplH(Qilm4O>5&t!JwKHvxr_ERu{kPk%7gcEQ{Ai;2o!xQ_^tbrnY0X?O%XmS?Uy|_ z(2v|fty0H{Wp%s`a+&;(r$^ejQam?)*HlV_Ulf~Jh*U)eC8Bs2x94ttiE||e6y6f} z((JxQ_Rw4M4LDlHcO;^Bvq50f;CJdiDgZ}bLAeob2rV^xvpBb!?VbArpgrjZ_*)Bl zHMF(H^Tou98rmL_xs^7WLOU7wCJd_%0m$@-H6=7q4~TsG)b>~TL-28SUQ!i9K;4W< zX#B{$xYYH(#ck`hHM{~?!_0dxQ0U1cXO0ETpu-m)$EmGogfl5UtsFRJbIfF$3{dh+0}%wJ;yzj);^-KH=W&+LSBRkbYV6CU&-F4P z%Uz1_g;rP^P-GXrQxmO<*0GEe@S=J5%5lb4eqBhIWxi9xw^b;52X57SE@xG0{zO|F zKh>#dOTOr8j3np;{fU8hZucVhF1IK^#Sn(A;%W zxLmVxM6eWJ*rr>dW!JuY{mvF&TwER}QFQrGL1k;z56&5~gjq+&pcT+vgsA~>V(I4pmFP6#UF zWL#3BLe{L`wIXOgV1od%t^I-2D}Erm+cT;s1_m^>dS%Rk%uDG?Ca)g5c8;=abT#zu zVIPyivP%rIhH#T54t^c6IJKPcI;%u$)F0t1R12E7hI3!NfC+7{b}4=SC#(^{jGtcwHAlS&%Mq_g z;hZed?tW0MG7av5`-9#XWpNkYgV-|oDM45M}HgF(EnS746vH+O2_1(k2^OQaoy2LX$GCG)Az`dQ{Q%`VRxAv_Ti z5rI{8O$|W(t?YO!uBY!~V;Lv;g`@gMGQM3#Iwnjad@2sjTTz=94u*`z(`qaT!kkh(?$%U2 zXc-$T#FmKq`)wa#UP)XdFd~Df8a{>=-ux^gHyS;s0Sj!#tIZ&96_B)jtm`A96$%5%!Dook~(Zybk&XhUP z@Q0(J%cS%wp($hu`M=FW_^e|k^$iM$-WCI-7FY~5AM5E%n!F0>kc0k@n^{rYZ&(Om zTJ`o=(m1*!)%Tw1h1B=V9`%|QWQj1meBk*fSsi}*-VQx~l)NAr1w0ZdQBtY^^A1ie zeV*Juv&X6`r@ob=a;q@TM62J^2ZeVJ_SkcSD2V>YL-fu5v5jY2NOkR=L#^oK18Lzo|!BZR0L zRn;u82+ogGF6XsVq7g=e9&i#&y~#V;#W)fcRhW4_v6LYAc+Fz!k9syE3rcv5yls~} zqzUE&BxdW0#p$bQ4JgShoBEK^*?N4KkUEQ{3_Wl?om9woLrwLo9Mns1rJ5H3_-b~D z3VSxqCH=jMY2Uusm$xz*^&9@8EbvtbMiYM+7kEgu+zW8PX7mC zCk^~>rEgE>Eex(XZdII^KiYE!8fEyL-=@ng``q4NP{&yn{f8O3^}N;?h7Np{^i*T` zUZh5DbZEIa`x1mwMOaij4 zNV2FY4&q0&n!na`E3)0^{r8wH3W>fWlS|l!J0>~1*4D@H?zoOs0ND`=3H8K0c zFcM|0{m3}DiPD~13|V4|y~y^{t1LwJXfxR8X7h*CaRZO9cV)>Lj6$3ZCOJw341=-6 zB&VKzaXbYjZ6J=2e%|qg%n>L>j*1ta0WLr|3r5$1(k9pN27=#5bYBHp|C*AsI0};K zs&JUHBBU#_NR20Jl-BrJI!Eugmls-BDh?z&+M5jN-gXRX{Y~s4DAcyI>LpJ5)exlh zApRW+fdVsRzr3cMTBY^ZBaVkS=_XvMC&sjfSR}%ymZi*D6p;Jex{ema9b94dSO8o^ z#`wP)mRm7+KXwd{u~}`6X34CfyWd8EW)09b=bTb!rjAEAtu^^2X0gOsp2PoZ{*U={ zzdde0urHek5Lqi`)mZzmGnKrZ5aJ6$-#de>Df1*H=Z08 zcgqyYBCSpXDieGI!=s4fG<^N zqo@dGAEdLu(rd)e3JRzS&c>;~1bNBMM?Uen)_uhw{97Vw~sUHH-w2G}>DwxO66&S`Jv zy)iM4?Fyq+b18Gev%+$qp9+C^3Qt?3-HhZ#c{3)DYQ z-cEXIW;+eM8HNdg(J8JM6W7#Y$@Z%Jam(X280ITttgDd~v}lOrq}rFk+{40ZE53Ac z3(t>5L17oUCPHfM+Z`*B@Jr(=Dew_M=9nD*2U^j1>g0L#>tXb%o}GaHKd`N?>-MTe zg4!>ly`QxG)pd||>J5=RXR@{lR5raAaw^_OrcMj5bua==h{)c2-z>CNlgGw<U`J3ISY7Va~$Ux7%e*!kvL+Sv@Y^*e=vc>140#+?k`5+ zoe~%@3yWkyT~$G&xxFkin=V_Mp1jvOWS*AR zh&Yylq5dFJ2sx#1ya@y5k2;Sj*P%P=1(hAbN1HU-ozhh=e#BDcFu>PZrd25)%?0%; zB7S*Il#6)}g?j$N3%ja3+oV;ov#DDOloT$}XCMiJscRRQuhh+bl?Vj1%wS98tP4jM z7LYT#;%co=JKeuZR1|tyvy#K^LV*4Fusta8sN9GYDDjJJElF;FxV(d*gH%rC3|Zd& za?l9cllHpeRo#@x)F%Cz4Xv(?<8<2>Xf~VW1=TF}Wc>o4u9TPtskE{DlE}0_WyK}#|RuaG&4Y(8@ff@p!2f)F+T3{%ft_U7|2y43@-){K;k zs?K%$2lvLgbRK~*1~&Ybj>QCIu?+8+|G>R7@A9N~PSNL&w6p&66?5)d>MiHp-Y-yF zoPC}{5aT-&@d28~oEU(J?^cz+-FZpjxQaKRyC_C!JcYo0tU+qbszzWoS*w9%1=sGH z8uQbrl;^z;?+V#tc*6&)IrMq|U0AqOJCRM>PeZi^17aZS%V*EqtWd5J8#gBmiFKm@ zQ3He*H2DX>)9N5mK}k>H%87`OkPPfVbhv>~Jrf3Hd|WF{vlBfD~K&1-UABv*~_}PoZm>Mt?+l@2Wz6|se z3`YMo3b`5v{j1ym)urcO4Da&7OgPy8yE*Z%P+0Z)-G{+W4Xq$Zf^Z4AZh=IBv@^K| zo5p88NkY@X2#EpbTV6F2`(S={#Y}wL_LPjpu3y4t<6V@6w&O_7y==rDBA*FHmjOHQr zD2Me*yUCB*cH($#+qZ~flW)7=QC*sds=JbE zI&&yB7AE!K;Zsh{gwm4?;){wuSJ!g~1U5Vz+7Z4r(jp2;qDwET+?@m_<}7DFJ^vk0 zI-CCd+{tS*TxtfyF{zI*yuYf-ai!}IBmE!Ep9a5&k$LtlCz$!7{13uMn>D*I%}1l0 znKG;v{SrZdSy9eSXH7tsdPSoecjaN}22RMNPr`6NLEF2m{Me`~7E>SV7;1-@dH_sM z6G6fUpR0A!{+{$_#{44TvvLG4(k_wQQ%_IHr6M26FNH;j+0>6nyf)~1Sj7L%x*Wch zVbYYWrF&bg25`XTnEqBF@&k74z*~Tr@#?s|^@pKks9((MvdSTq-Gi!AGx^a_ z5^nCq${r4>W}dFikXtx?-yLZ-n?O}P@SqgNOSsbE$0N#)rWW^hDbs$4xN0`?khEJq zw!z$rEWDAGq2V!Zrm!dC3@xo+ok#sg7bVeNdNtVLnpE_=;;2wdF#M$_v-* z!QBw>;7rvQoU*Ta3DqkiDkUqAXI*vyR4)$t-MIwN_uvC2g}~HIQ~=%YkD)3w-<0z4 zdK=GfY@Ch&E+eof0k&poi%_4DpO6yCl?@|*$nnBonL$CG$yx%s)@~aSAWnxtTNV)9 zP>}!3KN7_N(fqft_1|3BdZ^?(r#er2UiPQhLjT6`#Lvs|rC+lP#_!cy z=soxOex_iu<|x;t<<~Y7ZC@7)oJXbXM)N3(WjPrUqdwC~+y0mHTIa?sjl82i&3yMU z-dMC0F0{qc`=i7ON|Z+Q#j`NT=7Luf^7&YSsrjpG5tN9xgeGAj%B*^MMTy3!46P~5 z_rBq+x4VniCA02=F$ru8O$tkrCcjWjJvU6$2gfZ=Jw&7N0t(6;B6bY*lste0IRt2)Nwc5e1T&Q^72|*4O`DYz-Ot2!M_m$4diUgeHOP`dV zzc?v+?3+9YzdDM0x}TYf5k|hxN$JS_TPIs_>;GHoWCj`upO(5ErtHGY_ompj`V@mM zsk9wpriVCZ0g0njgg9mG3Y5>yX#lH89KXgW+-GD5GSs30tc?u}<@_4kG5^M4%C?~M zmzgttnY^eR?yRG)WM7u?TlJus~uA1SB#{jFt z+aN!MKY!Q>P;1f$*f``yZb0AHb5$G+8Lg595=2~(7xSG6E*I-X~0|%4?`sYh91o; zt^X(FBG0N_v$5~LTtOwEHR(9c^Qo{;K{Ppg3^duE^%;M~D?|$dHFAzkH})l9zT`KPi5G77 zYW@~BVc|o5v8W_RaS!u=REx~_tR8EYbih`%uuB2WmGK0peO)Y;9a&FTYsu3fr|wqM zgF*~W7hyJ-U&|ZDgC@}EFRCqHaiTqV!Z>4%ghB^K_=%+pFmLUsxK_a2W?E)E@!W5Xubp0d zo^*d7A$ZrKL|$NZapn&j>6 zXW~a^gP~&%95Njx6XU8^GM6wqF4V$NDLr3!CYvUob?}ZmjP_bB{&+#{EL56^ip}_} z$T)Gf`=mczdXqOq{}zz@as_x-&=MS7U6^_($5v)E3b;|QgA!VTYc z8117%`yQ6DV51p-;D91T)s526yFk7e1y4dW^7lfP{aeL@o`~z<3!SCe!7KM42t#+n4qzu4Tk;m$nyM_Ag)_l6rUc~xRS?U zod`BR2Tcre``DrvUFJKmtcfPr)ffvIaS5uwHmn5|@^}tdApz!ts7Y!ZS`g<&at{-} z?hQdg*1boxDc2iDW8~LI2l$yK*{wr8?DB5Zmsb|{aXss7+J>??xv&}(t!Nogsrdl0 zbpOq6_nWhbr7$#Vm86kdqi8wh4wh4%5d!(J7E~8a?$J~BJ*~D$Q(j&8(DnDihX^c1 z`!d*qd1d=otPiXOr3IUIG3L*Lx_bJ2WcCwOmos8UF^A3-^`Ta1G4YMD3sW^`nbEmfuU3|Ji!pAM5N8msH^F%evMEA z5%)oPN91vORb2+R?fTk>OyTO!d12_1n4Rmr3h(&7pG3ol?CdazjiQ+?Xn!0UkYERs z5a1uSy31nEoGcm~h?|>mbI5+WvJ&p)95ZLeU-pdrQwdYZ?4F|3VlNx5jDp=f#<1@S z`Etxr0a+F0<;pX%@jS{WL(YZ6BFPCwkpGrnuYWp?VnJHtp2UEELA+xdH}XmVgB{qL zeCW%J4hTq0A!mDNcTJ{#p-5&^i(4ZX=^@yEu-9z+rFAg9Ax=B+rUdPMVuxeMbJ`qK zELaqwkFr`y#OAiH&65x?3O8lbgS&Tn^g=^KtG<{Cq|zhR4ZrX-7^q-Q9nQYG=Gl zP4`QO0`Czbijp&I$Or(I+`#rlAifVvyP$B*;cxyi(=+T*gr>@-4MO-2VHq}dw$+({ zt)TJ7Xsx5MAd7`voyXiACJCpezC&<2ic^5DXYMob@(ObiXS3bIrZ`^->-Wx zW}SSUpU=u(BO6rr)3;<$&Xk^BOjsNDZDPiQR0X2H%$izEtgwm#%q7S;1$X~LDJC>#n&R6ENr#F2KXi9P` zAdSA;IR4So`E2oIjPM7ae%M3V&41WnG-tXz&)MK}SzpJZ&ohhet4&hs_Ql?Rz@U@I zlAOcjXOPy@BRC^`JB;F zp3*7sW4An;ZplhXcHiyuS$3N?Ec!Gaj`H?%k8XC*r|>Quplyp+aN(6_mxV1-m>On> zc3~yRUx!JDx3kpqf+Lbq>!Ooj`lCG7Y6dORQiHnmULI*~EkVMVVYHxXH)DkKg^hjS z7Dlk3kw$O`*!MPu()n^A*dj+!f2QACKvP%LOhi*NwO|)xk>fR1RoV4E{{)Ju+NlrV zCjywMft>%)fgo7xgVxA_X_0RPofbA0A-gzy-^#G{dhSDa>I%Uw7N*5vTWPN{Ai=fm z*p@a}h`7fMFNLj>352~C&;?-jJ4UKohjHh-ar${`CrUVK}e)pon#EGN`{1@dm63k2PydvRx+nA8mAgyivmWY>pGjl>TgCcfrtC$MIxGg|@QJ z&jy`dU)o9x9DNvy^WPOZ-w%sTWpo^+KeG5(j1yr^59u9lwp;#|xn^u6UH_5u|JFh? zpW&^1J@Z`w3)Wao@;{iY*t|8`OxM&u-9M+iIjO=cnYC*`nlH^QhS$r8oMu# zWGi0on53T_^*q0H$9z01tMk1>Vvo+c>aJOHGeAUjc9dQJaeM!N8A$xmf0| zlIz2z;SW>mUFjtkZZ3ZQef9XSioINyDD$B?f@`jH&iCIaYNPy|=N(#NQJvBaF~k4r zCwVP7d43P^va=K94rp~B@f%BDbj~Nn#|s&K{uO1{rhd(pI3wTq&Qf>s0VVv2voAqG zK}{~TM{;cIQiIGkmfKs{D2$V_$@Y%l1 zoCbiux&vw!yF`&9|Y)vOy-#v+y_34Lo!&3IA zS6wVTvhwF!e3Iu}mm`kg>sqUzoccBYvfEwcozS8V7_Q)K%DDTfEic$B0U|ucxy796 zESIHXu|LZ~bHa}g!X#+tSRh(_kPx=BY5>Q399u3!Vozf*@fd)Gg;twjJ3n-l;<`H9 z|L1>_0PG?uqgZ^hGtZe_-mw*?OXL`u&F#WbHL5UOVk~dIGOMV!Mam1W4paO+;<|aT zFE8ISMzyb?{rb?p@V{kt7=O9sYJ8r{h0glQj_UBm6t?i_z*>_Cm@Gjv%OY#FJLg?p z8@Hl>LNwvHLRbnkGT6FG9Oh8G*nSM#X`*7l34S{YZ+aa42jlDhKkU6{Sd;0#_Kheq z%8bm2z}R4oBOoB4q9QexVU#XSqy{S@0zxQ4NP>>YC@M4b9+3`0q}LEEh}1}p)JP3U zAb}J@`f~+mt+m(j?!Djr9MAr^KFbFXa^KhW|DWgYS8!nj+<4Z!!6Hr4>)FVOs#q&D zsrhcNcrPKCdp(wZMgGes5E=f8OUb_TrtUdg50`GuFF2s*!b(0{FkMbxx`??m@d^!& z&t|%d)$y%LS}y9o0N?l3Iq*WW5zv+YMLO`Ey6D({X&uPu=Yh?F8=FEMuWHH@zC3VH zF~*7menYcp?%QDs+(6)F%KE&O9Ty9As>V08pF)Gz-D#fDrUtk7ws9RlG5L_Fw{F{u z&Mq_J==-ya2JSZ5RyH1ltfms3>;yEn<Sv@}OQq_y0nE;Yy$u>x^~J)ZEnp zfFr>{1;C)@AFYVyw#NZpkr&4*xrZ(buS4zHeN&zJS{Hay`p%h<6OLeLWH9jJI z^```#Q+?6*@=Tt|;8);;$_gOXxR_oCmWa-V1`;d11z^D>n6u4!KGj)fd!xxbQ$0Nv)2V@fN$E$Pbb(g zY}BPvY2Es3TfXE=y(0b`fs+;&i+QgQl-m45<4PF}tHCsX0yVIudy0@`RdMekYHfIw z@W(;~w5k4ht+I0R19}5zbS}$JdgYZ}l&dLgF|zK0fcAWnk|js)oC>UULy+-oVieQ& zUAx~qZTDgDE~)?3=i18uFLiHdJ%LHT=uR9>7xrCjUF5v<3y3r^sw@mKW`&N7}8E68ME9?G;sABNH|0;6AggE2$$41!c`v99yLjY84z7f@H zGX-_tZh)L~NRm*BfBCBNIG($KY}A!f2+fR4O@H%O9jxXE<-x`f*PAy=ksmjDlJ%8Q z45laJxd{g(5pV#kce->Ppdcg(@Pz0f>r$Ckv&M)^Rbj@8$GSH-GXUwAu`#<#lH4eI zmh{pdQW>IyirR8!3OQ=CAz?N2`HZ(nS`KJyC3!yvl?sp(JSCUUCg;5FhUX1^25Hf( zSgS8<8}veUyJ&a%oeyXuC+lIOQg348Tc<41{i1LU|s zjKV{3rd>jJ&Nx}W@GZcTCNNhIB2qv}Q_@9IlluTtc?#dC&o`O40i{!hul>Ma=z_V` zjr;t zjqZ3@IO!#LCOd>zi8^E28~}4DEqHt29zQ#q(x_Zt9IG<8ETy_=>W?XY{|VQd z_^QZi0S3kNXU}X!p1r;La_781$0TvGD0j=XtdD!+x-o)+ruhy#mj+4LaC~Yq8KK-o zklQn`)D)j^+8hOXjo zc>aK0wnDTXj`71Bp zH8NXZa>!UQyQIe&&75~3TC^f78f;{IBA@kLJQ~?cK>cZoTVML^;eWsn&bb~aI;$f| zvl=B9_2AA3zl;#oafOQ<{fZ@9+|5NoM@oHIajhM$u%dM}2;7WXq5KJTNdylhYkQI@ z{k53uL>SEn*N*G_+9(PY0|Od0flXz18$$bYI@ zB8#jw)AS08`IW$)>cdi2HK5K`E|b}&2K$tuNZc4U79Hi*@?;QYc7u4)W!)%K=Ws-kk%J1dA|Gz_*V4htBG&T1b-SR|YU{CS{gRdx#uoSJ zhq7U`XgPd{=TbT!qNO#(WRh-cNTCtalazE4@j7a15$=9?MAQj|{%LKzpvw~thJ0Z$ zV@UU*t?!W^!t0hDm?@K8Q=3H$Rg41!wJ0N$eMZT@PBtf6X+>Tg(EBkW#Q_gXZg`&dY+$ftiSOGHJnp#a~L-A2309k_+X}0 z4s`Nc(o#zkQw6891-|1{oBz1037)I(g5d1TUYLEzNxb18*r({FQ}M=3kWYo$P2uh> zd-1Co5hrn_6+A@PyT!2r6OdZ0%#?A|EP8zFr^@I?SJ8D894Cy;9V67pQ80o1Z z>ApFAfe|P3R1m@OZf{#gT+G5d1473KWrxO%2hpEQ_i~EyM@daH0nB*$%(W`g+>*1N zPyAap~ z!h&|*4eHVp8cnrz_ezVu?dv=D zl?(H!Vz^euPL-LLM8D#PR(Kjr8UjskG=&Jc^b&BjOhmY>`#DM7L~r((da6buzOgMS zBI>C|g?XD7>~MWnxh!W zi0i8UVCWrrgm#hREV|r$Zn8eh*za{z_E^^B(Wbgrj#drT+njom@3qzJiXPN=Hfv@5 zz+Ul-f#|D2<-^w;*x@|Fht=Xt%8X6oP~xmbn(& z8rM}ef&%{^Va@7_l$gm^qusF%s1^u7# zmdC3>_a?*s{2%PqH2qqUD2JhE5#aD)%cc`d3!jVT)CxFt_bnRCQ zJ(HjoFN00@`jrFmIhAe*HDnCZ8MUp2$8B zsjNgfNO`5367?mfnT?3Q3@T(FrrFUCx9C8z2fZEU5X+0I%7+!G;FbLdabyaU!x~=peI)(F=mcdv?jgg^ohb@NP zFfy59suw}y76_Wh(;$NZ#Fw;}49fnP1JsYIPFBwg_?Sxs48Bjf!e7rMljzfFm0Co{ z%{2?CwdpHqZbwtMzmQp^Y8tI4+>kyJzP3}u$1YdGhdUDVoo=?oXnNG)rdq@)OWb>^ z2Z7S-yOuxx;UIZ`QW0g7QuB{kVFg5v# zwnz9X&E$ox9S!$H%=P4a3$shdAdaHMcn@*YSoWlQOPy(0ypg7{<4gZd4J?z4%kC^) zxwcW(gwa3R3YAg5n8-#3uF=J+Ci#Hh3%?Fnvlaba@U(8|BxbEtTML8jKvtOQxfV*H zn_c=>O^tUHE9Z{bN9G{~d?CF2M zu|i6a(=>yejnLaIwtj~d56b>JPiI9!O|RuNHk;cw`{c{~-*+X7G^;^k37wUH^`=Bq zHoif2lQO@Uy1`B8`Eg@N2(J7s&62jgYhQ@*r16*!*fs`8+WDHDJ0(zpNclgNY;{JX z&IS(VU(E+(#tU-kBD2#VgrZh5w>S&>tdjIMJzD;FnAWeCOapS%LqJM}^PupvWlOb( zlSEgwSCX-o%}B7DI04v7?y#*SxiXM0PUR%ZNOp=W&2Q9~n}DWGE*oESSu-TN#SxT3 zIxl=0nmvM_0qBi{&I}l!>VO0fm_l}b-d5_R6T&d7d<=jbsy1`A#^|rZ2g{sk21x%L z+JK7toc?og=D4$j!BxD`k((;%IkcK)7;!vZ)I2@k+j)HI>e1A$CX1ggYjEg9gT~@5 zE#dUmxd^92x~=ld*gCTR8f^3hMn}_ifS_doq@6}P)1t;l_=#z+{((m`{4L}vhP;XK zJ>mM~MF6aNhC{=!kvvY|7Hx$l-AGlflQ~siKIFg8hD-0)%ETExUYnV&G+!5b?XihJBr*V+1$9#7QIS+W!HwoCRm zRg-HjZc>HY+MJ%2D`ouYw7!5uzer$YV8kzjRV0Il?QWt1zci^=hF6k%0GRc9oI;fO zj_s{?*prmWWe@*%;+I7HiXiQ)8+@6O#5E`;5Wi?>4<4suP@L(v+|^ZxU84i`YPzkp zIQM>jlC@7fo<=?Z;2i&%7AoOM_0GS*C|T=0nBl=>$lE2ycoe^i#rBr*o<+RzY0!LM z;TP9*hR9zH47?tPN|1}0+nXl+a_MdUT+M~7tC7FvZEJHW+v|16TD;$rMVK4tZ`97| zuG{R@jE=l$-=v1<;SbbV5YJ~Lyz>9RONJH5d_y`_9@FUGH@ zI|@Ak8 zvv=OPX-6@?^+T5MX!sg}y;wV3U4`Kw*zav@`noH|9=F!Ye3_&?{(vKG!;B=x@qha_ z_~m~M{L-L}gD(raPH>eQ$Fn8C~5B0+{swi$hB; zqe?r7?(uVonO@71^6l~F3EbhmVlZ4J;P@AKt`9HTv$FkZc=s&P_*RKCr$NGAGdrgo zoj6d4JeeadLh<(tGdbg27Rk)n2; zf}OV=yz{m-o|3gTICZT(-U_!yPG?acsjua*lvArYLsv4F_A)G6Q9Nv)D=hxj_BvLA zwUim%Y7JL`6D@zZ(-l!-w7z9l_^rhCW597P5Kep@K>UyxWCgS+iYOkg;7& zbM&$cBn{%R7Edp4;J1>@9Cp6$J`ZLN8#HpWZ(JFZMZ@v5!!U9%R{Xub%zCZQux1D} zX@`B#C>)hFE>o`T06`{9ou*6MZmGXAI@$1+)#LN z(1<&3c1k%+dsh-Y)&qD9Ao@8FiI(~2A}jlT;mo6zdlv0q zBe_%e$)-~6PO0G%HIo$>+XIuUygH{YRGfd{R$P{5kk-|)>^`t^20ov8h0dKDOJtRS zhLt@h0m6`0l)C1+p$%=f03gV(I+V&!fYXp-``4bz>3vVOWdgV>)^`s|T3Hg4>%DTe zcjL#IzZ>OF!gv3C%QW``N)TklJQ$h)dM)pPnB$ zw8EB1Tyr8ooBzaD6r#jG1ipo9>PIGfbMLp*8%|1AAC8&{p<4MVrk4TmtNJO1WK?N-n?bNPGjMua@EiY0`J)B=Bmr2%DhaFRqPFaB_d71_RdSutcz4 zYmm0yz5dgnczq`S7b}awu;rYTpt33dsk_v~ez~}cxWanTVg<1zPdr!F=@T3@Zi-Lp zLQj}uh--;H18}n@_0tlG0r>V)p9p)H=UShv+=bZI8-o`b0f{Cv>F z8L0S*^xbbR4SyY296BK*UT}_oEpw4MR)EU3zt3(aKnj(zt#D=mE>?XwM^D(`Y$qm@ zK#Zzq@oj^oj{x-qC>=ORl615V4KXEi#CKtwMW_0d3y#9kzyCMO^4EVY%e~MOHRIQh z(I<+W+4Rq&yT1Ic5N+4!A4l5qshlzmt>?%8IL)ldloI%db{W_@T`4<){~66VRJO)ky2cqzCl2#t;}STb2g=E;*E8j*pgk9TCIbj5%dgEz(jJs`Gi5 zkHz|KCjN@-j^gpYasYezeQpU(IYWzI%UpYI*=PPp`gM>^$+k9`Q#|I zDRhte=6CVYB!%B>imLMvdW2nT%K;XEuL7ii8)Tu5wr}k~D?I8PSQ9Tjx4?bI*nSg` z$y)jkA3HMxtnwa3 zQBnKNj5>GHNS1DpL@sK((X`|wHf|I<721y5#iziuTED#Vb2gexMX$T}xIl>xTC)Q@ zYUePnF)wuZ^_@5b?#1u@=^rj2&8!n4iSO+hvr-`Tn`kuJ|jt6_4lNkGx_EU3jUj zXjiwTov_Ymtvg)`=KM`aa*Y)PO@RX*eI;R2Vp%4u*CK*wo?nG@a)m48}L%2*ImabW0v<0E24`CC9KPdJxPQ9@ssYR9TLP$0AMebH%`p>s+(KHNxrR65s9N2 z${5Aj$79A{jr^c@o&3dyMk1s&zz5W#D(`_NMsYl1tz#5VzZohNFc3*mL228&$@x?A zDohUD;L;)$^^Y-L^$R)9V$ihjs{sM`TjP`Jj+)<3gGq<&A9W2~=m(I2yfy6^HE159Sc5Tkyo_=E^(*1|huQnSxbxR410$_!$--bq@ z5}qW>pts=@f{cvEIKehoAmMlkS!x3p4H{QjG6TF2yU+8$f3{?6exdK3+Ff|-0!S29 zw#Qf${QCGWv=Nw?)P!lBUEqhwrx&?;08^*z{lX#My&8`>3B*~V_$F`G6}50OF}m zZ$?Xl=vn@~xShI{vsh1yGX@Lh=ROx-_sEfMamO+!N^7v-i4bZYnUI;JQ@!t>X$^cL zn2DMiQ~+SuDCP68UDuSCeK%KI_2;IxFZ%k4|&t3DV|D=9Y$5yiAkdAGZ`6I^*uAE zqFg{^>KU13jBEvqB zDktlC186El>NAeOVp=P-4Kjmmd2yIBh;Tfx8e`*YdjydTklCP@?;WQA2R^ylr+%*k zc|{PhY3*ulcop(j?)wtd|1_LB#*y>7$8sg%|1P*m>Z*AE)J5kYZp&yu>adO+9rcmi4*w(1*JK_L|=Z@Yz_(EX%0ton)OWD5bIyPEv(@ zVHNMh@y%JX*v5A0z2`e$oBZL>L5p|X9!%Mnz zUWw%YmYH)1U0Lm@bES~GuynCLNNifz3m@LOAmDg?^wRSJXD0d$j9$c3K2dW=u`KQq z;!<+<(nF#RZnQH?XRuYuBYWLFeED8L__SB=MX3t!?AKHYIuW?bH^8WxZT)A#+2Y|i zw+eW&V}>w~Co;Mp(o#VWFtI=>KB*ee;=f8nz!JqZoh0MampSjML{|qwpWL0V8#-{8oV3^3t`m9yozLb;V_24e%Xq^-Keo>xOX+5Kp;30vA_&hgC+1_E+gZ z0R;#_{&vxj&>a3z|sSC03Ud5$}$TOn^T#KRRREk`iv7!z6SwufGe0eG_jMhcW z>}t!LnsDPq=`Q*eV4B@;0>pA`df%?-I8wrYZ&WxIo~+v3vIy%ZSwUdwVx9r9wseAJ^a^6ih2;7r?db^>{POdHe?OI1*iAn7;NjAg(%v z)%A!)_0-`^cP-d&EYMvnU{*yYc^(Uwg?Io^b zB8)??VmkHYGkxEV&&!;R|ElD|>DDi72V#!MF!0h+J!B82Ld&=h`EXvo1g4svAhrHQi`V=Nh)Dd;wlMC<0)60o=X4kx|%RBW<^Ky`j zJ`{Yfkc*p+>ozth#VGb|3Z}uYc!Ay(j&9Fp*$VZwV}xE5pI{&Az2%6|For1N{z;)p z=sz{9C2vP@hA+Ze>Rdd-a=Bvx>@E8D$HibD6qLwS*$SBzagsU1c`o`sn5m*)#bpzH zoMAb;C3~m};yZeYY@@hjrW|o6{qx)s)EUx|V*?)^<<)BE#Boqp^KW>?ORvNjr@yU* z__!c-tWWxGI&s{oCFx$z)7X%=ue*(HKmvQ0TSU>>+gJ%+>xHRRx1rVIGlvarrOyk^ zhM&N~=;a|2BOgxP4-PyRe+dO7tAn;TEH)Gbb7vf3=NeEBtBx}%SsON^5`f4G0#x#C zDH~N|4XIr&p0xBd0hKZE(0g#hWk%0GQ23s^#UF9I>hnyFMM3wI-yY0*bQ%N6p~~5U z3sZv+V|xb=t9*5tdH9*S>F$jDiF`s;738j87|O-;fngt<|7};y#>1~#wnWotLx6D) zFrPsv9P-Tz-b0cV%X(g2I^m$I=WtfPM*tm4<(ekwf6-0@V^6Ca!y=>o} zkMPXFNn2_^vfWNGvQ6S(H&p%puPKu!cp$kS)6Cy4F`B6ywEz9@WUVwaq!~LLdZoK+ zAI3kj>{v|dlg5VP^R+&7vy{!UJDi@podY9gOx7d@pP@X7Lv-}@!xccxIoHc0FePRA z6Coo>hwKMl-A1z4G}{;o(f$A$t*QzIbE+mupWH4e;`<}hgn9CoFL8+uI_j%U*l`n( zB)Q!kj{wB3R`+b|f<`CFW_>Z^pq}W%=DwL=hh0si^Z^9&>zwM^`*7(MdHO5#j%@4O zBR-2u2~5;0RARkgZ+A~}YoMFSR?z7GS+mual5G7+$ca5Kb6bn7p3Z#<3v|&l-ag#0 z$iF+%)ja%jJnj{Uj2ck##X%9Gmcx2Y0?`=yH(4ZipxFBv|D!VEPqCR}I{b~HEBQy# znVGUg-%oX&=~@ZzFk|qB>9V``Osf{AjAahD_vwnN}b{ z=vIjC!1pxd;30z zh#aKN0I7gZIALI#W9wvg#W^f6W#w#FYaa`S=jlNm#K_4!3;TU^n+W!^cn$g)l84Nf z^T=`>v6Juk=45ZeZ+lV~0N?RqyMxw{ErWUAf>~5h81jZ>#-~8;O^Gv06(TQ& zWpqVxljX~ZB3kVn+(B@{S{Y%hwT=@|E(!g(yF(c`FZU+m9LUd)i2ryiZh9$Rd?T4} z4fCHX1Fq|TF6ceAap05W!EgHNNM(}lck48$OQD0um9A~qPz>?4)WagNP1M>u#?4{4 zN?T9fa_H^q`M@)niO290=tgtlq6`gh<#eP_-)XV8PyLoSwwYx*3eo6)e`P72kxKDp z#>={olyEo6wJmM&p3zS&jo%BmYUL;K`m=ZBl!`i_VHju!S|@lGOQCP4o2yODz^xEb z5njU^A8#v(hZDT}jkfl6w%osq#ghUjJ%rqX2LTKohl?g^kCYhrLvZ0=yn2fQ>%;=D zvpy+4J~|Ok+m%gTst_|wyBemV7V88a2^ohm%7SQIaO}|^8Z3~Hwao)B5tQ+p22D>_ zj?Rl7TeKD$*nuhwoBRUQ8JOvm%Xex?GS|BN-|B{P68S@+F7)EoONV8ZD{SJiE~b8r zXNb~cf^hn#(D0Ln4XHBTFiK!|naQ8`7+mj@xds+Coxsb7_=lHor{u5#ynH#jeK*vK z5^e_(yV=#R@%$<Z6RcrOpN+08QbK4^JEnEyq^2vWuqPpv% z{YHJrZ0pT$fRc|QQS$u|kwAO=CRah?ZC*cy%Zi0Zf<^=lr2PN4qC0oQPxYo=lqy7X zCt7Z}mqhbvYn)w{*d+R$@!Yx=wrxy(eQVj&c%!!Fx3eaSsCp{D#2qL&y~r9!_B zc(bLbFAuCX`q4DAQ#Jkz zX|(!~%|b!&oWT8LX{g?vRqwneQ5MUPwyiBGRY_e)bIhdUTo8vxi_RAG#rU01G$MNN ze>WnPKBM%G5hK@1TxeKr%`WvDy|WdL1ZAs-{P5yf+?m8@tC4GFMkL|g#Ic(u{9b;b zUN--e`EcjEW^~j=9J0BI^}J{(UP|#++zyqotGm?MwKuMbc+WVciDbktD>A*_gtgQG z-}e@ecS_C`LAFb^>xWY1uo=Fn>a~+gxqe4}a1wMrr+KwhJQ*yg;CnC-6M)ZXb zCAX6lF{YTZK*W<~jrqCe!{yWcwN|DfS0dMz`1Opz2~!S$u7nt;4Pm2^eseo9kn)wm^LQz)l#f_tEOC@)#5MKn=Ar#2h3 zD;oLVA|++NXqzv+`kD4{{uq8W-ZH&ljH7-b2X=Ik|k=h+ma_~ zbht!ve$#dbah-<$T=l9mj!L}nq@`W@h+=3^KdxEaSGRndYD~ZM0!D9bK8FQl1dG+w zF09i+L6x4(_fv&X?HmnaJ&vcxTArvi&NRwug_vFwY9G>U&c&S2bRQsirGm+3=)oi0 zOEke2?<}g>QCEX-Hxge2tcAf_$?v@eH_!bv(Af;El&fWdZtljTwRXxjd$DX9u>dX1 z^BZbZo-9NCJT3aJMey>#P&Pz}2v*_Dr>6v#?}$A9hS2WYO@E~`&GiCSUr)`k$3gdS;szsaD_|asi5uxh>fm ziiAxa36In2;*bbfyV;n&#`3__qi62JyOk#jMxunuyuf^RLH{#Mpd)Com(DQ{-dN2~ zin?;lJ}q;`D$$m#Kf5p4EiQuM3K>9M{8ID?_g8D(6t2p6st5@aEe+I8Czn&8O2n*5 z!gDh_Dbd>ps>QJ=?0q3Muz7JwACEKCvPeDklg^^(VnojsGJuRx95vPv9l+)xI zK_K);V^uu)0AV?Dsx<#w8{Ae;Wi0UqkMy*wiM9KznoVT^!*3jC;Lx98`JUww&C#3z z&98@Ub-Vy7eqVS$)JIE1QV1qvyGHLwzuup*u*Bz|m^_cGu*93Rz8;x?i1m(II(*Dl8t4I7F9#wd~Gxa}TZiJe!F>f3=dgouW3H@b-X3TW;*X#TqY zFa+8XOe%;WNe$|^_Ox{HYCkk~3=Q5X(VI>0_|>P89{5^2^H=K|&`8XxhB|d@gB%Qu z&2;68&Xx$xdU62@i93iwC()^}=AlfE_!q>h8k|XIycz_@DJfGKpZX$MKCJl+@)JoK z5M1VPd>=^CG&(W%&r5bB?FXvU{RpKIoe{l70hb_dfuiamGxoY7)CStoXo-Y+vYVUe zekaRaX2nAJ&}9dCgr@MY(}f+0|55C2dl2%u=;V!d`{&9uy&ROCXOP${l!$RqDSz7T zOj%B45NvX$pVT~%UO^-L14E@Tt?Qa?-=^?~KVT`a39ht@iM!C}sMfp^-91=N%zn^C z!208u-?qlrPda2@>`6}7mhmi<>JhSQuXs6vL8?0S33v@lurwF{ytD!Hk~uXt2(%9~ zkx+HU*pQETK<^EE5L&qXdT8d)U?sI9o|`3FEHkBnnPV>!?gSADR3@-CgR^4Xi=D6E zW0}@*1{a#@N5DwG@xD^N`D|&dh1PDD{c{1m>3~JI5rh!F_{+N&ZTYTuW5)@s&ZiXp zcCNmm?L z166c=kLi+DcY?#B74S08ORmhnNW2eb68x=d6fm8_2d=yKRcGn4#w4~tZa$}!{cY-O zYf1YC#X3?xU7htj!Lp=tjO_c?KVsa|FZq`A3eR9@B)l%ZtNzfJ8Kb*jqQ{y8aR4O; zbr>ihe3K!tQX|$+O{MHY`rck?Meq||>KU5C@Hs43^IP~VX={8TVMW9;+q-8M=!z9! zjJ42$QX>+NSf*h>b83EulJ(&m|HYJ0*I$=VfJ24O420^6;a2PU&O}?|V~H zC!A)9ey126hwn%B%8gQQ7e#u@EaNYsFN^+&{30XVy*eR;57*gXiZfF%)^wYkbBzu< z{ZKrNr~g#fh|kletXbj8p6}1T#wZjJKaZ__?B$xJg;hs-JIPJtS9E$|qD~^7wJzBG zh+oY5s`*{=V}?k-mdki635U(H@Hvsc!Md&zb+u0SLilxaOvmZIQ1CK<-(K5YpASWy zJ_6e3)4&pLqvult!kj&W^q{F!RED)@zP4t4dE`c!_@S`RF+7>*QW zN&2c9Q9^ipaRd)T1Z)oOqDiXb4e)^gt+fQYr{`*_ZU!$Bq&$X{tQ+Ih-wbTAA(%r9 zoW^YAa#@H%k8;|2r#^_DvDXtZ&-?CrtWCz2qlZuWH+=N5ZFKOD5@s(w=f$-egcCVg zylzy!w7$4y`{+U9%Q&!m-qyxNtb9<2u1?x@P1TeC#N}uzE%&9C;?3Rz+J7r5X~sbb z$N@g+mzUY5qt21Jr;lw~Z*tH1gt}W}_siQY-fu7Qj_dJMKK*hfQanQ{@hKR#6A}FU zQ02$5#aSpaZZO0*QocogM6*JAC7WZG8AZ?Za`JAae1Mkavn=R0@^48Wfk6{8#4K_1 zW#Q7B(DEk(dD3^+teond@I;ef|Fv!H%!LW?raoSv5KR__AQ!6cFaj6y z2zt&MD7I#8A0z%qGxXjiPjS+GHEpz1rFAW3snMkv0-8u9AAG@sB64b}75b{^XKiqO zRvYC~sK!Hx&iAt{c02}YIT40kBgFTV=7X1iozUwPb_7AiM2QuaoY5DQaA=?Qp5-i9HW|C6Svas@khji-G$J3g~tj# z(kp#J%99yttrLzWi39zc!1Dh}V0rLQ0!x%i#GU=_DJOEbwSlYlQ7s~EqEAw8+VuR}>- z0qVjCau%c;Fq4@>C&Wc}RS&IKl3qFQ^_h@JR;P9KORvSYv_k5DX+cZ>A*oD^YFKp>?y{6w4||kV>xz1Ye!=gS z8B@2Qd(tJ?(<$#6z1di6@oZdTf{vQacrD!RLpkprV-0OWbvByS)spJ}WdM#`ZE0HH zD}ONYmS(3f8o7ARgB78=J{-xOMGL1~Q}U}jSx{bN$*Ih!N!PdT1&=~O{lMUF3tPNf zI>IsH&||$LS-ibFwIT)&y7JuA|12L5qd>)+GGin~v^$TP>aps5?C58<-xy~s4{b%i z|KQ}45vP&)3S$=iyF=IG`+WWwq}G9u9UJSEqcf2R keTIUf_#ot)RyhnKkTdnPj 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 ZwJJghb;n<_#C@)S0An#5bI$>OT2-*-3 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 literal 0 HcmV?d00001 diff --git a/docs/images/datasource_sql.png b/docs/images/datasource_sql.png new file mode 100644 index 0000000000000000000000000000000000000000..aea8be911b6b6739c84d8eeb8684897798187022 GIT binary patch literal 177278 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 Zak~Q-M#&&Ax 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 P|D>s|eYyDJouK~$G`1)~ literal 0 HcmV?d00001 diff --git a/docs/images/detail_default.png b/docs/images/detail_default.png new file mode 100644 index 0000000000000000000000000000000000000000..30e337194a04c2d951ffa153cd3d62d91676b8f5 GIT binary patch literal 28427 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 Uvc;F?{N-tysyZqqN|r(Y3ow*c(*OVf literal 0 HcmV?d00001 diff --git a/docs/images/detail_entity.png b/docs/images/detail_entity.png new file mode 100644 index 0000000000000000000000000000000000000000..edf9127eb759509dd6e767c4d6b01c74e8aceabb GIT binary patch literal 15923 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

W_oQM|3k1zV;BR|QKc*Kdl4bgB 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 z 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

n6buac9y&`mllC2I$>rL{$q<B_2_17BjL31?0#I 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 bUT@SN4PDRq@Z<)=GQB;veNp^*_&5ItPK*sI literal 0 HcmV?d00001 diff --git a/docs/images/dimension_list.png b/docs/images/dimension_list.png new file mode 100644 index 0000000000000000000000000000000000000000..6a86726a324acb6997803703d54202ec98511b12 GIT binary patch literal 304791 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 keTIUf_#ot)RyhnKkTdnPj zCXJaCU=*TDz8_!UoNp2v6H!Tszz6DLv%N0_adCw^#GO!tJ{;*5QkYOlrRIyh+ddE| zRzxu8Wks-5mG1=>2{^}iwZEXAffO+*?`+5e(Nm|U+NQ0xAfJfD-1Q%q%zllsw|GQB z^2?-JhF4X;FK+fiATlN4mtzqa0m4O{dQ%~~ECMw6YjYB;aW}OTqQ6_n;l9gwJUc!N z$%@<$M<@R`$+^E{X1vfN;29c8-PTsY$;Hon!9i;-nTqx}e(bI2^+T1|TJ(7p>NenR z8m+A9P%7wCxuWLPs1&@w!L(PfyqFBf5HQ3tm6LH#N0U4TjaYpyXR`ryswQ zE%g-kuvzM9wTtOH>u*j@i`JUZhCYljqtL!ZedpYrn2*2`-C}~F07H?%U6A#OErcpW zM~I?qgm`+UpQ=6Dt`BKbUM%EJzCs}b9Z|M7W(VMHp-tP{EYh)ea~O`C;@EoHAY>e3 ztD&rVj{o9|N(4hKK4tsc11e)ZQSxTHCB9a?<9g!QmjO`}lpc zRLgm+w`evm?>Yr4HR6G_!)8x9x2%Chjm~u6=5EC8>e<#U;Kb;$u7dbl4=io*7k$5s zBu0E#Lx?BvI^v#I5cFTviP`zuRcgvpM|XS_%FVH}44g-gEY~B`s?B0~G5UrcrKxI=`RnB*{ zfr7M9bFbe#h~EPaiFXaL$B^mqEkl)QgRhpT@y$(VfP9u2>25 z@UG2|3mQ8df7n2wm|dJcl)9mO1$3qyAgTM->231*+``QD<+XNO4*vIjn!wB5;ITz9 zd}E_c%T2(%=O>O{_g?>DCF<&H@?Th!)=3a_L|!~=?zw>w`Y~;qoRXgq_zh@*OiHL= z!`t5Y1FhUz5-_{=$({m?)@ezL_0Wk|vS49u9Buh_d0!&jQ$?Qyf-(}0udmCDr}~8~ z;K-&P2jN~oH`zyF)qJ)d45LnD4650hUj}%RFRZs2Oyn`bMu=ECZGqe$Y}<(f&=IX{ zmR#}S?m2Mkbaw~IC67&M>T3fJiB}uL@l%NHgQ#t8%5rbEB%?~UWGThM!f0Azxf3@x zol2K#34*Qdp8Q0xEb!#145@(y`{Vj%;uHwOUN3JVr*!NLKwWoi+}FbOJwa?x-Pg?H zP@c_<3XO*!K_S_uRQpgmrhX1T)?kkPQzudS2oRu=<|1rzr3Cq+eVyTNCYBobh zeankf&BM5$>fCcK#rq!)zZ?dE1x7HAfaKcWboM9!nJx9Ym+#-{^nDv(T#KW{%jN|w z;GEdP;~Nru@C)4PM6s#nR@&GNaVqj0^tg}%ttR7W+nOu&vp>0qfT6;7*_O}Sg+15o zq|8Wf;X?pA0NQ}LFG&5c!I_)T+^U~R?8Yxy<1FHj%i^~}C86JO;aG`xmvS_5ywQL= z8WA458d!L;C7^Y-WC>OPa4U_Mu%erxrH6#y@x}>bas>~|Pg$eUg_}|DPeE4|E|q}= zP@i9^=93(49ItxL@LrC#8c6t`C?u5}O24r%v#o6u(RO0D!TSwXon%u|z>%p)P#3C* zK4J`t6`|Y`w_s6r=dP(HoUYR;(Ff;vr>PEh=m4f{^Yf}(AWFR2rU$+4w6nupp&ldd zSCH&>3P!6hJz+eDXC@D1dQhPe?m{v#N*kf4<*bzOWVuq8cYSUhtrq4z)mrHz*cdT*yD;-VOFNGC{SP<)7 zH#P9sT&RG9h;8a+m|oBo;v4N=Y`LQp?e67RE|sP9ZxiVMoeA_DNGx7c_ugl2<9*8J zu@243^!DwRiG(&h2%ApCN`ls+YMOcL;qKLuaeB)3Hm5NiFF1#$qX;kg+a09`;Y*(j zZdK8Z$Lr$PikF(LAc2GcEk(LYrK97%yY--8d3)2kVp0-#gl44ZunD#n#NS>;b;7Uc zO!L5P{5&#u0hJN)?1e8j54G(cCUVIkWHM76BpG&3=FYkRy zZi(5}mIur5`xQi8$FNt*-4aY;Av6U-861k=vFOKXb|tSZ6U*dS1jnc;ap>jTebxkh z+{KQkULA8D%V3e25f%q)2M>_i-Skv6Up_XwT*OTw$caU)lk7zEcEWwK%8>Pt@nz=4fPOZgJY2u?9M02mcEocc{R@3%i39j?#=Ly&8c3^UPe#ZgZ zx%~z<>Ll7&Z)*Lbfgf{e*g&Wrfqbf2Yr%DZ7zp<;-d2z6?ORSYJ)LtXM2BUcDwXAX0AK(;7mo z&Y-W8ich=u0i=2I*t!w)Lmqe_H}Xpx-Le6Sh9|F#Y`+;Lk8hBoyTs>9^-RiMwUPQ@ z4wY9dD>?ogE)H1Z4BLT2G}Gt#lQd;dQJer_cOkADplNPrXIUyE=zv#+&0}659GoaZ zi63RKAK&S!FteL?B@9_jd+JSuW*0WLl^JHoxSc5IB5=n$BPye z*_a|?*2K9_J}omDP_-MPrnoL}wijgfBg{eaoBR^0il;)~G4ZX=#Oh;>^nF6+&zk)b zoM;utl5XXAQOZ_bs>mnq(=XF5`v$YX*QY|@cRi=|i?WWBT122QLF#aiezp2B(kUqOya;~Yf$~nxp13>@?Fu17WMN! z2PbZdgeNmWbVxTtN|5e1lt4EtSMkDGEr$szVH`i|u%g^E{`o8npjV_)rVX};-#l10 z9%`zUlsqP1+Hz&JzAxewMP&2r+3~O?Hmf!SA4;hpR6ToJ3m3YDS~7a1N4B-K!{SSd zDBo?0)ZK(qKS2r&BasrYLeR8(OiR&P3zOIj+;s=+&>{2 zOw07j9A@)`#Ua-8akGDQ+Wslla#1TDv74oY(?m@{1TXoeFPN=_71L&UsvI! zg>@|u>s0Wh_=mpLj{&jyP`lITg8}ateM}+H1LM6C1$5kiVw)kERHxm!%9 z7o<3k`vX=~btQFHJSos5)Q7pNs!xw)S~xZG{a!v;7x|`{;{Z8`6oA-i>8^i6PE8zQ zMK;`cRPUUan(G1l8HID+!&pX4?R~PK}fk47EeUNcRj{?3} zN`;p)i%V=05W2RK>fK)IHg0U>F&T@t?%h%pr zWf=ODlHn50)oMlKf}8Kn`IzAlVK=`SIjW1r?FKie9!~jC6wBu-Il_jJT<=YdF94c8 zqG>`@T0mlJIR}0Pu7Tg@36SSuEV_#4$sab@rhY}+>wC|vM{`z+CZg>k>`O|(Ddr(o zMrfE|QR}Poy_K_tjnl~gNGtbjJ+1OL6-ggimnBkNXTbgT#%AQ&vgaah`gv)gIOTCA}u4ukxr zV5E|?7aPX2UgJo8N*L+#=*t*RD6E@BIF$&@@PcJk4u0pe2rfo?2xHuTN0vU6%@!iK zFB?d0bCzgVeTBiG=`j*64iiHpm`WXtD(8HXj6P}w>FJSEXuX;KgY&Ttm2&8YA3?FZ z|ATuGi^7kXg-uo>Q3!5iGCsMJz*_!YENY#P@`3Ves(^9qA#8}*Y<*zw=}1fpd^G() zGM@=|P9EU^Q$Cz`{bCi-btSEZ$PX_8d%oS^UdZPBtHdM4`kXQdxvzj;&tAdaJPjPi z&;e)J)!}>~Ve(D(bAPocP?#qro=rer1BT6oySlCa0)Z4}6$(DJ()`7?j>trSV0Fa5 zUVA@yuABXA&FLp?m3}Y}xtB*%c2K;ANqFLW2b-be%rg9dlQXmwu?}G1d|dzk(^no# zpa3?1FoTG1Qg(vakp7#mNO;bly|}h~bm~<5pho&6XC>G7)nsAMGtw!<&YS#gn+HEK zJ^J-#d}4=Dj_O0G?^hxD^cxJl!@62~L(d8gh$N{5Q92GpwMs?}|KBmn?1y7|Y1;bj zhoa0_Qt@h#0^Bv-@})@F#fn@c*B@lP|>j1SzhW)a8-*$n#5Auqv6HV_G>n4FW~?6;ys!!<j`UDg^l(brX-=|xbC7Ee1Xi_>rIuynP^^m=UD zwNgmt0Xq|uR!b1o8G0GIr>?#aG}#w&l0r`9{;ETR&UL8#Yi4;g=yhdTpi1pXe{!^` z&hpeNe?bTm1yo0f>2=`O0T#%T6GK5cvz0!3PCJ?dJ!quhO-uvsFM1i_=~tzoAo1sq zYp7xOhrL^m{#X3qlJxTQ+LG3wt{T0>F zI&{FGd(!WZqx83mUmvGsb3n>Aa|IOXo$2Lvzav1*U==CbS!YN?|KM5VyYvrF1-Z*{ zFGT+2)jWlyw}Bx><``_&@sQbnk{lrFv8D+0PTW+)$~#f#(wsl>fQ{2vvVqPML=!Z0 z{69;&4qMlAc3J_4jdZ4vkRVAB#LZgRSovhy2#29i`DRp^&LXTuKD32Rx43$(8n;T~5jb8!tfc>F;QlViDw$y-KqJ8YYfeWXTQNb)`1gzKWu#}IQNrqhT#KEmC zT8DXM#!?{xHIPSKY(?v(rTBQ@v~_28ChP3E;mu5B8vr8;{#$%g-owYmKK zL|Bgq!3xFAC?Qq=QKd7IDH-I?ZN<6hSrJT<=@TzVeA8aOk-!+u`L1vU>vpUKfD*d{; zQ)B||6dtr*zXekg=QAj@E+gkL^8#4&PZ!nynzoOnz`YLbzcZ;5w1wzIbN|7 z%`rx$pbYV}U9)zpc?NE>>f+*wz9t)?0VRERT$Y^nnGVgtXccGQ zQPc*7eR;J3!kRD~ZTomR>YVRmUzQk=jcp+%987qh6w;fdSicSn4q3#LGU%q|I5)fu zT%TY7O@}x?Q-|~+j--k`#~FIAA_RB5 znM5B$Jfr%5SS}$p_|R}uH`Fd<1muV{wgTKyl6cIzg7lHFJ3r%yQ&|* z#T;K5V*3e5Gp#NPZTQ%Xr5Kne`c4e_k1cI=QK;`38iz|NvB;IBU3FY1@iWo(WZQi%_L2>ua^M4L-z5P$FImgdXr_$^pC^Rfb+uEet zNdn4Q4?4d;MO^s6eGuBUe;9GXEUZ??fqcy3Q-7p}HmNCc$brmq#9GO^L}nJ>1z&13 zsi^ib^E7mlq2y*t&F_@3_&R!AIWk?+PggWCTA^o#XiR^`&*|Qe{NU?Ain^;heOmI1i~I7oQv6+E_lE)7S-Q}u_>z_a-Tgx; zTKM`2UQG4KQ@LlbnM=+#!ltf3HQ%yM+@?VJ3wBfbOV{jY^>t)u+K%3|OSPL9g$@M$ z`3TU)V>w!)U<6M|-|@a+7IXNR-uwI%kJgmdHG`2pr@j;Zq)W~)h@J4hiHJ#g_^`>0 zY)&6|A2Fp_i-@nHfDi@m65KjtSJ0g6QdO?&^t(i~bs#h*aJ?fu{O0%2u1lU+;Rm9T zcWbg|KliZc$nn8kU7^&TZl_AJ;_^~B!nRC9gVu(>y<5}jSQ~3cWdkFe$98K3eSBcR zIPyn(gUk+cvl%=wvcNTPuM{?$~KYl$+a^YCD#owHBI5%&$VRI ztsX-G^9k06-!lwNI9zQ&p;G^fmfBSH`Eo3n0d-5IQ~~X3%tp1*W?Jk7N?O8 zCLshH5+nKQGBhhFfLD*|GMXK7HFaBhg5bS4$CZN8hSZ7t6F#xj`5K`eD9N)CKX8~7ytW1L)&kw+yN^`!kSi)=d6G6GT-9R|Db11 zYHV0J`bog#vZ_2I^3UX*AI7r&!^ztknAlD}cmJrVTg^Mxvc4zvgjj-G&cC6}UbZu~ zpWvUx5rogwcK5K<+T}ev6W@#tTBjV#@!j2eWe$JpXSA!*M--F8>d!wK($K41$oIdp zvh~PfcjGjB?ahLL(13wh@3|vV81~v~L#Hvcw8(i}X{?!a-m15ishK0CxaJQe?FP4y zFp&dhHS^(2PHwpU8KD8*YnR8YP(}zYRH`)u-=OUnxvn= zw2QYQ>(=lG;aN1*_CtM-R9H2NkO0Yu(;6GD9C~*kV;P~6@Z#iNfCbr(ZWBZ!_bi== z@kS)E3gru5lz#NV$1vxxd03hk_Mj0oNCs>7Z?1Fl%T6;{F;TAFknw}x#(F`0KhIK(^F`aXm8vV;Y}Q4_cXpGxdRr<( zmE6JTi8dr5Wki@`1bgQ>>|`TadWX-w(nbt8cz)E8eM~G^A%zbkq|{Uzlo<`i^NXmJ zV+-amB$f}qW$L0QbU5mRyr2d(!~_`QI=}3iW1Q^!F|%uleB2_oKN5^!?$-4lQPOy2 zV7r>_e!?Yn*M!dCp_R2+bEOBrj{lm5(RncgFrm-j|4u8&`YVAvtCs1hZP4l3i0Wur z#p$q~ApH@ig@k>rm#dJVVjdw{0He5;_5HGHnP&zgjeW?`e~jYd51!$=2qkOv$R{3) ztWVz23r&34xpO=+>-ekp)^Qoo-B~udIHb@uPX*Xbbq~GbSnj?a#Yz7>mFX6j;qpYi zi~uG0(5jH6A6v&!cJ&>&rfuK;E7ig*2?;e$3v`fs5(36;*^Sjv+nj0POR+~T4 z$WE2;W1qMH@~mX7eGcilV~1LRQJjV%gJDAxea*TYYTq5;Tp9{76|5_@1PiPBpV@cq zei0|r%=+nfL&==ue*&%gnuD~BtN_e(MKc#aM2Yo<=4{_HJu*PXb2&$+r_`K6-eKQw z!~go~DGEnA$?nA!yKHeqhy*OBlRD=iW3v<<=)~v}t4nC0-!$Bh6kcX^xZ~GboO5Sc z@+2zjIuw#388~k`s-N?(M}uqkoTJj3KkY;oNdXFJZW&gcmyCkjsC(6WvxmZk4zn_1 zsxvR>eIc(y!ggtgX$Q)>aGwujI|!Un^$liDYVoj?l3Ygp3@}DuQN&m~ZC8#M)t^LT zE6;und+Ro*mWaV~o8jc8qY_H&%7al8R^LS%mm^;YA3p%m9S@qro?fm80MhYce#BSc zM*D&kV#CwT$)4{~C~$#WEmq*nup`M`oB@YNv@eIf^k>?Q)ZgueA(C+9}HY|HAs7u{=o)((}?fZsK3ZVxz~*w zM2LSPnY4ksbvKDW7UPh>viCEjmAD|g>4o!U%=Qvn^=h36M?!cW92X`NVML}qg=frr zM>b`WI_mpH359a&(XLJWd#&e)ICOdI{QT3|uXe`j7)15&GI*7Z)N}LiXl~qCDSDrx z4}lrNc3BPbIenw5<($w)`ah0H7qyful*>E|uj)#s&x1-ar7~92wRz^dg2W6;Hhd|$@w zYDMuot7$mujnYC>#grq{c@m!|4kbyTFVRQ0)4{qPFoD^Gap3y#D&1N+R56mYx?h<( z{j)lY+W?N8-$ki_PBQeIkj{PcHCjj=o86$!9$u|DN5mG_sIX`E&d`2j07SKXER=%q zwkQp~jhv>jw21|``MYYc9zRmGRfR8T@_kExzIwh{DA=L$MUe4l&;VfVWY@_rrkTqG!v*;`_)heFi{ z>7os#0LNHlUshT9bK-S6`qH8${OWLr!aUN;Wf1{EKf&L%ZnlD;-<>f7-WO!90T3ta z)_Q-tMOl9&+=p~68U}Ek%l5=5g{3U07Ukpw18^9YL&bX>{L-`YM>>zhfxiNEjcZH)AuC?nru8|zRYi~UA><+Rns)AxEgE?8aiOhx=o1zl;EGKV} zC;ZR&m6dj~qst{U06d)So`^j{N?^JQ3h>KLImjP%<()I?(<>70;Wf$CQg$6l8>tfe zbq}}~ae!ftANyN-jxkMAari2R=9yEac;JqL4Yb~&h*o`!p5dr^ApH9!PnnbD(J(t> z<#R6jhL(ZqgrJq=JLAUjfAATPO?D(8@8!ugsKESs4>r#K*XU z_@&TdTYJ|Pj$65*Qgj^{Ju*8vM&5<93tml_zhu<= zq3z>d#Ju(S^Y%ii23md_G5G7ogDFfPe2%S$%m>m(8aJnG`>vU}NLl^jj&d1f7Ivy#Ur2}ldOIO< za(Z>XaOtZn21Y6|O`Q9p&#unVb}NdZ*~1}U2nBs(GGgi^tVy4JbT^9r zgT-E!Q9<|C{AT|eMkZYQHR_B`_7&F5e9F`jt)9z*LTIz6+KiPs_xKx&s|}A>PP{Y` zBMWq7wHRfaBK7Y6wT|ybD))8IHlGtZ%oC34BQ=x++rnWyl9ZwYoUi1RTcExn23;^N zDcXe`dpd~ox-}D+JI~>*mID(xOR$L;_{eunTFKA;sxzc=NzxipNg)N<>XjVs**P;W zHQLSF8ccYVBcE1MPOXPyS~uJTPrGsX+bL2t$ty2oKz{<;HR}waG{_BJKIkb^&SxRW zpxUDlidg=yr$n}gx@vs{w`dT7fHXG-l&Wdp0}aQ8QR}@eWSw( zZ?1n^zcNYF&VuYAxns{}9=gc zPKp9*+bdjqFdnz^XiLvss5+_GSI<5BrFq!*OU}}m5ATNhnU`eF?yWa*EUS&%C-T!< z-L@q-Prqm=QaT)y8Dg<*_A#ge+cghrN4HxlJ+~M!ns8ivI{*{@oC7T^uCwrj+KVU_CCof2BIC{8Z>UvF@0f?i6|acv-kTOsG1%R8J_>>9kNas&w*_ zP<4b0=Ks(Z>pP%43Doxmf{un7(YR^Vg+fwWpO@CYQTP(mm^L$IpeJSEF=&mdxpr0G*24I0wi%?iya7b0QM9IB~sN z&O(RtRht@aNJlcJS22J9t4FM94ftY})!>Ifg)9#Bq&)<<082l1X82XXNp)4v0=k3w z5^b)g8<&ROIL|-1le|sbM{Vf^$u&~Ci7OqY!d0COQ|hs&o3J`v@gaosyW|PR#IaIq-B&q3f&6zRvUP#Ju_h^ zt(-O29!GT#C#XSaIAA?Cse*+pgv)HG9-zT8JVzr>3?7Y5!C2dTq@+;0sLZOWE#%K% z?eQcUZ8;)21*%O*#6I>IJ4$RYs+UD(0VNnS-s~!^U=Dsb&q({g1>D7X~ zu)U}u034EClAG^hsv`g%n#$)WBzlg%9Y9%3^ku&6G|vX6da||;4DJe=m4mirAN=}E z6ng`ejySL~VJX1|?VIlaS=DmxPAW!ckLk@06G1QbZKn(V1D+KA{p>pow6|Y0J6dIB zwtISZXt6VE3ATkiz_S=o*89b1!1k7ZF0u0jy-S$!Dv8&CV%HutUIIiCRE--uK zCxNM+(%e<)Gy79)qjWK#DFmi^9)E|nn-i+XGXEOUo)`=g@QnG+IX6d^UVNkx!wSy6 zlU90P3Ro?PC7RBk?7jU{WtTwqUShBU%uTk?pPy5ic)Umtbem> zT2>fmQIHyHTln(2OuapQXl3>{TMZxARoI^S4*MiK0EX&c`Wx zpsqXqclf&^r1|HttAOG1*1>rAsSI1Vc>$sahB1PwI`6NTzmdh8$NW2Qlgi`#PMG#V zErqX4XAzAeR<5=)voAY_+)UvdKi=`aKe980D`n_arTP$D%-Brbk{JD|dBb&46*ZX| z$*2{!NKF7%Sp`mUBD}~c`T0A&W%xzqRrop{K|^E=+8gZk^AowMbSap9)G+%yZ&8N# zD#AXAuSc&8Ojil=3g=b0QOpRLTZKWk&0rqhylBALg3J3X`llFR!SrB?R|$Wyz#2E4 z8QI)2IH17na=8k+rx(>7X#_27Q8;D_Zd?5%bMB49rq)A>7%9$6*ta5j2pg1(o-cGYd-`73zfAkHavZWgDFAxUD!f)7eYm2fmoC8KCgK)3t> zH=N12fN~8N$Iv8Sy_3)=UySS|4c6nVlrCSj0XM7JMVctE9xeHyFF!Ior(3C##ZGu` zvj2=zog#Bx1(HIV7~8o!J}e)r67uQ9QARk2?WTs;NIX02PrPRS@gBm($)~y=CBw*D zm>*!bYy;)PXNjzy`rE0YYKNAPPUPY|aY$v!^3ZXUgXcoz9dhqq)*)lMkyQ?$6RcG6 zk_`9gnfbe|+$uKywcs6Z=ymJ4Jx>E@e6WoX1)=N2HMUruo;kjvq zz5RDc@OpsJ@IJ%lwhC6#SYATZnE3P<{69XtqX#~EE6f(6`0ISaW<}`QmDI+qhp?C$ zwfFf(KR2+Ac95QenXBWMMoVFCGkxyk8xhN>I(BrC)LJ^_}=m2uDu?Ych5+tMU45?v?Y#^wbRLE;^XKqmL zLVg%gK4B`F%U8w!C)HwJ4#-kf5(&FTB?RZVigxKp+UjC>a`xx zM&!EmWh@O?HHDv#lnFIbYORIA*O60ZGZFSft>%?B^i&x>O)P;{^^10DP%2^(fhB;H zRD`hR-MV=WYV4`wmHOQVgvE~CjlRLh(>@6M-olqsph`@Mgdi7|!RoNo->kDbm38`J zjr|t~l>3q%E|;pf#o10jG4I$2%Re66RH_0F zJz#(=!Ljkg3IT1GVvhU>$$`9XiOUVMrh1khs)d7wCJjvPuJ$~=MzE{obs9{D^W3j?Nb<>!{Fj{L8n#j4Ct3HE{*Rog12D_ziI?FFuV)q z+R<_6<9zjtE#b+!7!`vDe_tj^{wLZXoIN18a_6OQnZYk4yo1Kb$h>czrZEYDUO1b9 zBwg&w&ZM4W_|z4H|DNVQ4panq2%@yM8CoB0UL_$Q)<(6`L0&PaDgluZ-!EN$A?p={ zWdgVjW9nZ2&4?ye9K^oC6#UdzIB-vyB!L<2+@C_ae8}bms6>sbIpT?SvNq)6W~yUH z`6YThd28Wuy?kr}YCi=Yx>7-1bh&?8%A(PSK9sc}c3l{yowZd5&Eh#l#yN!4JF*S@ zOV7jQB1*1oEHo2mwgR9TGMC@x^iU%hwH7H#Sr7w41os{*xi2E;^495rb~4kTcnM)> zH>-6A^k6;Iyi)Uqq~fe+?%%p}FR$0^(iW<21k+{Yo5oX+1jL7HHVb*j0DH?-cf~?p z`%0^6YvOY%lv-RI&6)TG-Q}*c`%|i#lPv0-?E;-6=7Olq$SCDnaRY`iFOX+p=_Q7< zB27i!k=UIpQNSehe6)m*ctT4=x`G;6aVB}s#RpI(#?RzES~mpz0I zk5%nRJYOE$cr0U-uru-c-_p;Byt<_{6SX5fA*@+MJxDp^j)D;njD(- zCh)4}T6%Ol)*IWEm1M1<(PIgS`Bhf~IBAV&nld`3H&~Gh$;7q?9=r!ft(8!*d{*8p zlDwqtmc|x&YXpU(M6d~?v{Mxn6ph{+kh4oyXoJL?vn2A_AyV&f<{LTpHqS-K5HL0o zt|?gb=e4bTT1YOim93g~A$0J?{AMf&bh}X8{tyDh_UMVxueqEB;$*Hn63E?gs7nnI2GG7SLglDlg~(NP7IzS zeQ_z=Uj^ACVng0O?l0@720aacjFD2Pe;BF?hn~Mjq%k=Y9{<8{6IMcpNe2(u9Ehrd zVLc;6_@oRMVq4#D2_Idd!#NFM^!1MI<9P5SJ=Z|QN41@MHo*LJ$lHO}R&S=qm2wtqj3n;< zH|OzWUdz1)2Dy^YU0@FZfca*uvS@eNO8`$CHp@R@n9%@c08LiQ^ma`V?P&27y90U7 zp!(Ixfl8zLp*F%QCU@T-%R9jJY|Ec{?#qv!ENDr~R9Q`qE>A-M%R5k`_7}Se8Y5ew zo6bQsh)F6ug{-)J*!$NsDi#Sna2hbUy<~)9=Mk2blFRvHg*uob_61P3qc14OudDvo zJQMS}-8>hUaD8`aiL_dZXhZyRdYlya)&miRKV|{hLxJt|cmDzpQF{3H#NHcbf4e$f zgB?lM6o?+gg>V0jYiS7Z<3}S-zcsZT@d;7#?1gm$Q9zvOYXO6^L&@C&e2i*?-F7WN zTz1LR$N%988LysTeK3oAjyOv5p5=t+cn<3Cyf|A%>fIlz5Yn?(A|lro30xN~jcD z_!)R?`QA{3IMgJj{)}z>Ir7PYv}p|~mDl|r`=g@*xp%VCz(Kh~LS%esKCG!>5#&Lg z7>|ahAS9zmmYtP4G33RB?#d5;h2)9UL;#u0PQMy4?=!`#76p7tg)*A*T-9hq!=Z$r z5H|0{A-pSwFXPFho4J3upK=Mmud?@D0hzXX&fst(ay|iTm#l(O@7Mi@^;=kr2p~TGx zR8T0ra?*b-9KqsIzXtdejm6#Mr9E@VeP%rO1Pe)5oreU9yozK5}BrvNiW7 z8?`GWdJU`BLH1m@l3q8CL;`ZBzh`*FcQ}FVzRAdfY^|3@5?^U~%hOAQ2|I_>l}sH- z=xO~B1|Yo+B52fl0@z>BTft>D_ct{UeAlR5Aiv>^NJgPEFeMa+ zpfGm03ksfGCfYb1c9~2sY5-^aD1Ie&3*+19c4zJh)*hWlkAd_jtIUXmBbM8Q)s_N9cT3W`@y6#xbdriV%9lf&+1~uXJtP zfoQVMk1mWnZr4>(A2KH;kKn#4U0sNrfieHSQEYGwqwH|qcqCZdHd*kU{!%A8C2?6t@cjMvM9hZbcX&+e% zu{NBTC=XRa+y=YE3i2Q!72*l6gJ143{JZDq2|h2MI#cpQVtH5tYUJ!(WBcwp5FlK! zTr%4Qjpg)f?fd`epmaJuW-MiszQ^Vu6U-JSy0M(%uis*)g`C^j{9q7%c3Q` zLd-0%e{@L-cVf!J%6=fhS2Ck3V2n;W3ViA$EZPRs83`k>Dm>|bgb_w*q+cuh@E^41 z@OQ-LB3$YPK|PJ^5zPiZb?!FN>(j3_e5%m^JB?q?iPPPml5pX@1K7&^63Ms_14?VM znQDMw{4eb)z(em#QFahhmp>mtRMYIYm2shVbXEREs(UST#|xX>+38y=_x%jTS*yR! zz8uj4s0Wf5Wuk-CA(GeM)m;7^D8OhIwGuL3#`^^pEni%|=>DA5bSE!*_8bcLFg|_W zRW_@k3?qH$jG#;cV#pYKQ~jaf0z`;cWE``k?tgJsA*EC{BwuhOs|%TgN$H8%ZBI^o zJkf=uH>50#RvBfgpPKU7Yl1H$yLV17e5>cL<;+U9{CY? zQ;MVJJ?()bB%oP!E_R1Yj5PLG+Sb9sJRFdNm5Wb|r)51hH9$|Rn^IbK+*!YiwIXJT zJ7kDUv-_G`Zxz~2)~Mcql|fjOo%#vrjmbRGM5W=5uj@CgAcqbCNalEiPFdB;Ya~DM zh^-WDG;sk+(sCwg00ZnN2EQ(Nz#VlZptN6f{k2S|!84moC%7$)ry(^>%V_lQZ3{Bo zq;_U0GW`1jzuYt*y(S`-jw96Q>(Ydk#D2jMqg11kys5nFlFQ={L?rs#PU>Z=bgQT;%hciqsZ0Mb$jXO@WnF-f?&>tBZ zYe^mgK_}X$Cn7#n(U}u0@1RP=I)-^a)i@10`f}wZ;pL(bSIa~p(BKazs7jR401hzD zltdoU@PG3o!(5;gAOdb5ed~M6SvL%#+vfus#bi8MG*G+&L56@bGE z3bBGvSpWDlYjHPvj=}<57;E~eSnk}~uXQR0JCYu83QYMVAE}UTkD&h!AdBs8WdC#) z)wx5Smb)y_d4l@pP7I6^_Dz|jR~As7U94FW+cD=ogmvENccCH=WqQN3Sk{B?Ji`@< z0KNj}rF*-A?Rg#~JjDPJFj_(Xfh{b7bd{;-a>#UrEken+wHI!kIF`KFcMjr^Z^CSK59yzk_rSUHl&r^^IF=;{K(U1m=034tm?BP2baEq|ffn6_Y%93_2`}hZ%~t zcGWi5j?hMp_76iLg8$105|8_B0|0nMjORM10Ib)NYe1^;eu0dQ?9Dkm8%ziElboaS z9}$vq?z3x(b+*43)9qd-hSpyyGtMWdH2SxtMaO@PBllj|1abv7kieFkoGzR7V_pI> z%+(-`+pkJmc6Q#k7BEoX1}_1jTwZ3i2Qv98B4FRNWd_h9sLMbtqXmQk;)ISnd74sl z^LOBbR*RgB+~cp}6K&08T@3fd9*#>C2>B9^>HysX0QX83ZJ;7{8$%bbW$3&oPq$uj zrOX;UUXd0heF}Tqc~CrC5QiBvU=w9(({|^RC+H;q{UcfVYLa$k@^rvv^+uUKak4nW zi`a>)$JAGNgj^Bckqy~nN*P72D*~rt+jW^xZME&qKT3)hI4`K9EQ;m6R4$hzE|2Us zv^!Rs9P`+PzF-|(&$BNJ>kOW3xZg-lPF9`pNRsbe?x<}mB&Nue@^@P5Ya3=cqZhfv z{^!Fo148^7yYL1E^;dXIfA}x{9Zb+r^HAVv42%d&81k_liJe2z2{S2Z2O0|a>jetfO-4>ODAR1_$KSJ!&v3$IpG(0 z>G0Lop@489g~% zTJ)s1mhG^wieuml^h;M{-<0Xf5zVNBHBic2E1tkq ziovjvIFBb9TSFI4{=$oI5Z}b*^(7ChkBK(=e#1>`JUxWGoFiGz##Vj^F@PS9!_;>J|5%)JoD(6=U z;N~-Fq+PTkK*E^-cuuOl^=fycJG&MIuM%xkU>Vh)Gr9<0X0nH&t`8j( zF=XlP?x-0p^x~7rEx2pt8-uFIsWo=mTtHFgn5unqzlZShW4HN5ZAk*gM_$_j&D|4w zm{7CQ9sv{DNL|p{lcM98A{f8$Tovzfs(r0zxITQ|RENAvbBAR--yU27n)9f=hw0-Bc*5ncuZAjB&nVwamT6D69xk&^B5LE~}a+ zEa8zS!qx`IphgWFwO{vS8sdywp-zyVj`n5zgd~(Pv;I*^f~BVA_<5w`xU^$57{B66yMy5zJjuX6O-;}B?7BH!pN@*9`M zzw6_#cumpU;NCEbk(v2cmS*aR@6s>EOVv(Rh&oftMYYK{Led>0T`8q-v8d@ePwN&V6yqg0S|VkObv)+ z1y~aR(7+~SMfls!6?|H&@&9D9XDokjQ%JnpSJ78~DP$T7<0f4?v!dOpM?mxXsn1ee zEh!^xo0595#_e#WZE|+IYzh~WaQFLA`<1r&AlKed*=nmCi^sUV_?~|w7SgHe?P%O; zM0ZgF2mmArBdtVX63X`U@bqRhdXQ4CfywHGY9%OiqQu8>-JG@}tLd;nV zr}}>sTzc58Ed`?3+ZfD<$TYU~*XkI4Ypc|{=SdD1FM#5{qOEovv-Mnc{NJC~^0Wnr zQo&P5Cu?0y!HQWtSyN-C0%_iUJJcuwuJ}L2)*dfY*XnWB(Zpju)!agAA5%k{bzy~B zN0hUzzr=HmZYZPfreB;MbQe94A6m&p0Y0IW%GY0+o0Jw!abEk&>C|(AQdDh$MFqsU zA^ZF0z_sD{BA?K+x&V;&UY#}f@UgJW5;t1ET84;2=KhsvM6wp^PGT7>El{7tjuJv9 z$m5-3crA80p(Fn!deaD%IKmm9S@kjWb9p1$7zT9uzTaqgUL~~8SbapB6!AQuhyRRS zzS6z59epD<@8)F@)I(I3bL+I42L2AdUHcI0I(_Hu&7}}^_Khoz^}Smt9R6*Kpk-X1 z{~R_yPgEm>Dyo$6hL1>_xl~7(9s>+^y6L&PdW`&r1X0gU@Too!}l2-2f0Vwh78tS+Y zom=JaDTU66;+H3=j*Pfp+lb{xb@eD-s%5+im=873-?&XxsdvE%IyFu8m8>_~@d)k3 zf4?N9=BK-Ag4PEmR~Yjxw4qKV?Dvb50@}aE|MDvu?hE^p0bDveuDI*y5K!ia1)d_L z6hFg`9esEn_8)_Zv{}#my6csxLqegX$auC9;n()tr;LKMm`~T+#E8!dwlp1A8ph<0 z%An*1XL;E9Ne{Y{50nI3;ZSE(yscq?^M>4j0Hv!y?mrawz)wc3@&5ZtAb{H62vX*y z}U43oK%ud)sOOIvbY67@4nmI9WtfO;Z6=?`Nl zmm4r~&T~@!HpSuRy1DkeKcTf%6p({liP`x+qJIujF;O+k`>;Tgd*H(U@<1hX!MrO4 zdIpvT<}v1Z%R_VD{Etkji6Rtw1X~E$yw{x)P@yV)utt^Arz#QN7IQTcOFr9 z{8uY1QP%v0@uShF3X}e=+m!D95uPAH=A>2A0p}Q&#nbN%60u(@Q$%skmO-tDcJ><~ zqf~!b3^1AmBiOOhgP}ziYEqu+iC<9O$V-9SVvrO9Bw~%UM8e~n892#~D4zn~P)4x}BbDcBcw4av_r{%_V){=tq5``Oi7pwz$vtxg2YsV!DS5!|;X~}+atGCH<>L%^R~d{VpK~1~_X%!w z@pz`q%CocTSV(4;PyWde9kYW`CeE5fR$`F$eR|TiJm@FOb;|u?O4a>*9GRaLM#so##88KsFA#G_phLaI<=a=mT1|#8&BeZ z@_GgToHRyJ-Pg1_LD>510CK`gAq9r}w)v ztP~4>f*fO5fEvju$w}DUXD+P>6vd!G`+wGjESe-}l2CT-NY?d2-`c^fk#4Ku(X}QX z)id+0ivL~Ddm->#ciU>ic=jF*A0e8UB@ky}b_OSb3tw+^bsEzmdW zQDpoWT@J6F4@4>Y#5AK}>j5E$myEBN*Lz!5+=3zmD58Gq`7elf^GK38z15?`BH63hsv&&K-5H3Btk=^O=ljSH5_A{B6YW0K?eHCC0H3lwq zku`l>Em^bOk>F+O!msN7h=3;^14F#_1h(7lRkov^9P zAKqJ3vmIuq$MSt(YA{7w4qjQSdoC+&@6QZgvBwPlkN zNo;1*fA%-0OXm)_X1*571nWP2=I`uOpF{u>ZFaT)l;-JxMTaG&rRMsjU(hTOO{ESs z-NntJ$ff8>w^6X$91^H>&7P$K`@h(G^Khv5|NnnT38xfFor)5M2qoDm<=B^0M3xqE zWZ&1Z6e%tCozaw~4pEfd*pjSMgluCs$!;(h%kS|To%j2FuJ`xz`MlrP@AJ8S-_P&r zT<0%W#>{J8ujljeyg%;u+hh9XC^v|4?04s5P^gW0wex2$ZN!G_GGpw-G3ijGs>cB> z599#<0r`V(;r%eZ=^)N~a6Fy(pcT->k2<#>iE*Y}b+M4qx_Gj(-Suq1?)0Hsg!F*A za$UXHm?s138WkG8nhJ!`$dnB_+4#Nuu2{^v=xx%*+uUtT0&R;7s)I^=0j*jLNHy&wJ;9NCyEm+2Et!er0tsky!9c_9}8#U!!NvH-R-!0-z zlXcUDKnkXARa|6#>qd`e#JQ_@PV8IXuWd48`LRQ^xWo;s^Iv)0TDSI3xXO_l8;V0G zx~VfCR(%CjM-3OCiO?}fRZ`1~DL_;7*B#$dmV+Y+mDX*}dp5fLn$p)#n{M1L$QhUw zY8IV-<)~oT(o?eVa`;Pma0hNa&Z3m50<2Blfy9KoqIN) zjVVtxhdvD*{*=3v&^7rm(=p1ilxHk|x3i7i6A7@RKEC|=u@UO@TdmZZad~nPw$mUc zVyp1d?7I2G{<{Vb-x!pK*^hQ)TP}|FJv6E7bU&z?F9n&cY%TXMu4UGIGP6h}w8teeDiqF!#*3l;$dS}CNXwO*KWGrV;K33i9yGiaC7)k{Te z^dKo(D8r)_@gdxilm+sL}bXugQ8MQ z9V0_(0{Z$sB3{_QA4|Ymi#+?-ckw&Xk6>pR+0ri@mY?BWB{G@ZQX$K6M36Q1es_b! z2y>0ohae`H8VkarS1MwHn;xIk4HTw$vc{uNifE)}GSY2MjU9DE8URqNO@=&Fye-9X zRFDwie43P-0?|gcd`}u~$!^3(W{GUaJ}CAbg7_ zraJ2Dcl?*<>6H!f=T{HbhqPhfl?r`UmfCCF!<3CeNLW9<)7JQTXE!*O-l^)8XSLCOvNE0%P7v|WbYl`) zugd@4Z|!YukYQ*xwl&RqsjO=;et@v`ySz!HBQ9y2TIOHgh)Q2o8Y^7H*S^YG<};9w z^7T_P*7XR^wQ;>6T8IdEb6{tSsue)pH1skBlRJ@6FDktAqD{?s^rSsnqm`+klPn0G zS{&*Z%Z_ltW2lUg@$Z;B^bRs~QnDI!W}H44jL1?C9C>SF#%nUxh1WDBUt}&7&#dyY zA2}3KxtSpLW)}dO8cl_pTt9+rPMfYaH+qMWN0B-TNi!Sc{)JG*7#D_lXh%PQa6Kd= z%)~e5a&5<8*Cr?u<0drFdJ8-IVh<7cg{%p0mJsh-bmem(p3ELx7%y_C z(CvS`VHg1mdkYkt|KxBBj62b?+!1K|qan{O(S7a7BdnfNR~pJ?sqkMucr|V#(_zzla)negp{{RQ zqS*Q6U{;E$MWy6WUb(==+&fJ7B059gG*e+Z+}2NZ@w1=KRl<0g`B6isQLyEoE03LchL1@Ww_Fje(EjQQ+rA1DhZQZE1BzQ9_~!$u%ip_v z$D&W=JVNj&mzqFXbRKOIxk5x%Qz~!`o7?;@YDjcYH(i+)BrL#$qOsM)5VjihGQ59lh1Kw^ zKd{wkB$QM*n9|4|3c<`KSh1q~!MxApD6fn_pl=vf<#|gZvGgh?cp@e+%mn$$l&9o1{ zZON#A{8vtLQ1kG0rJS^Yc~w}^jtQa{^>$hizx#6L=%9X+3XM6iuPq!i++hlSo;ar^2QKjRqf2Nc22Lt829 zQ&8gN<&t) zOxA4-BpW`XG~@+xp=naoimP;@^?ug4nTZ6_*X%E0d;CF{pr-hI>&h}m7rNPb$w@Dm z&8`dQ(Pu^@CXKrV8I)@Smy>G0pjXm4H6gH=F}E@t@|ZQ1@9N5eSCzNK+NhCLYzh3P zaLVvQ%HH>z_WbJj_$x##+dDX@ zQ06o^XP2f|6LOZzjD$XPu?LZP>vLqe3*X6g2qH$ejVF5{nq@757nF8&boQ%}Ur^*& z#Lqe9&W2o#)EQy-%Ot67G=@ev`^`~@I}MIm^ppG|eVEM@7bNS>5$trZhZ2JQB3CUh zJPRV|@4cNkMW_AU)zd#!JxDy@;*OH#^u?cV>+mTYX zMM1?ke&Y~+WOl7Cw(McK)?VXW(IW4QX%oc_K08ZnyuI|__EOj`ufOYz&MN&~XKu}G z0(!11XXb`AAcnn?Yvt#3dfD{&)@#-E-pBf63mZ8-Hx9M)l1?{wMjBH*%C@f#Yawe= z*dE<;TmFtU^Z5j_`kf&CE?ijG6yPHujd)p}#8h_iR~TS)zk%r*v)y)X5uAW}k=y{$ zO$F+hE9YH-)PTe#XwkH?i*zMHar7 z9L85+Y%IGM-+%yweoAsbI8|hz$**V;TEPbC2p8fTYCy3+C=Okn%K~Lgls5oW% zz?+0DK{pOQ#1{5V>3&T`s6a*B55YilzhQ@NOBAHE9X&ao-lsKMiNl}HD0C%FBGuRq z#k1e&*dZCARm6j&CZW)Cqst3yHaAk;>pFJT ztS7v*%=+X=-?479?sz#$X$iwGX6IHG&J>;W0B6nq>vVh5hgX({5do`#eae>dODrQD zdbLfU{^tX@m^X~{xtxrV~r1N%J$Wt-TUp>eLJ6ycK7#Jrd5 zk67(hGuRZDx;e@0tM6>7-F23GO$~b(nOgnLdPcELTL{6Fx~YcxLK}$NHS!sdg9Pgq zsK;~Ae&m&XkrLp?EM*S6 z6DGeIufAvT^~EiDyw;ak)b=!Do0HAFgaKBvbB_S-8l93H#FWcOuQ`KV@zUyX*B<6i)p0h)BI`+JUgPfhtIwd^IDQ#5a zB&tnrTY_%MLUZC+p0=I#Y5XO>b|MnO6fzASv|ErP_2wm|9U&BfMu?%yEy4REbU z^p`%C1#$ke=P~I}DV56Jhsw7Z)Jqlq4^*(qK9Oa$+;4AXQm6(iHV1@6eW6RRgTcV2 zF@^ek*!}_a%4uE2a>>t@2eRI*^3RbdUj~zohTdA8o>o7-sliW)^@-;NQ>~nuhx<0f z43|NyC*{0ZJO{!p>t7vn;$NeMr83ecmWQ^~owojC8e#;WEDubmO-XL#6?;u1!Vzbf zr8{4&;)FPV_wdCQ3f`h8q)wT8g0F?6h2^ITqf{KYOj_>5tpV?tnazYTj-cDXV z-W@4P^eMT}oXjBRxD*uY7Dsq4N$z-BHDje)>cxS^}{L|9Bks!&I2Zf!^YgR&6x;QllPek6 z_A)*~pxMQ^?}Et;ETm>NKl%P~tGQn8-W1<$-@W<=UJc8iaa9t9#p6Q_B`w9e;h}wc zIrj^_Q>#RO#XPJR996p#xpZQZ+)QSZriv7f=T@a`l{NLwSXyJ`%qqao-;*GrRz?Zm3X%{Jmbu}@};@v`SE7{`dcHL@QDOPGM9RJ?2P=o z^1l9=_=3`<-<+t)=Zq?r17iC^cDY6x+WzL6%JL zCJ<8cvJJ4gQ|a^6nK>bQiS>g)5)+ly1*?Pc=8)UeXkp{)5o&~E9@bt9bs9u0l4a&4 z^t}EWVV&w(XK1$UIahJ?YHMG0TZ&L&u3x%&`ELa_!sQ0KMp+7snCh(uI_afWw{CUb zpcb{SnXoZOM>W7EE>KxlB0_0?x5kcy=^CQ5&9~|xv6fg%=H!nz1Bnq1rvvj4`>L)T z&A?8Z$7)gfQ3422$Mu;@C3eJ<>cCMyzaUi+XoP6^ZghVd)LsbGyM*mgEumLdL(J{o z?4&@`*qgh*&?KMTJvp*bdm)<$#~Zgaaa~gmPwcm|t!Iki8046Hd~m!qQnxWn7M5h< z8u(c0ufgx#R6jqgd+QM#nra!rX1VNubjHX@<8FloU(vw4vZDZOK|CTFNe@mQJ#Qps zkxLCEW;4~OKB(2;6*6Bbp%=DHQWKC~L6VF*0!W^RDkIBrG?7bEheIY=)r>-){#D)Q zwQ)OQ_B@mXE(>*o`UfTX5H>hX(#5|W1G~hWWA1q*uY}olC(_MiD*0iMwxxa+N3mKL zPC#wh1#A~XukX*QGV#^9XcYnSkZ*AAtp79fiSr3WVV4$#cYyaXG1VL%Np5D}w~0KY zF&{RoG=?j~<_FX3p{W-N7(#D;CE2L`fG4!v7Hi^a|J<0R)xDr><+r)!sWPU^pOP8u zr+T7oh`D96o&F8JKK6^txJzS+NK;w0f4Cd3fPG(AoCZ!jio3$@SawzPVi(t8RviD- z2i5l-+#bV0rRuHIcj!5yQhdG0?14y3OKl0c^i1p#IDg8NUtS6se-vs^yedJ@@goT;d z?xi_vZZ#Ian|M)Yb6-KC-0kPrDy zhAytSBXKB~C%5$|U(~Hkc8v0qO9u(>R#c%A(IkU|J9ClAVWQaO53wkpmqKd|QX)&r z03Fql19!=ZLU5OW(OEJe!gf2jvwt^Bl#S$O^RnJ7t}S_WhiUP99WH?*9jp7gW)F_v z<V@oj}Ja5{KJXllvFTK>g5H(iet&}6Q zJ2sR}poK;+BA}kkLGG-Ze*~9UlM&ocL(2Pz0_DT_I!N8OIl&mILeZqewJ#CiGKU znWo#mON-P}Z|!9XLVTMlA8F}3b*&C<0$VS7WB!Fj9YExgfc3WFE3UcG8$ChH%el~) z%mHdcVrl8*Oc zx9fYZ8B&^eXe$mixTi+4pdHH=p^vs<>Z`RVy&b3|H?7rniY}E}`Ye+k1O5Lo4z)}! zIV~}@w#e$&qr9Og$5l>ua=^r+Y4b~8@>M|wRZ_F4BchL70NRWE5KG(-CKg%WS zB9XW>GYunpKBrPJKNEhRW!-R7lPP*PzR;ds2KD?*<}jn8ubAgrQ}41J5OO2G@Lu|U zr;kceD3o6Q*oQf~VPlB~2jf0zD^5{?hK<_#lvK;^nPmEd(LODrBq^qSloIL+NLNi! z9R7g3k}GlZtH#||lY(;^q&nFVk`)kB)1jsHegu1_GL}l7tW?QQZ-rJv6i+542FpiU zn-l(kjzr)XXu6WpkMI6$<1ulZSZ)kS#jG{nDDQnB_n~zQzueV9IKNN^fBAs0D$?jA z&lb)|KoH_w`Vq?8?M6}@r^)X|JhIzVpuv?}n5JRfN?@0g-vsTeIY^BHp`d*<&+VNp2h)BaY|aP8Mm zta4!AVf-$jRqMq3OquZ7H!NtPcaHQ9WZSox<&>Jr}+~O{_!CsxfzF>+2^7 z>5+LRHOuZz-qnQK3*1!o6*(WfmCiUeF%GYC>T|~LBxjqAalc|Q&pG#b^Rc(DH_}oP zopqyvXq}nYzW^9qa=d#@>PKt11RZ75`tJRXB#78_bmdBW)ZnV~w zZ%aZ6&&9k~EB{+KiPrLlaFP>bK&@Filxo&v zuf2ULab}{}^3*1q!j4k?8Mc~>zpAn#BrlWz6U8~HXM8TM=)R*NEvi()#(gsU3vQoA zky`g%z8fWjgSr`(HMipOyGL!BW2Aud2U=)`L3>naWDw1Tb+JNNCp3noXXp40#Y6_5 z&dU`3Hnobx0y`bz*JbToZvrtZirS2Ytar%)i(Y)`>}Yq*uS6CiJMq9n@GzZ@TV+Yv zqh5$K(H!GMT?lfTgZB`NuF6^cQ`;c2Hvx0v?7%d8;0ej7l#i6+a@=s=W5-?x>cwU1 z>E*^Mp;jK_?uGirf=Hx=CLbE<5Kxm*+)(Xc(Q1+BEr#%pTk~1!!^HRsz04?oZ{|xw zGao-uZl_vq(8dx%9P6Anjv2@2pXh|-LUR30@=-0c7_6=k>qeMitK5$vM@X3?j zzQb5(ekT(p-|NYwy5)N6fNr3TSC3qzqkt-N8Q*}-c1yV7F8Js2(9qzHI^SGJHpwvb z_5huw8CJGvzM#?FIsMsPOIE_-&;7ae{On2pyFKa9&7Sm)|F9>0>&<|*WP3;fN^=l1 z`PiiH$sv3G>GN^St6k&v{IY#rw#1=ipYQf-Ymz>b_a?|^AHW#09fh{npWuIR+H{N6G{FOc-w<3>Lw^3v2~@PzG(uthA?i|50IT7`X%||T}1mf zAVDI@>`Y7LL1QS2WF!TIr_@M^fjcMXtVlfx<=cV`4PmB(%5sb8y8It~!Cw{f08Y?9 zWJ3t4*CMd@isKlrYWKKGbKGVE3|wX?&>X0=#|gaiwR8C27j!zyKW$mRaYvDwNvO1xI zEh9lH%N;|ST$4lFdh8dVJ(q-{36<}eN)c^*a&&+GMcS6MXDKi&t5Y9}usw3?N9D zG;+#B1~Zj`hJ6${D$wm4kTbHoRtl7Zy65XF)^+j}`zH!ai*1KW zA_(iGP%_1CZerSf7(LF(u^rd1+Ph_>?a&>j4+tS-i0EAIn6Z5BkFpu&k>=fqqgxYUZB#VRZy&x$ z7II6+tp*kW9MV)@gy5iYS8X+=Dl3D`?T=&zu4JD*}H26w|my21JexdYi z$Ssq$M?KUr@@Drm+m%Hxti59Efz=armLHlzjz-{^aG&%&7n5%Z3fA4bu3!}kbP%vY zxKm(zF5BX_*hkRNz<=3#k)UY5{^*XgZbTN*z$@k(oQ`m{P^aDXkMuQZ9yR&^r=XHi zK%jA**&RvAQZ<4Oyf=0%rFJ{Q#_=fy+?DAWL%l)T;0pgpe?zm2eWG&O={1CBGxddZ zl&hFj2r(+w)7z8+*ye8y$&hE7jD~a)r*uoBJQ^PbyHveyU_=neSAI`B#Qbt{Dg{hp ze)?_B*iW))NJtAF&h-9!GXrcP&!UjVl{+{T{9(Qkgm%8*glYXV1q`4ac1@+|u0}~k zItL*NA6Ym}1X0d5tx~{IdzdLg(M(z$pX&+)em}xZoeqStLSw*9Z8Vo2!ZM{b+&j9b z)>(oZG_=rN0?I8|KCiEG;j>ckAtKZ(-?cp-If*l1g8@f8h*4g6k4&-@)7Ng&84+NE z?%dk6I~DgGWGd@=bTu2IKTyx2G>4)K-9;d8CH&#dw+Gb8ok3b%h!dUq=00Lo??Lft zAyJ@M6}pf(n*5;kcYJE!40|A#7*eW63DF~{S>PIRB3AVDpi2RW75y&nUK4OS6-`h3 z04s!%tdM(b8C+9en2SCl2vr+mvApMUv}EL=obu#}u6G8Pw%-$X*gF;AJ+Oa9_`7_6 z*?@Rz3S;`Rz9M&&U?w#vSQEa4qrw$cQO4XU#y3v1yZsXmLxYCHs3!IKtPBp1Sr(8k zCrWWf*%FHSW5>MpdMKY_R?R)n#?N3GPiOFrbS*=tkX+o2b=n)-*IA}0z1Guxn^HO7 z2ZMBO_}(ecM`YMppC=&_yI1R} zFW_Fz{hNDPA9>I)+nk~@9y+@=;ZluyDNbbJo(zmDCS{=xB-+}#V<1*2EtUQOL0@Mc zkx(W5^LE9;xbxk;;VsB*7kNhQ%AgHac%ByY)rNajSylg(n|D%RgkygCDsKVd)pQ;W z%=ZS(?7r}ezz5nc8oiBs;=2%k*uB##4k^y`0-fqKn7#B+!vT0$8|0<*zTKpquZE)$ z9!!dy?%&;j`#4A!cvyz4I(rB7SH64QKXU!6w)}? zib!T!8B6%3mhn0b(eiK`Z&yp^EXOL*q?di&!@rVEkzZ*cL|}FzbY-zd%N}vo=LfB3 z5sRZh9dO|b&?v@+9kh7%VAX1(j!9z-1$=d1%Dxw?kSR7!(_0eBk)2yfe&Dtlb;jg4 z?oIFTy)_VR1=BFjes(9;;*Cl+0N%UKsWI)*xGOUc86aGvciC03;?ZXxDChZsi zwjhS5%L7c>7$m8|BE`}cwnhuDiPs6`{UltI@7gB zK%I8yBub&@iw{10Dnc{G_xtwZ-d^b?A&`5ap4xUTX;ueEzAIV4SzliTjdOPkkZ7l2}lXoNSlUB=4 zXai*&4bKL=<0BPy0kw4NdQeheMF$`@-%WJO{4HGM;!CZhkK=PUctodNuoWJmftGD@ zwId;noBA))(?^|yVwdy5^!tTICh5X83e3iNI?$!{JQOX76rQ|?!md5g!SH!23TQxX ze<0eG*I~}qj9Ul%?k#Y&sIu@7GNrP6+p>lQtMX6XQ%%h=2vDogEq2vvTPQ<9>=R{A zU5qi)upImP^gdsHnYBu-I4WvB(zog=>o*^%(h_0Uz4c-+lqSiKsRNzaP=dMhBa&6q za#re9u}UUN6EmN~yNItm_TlJ=oa%eGEwo_` z>_>z|j_O7rO#p8!&-`^bQScz1f@!(<*&oMs5A89KJ?y;VVC8HLZ|MYn7ahB!7kGBK z|6HG*p6Y2rLLW#V5_jdQ;}%kDlByZuN;5Jwi_;;M)&@bifNvm==l(SHK$S|O%Be%` zX`&4W344gAaRt_3+xg6d=la3Dk*9a=I;36<<0=pvdE^5?NJ640+5`H6>h?R$8a=Q{ z6adYG^a#@0!o3*>rbtJ@&{);hhIjAF{PnT{)PDaXPW9?0K9p5q=N_39vCfz|IZL>X zxa~rYG6Q8s^0gx#eT_G8pFqy0ZjYzAAYYDkjUk?>t>#<{;g{sTR&0$s_<&WRlyECZC$5t9^y%5e1Uf9<&-yx0km5VN^f86PBOXtt2 z0{;zD1p;{lNB*2DFgCJ9<+v7lOU`PJP^7(ykBU=o6Dyh`KVviZ{-P*9L4l&qoOPYm z^zLS9{L(W0;ON})TbRspZWFV~iqfo$_9%US1FVCzwkL$Ei2d))s#xRKI7w+1Myhf7 z4c_`6Y*(b_ps6eB3E-p)`Qz`r3G3!fvA$S^zR}g`-dLONb+_Ds1MU$y2Fp_;th@*# zL@^q_I3*jFM0vGp$W09ED>>5XL2zDXTJM^L9vuuyG9jwKo4C#+qKH%*j)+zrnCYG5 zO`25-jhit|M#32e?gAh5DW9Q9HFq6WUjR$NJ9!LgU%% zk3Y$if3FV@`SGY+e?Wc^>0>gb{l_K5Au+SAs3;$xXCt%R;m_``OpK5kE64%Mh0m_1 z0<`j3VT-i-H)2t78}7YPFQ;^mwKTTDM`99kY8}DXqmji&wo(p9lggDg@vC+1llLbx zI1mzH5`%g*o9LYRhok%ei!qwz75Y^YjOALv5st2eF=s2FF|)=)v1-hIZ|p&}ZXit| z1<2T^5uxwYtYDhG9BF44vZWA>vDv-&p0V});m|CGqz)%tjR|7xpw67BGZ-AI^EoND zvisY}`)l0;HgBd!?$s+yYa-uAz%vn~Kd{UYH#7$21;QE&a8H_lNNr-O#IR#cXz|h)oF@?0lj#{NgTZtB5i)>fm9+AH4Sif)j5dWmY(nprDOT=B9HRtg6zDvZ+;pZDO z$sAXPQm>|d-xx{}QO9<#daa*dza#Ev3sWV`oVph3nhO?((cf6oH;6Oj3~S1Qj(|2Y z`^{G+IO3*jip!R%4j&~%+;%!Wgp>rUt1lZIpJi7Mjd-~uW0=?s-HKsi=>k_xjSQSr zZX8q(%YvH|id%M{!(n75WmVXw|MP4b0!PyPfIBRR@G_4iX{BbW(A9^~OtLldxQ=M+ zeT0+8)e#R5&t_Xl3`a|S8l$woOnyIiYv<)-mpCkBJ~BTSdAg*EoT(KhmWS|9l(l1N z_YANw$!FBUk)WvY*e_9g)ClZlz^!cNRg%*FL)i!8MUHZrbQ3Udr*WYC--_L)A}GSN z_b^WNgmY;>uW@WB8h6ETw&!J4T@%JCSkk&NyLxA>YsO}3p>SB@)pLzOzQ@w z${F+6(E^(d`#Jfee&sXO*a9UKjRsY4Zg*}EN!}d$u}~O_OolkU@uAO7@yIt{Q0NX- zw8;940o_NbavIH@Nk<(8l=Kwh0||O$prRZce{NpK058LFC(_9Th8T!rE%c-2T_P<$ z>kSTRLiK(<9C^+Ts)x79(|Q(nQ5Gr>YSrA&Iu0!<9yo@GGil<+P0I?J{=+4PO$gY#4Q+UGlUPise#Z~0Oq%w#h*s>U6% zeK+n617m4&^;cp~5!w(yzn${Sm>Q$&A4BT2GT7D2*VdBYutzuNfdd0cM=jv8AW{2< zc59@G*LGs}L?>d=#g(dpMI_g#k>Pz zYZL$ukkPXp2$gVs^kQFTFEuF504;0khgPgKJ22fD1+wG!vLqPkbcZ(5$(5jbNIf1F zWSaGKyCsYKEw1xdwq8k^@1BuMGadE%;GOEJUvh4DUapx(jH;QU)RkH|4r~vOxCO~c zq?;-aWhRU%*gTONDur&ERo04=n%+HP)bwzJVFLzo{yhBChT(5}5GYcsV(4x!I8!cr zgd-A3ZYr{|m$abJbb0u6yqQOm=ED@_foR7qQw3lf8yokH+6n`F3wyRCeHoua{b^O9 zzy14D55d{E{j6hw*JD`|VE26eNnMshuNztCqSv$jAj#p}L3D)UnKYed<&J@BJ`QEU zSaeVK6xeA{4__ch^_S;B4MtpqEB-Hwj`S$vmINL7Nwi+(sG+(E%#*QX5Tc0~7g2i+ zOs3+cmODn?F;(U#x)#BN1#mt-0PNjDe4Wz=d3N>K9moOlHcYA!;Xa}pk}9t;{~AU! zI07|OZ$7}-2)0G$grlnG+Gy&j&OJVwCUh4S zhs>KdMqD6|ZhmH`bRS|)d<%?ySO9h-3qa8iGze%P09i(~kHmw&epE@!>qTUw0rYnH zYseHFK?4TR!{-om6sSz`nk+Brkpmf{nm`P)86pV%uh~+Sbro5JoM}!j1PAcwHHzh; z6UN8sLCux!5$O1O-)p$*&+cmi7A*zQEk?9xNOCH#vjAS^P z$I7822{L{gwZ5^wK#S%+09b*W_s8?EmyD}CU&|3&5lU<9(bRLh5%B?bLWAP}R1#(E zzXBE6e=tyd9oN!2j6@7*?HPuUBB0$5ZB_p$q4Uju4H7g7GD9`2byYbBM;RA%+-Z73Z(|5iHE=0`#4Sl?PxR6MGy z_iD9u)C06B#5RarujPA3^Db=yfc}Bd#j;D3@ zB2P@4Tm~Q)=PBEm3RbSbIO1!o~RR(JCr21V}w}n0IsvwXT z5~S&(VEAm)gHQOR*^wO(-X7sPC^!$&u@l>m365Z?oV_axx`@ z!fJX(&0z4k7BZ&@keD1}f4hlMgxut}QZ~}`9 zH=mRz!n4c=LC5G27;&Pr`qdzaxi+VXWA}XY=_*_EJqH-q4&~n?TI+=INb`fTN0R(Y z#YxR?uL#1WH3v*Ja-tYQvEQZ{m$v>nWEr``&gvhYWai+beZN{s>|Q3o3EHdy9Y8WR z%G#X65#4;o^TM#_Ge#{$S=nA&mw!J;M@Q*I-V{ty^`s^D{o(g$Jh%80h~&U6CD<_n ztK$hlf^&BF0P#kOi@OHwsOmE#0oc%8Rs&IWQ|w+P{2WL501KBDHa5-tI?0hA zH~ekr-Kj7I9O#{p*`LsTgcw3D0G$}q%My1(XtvVH5J@q(BcEKzL=ZjIg-!d?nRITs zB^|u64YhS_G+NyL?b=LN$q18Mez)H;9DlxJRt~_l_ zSi~EU-}64HQNQqO54(Dv2#A*Y(VK{V-;A+PJuKYO_M>?JXn$wJ9T z^Hhab)D>Vba-dB8*_RSQhiOl|lRv{%rS)Y8c+r79y1TnlVMxNOngRHRGE~AADClP$9t>&<+H01O;z8?h#`>Aoz2>`%UL2JtVG&=)j|9_p? zS>8tEKA2}yc8-dRG*8_sXcrGiyUp(fF@MLX(@ZLJP3VcI-7ZLH^!Re|8@e5#Sqd#z(Z#J79T0)Q#$k9C{^Q z*l#e?#a%!HbR3+2SJMd1e1Exwa1MqSYJ>Y;7jfUG58j*c06Zde3V}Bd#&Oi%ivTZ1 zimnLcQBhdyA130V2hK1V?hNc6P2vE6dz}#oaWu@6KxW+>NoL8p&W@%dfh3^1J8PRWUg@3wv zi)AweJNEr7l(R?&p|=Sa;PY0xd-Ao&B922%hC^?hOBgOO;yysm<2`p_kOW(LzdABV zVk%mfHx2mX#{-e5!YK#sU05COFHBY2T9B_1CB|nkI15QvkzG+6yBkdr<~9o>V7Bq~5~`a4?-319U8gkAm5!>$UTF$lRX zV;0FePkBx;g=V;A4vxap!Wvn49eS(_7sB>D4zPg%5oMFn2cYGAZ>VT5CuFmSE7g$g zkg28)A%{79nAD7s2(e{uCFHJ;XX)*l9S(ZB~zg&)s9 zI>!{@x&$GFYFkM+K0HGh#v{vZg(in#<6%UF{FdrLn>OnMn z&h;-_Ik;)1Q3k(XPsf{&V{=Df%SP-iTmpi$Ux5y8F3*_fGsKD#50#PHJE)B8u@Tw5 zJA)dFsqpz3!uI}VOY=-bAzj~FPdJkT$LD5wIfR51IOTP!ekiKGV_0~f`zzIsEfBTaz-M~vM`hZQvS$%Pi~2WA>mP$b<&B>ygQXu>(P-jhPSadk%nTFaQqpN zxs{N%^7D}!AMzSQBCvM3!ba*oNl5e$V3EjoAedWRy9}!jNY@hrvr=Oszia#Pyc~Mp zn=SGq>!z=QoSeddCA@2=Mg4c|h!|gfvFO4Js~IQ$-HO4vH(a@)>JvdyhT!1!`QfU9 zgXDki3cbT_M}9R!1W4;8GOfD8;c zg~n)_9t}bO9s*hGeU@{-b0fz&6`(vb=ngK-*75yi@*C2Rea-G>f;=zKkELnszw`^> z#F;=5#}~s!&DUhjW9j_v(;A4Djc||)cjDr`Q4&ClEuhY*>5p1e#?RS#G7kX-xO-%e@_8UT{^{^h z!^xe>jrG0*hCG3#VN zg_)LTPHdiYPc2}Trq2N7F)!+tZO!v-=HGF%C9^nuxi#-FDS2e8?1 z=N1mVGKz${NVcmr&_GTs*Q z^1?r+)8z#!yfLPY5ONJ>vmW4=wkK>=;zrCA|2cvII#(hoa#BnMIWRM2bBa(mjw60* zgqnn$iB#%3X?pG0^EjA_OBP1Yu8ex&3R0zo=6G=X3}pt7xg6twbDSWKH$K~$W@=8Z zkjEK}S|EdU;+TTe>n-4Bis~OWiS;IR0fpzbE0TH7y@MV>C{f};aFPS#oYa9T=n-*k z6%eP%Y21NQ=*5%7IIv^LwBAUoxY`;9+O-U9pgr7KD7K9flV4+wCZ8miEv`xX~wd9~aB zHj6gtjLe&kMU>}u+F+KS`q9s@JdCQ{49ox2kACV$h*tGeKl-U3{of2r|EVAS)Q_MZ z{iz@Q)Q^7ZM?dwW|KCh<|EVAS)Q^7ZM?dwW|LI}GKlP)Zu*Lrg*y2z9=%;@4Q$JGp z=|B3veAwPk{phED^ix0j=|B4EKlAhzm4+6}f%C+KiR&OA>0Wdb0JUgNszG+8g0p}*V8!{O3Of`*&C7ncr7@&~fOFw^p zr^N>vxf>bs3dXGWsd9uOyI}8!7_bPBxgj}{qlSVABS%3gHRvLLiO#o4;I2h^l%CI3 zN-r0xaQXn#sGo*Ro5fN+F8D3gy>s=4{xIY9!p8c!;tLwZj zXE8DTHh-g>vl#zrIcRG7NKW~(Tk&g+iYpAiwJ5#*mtPA0sOhDWk~VGocdIPDedmZi z)&|8DY%_};M9qM^Zbze);1^V;>X&#yeK<1_&C{~Q~8?kmZKhd z|IS-lza(4wbv)>as0#*1roFAMcd{mz9#&l0mR}kCuU;nPg7O4^pSqF52@G<0PoCZ# zSO(OahKhgvQinWyk26}?`kLbX5vHXfGdmL_?C=+30`~mNmxV+50i%mIZs;M#?Atom zT(jL3^E;x4zq0B7>sOY8@1R=_eAQp6^5zsQhDk3bV0PEzwKM<5d$^FGYtkE$+kJI% zl`GeBdY$2g-LZe;GMqGgO}Wb9Z~G$g-+0%`Ok3J!w|=Gnw{FKsQdk*vCogK@*}rqg zMACVeE7Sd3ck96Cf9s7s+I}1*^sisB`um@LzWjf5x&9YlocfKFGR3vx)GYGWwRPu} zwlU5O@5?Dh*?l?MuJ0O-)!?Ldrg3m^Z09+A_@oXGPh^;8$jSP{5qAzp9^PITcarZg zz0wIL-is$k0}U5=5_D22qr}eM=qpfv`Alll3aW=6fn-fOR#?mhM!JEX`dG*wz& zG$84I%DTgL;!wGSMY5gQn_SO+T&;JlxMTs**Pc9-vR>+1N64`vdb-=%mjrd`HFOf? zmNQ6<9oT4!Vpr)}bM4J?%uMWt4HmPWHu_dv^!N4o#)oCL`J6?!6xZL2H+?tgvuS^| z@w8yaKVG2M3rr}Tc(b*Yf~Jl2zV(!V)!q&}>&~Uh^wU|?mxtV})~OpynkBwWgoSs> z=aqiN7d!)%)C-$keel)4k3@ar+SxYIOgmtg^wCFq6Dl5tQYUQRq^|)ZPF1vqL$MH6E&gX-( zsixjTug*%eFMCbE{M~Odgj?2({;dYBmf}9sYfloon7gkw7;mX~_*q3ot!?u7g*~fJ z_LOrMr;lvBv?F%7z2x;zWPXnsy3vAis46q0I1Vgc+GujkZ=8;5B_#e~&G47&9gmvf z(YQ9*B9v`wS3J_}c{$hQ5y~MZao5+mOnamGYX+mShi%H9n5}+Su)UU_vnEyU*Z=11 zzP!TK`tkH<^bYMu#`SWpwo8onbodII8!pU|hF;v%v99(H-=MrR6lMxtv{kXS-sazD zR)UkBY-HJ1eKb1D-t3Ljv6Y@van>l06D!{YG&&V;7u`y6m- znm%80IaHxj#JE%Oy%zx)N>?Fi-Xw)!Mk{m*=eAU`JugFEpsB&V`IfHojQ$`pjow8-6>l zb!uoI>dB>=wG6_f%-dB9OS2xE)oT~+sWnd1^_M5ho(VgDk#K-_Ul8G#o%8ZjkF9%i zQS6ScR5pkFvhKg^LSI)H{5jR`1Szi6joiIG?vnh5L$CWcXD~jnnOOyf#Q|KdS>|CF4x45>y5t0C*8WqVZ^Y%Y=+2_EBcJ#gI?vEz)YTj z&w&N}J06MfqE@R?3?$(({rYL%*<{_Ax5qg6X6Q08_rV`S#F<3dd+8bu$LaF%`B$%+ zIh?-ULo)M8D_FbnM|Cvc$L@~o%&Bu0#RoSe?8`g0G1hu6g`>Mr=JD&C<)v>5Oj6v5 z$?{p!JLvic!)vj>2J&Y}_~X->Bv5kAX$Ho!aUGoaw+7_KygWjt>3X3;%251}QI~dJ z=gM+sPL9=`}@pivY_v%K6M%r>DRSsfqlMDO`ZeBehel{QP zW)eSDpJ`{4dFfVHqFqs5K`$@=jvA5o=Q7v7`V3B&f1PSQ*x*bkd1m5f)?M>9j;ct~eJ;$xqC&Vn(Sby=3I_S^cu@6KD6Uf zShm4=yQe6YmF1w{p!D5*>V%)>)qvt0+i>g4$68{nPGUw|J5JYHc{8I(_^>s@W6%9= z2b**`zj>5H81wRtU0qG6oKf8;h3h|Q@~XtIytEZ>+qQ(y|Hlti(T+xyo?kik|FHM& z@l5ys|M)s57rOLzsl@6kDMC>WVJcTgA*WOhQ$k{n&3V(2>q=3VQyG@z98=gZHc=F2 zmBZLD!j{c8%r-Xc_j>jDem?K6&+m8p{qy_%`TnoJx_P~xujk`&f7}m`&Fx(q|D*I8 za$dMSQXD)9U-!|BJ=94by~#XW%hQMCyzuudy!B>}*`R6sE`z%07={B!gzIZ(ectU5 z>=ip%d;APCrxVv0d~g`3x>;UfJa4*{81`DJRa}d~odwFyHmBUwv#T+TGJQ3O{eWpc z^J}EXGr}2by9E87>z*?D$rIlc$l_c#lo9T`hN+uE7B-T#u4!C)-Kv^|VmRv2=GKrR z;)P4exL+P?s6o1qth}_Xym_y+p81HFH!;4BI34!c8`hp1+W&`SgKh@W%}RP*2$p4YNu!=$ z#h)J6iTVWn|uraFPY zevmyV@ojjJc%B(6TNe9lyo_dR*Gq=k-OsCRUbPOZmdILX~)S9a$n; z(Y@9*mwIQ1vQiVI!pkVx6M;$*cl~YRuFeP9foFgwHe(^EL?ju$pLFvwz0~bbs)`fN z>~@&PbJH#euen7IUp#OMVkQd#8vXVze*k0L^t!x!Duh7?D;6Vj>bLDiJffIi!?;7S z#WnUb&?e@oDOM|w-ZfquYTwZ|b%IvIsneLyEauxVt^qB)SLVGdBgi`Vx80DTro>#}>)zt}7n(DrPOpl5 z9{hLNyXv!(j4k#nUp`CsytkODcOfqJ6BAqBE0*qS)Lzr9aH2RnYFi$nZvJ7QwTHyj zN8dvBGJkPWU}VtOLS)ovFL}D!$>mE>EFv#%Y;q)0n8A~hSHuzbe3#^MCT<@8^Y`^% z&vVvH0^qjV{FiIFs=>Ag%Ndm#d3w7luaub={T>uhJw2VwR=dIY?X|o7cmxGW)^s5> zO|WS-YS(0Rg9kiwNY2htx2Qq#Ad-5Iy{9LA=S0bq8w4oz!?m^6+{uu?AfaU)UT>BX zS^in_vL9%L%0s+60UUlJrmW6aOW{*x?EI$@yr=0%p zEKm~QSIu|`iw7f7)*-1D-z+@W@oe-w$Nj>WlEau5VT<{KbL|1czNRe) zhkvtaR#bqnr68DAE=qM_Qbbdaj|dJYEQ}jdFd0wU{&z&ha(>}LvpA5b^|`T8 zD$0*kbaWFecVD%>;T0b+w+Sz5*LWEJ$oucIwt`n7uVZ9Q;`klxl@0RG@l%0NUe*BE zCys@~Wmn7vTh8N(vGdzwS59_r=(*0E+$ySNd^I4=bMkrS?B)VOBlscv~`Bi)p87!v|9bB+Ab3{g*xh1@OMhE@43KBgFz)Rr1Sf37~i zK4{AXul$@9#;Nw`*tE+UexUI=&)K7M@P4`I7%0+$g&Mve}V)=jolU|e~K=JlwaN0ymkt>pWv5cQ@XLIHrV47g5 zLcD^IRS}0o>y8rNjX17yTQ!=RX$2K3Kxn9{kT@>d=%$uJ{73||Y+H(%wD(=(mf*%o zJkh`AY~3Ml4l>t8x3mB1LM-!fxmWfJpCW9?la)a>oTC(A@9rJ$6rlw1mlvMnrN9T{ zZpf;s&g<%H;=sywJSp#BuV4C6v!U82-iwEy?HS5L#mXLLP>Lf53Zt~l6L3I5!EbBgMmpt35os{xS#JH9s3sViJnB>+vzkRAVo$TDQgL?P>wX% zyJ~cCFmp|FL9Z-g=uJ-G=V}WapQNGIczz(7V5JhE*Dw+*YidG;<{%1J&p561uclU0 zRrggS=`6*4nA1pH{d`frzZh%UTS=vnW1@wLJh&i^}R za>tXzVJ&3CraAiO*-rDQnK2#ZS}tD_#dN1#+)&BrMK6{!yDp*i)t-^TPnnl$J)0x8 zQAZ&NMLpEU&>KW_Pg-lo|4tWI~AGqQeQ)y2~-e;4P*yn8{hMg`MYe--EDehF4JT#7*o zt2-0=I^GuVU(y(k2tSmL%3FT6Spa;$#CrKV>+{2S2jXLB(9PfliYEB2`reQiari%a zXm7ir3vXU*?+Vr5rSjqn`KFPpSZiZ;}D`{+kP#wz3Gs`+stybn=_cZWIkKboekhSZUZb4?xDlO!Mgt_fVcW@pK0afjQV1Qh>wh z+{g_K9Hug6g7wFM2bciRxKl)VZLQQD8Pj|HT>yY`$H zTdQyDeH1_&YVpD-U0G!7%D7Ytw8eo$G%%=g8SS;~W4f!c4bw}JXk-CJ6 zF3;_c)e@U5(7pl|*uU0?5_=wTxw9N@VD>#_t9(stS$`=cXRP#h4_yW8xdCUJjNH?% zBD*IRYIkjkz~m5wF*8kB;ZNN|rZ9rZID%){E*ej4F+*(P{o_psZh?&0BW>afPNdiJ z4}%jWz#)~hURP>ubKeb#2mbV0*F)+YXNzg0OOZb+V}^+9E;#y~@a)_Lf^u8RCP7{V z-}l}Wz7G<*I$6OWb9R_l7d2Uye{e#rGi2*_a+B?`nj9R^xuZ4C>5n(i?wq|_H!Qq$ z==|Fu0P$iLpG|DfC~H#S6rsu-u=B0hnq4En?*doi)D@&Fqv_Cu==0FLLk3=6%dx^* zPnE4*I_y8-19fprU}?a2pa{c!ns2eh=i(+n$Ud2CxdqFsVPWuY#qa4T&zzgo#(P8zq-maq3( zo*HyoH5#_8m)|^YZx(nkxOiAO2%Om7)j&6h!p_vvTu?tA%Mn%EKg>+N`uF5-w#bpL z_E)qLi;GJnrB%!r+8S_rr)-sjSBaP~{`tSS%7ux98ns3ug7q@)5lD8hYE4J7zwkls ziJn)#BdJ1PEuD*GMqqa*wh7{z-`I>t{KA?2`H2qNt-Vcf9^T9>+3Z_kLAmxTP|jUS zf=l~}Ymxqn5S{DM9aC(jBCb2N0Xt9e$pL0ZbOJAt1)x@?HYmDxKZPi$2yFi`l7ZFl zU7gUN@hw4>Bi3bHahu}vnS7+T3%mkJ?Qzb^Woo6?M+59gHZ}gL#9W_HB5Ub4nL47I z&veWm`30vJR(x)zq--oAY)Xx$%zD0Q0AL=+KQFj^wEMvPx>pSuLFz>m4LfwpKX@;X zgVSdcJbnD(F_)9LaO%Onz~KN`ZL0yLGEU3VA1nWscQ58W zzys(Upb>&2GEf&XHHE`Ep2@$m%572=`o*NwWty6!!Qo|t7&Q& z-UVVN&CKxjZ7KDQ)~$j`S~_id5CT67$^ZE%W9;eBK;h+JN67;-@q%$SR6fskKd&pw z^mT}Ryq*2Y+RD1dkQ6bXk`3_FWCG8_61aGX8A6w7d#N&+3=-a1QS_*TBzMhN_ctJv z#qY|C=hWwuqXw5>j7YSV06n1%Bq5K4Qv-(7)|yfPV?EGKN-2~`0ljD1B7Q2 z+12TLd9;(dydpbnAC5E_FWBI(!jgd05<@Pdi@^$ZT0HfLA!`+uc3H5cdgaWmkI1tu zwR>T2DlWF8V?q^HYt`smrM zIE}44YSF`y(Bl6ZTMZT$kKEHOpjuk&sHu<$UvV=~rUnoXw~hMwgR$|w%dbMT#?Nn0 zpBCp2&QrKF(;<_s@=p$eA-k@~WHMig+kF7y2IYnp|B z*Ft87RySWJ$D-7G>d?6dLrydyW%tp>27P1|^KY--&3J6kx*}@dCLFlvkJj=yWT z$p--LXF#l==g&Gy(!#E`!qV1j6HzxzP(n`P0p}?^Ob6e`DN^j?xtX&>3&4%bQ7!rx zWW;23^Hbdch4)!vu=`TnL&(fT6j!)A6{|6dh-J3x{C9SjMk zKl%as8W$5ibri;t5?YCfi^uHoAUxxE!@HueUF{%L`SC^7%a;Kq0u*18+GyZsSJsLh ze&J16eWUC>@Ux2jILMN<^`apU{rw`=&X*o0uv)-qoU3!mk2@db?O*C5@^V^J+D0pZ<5J=f`^m@dDsFRnKs3Z$ooi$c7Rw;Q-~dN|poi}J_8 z>jwCXgH6iu0IwpsxGh!noFK1QXztL^NtxvZ()|Ap>~_kofv2V&i@iJL3oA4Vfitd{ ze#XfCFTok#z$af<~eL8#N~Cf zEiZRLfDP-|z+OO=3$XW$T=CW_jcww5(TQV34##sn@680SPyqezCMajbX{AphbEC#G zpp4s=Ki9JJimOI>E~e*oAePoh?<1@&K{>diC4+?FWPqw%ICz}#)nr$T4~g))V#S@h z`_4OmY(i<2RvKshZ8#u8`GHJ=Iy@HXj;t~K-ne;qJPTnf>Io*^*97#Ot8Fv9FNO&s zOg`%G(E#bOZHAD>gTne#!zikaO&@`3C3u+cW7GliR6j8Flo;TbO@4R_w_^eWbZ{LEwYg;V4mu+rf4ihaLosWM1rPxF=M7a4%M?Sywx#naU-wWW~ zZH_m)thPTnx;BjHdSc5al1LoKn3A$gF|i3Np!^d*W*etOA%|G7_3}q-(P+x&B?q&` z(})LS!HoIp0&-kzL~~S12*HrSL{wXyDVYZZG7Y*;sfjzbK&bF7lG^iOCQJdM1NkxG z6#*?r-c&D;q;|!o6t;-IwCih}&w_;AeUC!O9+gQ^V^nmh)bQtLI=>2d`@PrJ-u73_ zNO=oFR^i4~qxH5B91#l41&{JkE=gMKYOm)s2gADXeM=Y)7I|rb7u9c~gBAC@TR0;- zfD=SNPV0Czm>BDYl1go{(*<2ZU@8eQXqYJTBd;MdE*cq(LleF|XJKIk?&n6srf>B8 zn14+XtYd`a_`RgAiKj*GPu?W&1Wbl0u<$6QPF>Be1Wj`h?-(izd8oJ?@hj?V#tM z!&^v~nS9F*^j5Xt9eq?_h>qxP3Oa>xd`smZKcO4MQukt`KL)MZ0~ON!tV2{*jh?lc zNG>GVcZs%Vpy#HAhP7i0q@6P$&sV=v#MrQm$K8yQO6wxtl)GEinQ)H&e3p=)%d49i zr2#4sGC9%)mf^ja(PPwdjG>@L@M8GYSdXI`G75kltc<>pdHd=k+TNZxHi3j1 z8kJ9N0aWIbLSTec)?}X*pOjeI9iitGM?Cde0W>~X@#Jr59ub*ePpoeK5OjQW8k3`E zeoC|e9Pi-74(>%2em2+g=X!tp10bg4W{V*+uV9s{Mm0jb4qfs~`Lv2@j-H7+(Yy_- z`@(miPIRu8${cJ0+!fE6uLLIgW%&Nk10x9p~~tqhpC zirbiS59yD%g%8$7wMe~Xz1kL@f{d{nR?G;@=7|7hcp;dKM zmXt6QFe9lGb%fa!j(o*0U>xE}=D;k1I93IuT%p1_cpfup0znI(9ETu-_7kpZQ#`DUcfA047RL$F+b+|q2(TSq~-x3=ov`T zx$d5HJFvRK?L=Oo6XFC~L2a+u04-8gArLK*`75{F8=g(I6uSujBFnD{L3ue*nRtf* zBMe1KKASvNltpSoVkA~7O0I_}kwu1n9xO*HQRAj(7<>6%Sm`5+teF7as{T&9Dk;F0 z=k80d*Y0yI+&w1vg&Mo}*>DBK-6N*&u`@y6li>p~Q^i|PC0TFV21yBrv3Ed`IjU8H z@+FMQnu!LiiNZ#mM$gpLoFs+o4sp&sS2WN+Pj-W_jzmC+y#e)Nx+h2XHx_5%{7H8zIH9w<^gBX;EzKroQ2;Cv`oGABLkwv|lI81z6{PF<~D&(JBh>aY%s$ z4?elQRg}Wh*5C!wSml#U6b_JlK`Q+g7cd>&7z*peEcb_^czvccY z$T8=~Xy=Gm=t{=)V8d0TfKS8xUoF#$1uV0o*g&}1K_kmu@1c2N$2IOYO=VgzHszhX z+nj)2?0ZLo>a2PfOTWT$PwE~QtLY{6BTEa(NIm%}=~+#Cdm6DY`UT&89GDa;vbLz(Wo`TKW?2-OwJ+Xn7tgN0b7btrWC=C+Iss{VhPPlH~UXN$TZmcYSaWH^x^6^7I4`Igt-nkE<^K_>- zGajD=FfF$`yGhYE7C;O=JhFD_hXD%ElC?HP2HTbD%08D_iz@|AA7ORCkY?OM1|>!J z{q>BMJ{qlSqs`veFu*FDgTybT63o-HoL<2Z**_lAv}+g3kchpGj@g|ai_hJ%Ih?#ROoclQ%lktJb=0GX~L7jQ=0 ziyVJccKAw{c3svey@ZoSwUm8(q+7uF`*i|-x2w5)DuRe-V03e-O*3es}rANaaq%Qapi_Vj~+=LE{f=d;8~%{E8S3Ld_(xsX^IX*@1HJDTiYK~uh75`Vg~ZtztA85 z9m=qhSPfaA4h2k(+;;WZmy^j}r`_FInU=-j!uF5^TF=m%*!au5L zh3$XL!#};L|JbX4b|^p~|1qHdd|M!p|5)^Yx-7sy|NjdyOeDlfr;0WH`QLjV{l6z7 z7MaqH)&KlTA?`{42|WD#=Kd22`T1=?{!`Wed0+m&RQ0BjxC9jFnK=wynzW8!q_1V5$R* zYV4*79$4do0nN&l3y7Z_M76f|v*_M8#Yg0_1X)71F}3~`f#R{up^*{ntVO>S6yoM( ze%+*h0y?tY>Iz`C(#RYE&5kk&=!InUGXy+D4;wIQ-z0(5`N{?q4)kiw!H^2X$|55WV{E|u z+(@V-dxmw@YXIVBpr^fspwZXG=>xSLuIxbJR)CX65n1+dOf z=H%&M0Sh8%w=K>U-%m^E1vQPI?bJckwYRe_dAY3cCDb6ehy9b_z5)j^o^i!#SO}0* z^`7MW%TAu9I8TN4Q!T%u5coZ-yc<;aMFW;i3}Aluy|GYt;nZq@n-|hYI56&@qLk_$ zOeE&A$nsR`VbEmvXf{oE`MSFz1kh1hc}MiPc?rTOxCMR(su4a_UY|7SqlQ8Zh->bQ zEcfG;&5-fr*s0po69nvV0zyNpdq#*GG<(*brR>GPbM1)(T5&8x#Hd;4(3nkUh~vq~ z?5@bBD>oo!YUd&}8#vh*Okkx95rS!n_$KxNavTv@sud}|Bp@d|^*}}?ThBE{M`4Z? zHA&jAgTc?rjkKtW0obothUn80l{nK8NniUX6wvKPB9pacZ(MY}N~W14-+zCM&GA8| zt41G?J~m#GwyafH&fGa%ciTll`@kP3UZaG3XYwUYz;O*kj5b5^N_XHKJJqKL!d2_e z%I%(nf!?f(WGTzrqr1~F|B>pBC4iDcx7GhJIre~DSvEkL!43x-oU@+dx`|?HxBkZU z_|pUW7Cl(}JW999O86SxSo?h(gCq!+Yc;Zax*NR@!f1@40*<$nuBM=Y{mz!fau;mB zqVrp@%ZsS=WOUP;vjZkPiFBnwg_=ca6$%LUUe+5|vE{x)PDe$5r`~OshktMIqcCit zmVQR#m2QWyKnmxHf*Tkr_~Aqfwc0MZn)__RJnT(ne)3{`^Z9XpYjTVVUC=Brp~B=} zKQD2ae^l?Mt}4V*X?w^SswGx{?HW*eBkKW18{qexx>L`SwaeuFo$e(83l;w!k($Lm zL_k29Kgs&=Rq4`6uiG%>;399K5rS%e$fVxbqMcr~8Py5Z&cAD!{+J4kwnZ z*(gMnE&|3PlOGPFcI)NEO95&4ak@VoH3^ph!Wxh=pfie|)x7l`Y~$PVV!pr(hoayu zhPzUi7@F$vVPCm8`t%A@GhxB8_>ofLK~v-hdO@mtf1_-qA#$PQLR(rwEJ>->FWU41 zka-WpfFwV`y35rZCu2Ed-IDV)j$SVDAciYzTS}ARBUKY)ifujZGFi0L_r$6C{vtaC z3!THcv$o6ePkfQIzaEsXX{vUWqe6xgj#xnJ%?~uT68cTZ#00Y-*-|GaJ7Gl(Z%?>k zpcb=bsA)9&G37FO;Gm9D?V{fq%r zDe4e>BQAsYns#T=mQ0k=-RUR{I(Pi}RaE|?wK`i~bXDbqD4gpTmZdJ%bqu8KV~grS zCjdF6_aaSy8EpVMWx$Yw7M)aC$Z4(Ke>{bRyvCoO{erTT;Pf(?2kVL_nV>Tr zVz_+dbYDUsaJP@mk~OPImx)*XFfa#836|n7VeZfx`TK3x0b)q*rDtKZ@_n@AaQQim zhjoO0=aJgV8Ae9c_`4+R0IZe0&5Xw8F9l8>wd8v(0-+)aOh$E;Xf=Q9Xex_?8k}1< zI(PL&%{I~O3&(S0E^uN6Q`But8m_0fdgx;a*(j)YsqHy$X+KBhN!Q8CSU{<{5o(xM zo>MMDC8$0x%1K?c=!qf(+O<(hAD;w`dAZo79vK3kw%fWt|5Y%? z(a=UG=N7>99#Myj%a8Z9Rn9qyJnrR-6x(C&)Z^^jPB?-rq=lVV75YXWG>)OB{a&rQ zsn^3x+I@8Lq)_$tR<|z_u!}75n7o1Rgw!ULK)rE4%`LAvibk&<&Y7-UXYoY525^l8_y&ZDwOzkp!H~mpg9Ir;`mKjt6Lg~j}b!wOQv7IzK02)d$ zLEI@8+($a)zqY{Mk1~R_^8rQh`60AH+XL-$SPa)3-f3w&Q=oBlKPT{gX1cH6Ad35b z>HGLH$}$`WRvX5q<^Up~TQUN;J3j|WaBtzN>Dyf^u!YD^N*WuE51cKN^CP>Ycti`p zW4^FHkP{h)t*Tsnw@w2i+LD+61U+QN{8+Wg*r$Qb)=T5|_X1C2?;Ax}btA!)luB93 z={!w;A}b@VI&Kn=i-Yn5g`kbjQ*3r42m=#Y9fTI0fomKgF>n#^11MN08VDQlX1-F{ zbcvru!tYSonH%Ojj{g(T!U`iS@l!H9@b$ga;x&A( zNffIcLzV<;7G^4ZrXpSZW3FCe>Qpd=OD{-1O3#4z6MU#u*~Zv zuHB)*p~J*JHmGx!b2cz)#9@yD%P0rC@A&O$S z!z(5SQb;Owj}%w2w!6U%Z^poe0Y6-}qJh_l*O~~_R`qL*fW0HK0hb`05oZre@?Xwf z&HpIph6Mr<;_0R52IhXlvQRhad02S5$>OjO&=LUSDQ8LKx{9pc$~5-&@Rw;S zzk`vId(0<5M--W!!&iiue*lykMm*S@7!y7_7WbW&hGk;PmbT?Z?592-URmY@24;iN zQS<@bRZC0ucErdbZs2;x)6m&HyGAPq`{mCfB5vgcB!u00Bo z{MuF*l7*a7EEj!(b&@)7p$zG?ahdom+_z+H+gG&9zE>8h;f>Nv=w#izrZGO}?1^o) zfXEngAtuNm+^e@U+fM3hj>|l{<1&2r-oXuv$BwPuPUOX$iRjUf663GNejgw2lT0{D za3vDk6M*mF(iNnLX+vH3zD@7WAQf5_vjBoyuV~+hfk^glb=*;b{Ae^ngH-`|V<4gZ z#^YQ5u-^$3rV3?!`2>fu3!QliCBXbqsRG>4nX7{8LQ}ib*1F?XaSnRqk;?HtAy15% zdsoaCG<}7#r5f6jQPSieXd!APISxNAL-#zEjymJnpv`bi>t!q`V=Qm{0k1#f`!ntc z-;~DRDtm-^Ux!SU#(t5!uKN6wv+^K(b#uf8@_+?ra_m{B?TRSABl#2Rc&X~kjya;? zO&T{NQd9>ktxQ+P^{iMVEx(8XxZyZPU&ma5ppX^R3OMYwYD(eLTH1yW{7ErqEqf-` zEjE77)eWF|NEq7;skFDaa}P>M>OAf&6E-2cH&!~7sous8fAlg0!vx~)aXE7#Q6AUb zRk#1e@01?Mn{UcFjcP|YiDHm|!y=Z^wHI}rH1=`r_PrG?^o*+56Wr$xQdE@u58&qZ z0p-jtqpl`*e$A=_`lxs@3}%mNGNjFs&b2*{qE9bmG+}^DP2dd=w<5r3e|bmX$Vl%} zXFjGC4>$8h2#eLNH;rdLLF|z9P^jlSLl$kTTj5E(Dmk6SOu5WllD#oTEsmz1AOR%? zV>bOr$yj%86C{MeiDT{wM*+=Mnr-e@pSri?`Qoeaz`QkF?&m#i%iZ4GZ0?&!LyE?T zdg}k+W}gw%xg%3&sv0dw=u_Xt7@^^n5oPKIPfqH#48#K9>kXz=2w=2gm(P4Ic1p5X zk-@yZ_~$A34H)^I>d11hGO-5wY(GK^@TMHUEd`p~;klJ;X6EyR)xEacAodV*szt5S zo4CJc2g$>W{~n~9f&3ly`0}-xI(4B;*QT$-mL9hB7rW*T?Yx`Ud9Mygs8>mMa-Z*F zT4E`1rZT69m@(obsN`EzMdd`gdWZ8i-Bzyppt}2D0w_F#Ne30seuS7Tt@$Jsylp>j zGu}h8pu}qeiZ){FE28x??1%4$h46{G>1EoBvAT#QK-kvIuEg0LG6=l@fYYnJiyrXZ zeim%5Zb{OPu&<+y*STNXt-tcf^-R{iU&mYOkeAAb$lOpuFs)f@hLjs>t$3E;c-ifngyN$M862I;q1F^rp}XqEI1!qd>e zsCby}(}2!H4l^eCG=8HjT^0uG_&e3%Ry&Ql5lQv}{QeXm=hUO@K*l9x^)1K4PUTvc z-ppBcKJf;{Pnc1u;LptMDs?%)R~%?7$5jN}YX#NXZR6o1h@}^D*yie7nW%d11TsPI zr?WZ{L|8T2xN}%(#J)^0$ti*Vq9vM}3F2hcI8T+J7m1C}8q-&e-rqKN4M{&`dj7~c z&2MG!oAxDRL&D0fF0&MJfQ9=4!R2YuQb*05*x_L6C1(t;~mKwn016+#VCgzEpZ;tG|5V z>xfBOi5}$**ioT4!S3<0RsA%6xV!_lA4s7Rq?wH3`;8v$>TYGrMVycmZ-x(sXg;%& zWMS4cmag_l6xlhucR@m%3~U2jYOnqlJS5W1ix$gyp}MdHWZsSk31pLyYhbL46%+~xu59fEjm$d*$Zn~<56?Ho3n6JeKvdI+|EP8B_v;@FOFJb?B72-=sl3hKfA z5cH{a?f6G)p` zZR?afVve|D&s5FcP0k`f_nrCB6YJ5h!^jBz2BxwOSC-&@y^NJEUD9n)u@#Juv~Rhu z>uRzaWw~4_TlFxUm-5xH+Te2WFPI4}$MX$VU6fz_L$=(TNVBL_qlHEQjvbbb zd%(P&LoD2wX)AxVW;q;-cAKRJRISDkAuYC_s#cqB_k!w)c8^}oUBhTB`t*&*MP)J1^- z&UfnzT8@d5n+m+Nv~==|T!@r;1$|_>Zl-#g%*$KLv=Thdykot6G{B-%`Z(@v(?zlW zL?P>bn^VBsUoeN4FtZBL839Jj;7ft3qE0@FaUm62>+rB)ll!Bicp>UCX`k#uXixwG zFsnp>VzO=`dKr_X(wz#rW*KM+=xGB}RS3rUG}xup^baK+#mLV-9_#w9d5n60g}wQF z;kXs5zZhnn`EaK7D^Mr@=H!53RNk$pGs7RUmdk*ZYyr-d!=lFjIwYQ!V}vGrdzKgZ z&DpJZ<(_`k>}84-v|gs zPcX>{CGlBb>yg|cNb!(0P%}hF!rsj5Cq2;1i0nk$Lp!YqLkWTP{)N|2^hxHR?s?ks z1W@962xse_474Y+y;IuTlP>$_A$uRhrp5~@6dn5m@UpoeE{qZJ@kIMi^)4PE0bGRe zph`GhQ`8bZ?B@~s!hyg+Fq7YngRejMZ)C!p168G^y|#;hL%9uNpN?LRiLp|x>sTPE z4->Vbzt6r)o|b7Y470k4S~q?q0&31ibN`!sF*!JtAu`A?jFPwI`?ROhbxwME>V*dh zjpP8_S8h58_sVoz6&>63hLy{D1zoxRxg89S;ptZtcE9=-FhvYV+Z@-TZf@OS?y@@F zyc^}}!d)>sE5e8K#h%7LuGOU*B`@;Oz2@?-dbrv?#U9qbG1434)VT2^`e{eAFZTT* zrhEUzCh9^suacdM+%F5l$Nho$%DWou6_0eT7M$f`tN?l4e5^$YWLG}N`wvQwUl6w=sMGI2=N4j78J(HveVTkS;ohk-$?gMn)ZK0fG@NCw|5K@W+DWt7c>;B8vK~ zXh@w+*8wI-R$PeZpKt9&D0A{z;V)0f$#Y|6pf>`=(r@iCU|&adi>#6k-1^B<-39DT zfcF{lQev;x2OGPGzR1jaxaF6Rx55DTuX%y0^L$gY<)=Dez)*&^gNZbar4G3R@zPc?(nSe8q;jIK$jiNJW`P3RxSGLLEe7j!@-Pfkylul znwqujT=u&^k^697R7>n4j`#}?F~n5|OXp=F?Lo@@=rMpu$9fIz=th12WJh6(;f(2- z{J;?Ti;5+TN%F4aBm7t(Ig`-liNmM6T_k_G=xs<#^N@jig~T>i+K01MOkX$3zvQb- z+?w=SeyoBMJU{)z!~U=<1plzQ%dVxMzCF`tFeCNWEt}?gLFO!KZ0IFlr<8>$BcXU- zQ+u#ImGj*DpCYK#swE7W8_vNx{+iP{5|1qG`>EK9%`2OIV%Y z^wf+8hF4fg{y~*p7n5#xcFqOJ0ArS5I5Dh&LGx5+u>mi3fD9={nENTL&V1O5-1uT% zvUWoz5a4xhI@$_)=)u@4qO}4?!WRwt2wLf5rBXLTJ=H(E>caX4ZcYwSj_h9bXl;Ol zrD(|H@Yg6W{lwsz7o=13xxzFLMw{ooOIM@|=TT$XLxS*Shi6U78~SMcA!no4!10b* zUb>PsR8@adpbR}aKBr_ep2?JE?ahdHeiM}qSZQ}b8YlZ`ju!v}L? z&n=@^_bf|$ujHLHUivP`gE?L>bdH&TvX<+H1B*>GQPLr)n3@1-H?tS;>XO z>G<@$ot@#bykx&LQD{l-F(C=I{gh2(*+Ld@oGkR|b*H!{X`~x) za=d3zr(%n>xm?{?_XH4assPtLfYZddRQK3pcM0fPyo9EM5!obqR@HzRjzsdCX^9F0 zoV;BnduuPSbK(ZQN2=FB-wLV?Pa|x+!W|xzG`?N|_($qi_@2!YV3SDgAbC*1Sf7~liom-2J2k@o2 z#7L{(sRcj~M6`3}Ih$|V-)QV3y|R43a!R23n?sXac<8YdmLt2lsQK&E7VX>aOnZg`sf)==4M zZh}?l=B4qA197@M)>Hka0d?QM37Uf%t44uaE7jk1I}EWmW^rL8qdePzSJgS{JGua7 zGb-@u@+iG{;G7@Fz9DWU@U=&?j~#E*-h7dOYrWrZ*He3i1yhcG z?xfcVR-~;+)U_#~J0oQaX4UI%S5NZ~7o_umLw*dZ#1S)ZDR=0aKtW#O-&wg3a^4+c z*7wkm6zpR`F$0tw;bkbxfL7%JjS$$*;9X7%bo)MY16xl#YB-f1#~%Sa>O=BTD4pw6 zZ!$>-_d`&toHER4GbG(NqUunIaiMlC!A|++;Lb;0Q)Vc~zBj zm?~n9BWIF2>BT6vOtNp7t{g1F(UAE+Z}7Zyesy!gkxz;pNKBX^ls(B=o8DpjHKtw~ zA`fmC%S*o_2My6y(Nh+E!OjR1Fu&M$^}fp^4rwhcc-VGbsY|}Ds}@&0sV%AmcZ)58 z8%Y?qD3U@J;32%R=C_#oMq-}A34i$Y747@8z_KkBS9Fkj3Se)+k1rtsVbdG+EVdxX&?);=x@I5BGXNVk4O*4h5`^8 zq=TGW-Xvjb^9go`^jD3lsRZBbmVQWNwYwpL08;Rlcl{Ym4drmEwM87D`a<9Ar!r7; ztAOjj6MA?bwO>?w6{cp}ZpF>ukhdiOWY&6Gla!v$y$)*&12#^m6m=pOp(|m<;usjT zcz48{nF}4p0@xpPweYols2h8U~lbFv1j``Cc+lRP3W|cxzB74e@HGCNKEL z6r>>Fh_*^Onze+5H7#Sq8c#KCev$=a)A+{>Ph?ncF4+b|dWJUjKMg9Gy_>WhoEaxYRSP`-iWe$1~cV~n!GQ6Xu=^N`YjG}wUijbnL2afPoTIaMBm8wMrYE=s#feB8Y3GuWmLSS$^m3schvFf$bpsqLY1xq{ayfoviGOZi|}8CS6Wo>mF*a z=j7$LagU>csMUIE#o|``{z4DQDbIr4ySnZlGWI0sa!a^gC@W2*zW+)%bbm%pCmJWS zlU`!p@+{rn$cCM+>6wV0%*!roC^QN+ow4dDL0{-qliOkqs1JroSqQyOYe9>i{}7=k z#5i>>zkI34wvg9gSHVwCE)3DoImD>9#>Bc?j<5coqpH#dr)kHll**d3jPu5v2Xg5L zW|*N$@!M}eh|ME{CnDet?Neh9Sr|I%q(7PL+f{b-@DmeIWbk$e_YN4doN=@gB(9HF z-Syf>SBE9|-Bl9@WTEc8I6jDd^CT;ed;7A&h~Hw&C(Bk)Rl?tOifRD5yuI`#3bEK{ zTHEtKo79x`7-pOSm~c870iRO**J*QfL4WbuY(pUOPO%VllOCV<%OAUY9usqm?Vc3u zbcgq?6Mf_vs}1AUbpvV+FVMOuJxPEUVvEWC9(SKTuXLZR1@|$mcWnlioxUa5&5IcO zR>?}J%&^XBUA2u-Bg-$u9^V6<%k|;`@owStDbcLUANB|950w9s@PF1oP%e?X%J0`U zsNHrxY1S&sg90}?p!e!Xm};9Rx|6j+%Vkx|627<2dRp}M6ni>g%=pE|vWsO(SplhL zaW)p`A<+yIPONJ$E%9t#DY2vax@5a!o&~p~Y?2P+Y|jn!0|u-Ai@i6GYVutBg@Y4Y zMd;QlQW@$1h=2$vgFvua2WABYnN=obROS$pV6CN!LS+sCQp+R)i4aMcqf$X25Jct> zA`%iIB!PqwLZoZ}=Xvh?x$bNHUB8QUi8Ciy19~^g zTJ4ZW_s^=ho$}cI@$Hq&5Sa4<+ulQgR?wi{_be{S0>~iastITR z0*p^HzSXJ*B6mMim$B3l-R-u;ry`EP@}4{3+6(=2)pJ;br=HU*eWHKhA_j#%RM9Z& zgu~UR(SZT(2%xBg;%ctmv$$4V(A+xmW))c_CjRP8<=`fG$N3OqU znY^qu^;Ok$RUG6!klzvjJ+1pRs~R59X1+fR`G&ZuQJ=bHPhe)qR$Nuq*z5Z~TF)H> zjhC;p@D4xkfBNpFgVpTszQ)!U`tPQr?0cWR`bO)j1fb3_cD!(7SQNOPxFO%oPI@{9 zHL>E49_Otr%fJCgxK%D%*?m&oJcM~$hZp^zifHed)9oUwGaA~n-(3RJU&JTcgvPyC z#fh;IiGY8OlN+#5IwrL7De>n@MstA$Y)#X23O+QrRPK16Hd$?t^0rHUdkq_rx)Ink;^=zzpfmm0jkD#Li4)uNNkZ^%kBoO5oq3VV4| zNLK9Dg#3sbw8qL(JwB_3?rXn2iBKhbb??Zl48z_0IAXOBk|_YXD3Kkh@xSEL&Q@=k zvUC}1f`1`sC)84!#D3sMxoU?(Qo%nz$%51Z6nEcjW~~9eyfNB9Kjzc<_2EA41bOK& zkf$A41mIIqO?EoM&k^PWO>y?jV1W5p?D;rXV3L>1R~a0ue206}bnW=R^#O?VHc%2Pnv(bRH-11<@UH$ad@l-S^40Jkri zqJ49v8aZ3i6wS}Cj|-e=35WN0dLWIu4NN}h|C(n3aDs3zj=aUxCPDrQ`yI<2U^u{`z#A1D$oM15%F$<9*>7W#PJO$t|Tkg#xD*pyhY zGXcFxTgKFvS44R|LdBqg;(YCy?>5bgw{9C|&ZUkpz3XbvyeZrovf7ArL8b$3{1sV3 z;c}pC!IHfO^zO!p-#;)*#V=jjaFWVedUowH1GVkP1m8Vmzl|>vKvvf$5jLSPKDT>d zW$wtKVt_{Z!DTV~Xb>^SB0bx~dTre%4D8#!GFi!R3IR+u-kR%$Q|>5Dk=di<34`Zf z&-iEhjJ2)iFA#lupRul7QnptA1&Sr{gTY_q+z!$3#JEu-T8m8pnE1A7vge3I_i^7+5MOn@KhGzKDC z2YBd;62KaX0LyGljR?H9G~2!(lVYO>b7)^A7p_#S@P0{1Dmt0_liG$Zarq0{0v6%K>Xu0pv3c_KGJXW!rLP3de^QeEO$Vo z7vMiJ+goUJ)<(qbeQjPq?$xFZiZ*0ttmGZc1ScHxFJFk^l*NfoU4YThD;pi+mg(qH zu75Q85)&>XGT6c`z*}A^k^gym|0vA=Iwkx?dRUM#k>gtM)2XdfXYpa#BIlvX=}d<} zcN4L>-qz@myS10oYHNbe5+<+w&J0$80Zmm!2DQ_s0h;g~hQcckkM11ccn*?i8q;GP z;{Y@g|CGZ?Ic8r?LdNO6eh{m<)APbe>&_NHLo0Q}K2p@AH2BrJR|o5QEhxwRVR!GX zODfzx&7*`r;Lum+K5?1MZbMCz^R#O4=@66>BPAW zG0oes>j}~)k2lpgZI(nIJ953sh;aE7Nm{-bgD8?AZ_WF{|bk|om9zp+YRpjg`egjvG!N)~#0#m;UVY0gpR;SW=v3~l;wU#4 zXeAE!m^0Kx{=D7=%gI}z+d=06NMzQ{DS*c+ZkzlZj25^phr>F|gqJ!rM0xqg#ql3Y zGsA^~L*zpOJZVnj&r=E76W+Q5#0>e|_Nb)ye8%qK>OhIsZq3i;l~^u-IcqS@|>GW3_QV%vm3J zO;bS!(;C)xF11I$RqmHn)y61dWL-5-V2ZRWG@a;5pgG{|ci9Rg2>drQ4YkhD1>JqV zA>b$Bud6prS*qm+&;-vdD1uN6q}~VDSh?ZYuj@X$66U7wkjphnmuDxbt+7|cekUny zR|{Kc4h#=s8XTYl8`!HO zNOb0XiqAcDX4vGXEcbNc&P}dgH)#i^S3kVmkV>zw(%W`rM0{f?s?cSk3#jz6tE&QU z)`&t|+J!dHVb?n%z1~28UIK@TcXfyM_e3`iAAp5U-EpWGQD~AuaJSVrl6CIodJYP2 z*w=eJf#_&u+qtvX0Zo1(+OmBiu4A8PuSMl|30-qOJbE>^*iij)AJP@dx0MZx zYT?a%*SzU$;XYU@E|xvehI?ezR(obDmO{NZ)7%|gw6m=Rs5k$>u_^oR(mXjtXHMI0 z%(2HA^F2(>F0S+9GrZNxBZ1Rbpy{>Oh#f~(_1aL!ZU?qvPQ=87t4e0pU-Meb$N-Nk zD&M$_n{oxkPBBNt+V$F+0i@+;oApM=iq>a0HN!KZ3=I1I`6##NSe@8k9qx(jUM^&r zPrkUFKy=VyMR?E&XW;zuD0)CV2jcaz8!Ti?h^kxk+feWm&%e4&(4i;I0$D(cC!xRP z&`aMVQ|e`$xVh#V-PlE{DtFq1AJfIW=OK`sGl1EC7+|I@c*MleItETMlc(xG3Hud! z;Zy~JDoPyeSDMquU$zq9|Juj(LRW#D@ees>@}=8Xi^cTK(hC=lnw&2<<|T8fdWN6NKJ>;|$0-z7o zGS5C)3OIrVl1D`v9~9FvzS+$lSJW=}&wY(gjC4D`xKq4BerX~-vj5S_1C_p5#~*KW zy#DUa^@`uXa3v>|eqPKHUch-N|P8^Q!edNqo4zp~`gC*JCjQgBu5f<2d=P;;v-V=;YH{10rlk_I<{La7 zKnon3;=ilJ17M1)DOA>#BuNvi|4=WEen{9G>r#t7(ac~pTk$V^k$m~Hc`W;+UdTocDeBO>9q)(rw-z#L#R9`AvNs?kusFNAaFRf2GouV>yP>a$YmfSf=+>+XR}f_ z)zn59Qwo^bl8yl>6i>r7ruhCfkvg8eDNR4O;IWf#|6akHJ7|XhlIzzj@3`>#axIP7Ti#4`HJ_1en(+hp+#* z-d2oFfzO9kNBVRrAS|z&MDH38@R5K(4Sndg>}xkyqCN6WTs<2_#B%RnLcBa6?B5xS zv7fpKP!wiPq54(@n}0;MDsrfaYonyW$R|f$Rd12BiY-sXw6{WvPJ-I@Hc0kyrzJB_ zF7G|sDYS*JEc*j}S}okTPwNbv9Sgm*6edJ#gby^x*q;-k&VI6QKm0{o1%1LuXQ`*z zX2IJ;NLbg1>0s;wW%_xe*7}u6XCK8)RQ>$N)SzYS5D}lHkl? zA?uyg^6vB{;&vXzFlyn}0UbgUKuD!>x>M1gpkc|ebT+=S`~gg4n-Ogdb45(yH~_f_ z|2&J+b?X8lg> zkgX?`DBu75Fxu*biL0=`jNAmI)8w1-7DP-rz}_|?KApTlDWMg>pjG?N(0gIBcjogzl3RQYvR(R4dAo-Y#iJY%J_Lvh2_j%tl3Jz* zX;u6*f7`m~$MenPJp#MPDJ}^ta!CS8+N%9nlDW)BqRw02&Av*M+L*CdsS01upgfI6PuKcAfsT&2lJqP#^s6A9SeW#$wi- z_yBZ)e05quzTK(~<3IRb!+kfQw9-(C5iR)WBQ;xnrd}ncpB1#dn1*d_cblZo@oHm` zGNA0YWq0Md``80w{cj#$z9p8Z3yV#;_pLbJ<0jR4;(W>uP?bN;N%#c()5nQtFh8fj z9yq2Z;_Z#^%^c3oUx|8#{XXTPCIOiIP`2YtVwT4nP<2b8&Pu-HNH{^izFl zW&Rxjr0~`U#B?f)8j6-?X{ea&yyz@J%_|>+OhCO zklz|E&~@0W+klS(^vtKB?y%M619v-A+$xBdC4C94mwU6mN3&o#Q1>?^q}vbrpsV2M zj#~=@;e+58(eH9=YuVg%6%HpO=Q?7gPr(5LVt9J8c z3&d8Sl}0PEYxlk`&%>FUl8M3(f_}b9mMSX555VWsY#&CBH7%Lv^zgl^znD&#?Ke!R z>N!!h$=c&e+xO}E00fME1L)?X))^9#Af;353-BCq)DI&gpIAXBFbgs0m;EuBl5-^6 zUTG7ljGGjiq}{l_(KG};cklqv1_c!KcyUC{D-OhGT(Q&BMV9Efkm~*!jQcYje3kkS zkXP5{%?D;`E>9IXty!LHFDzMjQ4xDR;FkfXH)U_mHNJFc{N%p5Hhz^h z>Qy+IZs7?>S|8J!d)bB5!0IL9912Zm(#^P=niNf%?XNQ?9zDOfdqPeP%01=%d`rPB zTAKIMTfcxQlK@zhOWbmW7vU+lEfU>(8OAO|t?$i?n?G;goEp4&5p(&p(;(Ja!G;uN zh!Hf_g|zH^?wocEF~&@32P@#;c%1^r$*tW?xj?eOH>fD)8i!f>G85@@*FwWtlXov-rX4Yga z48Ah_I86&2znX`$-)`1gEU$JCKvP6}`>dG(qvB#9!)KXuL=jaQ_MI^8@{d_i+dbT1 z+&r*V9t}$%8UWQdH&P5v1=YuGyJW@&=u66)fmm`9QZOTcHOqFG4*)PA+B9X?k_=qSZT3W4er%YWcTA^qxK-fbk%A(N(Hu<5)6Xmub3 zq(bhaRFfbIUONTdkj4k&yiG*Fcf7gpM=h_$TLu!*oEIfL4`^Y=D{H5;3HMSH#jt+B zSXiz!NKXfYA=lyi_k+OMQY7frt+0SWg$gemyW@D_GvJ^!?eILLIX+hDHp%dNE{@L+ z+`!tpJO0e>>b(jUp7bBi+WF5Ta^9WHop1T(-em|B$h-gWL;sip-&Cqoy#$c0;nL50 z1GTcx;DGYy@OEu)tb_gN6SXtLIuG9oAYgH!v0)wr+XM-U8#S?b2`r~0k-t1{j<|(s zhc#sdBv1m2>@t1Fw!r0UiwO9*NqUv{GZGg_(ViekWhOeSw6|N$aUu=dvCMY~!T2~E zAz_LcOYDog9*Da0yMxHH)y_%Hy*qzJh_W@wn-P6|_B*1J$i_rz*;Yr9C}sbK$}ncW z2CBX7bm>tF0wA_w!oY$aYk#=cnD{TWGkCB6jJ*6)6hWZ>Oql%ZZh%1l|4*3wUpO{( zJRIoM_eoh{8~$aHA7{@1MWnR4N)yS$zY&zAPAO(Ly%<@!ANaQcuW4DWY(0=<8p>4y zy#Rm+#0GrQ-^inJtiGS4GZfL%c=-Ao>|dj5(5qBI$VI|gipyULSHC?BUim)<@h@-X zKL_!Dq1^v|4b(R(Z$h`2AKZe1?BRcXYUj?=yG{pfccEstj4b4*TqO9^B`2I8^LUsE zH#3ZQ*ZX5H%ZC-~ZsGL-)b zQ&8MAGJvqj&yb>ON*$Ol#FcG()m;9Ux~1Y5z6YuO@m9ZGgJ!1{k$72Y?Sa1Mw2R_z ze|{o;T2S-1M|<&SoQcqrql<+bUex^0w`%|6GNa#U1tmHwtKgG)G;0BiPyRjt~G2L+WqDKG!VNm%V#3-$LfTO-Fr7*`}5%x-zuNy zMWq+|C?`C+^fz8-fTHX9|Nj4E-n{lHgEGvaI4c%@PU-IlGOap1gz~sD7s0%=0rTH2 z-ZC35B9yO=KQ347|9{!J=bm`~nDDo>=x{V{didnCphp}2l5tn;pvOorp5;)t*q|_xT>evn|BuiY|C{aPZ@YJHzjEZ_bbISWV}w^+pE2RbAK&R^C)^sX_9g%} z>4jfpSWX@3C%kE@{9$*IC4B8>-00?XR2Wh6gdvol3!d$P9_CiGRq>`jW?y+8LqGU2GKzE)_*Mpd^CyM93Js=S*W2|^WMD()i7J4caWNH- z>uJM1i&8NNt9<5dc;{i{6`r=oCa?e(tn!DVxO&?AfyU(7ZyD+~-FF3Mz(q;+p~tVa zlWrb3z<(@KxtgV{oqR1pdPnG=bV6B8J2F$pz9ZHIv@h@X_2dg8N1K5~FFI4%kx6xt zVKyl%H~DL`Sy}8vnV(k%($`O7v>y@)i|FARH9fIFpNgNutRy~FQZWdvRR*JMY|LVma z^RHg5nxT~<6!OrTdHcqmG`5H9aQ46NvHI>{R_)XVeu0qEMldZ-cs=8B*4ayz#~$c~ z9_79c$%VBBUHD!1cV+_{bWJ>At?C>E-gs5T{HtS+fn|u1pJ{gtDH9D^vIqL5SDSY;Ot=IaPE$}cWv?ezRwFUY=!$_#-G!$ZT6ty^}^>0Z|E13ml1Tn2HD%N0R{?)~x za~rQ}@-;5z7-k1kZ%fve^L#<$N4r?x!QWz*B)4}AMp2gcJp7pPCvw{CrA*k@N;MibTJLpC7=-X3h!G>2iywx_s zMz;gkw*#`|FU;4ZnP*XB&=;P+e(8NV-vuzqzy4wJjg-#V{Q2`Rf0Y$)6Od8;!B`8h>%y=r2+{Ohj%CkM|Lok>@1 zL@>CZpzB~DL>$+Uz`K9xXW3mfyw3U6mQ^7}RS`dqT8Nrf3n8KHbF;u??LhuZ9Q=c1 zI*=-$Gqs+9L-j-degMa}o@oV4ZXx@7!ID`MSJvKNmZj}0qVRgj<2m|n7)ey2HbS!e z+GN%zu{ULAygrDXnop-~zUEB2neoJXcD#Pp5aH_!XQ+kjJC#3sw_VL5OY>w~Y~SkM zzEu3K(7Pos0^ULAmS#HHsjHvMvM^KIj;S)t&4j_DDU0>}Y;ixi^XY(|H)fYUgBUq6 z01VrJZZUU?83xuJECyPqmNOXV?bk1f!(<(okX$onR96g~k4p50uj0^A>&@E9AMY~s z?L`ja)Fdik9qL}W-uSPZQ!M@AUO!4M?f89jDvWiAOL#_7;0guV+Xf-oOIW20o#{JX z{1tV!J81ef5Qy!s{5`{Jvcn+degSsScEN!7HjHYfN2yZ%)3Sm8!#>?>NRraio^ zdEt4@q_>IrV9K1FBNz)Lo<#dY=JMhU+UYEk(&Hfev^~eljC-eHVw8F*EP(%STWk>xHX3+by@L%fA_%7mv8=Vl?**qF zHIett%A^ZkM4#q_Sx$$Tvns;0uTJjR{cW#BlUZ3*@PKb$P?p{36kNVE$dXr^u~CWCJ4sNAXJ16BxYhnvskGZ9T(&|cM{(L%(|ORYTkl!-BeA{CdEPh6 zh#Mo{f(IhgTbQNLA}5pfmnC(o+O|!xZvL*7#q40@lLj|jMC-O!A~+jxbVckKM5}Hy zw_{mWsuUFZFX6KE#}lphM0PL)+O>Jdl5T*ZJ?|O6KG2_}&rSw0a?&X^YaKHig~#P< zm{u>$XPfr4;u?7X!s+PR*m1Q*M4RXpGwX^DVHYm4MVGR_>R-ZUlyXz2cVHQ_cz7T# zq-sSfq!D9Tk-QUras4OQ%z~--4=%nZ*TT}F+m1mvizKou>{{ENcJ0uX+;g$V{8YP~ zo*sNV28ky1>~>bwOl@lav}6MG48z*L^a)t!Z7&)l&Xn}OFRR*?A%etx=qFeLJg!vd ziHAI=UR^h67rK#_L6es;EeTUC5p$*NJT3yWnvJcNCnTtC>PL&jdyP}tf8yRz1+__d zePg!QZWq-Vftc!Sv}~n{&5xqfk07~l$*c}`APlKNXaG&g(5bNuL+mmuP@d9>Gd`vg z`tt3Cr2$eF~4VJ$}(DKt~Cs}aZNt}egkJfn7zTd<3q6^I9)Qnf>)>&~m<8Ij^!=q6;#GRe)8bkT z$xJFO77?7@TkywT+O7p?|IYMjK`OI5tc}x_ol}XnGA)fF z@>A4C9ShG4n3Ew(J&XQHV19pR&E}7(eo)fngph7#o7!bomq$i$uf|F0^@}#Dp>IyF zzNbcQO&;RY!-?GW;SR><`W!ZqJX7X&oGV)_8|mi!YJ`gJNqqOOU~5B$=4ATIxHdzZ zR=%ILQ(^$Z(|cO;d+&}?cTmp&yUvy$ulf^7_`J>4@fFMX$i~k4cYrFoH2c{pvn-A@Kz_3)B5L5BQS92%%tGpj3#Q4}^*OIEP}Z1iOLQv$ofoNMU`(_BPXk>8wWcx6LTqd5TxZDs>eS z5Wi}F9568?@_ipAD-PmXAfM+Yje|myd_Q`gjQ@NgZaRWC)Nu}&I*j5jK$_@9!74|D-+uxD~=xz2BdHW+m&yq#8jvLVskGt zK~JkTiQjKY5Hde@et9i4PxOowg#6$>WE_$sfz@Em3UWGfCla;EYLPnTldG&fDPt|` zF$9o%>+?v$@QZ0fUa0<6%z@(O2s=@a8{&PjzzZ?f5!#Vy0vBa3%Q_9@wOnt(B1N}7y&0UXD`rWR$?l=gB(Nce>lO#z(xWGmYtTC5 zUO-y7a!BrckPLlNE!k$Qz?$F zi9&o*>Qax!9d^zap<8PE^CRXIp2uoqPVqGp{gE2GXm?)AnPY%&k#x?@GE#= zvB2m)h2+_oqa0?@+vCeCj5KEzq!MaCQ&(IM6o$Z;URSy59e06`eI7`jU?@l0|0$lC zS~kBzoA$i|SRXOz}*eYVCu zgDme;JrO8-{geSMz#c5Hn@SZjl~IAz3iG`vV*35N$>7zfN@6Qio*HgPAUxKDg3L>wB_Z4q6 z^}t~4z&+oTa#P9OMPv!ni^3g&3As_3nvjJBVh(15)wwfQP2w|f4xtTY=iOk$R(`i< zl_zK*)dO>sPzuoxJk!i`VAKP7o-$ZqJQ1&XwQ1UL8@9rC!+@VR)ilpGA>fDag3b# z;TG;%=xlL0V^$sUl=`~xhO6*f6Y4JmiGI5w(|g(jKC6ed^7{{Ldj**CTU;mJveA0r z8KkM05C{{DxOD_(VpB&M0;g97$XubpF>T;DyMo0MoI?ayV0goM-xg~xRW(;D2Pz`mQ=QWt{ zFv2ZfLa0vkggjh+Sdr-h@{D17Dcqz9aPI7uF%MFI$3pH6k4!c?_l`~OhTGX$5eJ)sFPQ`1Rl6a6}t zS&G*@LvEN?k4i84y(SfE5P3zZDL-|<1k;u{c=qFd6?Vpyb?LpWxO+Cr4tf<5RIqY# zb2}>9;ZWbWv78at5;n|1MEUw};1ra{vHz z9MlgrSP!HCPl}tZ{L+aBqb!Kj3hnt5yan{QZd^}FEIWbdZ8vB@ftxwm0p8dcn0qc> zXc!$9PN_39906JnRYK0~1L9Mg?%;uUW>MYXfub+r9ui~ok;btA%F)0lA%?;z3#6z; zY#Zm^Myk}Eu(-O4R(QWv)PnBBib3B}Lh<30>{R%K=Q!Hn`a9lqKhzGvp%D>tqy2qx zd2-*L#IJf&6p7w`?;mK~FVoVa0=Tb#Q>+4;tm8uP?FQpd802~MO{W*lpSXvzN~{Eh z_~X9N%z#yU$+!H`teCcoVjUWII-V9wq)Lxj>HPBB<1# zD1id5;TX^r*UmPJIfNwi-Ys%?Xh_{i)|-d#_|S2lS|g9vYusp{e*FULzUHyZp(TDU zK|n;xYVW;Gc$FO+qk76n=yLMru|Qwzf0!bsfk4`vjE?9LxB4|&_1yJ;)l~Q%?>35* zuX3{R_89=54KZew16}xfJP;TJi{eZTmdv|T7ohP}$vZEV>pm$c#Md*l@RpYci{h-*ByPr)+iYY6AGW^k)NDfO3a4Osjf$*A zO;+DnbDsVXr5!3*|XJ|(=MFO^L6b}$<+vVZ_)4QLpScKS;39=r1g<-w=qA2eW!6H?7gJpgPn#m=G!T`e+@Cv0*kKsvhyl^EsZC>AVX-|ous5d zifqqYTYHp34YR%}y#I%)?c*j1sYC)*ujNVkW%0UY8_u{p)aDM`6i3hIN}8zfmVgRS z@$4~saWnP`+NLjW4$86tUu~CX1d0;*LM(*uOnwSVb*%f|nqkW?ZtwpPcsqix97Y?K z(4U`SUx~+wgiku%UWR<64?gjr+{?0G{gz+nq=wIumZ(n++0HJCOH(t`$;ktCB+H|) zT7&dkU>-e|-usH2GB0DCkmFk?#DmqsAPx=34dzp*`}$s=sR}ryl)UzrT$uMZmNCff z$i$Zu8W13i39$S6>7mZiP*vx`g8e(#8ROQa2<+lN+>{QzeH5$vlV5dRu`U69UK>*0 zzQG~s{AxKb=E>N6ej0A$QLH6fWt8>a&U`gt%-?eDo>^Lz$}PLL4+(t-CcYT5M|Rut zKE(xm=$Q6YPgBzYPqwW~wo}L@m)kz)hw0l@>ggLps4UuhctExWL#ABX5<8YsQ8;9b zpo@p>lOwV@W5?#9!!QyWEqJ(kB%$%%p@?S5!@v^&;kXN%S?Qc(_(tXRPovwB2C)_R zeKBpzFA)Sk(>jZw1P|3v$514>#S7AR*AdY2Y)Gc9o-UQ+=b3G7)K?^K#oF}kKGTv# zZp%l;8^*g0WgC8+dk%S(tT=GO1tJwKG&oW$ez<*-f;(u$cZ2WAt07094W}fxm`|2# z9O*-f^>-Vux5Rxu=W3N5l1diaH@8e7>)bz5pHZROH@6?36UBaNDF%gliaO|gJs5(= zy^I+u&UuvzKz=mRvJ+V9n!MAF#opwb?UKsxX9K8?Wq#$BXJ&xu7ygHo)$)Non`QLpeT}Cq-XBNsMl;7%Jar7y7hOAk#0$I zy$#}mdK(+NbAx@ol3FRD+g?4feqm$Dpr=%PjkIsor}RB~Ch6NdCoJcI2e|I25j)v6 zJN@*@BMfszf$O>vkw%TBXhk(AJV7Q3sJ9%InpTVXKWeP{`MrOTUD>-LhG_*}5Nz#ehUhe=Nh?mqSiD0CoJu!7pI{Oq5?H77%xHfI3k%-(m!I!_`a-4=E7+b2J=5zYGU9rBcQp? zqr2b;NG*_f(`NXO@|e^0n(eR7CSqhOOfL(vq?70elL`D>LRuePze&UV?sD6GVP-?q zQxq1%FE!DB*cWXzd#W4mKGgo{p`oj|O>?jbA@}gIoP1^nU9HXc;xSXO4a!CXdq+EM z&JvPM=fh;4hRUQ7)i;2iwW@e5mrfCH*$eH#azUQ28{x^utsW~dQH`uwS{!UXMQ zE&}{^*KSC8 z?0fhWt8R8aVf!xMyvc9qAvVJ=qb?#T?%GGs&K$}jU!eexX=z>U6xzUvr9ZrFP!#DY zJd`rgQJ{75l~o}*-wB=>%s4_xmGvQ{Wxpk%_-}Azlr?s(6>*Ex5k~Gcw_rc`$V)|f z0OOrVFllgN532-7lvAQ^G}e4v-TrFsVKYvTjI>^RLue<$N+sSXhq#8BM!ZYyi2?@X z%QSUE{kocd8(nJ7E+$#hzS#rJ{Q-=r(3JPP6b-#Uzk6d6SkJz-u%(; z8bG9*bRu0<$J-n#WXITZfr^YL7dw}3-vQX+GQfLx(~g#P2igzXO3$`V@;Gs_)lo(| zF}b|GA*MLF?N$d=6cjaYadzAtG|=75wkfb%r3X>c@m||HWcg)L5G%6aUnQlHJsB*3 zLy+Dm=Ov_R!Tu5{xbB2XK_4D88qJOtRdDwXU5F4}1N zwoc^v1NUc>I+#H`B*-IuYCw{YvW@+L@_u`~Q1N0713g6A zj9H9k8}iLbQroFm(m3IJ-vkAxQ( zWoFEfE*9Wy(#=Z&0!E{rhWs&u9vYV@m*si+5INsuI)svLd9`l*;q4>59cJzA ziGBohQXbc}n$01vErM*~Kfk*b_l;SU*g46UoU)xD&Hk40vut-bO%b9C?G=vvz+tIa z+!MqbPjwA_Fd5X4gEhgzIF1??J&Av^H3qJ+G1l^Wq%|JTamb%$m#J1ulA79mzw7Lq%`qs^5m|i5*Q~UOa_nqb#QFE z$a28;3JT}g;>GEASP0LW*N+Pf#1x~L??_iLy`y=b&dCoMLLw2+@t47gj`IYlFTQ6k zJVD*`;3 zsBg9jVqC+<@(RYH-f;B)ENYx3Qk~>?yt) zS|6#5T8U}+yy12*BC>hs9s4o=Bx;Tv?dCtD)OCc?)~X*bNyl*1wtC0j>B)YLNIOQTPd3 z6jqAk_K+dTg19lqe4OWGKfk!;%~EH7t37`yrw%Pi=A#~3v6;>SMZn&-bH7nmKb~WEy6(boXAYQIpH*VA;^tuA)GMt$_ z@O26E-N>idrBBo(8f@}zX7g!>i6{B=wAYK0flS`wKhU}b{)yhLXO4PF*?T;qTjncw z=tLH3%>e1dhLH4>M8?KW!miQIAXEB=C7*dX9P`iVqqssJFCzz~^4tWc z*i)ef)hkXz0Chl2)bwhm8eUj&$ldTKXG1w%1p<*x71;BIjr6oWOhaz&EKhQ?qAF3cX_L7$*wI*)|CzWxRub@(A;@(s0^uw0E3=p4G(3X5*Ex!(R0`zjJJ{40 zvsFhh`l|ZBjnL%}0YEb^;YP4(yo9FS%R_@`A*H&x6VNBhBU2*O`IIdcSPAODs=0vuvn zxrE{s$k#BLfK4)8oqC(+_$`q2?a@)Cf+1=DW*w`^MVqDJ23i8Ghe5H2mWw!KwSnTS z)cF;xd2DP(o5^>+_`yo~FiIsD`2Pc|SyS0)c*VBelOAKV8RpOMy1wn{@l0ip2)^+j7 zt7EDeK58aq5~F_dFo!I0sQ973-1l2!W&KfjeiAc7vvA!0YCS481>@{)v$w&9IX8>puw2C8ME1&t+o2C9Q}c6o{Zjq~ z1zoLI;a7c7d661Nwj1dl&eo_ttgMxv)0TU0ckBH;qriY5LkuWe7>+qyJVtT;XF1}# ze6uoxLPdDSz_wBkQhdxTD+b@&DP7p6gEVzdg-ve{Y+hgESyL{7FeT-O^!0kA$P$^P z)~omq!XDym@D|K88K?v6nO~)ccZ*v3W^KL&y}z@q(G#G*xXB2T4N;dL6_jx z$5UefhCehZ{za-#+%#RDi}J={EppVoqyX*p!@*{gw}syLTZ_M~DfYV-cteyit*qR_ zVbJy!sd@(QXDC@KPg0cBEo&sz#u-h8q?=`{j*!BvN$yv;`HuUOcvj*snQ41+@VOIS_;u6qjPp(8;#D&bV5*Gu0PmD4NP-3 z+|Flxe0`5C8@L5UDtMeu>5iXE0O+`q`2rpLsWt{R zY)`bl?%b5mEg^8^nnVQ%`{6d8*7>4+(PVIGrSS&DieZ+;c^!YTRURfH8r)7Q2J+*j ztY6%;t!HKX!~TksGP9z>wtW{l+mLpl}E~uL__g1|oDX?s>p_%dv)f)b8!HRvo*Oi7qYh$IIrOjJ zx?eon^SWei!AMauL?;F^%D#+^9ch)_Ej=rwS?Z{ZzKRnRrn)pgp5eZ)`?{}7X-&9zux0~e39ca_{*0&lTh_?XZrPQyKp*tt|;jn2fW8`qG1{!M-)Uo`#IO*K;yfnUdfoy zr^Lb14|Ppbl<0}vPcb!)gOUPP{1ceBxFPWRC|An(uzl=+N&dqpwKn3Y>C%H#HBSzs z%M6WwrAu4qiu#J;hmGxL9>*JpJ9T9-c66_3Be+QypeAhe%&{4pH@T*K?5U|23&wA_k$uYJ$==f=-!(w=prWYRF%w^?+PVp`ohla;7BbD6tCjbY zOxx}f*trN4m4zc1)DcZ%jz(btK*}5Hb=WniDY|=**Z`-n!DpBKG0>e6Xj$0M_`T0=v&$a6YnTiDWV^ml=G@UIpn|JE}0Gw3Q zhOYu3aaf7vitcZw`wqW-Fgp|THdoL3D3*0xuF}DiUy53|q3==l-!L3s&A~W(HfCz> zb-RP$O*(ekVW>s=%C5&f+OhVP;)%`>w*u5oj|U__^N(CTHy0G5A1>$ej0;J_vG<#< zDE+X`t(AGdybUqOOfXsusk`L>7^G>U}_ z<&tBqw=HoQET!h&t(l#b5wk1WcvYveT?&lndp#gsO$#2SN=DeZZxC?i_rHYG9~i(- zysf6qH+Sd0MG}*er5)EFiGt8yzdU5GqU<3KX0*pKt)YY@AvTYU@O_Qbk-XhNOQMG& zRuA2Z+I4Hzj`95hbd%c-T$j5Fe&*GSoZt(=$0pBT2cozS4{!P==E$Y($6%25`l`{K zu@!OMu4B*bQY?orcXrSM<%#Zdoe@5@KW93SUP3lnSq?00furk9mj!EU_-^%xyPauP zIGGRrnQBTkxPit|UFk|jex5jbemeB>Kjd=@D~E;xHtn_abb#M>BrK5tG}$py;Tjbf zykxJ1f`2E5Mtz%mJH`qBBdb*2GPM9hM8O(`;XYO0SzL}fhI}p)K2U0HkGh=i1u>IQ zF5CY`L9L!VAIfdFXf(M2@vF7U5gj8usE8b8d?^cy@v#msZmHE98RA`QT+PE&ufsK4 za#2Eu6Dq(kfmyoLMsQ0V(C9|idO{o(L)Sq>CEsZ)AeeElGG?o7t+-OjnMem-8B78Y z!kz3=&MtIjlPdnvaYE)tB4B}6*> z?0Bi#cNei5fx71hw^l55W=whKB9EWMR6QSdMZ^kUsHnXW=93O?`h`NqD#CP(3|pMV z{2_|DKGiY{RWXUfk+-50Ute*&W;0IBtBkbnO6H%D7bS^r{QK-dtZ0J^PSgagkHPEb zwF{-abwX;Z=-!uwrjY0#XBF)EnXA0_nc7ilD$F39_++zODpt5zUA)GczMpncAJ-zM z_oVO9GN6aQlAXZ57^SsHjQesZo z#JW9o7d&zV?6oN?D35Y$-G%1z5%H=9!qUTndn_b>kMr$v-@9Hr&%Ly~8A)46GDD{3 z(I$XZ;c5c53&WWlsOlPuR}@zv@Z3u;1eblB)`SC0yw?{Jke)Q$1jdB+99-v34zu~G z*1`|K(Q6!YMg8}>iPSx}Aw>_Psj>r{058&SGyAFLAYBP4X6q-8Ul&}0)t(ZjiOH3s zOv-H*oR8fVxfzk5B4msG5Q{I$Ykf-0a*Ct?5ttmOP_er7j6=`81&9JsoRnLo&?RiP z2b`{k#!5e5a$XL>!nh4P-u56Kdt6oWJX$-S(GDG&ZG4%tRxSuO?sjd-6X7v~RczWD zdTDnh8JaCWT{AX09+d^SC}>5gN>1ra$DuKRw_HNp>QL2N*Xy^B83D*w_!Vs=7`ICI zUOI_LGvSH+rA~Mo|6_tbZ7U*tS&Ds@ftgE3%ku&T#D$#;eRy_4Uh?zsU>m=Z=5>FN zI(43GpH@rMP}=knciaY-CYq&b=7$>7q)@vWa%j79KTU+fBrDuCNBI+Ij57PXZOo%ihRTP|@Habc%1MJf%kaD{&v>ajnWN2(M{M?@ zy*521dDyaxW7S)lwf3MWDEQIOysuoZzDV%5`kcR_kykZT;eBuN+Kj*dA2xw51>eu3 zdxnyRe(W~ys6}XBVfD;0JTcCyF?Ls|8K5?swz~T|IcS*0J$-Yp@@PE$b@1E4S<@$L zuVun2Z12h*%#v|S_B!a$)Q?K{;Bmb$SD5Zsokx3DA}=`3OP{vzhj%=_(h@JIsXJN6 zx}r=~F{W~1$$lU-tLzNHl&A(h^@m$)ut#5_Ry09%L*NoyKI81OV)%NO6LWxxVvg9$ zWJ_3^5DTvg03c7d%JHLHbKNie1Q|L^2I(v39YAKQLD(06lqu)eXf&_t1j{C%*uUt(ND!u6lp; z?-+b-0r_ebNZ%9Ugru@{Y0WYIm?Rn5A}b12cv7=K!LV~)HX%x5GIcjvfqFmV+z~eZ z?Qp4;!#d~$RT-#O)^EBIc%pN*dNJA2bFYIJFNSK4R8n>8lVCTFHW<0V~#@Fe|=}ErZsR?kWv|SW%)>Uta*|`Yd~0h zNHU1IdXMm)aOm6wLZ~n2Drt$;@|QV<>{Kl`yO2gm%X&v2YZMfsp0GYtP)R$5*b^=9 zSk{@5wtVE``jkUuf%RL$-Zv}em*3S8cb8mS(H3%itn00N?vd-(S{4G8_?k%UIz1Ip zyFT&qKym}OVv8QUs%VQ1vq;!gSMig3a0pJuh}oR{)d|&wI(<|m+x4h^m>SE_Q zSd&ykr+Sc-m6^I$`cFRO$yLiRgyeWq?|OEOEK2^3e{EBX@_x9QwJh>sVl6Hs}55PwRYzcVKJzTxZi&H^2)_c zk=QN!V#_pnMkwB1&24tr_twyhS1Ru&*StWb_{4?OZ{3h0wPUWI(opaBiR3Yv1%5eZ zvgiiZ3EqvjYN1-84i`4CeuGBlt&RV|-i#FP`di+b1Tc>Q?$SL`ok!ZBGh>L-aKD5( z1M#<6dkE2tmV1O3B{Y_W1~??))vEXk4QGF#&qZ>E@XTUE&x+QAA~0y=_L|7eG{7GtE!o zW~EgFTrovPjkl*;-Hfndtm-aiqMx_=?b=(Kx2eLWFE)BsVaD(ntCVrcNNKEs&2{ zSNQT~IAim+Y?mw-c)vo;)WdLmFt2L)5TgElsBOpx_scgZc4Q6pslESa~0*y0hy}_gf{op z#R8sA(SQ|MJu=!EKHMC~q;2uBQr-|9{nutK{{H%=lrZuQ$Y63YKDqDE=P^4+k6xHP zDAqIA+R&A0OP=}%amyDz&BSBD02( zG5a$XA_68?+~sXLIWS8YShcfCe1+__WUuA3uV_?IAq}MmIUP%AWp?LOQITT0=UI<; zrh!43b%$O1Gy4iJvJg;Ve4r)sE#Pm&%*-?+b6OR%#M~hFFi_2|feg0Roklge>*^N( z?p~ABDZ$3$Udg7gninN_J87Vx`S|t5TRcQ_4XdmnGLbZ1`bW7sIzR5H%+OSR*8TNL zZxbm8eLHgVfD2>rS@KYNvP4=nxxg|g54IIe=n(jI#npjdn@L}mZE9duA~y$SY?`#2 zRtIAPCDR7-sZhjxGKf|L2Sd~cuz``oKVx`4E7~|@A3=909VC&V(%GY{kgZ2iWdkkl zwSx$n5J)#mJ*kx+FA`qhmxtgpVM;lGp3oTaB-#d8&a zonuOKbrQ3|P&C}ynO(dEX5mmz%ZL%NBz(zPSgAF;9FkN4m|Z6D8py)aG=XPyE9rQ? zf3$coIjmW|ZDm`!ojm_$daqPNIjn1@213L*H*%u9@taR86-VQnjQNlh>eL%En-1%y zM>Ypgm}0%1@O1|^4Q!yqwCMTmb(Zwk9cUq&P>!D#PwE@`Xijjw-+f@9@Hk9Ou0p7b z-|6wHAeFym?q9Lf_JEI$r9V91jP4nYPkOz+a?2Hv0Lg!@$xdCCt_L5;{TaPHYfz;j zAhqs`hJQ!Q)nnzi3+{wbetElFUf^DRgkuyKlCa4MoieK7qX^E2ls3LBE5lCp-wvD$ zXLycCj#KLV0<6`a`v3x=R2KE++{(bF;5ZJNKXSuH*rUyGv6nrL))qt5*Q+;FZ24>> z62~-o-a5dorVF!waZ=0sJOb!fatJ0d0g*nlVjfrjM1L^>jm0EUYJ6`I_-#+9+0L~s z5=IaIj@=>JiOjW4-{!aNBml+=Ll>GX5YAbf%U?2T;&>0A)Qdo#l;RVN+X3h*OW%m? zbm|eA&GQKBdgDtz&R~BM#JIomPG2bMj~QOpY3!gZ?}6XS6)rrc^iaZk7e*cYUzB`{ z%=Fu1P8=>~OOzbh$bl;3P{8`J%;Mjp*pZHF(qT_pOVrGcw(i=ct%u+5_~Q7A8#V{{ z!KZnIQ@w!qVuvTFQI3MZl0zp>eto>Yq87oo7{bSIt4KLG`8Ayzv3Li7)DofoiTU z$G6lyAi;gfUg8-*kqphdjWz2VXx6ULR@OxxX&KJ)Gc zok5lkVh$;U-|NxD^yfaw5q0oHqw=P@;oa#(BVrGNT3h232|pPjQ8;7VgtA)_g-@p9 z!jlgL{ux=bJ4Dsd?$8&tvUs~pcm}gjpY@%trmv!8Jh5c?$Yibhh(cC#xWswMoC_!; zdOtU9*54;ND;=%U-ZR{sB*naGyN%<4g+y|P=r?}UC6T*d_QzB4xr_e1R0r$h5Y^n{ zK=0(@0oVD1o8E`+80ui}5$L6{7=SQ03h(hOSY@$!BwH%>{gFWM)V@D1o@y2pgm2gX z6*NF5RNI>&N3wr8cXAUWG5>Yb`DfW{$@>$i`MXnH+y$5P-kk;b6C%paqc*CrYEW=5 z3zgrlZ}UtyDh4uI_I%naWWctkb*Z1#4W%-CXb|TI2$5?}GdiKqiki^}hy7NU``#h^ zqLYDj9 z!)fm<)$$&4{XZ!9q2(j%?A;eSgswXvY+szVCYSBJ=rCLA;Y{--L~SZJHyT5`6IlNI zJ2bwcTbaPplL1(%O6o_uVgWK(*k>WLOwobX6>k7>mxn1QU#+$YjB~D^Jceo+kP0U} zke|b##&M2K#y`{P$57C?4=65wPQJJ*+?%I9pH1S^CDsJ1w!l}-taR=^z%fgc%|!kkr%t& zQMIW$4$l|6?h+L-fo~W+uOu37j$0S#zbvKsUA4A6>DuueL0%0Wcsf=SRLXB#5yz&H zg`VUMNX0SPod(j_L=~}QZXvllx7-{t+8GqHG<#};Xu>QZ@&aR!AoA@Cz(zLLz^40H zN9F&F2F2f5vft}QRz*YPWfJSsB)#58=SkVZ@YMFkuQEPLXw4z)Z&tKbR^{w$&y3>4 z>FfGH?9YyC7>YB4F>1Qt&(TV=TkbH(vVM8@M}8rI6PvYk#zs=6?i*aXzDjgp z0ItvLo0`rx)6y4AYz4)!_MGf0NxV*`N&57Vmv)DX)9YX_c_JgnxwmPDqpaLf5I8z0(Px}KUjhpWwOBcY7yU&TSyX`J0f0>iMbE5HuZw(xTQ)w}da`=#G ztV^MBMJFWu_WGZMyPRE*tEM7M`00-HDd{X;DVtz5l$5m<{^D2?a~x23?dYp=*vxj` zFR?%w;}<9Lxtyxy!d=QWon=c;#}fZ(`)3tI=Va^CVnh>{aH+2KHfv+UrihwsSYuBK z4K-j@Yatz@ij%wqcL)25CmA5y&mrtCwPaegZj&Z6jOBx4bxbp?M2R`eAF@QYyAp(T zJX7Nyz;a0&rxu&x$t~7qg6vVHgf9aM*tP!J+Wl)-!S3 z=Ls}*cg~?=Gh-O^JP!bmH=7t1C^BQR7ezEgEL8!+;6{W|*Ju{YnQ&dAhty@1vQ?uS zif8i&mP8=UV8eyt*(Wuu#E=OQ;A`*a1b7yLC#tq8^buSKA$^X5F_q<@F#d-a%xoK< z#zC7<8}9_GVxYl_NSGBxul%*xWLhas{KkMSY36MEP;|bh!U0s#VBt;3fap(t*!_kv z72qVZccnG7$7U&qg{`xuqEVqIr0Yw4lK)v)rqCT??*X{Jxv?wTjNPm{HFe)>QQzwa zQofi58@Tf4XzOl$SwVt9)NJSL6;HSs$nKA+>*MibbPkysv} z!9CQvh`)s2)L8lUh^u(H@EX0Jylw8D$!yUfQUnD(L}c#%Xi-?~fgRVE zft~xQX^4xnAPc>xUo0#$EG&Hqb$cf*qMe<%L(wQBjA=Q{V-zj^l!4RGfTT&TLs)cS zy9u0Wn{6xAQP-Kq2WyQYXsXs(a!u1iUzq|PDwqra)DD;OQx>;>>b8646kig51O{ml}D7l72(d&}Q=_H-#+$PP)RUNb=o4i+&a9lp`6_ z<2scv)&I7~UE&;&h_i8yYotXY*QHbf^f658#Q8i&VOcnKk8`cQBs=mjiFE*M-Q%U- z^5-XsffOM)E^8x=C!?%e6yj!ZR{Q^Zl6PIay9(_omf)-L=fzurhRz4frFLD4uo$yG zrBQ;B`e9s`k97Aqffq< zC@8BLQdBoR8KAy48$;?=g*ec{_$4PdG8Vhko+WpxTwm9DG{=7(tV#X5wXYQ!YT>h| zJwTf}{zq{^(h%r9X%@4Wk=u^~j;ufYi|CtjMPCahE}$a^aL))v2}5zyj5U$95Is$S zq^If;pTa!%>%Hj*7YkwnW}9ZI*(mpogt1BoTAln&yNX0nl-P-uq#cCDyX;7TU)#d?H)oM+tUg}F(t z_6g55bAwgtkBqPC^lEsYwpMTH-|NUQ7IYYs4@dShTY0MuK$(_l8g~?|7x z{kzva+&%_?qUE8+0rZ8Q;^8K=dzP$4odw`C-WfptYmpCvHr7BO5#i+)CZm|+NT7_X zq2G=TBK)2X1;U#Co>|%DcN8y8BCyu@sR#hM=;8E^){{%q5 zASlAZ6(?r~cD)Ojz~TF(nuh^cy9M@LqcK0&jB_D-?Zp?a8$Aj=FNv+nGb4;A*rf-_ z4duawoITtzRNR}FhXyjE+{wPkO_o}CfP%s!ef`E}Eb&UY5AjqU6aiOB5Ht@ZCcEl$ znx;LVJ!kreD( zOlmk4E2r%llSF^AyA$z`Y`CIZ9JMW!;*ic9C5gap6NPr~(8I&oOW(-wb0mSaHIHmW zkAXr;Zv!T-28m48DLxf2(`!>$SsXW75hE0PaBpq!fv9?}UaVr~`psR(7Jjo9lrV*d zGbq^Mjdc;9v|~sC-hVM^1)MMU*jO+V6VoQb)CknZb``1XL}_xNjvWP75U zMPxw2ml1ojcLyZIt{5{?Q5YR${5VjMQb{Xsyky!jFC3VJj<3 z-B1Z-w*nw6DN<<>t?!{dP@SCKgvfLDDT@ZZ=4ej}I%iCCk}H%Y+lRqcVXk2h6gBOC zYr6s?b*l*1q4ffn+;&qm^u?Cn`Avvllq#2;9do2 z=^pE&sb*N}VF`}m;$?45DyU*TI1PF-+7t2SqOQ*=nRr2tnC|6Nrz~edx?P7d(LV%I z9uAV!a|b(XZMs@AJrjDJGG+?Gqx~o$b?Y1$^p~00*btum3s2N@P?QVlrC-TbG$V&B zj0J2elQ`Ei;W-&*RL}qzHdkA`#O#QCbk}k8t9(DG9MA}C`p}FI!M*<-o509=!()P) z#WTSL{Yw@rj*up4z4HMkX1MH|v}#pdndvT7)nmr5U-T0D`{Jq0+51-)?3YK_fxMQH z*jkiQPP2m|y6rR&>@+j&fNRm&g?f=2VRAcNDu|KX_Yq!W>1haeqO>sd{?-;;hK0C? z)^y#JEg0Li$gWOYO4F1TLW)|VG8d-klP-mu4Ehx(q=Oq4A{B$v7`5>o2VxUZ9X+iY zF91DM_uqveYH_Yqb2z*+k<*TGS}_E2sl!<8;==J|+jluK*Z7naMpH2j3xzHPaSSra zwgT^-om9l_JzgP>*f&Y0fk4%_(D>YA%a4x<2gzG@gYluF#XL62KH8L{ny-~5x0t?& zdQ6qy@P(8dTK56zv?+%yRLAI$k3qa3`u{@UcM_MLj-REC78?X4i)TujvL<6j{N73}!EChb^9@bYj(&4_3PyuFs z@HbipQIBIFzR}-Ko~(c&F9*XweMO!H6PIXu>g_|i%<|SaT_Qqlvs0($U(@0#^M}RE z>Wnqc+5%WQJ0|KKq*-JJ!B3C^!Ee(SK<$cxmOE6|#Klp@yD$y-#-!+`VdC+$`!Ld= zCjRbecPrRp9S$1hEFKy1Qr}rPjM@1K8hwNWYN*x{!JSBG;MkwAzCe63_UK8$eaT!D z+Si`Ox}5dgzYG13AQ@Tw{dvNczUK}Poa}*BkiPF*y|$$MXBTeUYsoYaAVBFf?6cd8x z=OD;|Zs^DB5!FMunI42&(ltk}3Po6LUEo7K)YkhU1Y*8X@Df+HNnfpKi+iuQq6vO% zbpW>zCxBytI@c+Lv^r1hP}5>l6&?+59m75|)`3CN5B~=bX1pwQiH59l?jkT{O&EYZ z&K7pMN@m1^}?f9H_sxZBefH`^-gj%yl~Ib#SI$uy_3LveFQ{ zx@Gn@QqUz5&Y&f$+t!@GE~4|iWlQ@!w%rDSzONg4gr|WdC)NWllVp55qM~r-&bB>V ze@K_7m;29Mlewu+nzS&p!usquX5YTs8!epWm3sAr_H3Ar+YLxjmA-zYki;_ARF`6P zmR|AE`HYnm-{XncqhmieQXu^~LCmntUrbNWW0axpILcHV)2q}5k>(p-QD}%@Xg~~P zh|vjeTg!o+aUrRp+z=FDNf_wjyo-4T_-(iV)a~qD+a1rmT8y;s5qi+>8Bw8zmXF)b zRr`Hc(Sv$-tYF_*oV;ene)OKp&6e(jwF;vmv0n~Q)*iRLt=H`-cxa1yo))lT`ACqc zuh3_rX|gt4m?5?*>nx)wZ?oJQ+T*kO*rVuec|NG7C{CjW*djP8xbNmA$>X{SS)t{* zp-sa=(3Fi2SWYgLN5GL(r_enP!oZ}i@PVbG`Z1^b@YRm`YS5<{gXL;CW|mIG#_6W; zxS_)qY^0S>__Ypp4uEsTMF6>>vt}+>)3C25gK==hV4s!4!ds*$C}#aj*0pd`4>62Q z$Xe=}$!6327=H7{_;^>}A~SZO1F3Tt^LMcL4!-m;k=l1H)6%ZDJVKrcF6r-DdfJJ~ z`7x&*Rp_Jbm*xw)->(Rp-agsf2c(mXb;ZWSoMcK?Y)H4*WY1(g?P_q%^y<3}KtK|R zGd}9a(U|r!y>P8uPHrmjpI{Pg>>1EtapZd*)_N;G<9Q?%U`~enA>z)DRkaYQA)H~OToP+bAV|lCD`K+r> z1ViSr5_9^4j6yhMQ-6_$NKmVHG_Shy2lp&C`y7Uc*@}02V7>fBQK%WhxA|qCb)&Sc z>}ThUQe>(6d7~?qnnzvu<;a$@4dwm!G%?KjC3MLN=qnUo8UeD1mAugxBM8@N2QicCBOc^KUk%VjwVi!A;M zBWOc5EGO1^>#-G3P|S)C6p^EzeM1^IR7#>zy`6sR&8C$&A0vdPBj=yqdSI;t>mG)W zf+|6o>3)y^fcCOx#4)C$Z!cOCHH*IIH@H`Hc#dQy`9--Aejd28s|pnV5li;sB;A3# z7qz{jE3@Id@VWrn{H04I*AJLsPI`&qJd@=kQTMjfBWxXU*KpHX4&f#8i+B#Mlyoy8 z;C<9Dmu4K&_p#&n3U0FY@I;3T9TRN4#zxT%jVuR3Ir>#*k=}NqPvN7m^Fuc@&tZ`z znAx5K50n0si?=lPq_grwr}=Wp3{t=hUvhbI=NCC{K7x;DSdld8mnA?Z_rsqJ?WSyt zf^JN3JKWfNr8~K^$j``lSDM&1H>+T5Hlk{WrJxK61Oz|G%H#tfz34)%S$mC$Tdq`- zx)l>7aE>nK87=viGEox3@ghV9z|%U*;8-taeY)i^x2|-TbU!K=9KEBgLwqvJog*X= zP_J@gV&yc z-Cuh81DVYGxo(P1$$-|G@s71XZ!GQxU?-$U?o%L2EZKI%rEeYwa{FwB(b2%;{_&&8 z*D_L`?SLO(P`U*wl=t-k2v3-vXegl4=LOQGq_%@$AlHzk&50F>ysMM#op z^Ki7z=O)a&?9@3ckE1-m3qKI@whiPOB;uYJZ#qj zq2&vJF^~O05$ioK-h$rge`%9^uhd1`VyY{EWLWB9^Tkf|A44x6U1aZdbi{Px(hS*o z8g%Fg7&EAM{R9yQhMpyX#%Ao-C`avzK^k7NUgw+~C=b#W2HiN;4pNV^i>-e>rK3pQ z@vhIi1!+DZDYXmwC2J1Z8!zw8J{OXKnYtWE4W79a#>-xMP&Pp+JO=Ur6G)$icta=# zVP#ZaU3(c3le_fvSnysSa*MGf+VV3^G0XWr^z7IV@yPfNy)27E1fqMF2#kAsDWZhf z90^lvAG)Ro55o4;aq{uRQt9?UQO9+?=IobY9wT zV(BV)UKCu>Jbbsg)#UupI_x)ytd1|!Vz8GUDAy`^G1JLa-1W_+jk(R!obJW0b@rsO zu?KyXZ8j%d7d*_^XHooL<9NZ%uHcOYS}BcX76=K(?(MU^_lKRbAGL{estp`%6F>T@tkZX`fP}AW+zTO5LCg} zWL=n<&eysr!qx9lqeq>OI!Rr2_Y3-36sM&l4?MUrKqhXe6@Qa5Nu{$1$Xn*zeyI)Pp5Klp7OZfoz@9o1Ubi@RhM(X^>62 z#ghf`r-N6RYr=Ddt&vYI*b{1Pf0oW`?ab}#$WcCtJ*_nbW`Yih%=&^KqN+B^Y*-{; zb{P5~gefh0`G{Ot`EXvVWTpxsIV^cwsUEFzQ~CL-e=G(hn#)NB6`g*Yq3Tr+01M4} z@bsfl(*8`25n{MQ)|!1LT*@+epB1aV$7^z7X1$`RNozf5LB~}yjKA1`APotV=p>Apvia~M$CxJ)rgAkx*VZ~B1iyK-qH)J$mz9l&k)OC7r%4t-Y*s5Ymhc%V6*2Jx_r}4P!*WOfXQj}tHBC3iz9p*ikp)wh2%qMQ zU+#h`agxdQ0$LL9x}e6u;W%i|rcbxdmBhnw!sU&-f!tedrQ{*Ez+tbVLeSS}KQlyq z2Wkul`b;_6@V`{&PkeDeaUXX~iFvjs?KG{`DXJf}GzO0nI( zLtH=nflI%VI@`cH6&yfefABr1oo^LB<~3WQlrIk|0ZIg z-*r=|Cn_`hvbDsr%p_>VKQ(;MJC=QknGa(q13WL?luAxqJFg1)`YJ2oa{c(s{vpfq z-M*P}0ht@+YX^1Z3}q{<+%r3Df2!Tt(o3$n(SnNXEdYVl@a3XEYaNIvP6$Wb7|^ih zbmrQ*t9--X@2<^fdpkFd6v8bneKXQ6EBVy1qP$jdebvM)aa9p~SBx)#V{uV%=^>wr z`+iO%pUh5vFie((*t{|^V(Ojt65IijKE|4@g;m^Q3$%svHT&ACdKB;P6YhR)2Pc+ zmYq|_7TH`~TPbzZ8Q-{V8Ocs>MkqS#vSq+jhSDeJTk^*FEa0sF{6BIA?L9;+JGJw?K~utYy2Xp! z$eI?(jRT#_bV{h^TMO?b@UV3lp5mI9LuKir`i4X6^mm|g1G1T)(F|IiU*aFFO{ewn zQ)z;=fev2DC7}E2-DUEDBY$b*d%t^19WNfuiVcjhTRwt*^RtY)K(IKJv22;g>8?@t zHdDlG=L5YyznCLfEWJhB&qOl7pLCHVGkQcRBGUNGPB+Swq>5W5$B!H+jUvv!Z8cb^ z?sQOfAFM(=zO`kf@z^93BK-Q1Msg?=v2di$Pb2(Tpb=`uj6pdkW3UT881Ogt#yNF+L+lc?pB*F zYj|VEE9gnTV`}hk!n9kM%7(f_8JoVcA5 z1eG7RSR21`vqoFi?(QxoA{fIoA&e>NGE#Lza;AOMPVvyM+2}Vr@5ZrCN%MaB@zQdr z{@9K-$|VkoeFqwF>0!5GX^ROT3>_mJJYzNOFBqnEapt%LWv7dBjSG#XxTxZN2? zNNwT{Nap!x2r~?;x&cRzx~cYbgXrnfixD~|!(2nllj_Ok0%p>W8E_csC)uyx^41m_ zMz@YH6U_pGGv~)#0%=f|nO72M+Br-7N71Hf%`pXvWIgWBJ4KY5Y?I5XqJqe?$jw2f z8YRL33dz=9dRn%E_88=L;cjNMt1$cp@A%Jc2@lhNfB*tqv>Jc4{-QiGvjadegVHJ!!I)uPLV_nC(fSf zbsgXy5j3i>=7D%Iv#5VKK3j%IwTN+Tm|%cTiY8~=ygV`~GjCpcAn@MlNkj(AI+DCx zxBcHb9}$&D9>jfv>GmD&YnjR+MmyID1K-R}1fl57L$bHCzy40@u<9?2<^hIqB1t)` z(W8uq3(hPb0i6Du*x_QZ&IWd&59}t&PJj~gi^1gKSL&;Es~V8Lusr{S8?U39>{Z^~ zNu$r(2i&7YZyQuhl9^pfEgp|bRre)av5F}TDJ(*>5?A)u5N80bLR&om)guhT@d$vKp-jolnK z-LJ^r6^2aTMsguUZa0!XH8DPw1`?n}fKBn`O_BS-T83o#sIaIt5$izM?156gOgG0$gv_zhAc{EH<4HaplKYkj#nk>&D?)l z`xGMwZD|=l&HVCIMd#PbHKzr|63gwzS22B9hxmb<)MoTi&&E@>;TGvfY+jxSXpBg2 z0fqrpfmk>}V^6@%diIVu#yye?3v|BJoTdGaAp(W4!r8cB-7SnXzYBE%9azxjAJ+@I zhudeel1n+RKNYGa7>+i%mweOK%ox(8M@Y`+1*;VooQ(;U}GHFT1!3?hC0N8&t=gLAO?4Nr+9>$~zG~yNFVY4-@WOO+% zRVSKfeiG`<0%AJsRATa|qKcUTqw}4Nvv5(p!AhJ)3|fQI7j7t(7LZLyx$aZmZkvJ& z#CzI_A>PS;T!KdXc<9W#~_bb_M{y|j>9;S z6@~N(<7cpbK~g95zw37sg*D5u+L?pbvPiMz{TAWyfA$|o)t{W``kd6YmekSHi#|y5 z^RHn!^7?i-uHMGK1S2-pCY~oZl)Wi}i(j#mD455?O6G*;1j_Un=z4}?fof8C(V->x z<9{i(U<<oGEA254eM%GC;9b7?#pMWAHrU;0u1)KlFS)?no zY5sYsKc~x&@V!Md%fdmh3lmZMN1;TNIL3HbI`?7&H;WdVSCgwZm%}fPw;&XNM<6Q; zGr}n5Hs#c>}CQ6H{bD88^+lU!jR~)lHujuS{1jLNpniDgJx(Y-xI9rVa z>8du+elk6$JPq9zV&h-OSv$bTf)kXQz_pVuA^pX4kSooMdJkMoH`xtO8>{Bd)v1+> zB7SUIhhMzBr!#Hsqaic+huPPnN^fg%=R%WeCxKL|1!yH+X&#ADLsdzxzjPA7*Vgaz2XWt zC)Lm+7<&HIRBTtB5hjAR@wvZBJnBdP>bG6h7xNC{sAD@$bKX2>+iHg~Kfj&5&HZco zxwGA4ZIAU%=fUzK^458vcfQgDIU*U7B+q0Bh9J06l~8d^(RzC-G6yOpuyIi4Waqj6c{rv@P(qu z(huWjk031j0-%{yHaMzHU;UpS5na=a{J&!>1qsB zqtC&-ODZ}e)9`g{oXc%n)-N9b^4QE?8>w>cIcz{~g74a92@J2uL4{o{SHMq5FtI#> zDirN-9Qzeb*%6hQ-dtyA!hISAir=%t)OC9^2dt=KNrC}rUxElMt+q*f7mM+XM$_~} z$Q#9$%T|jM1zLCOKaS7~@&CS@-L!F>6ae|x_x<1B{`S9FH2=N*e_#IpJoUb%4Hxgd zp73avsfY^TZY)tsE><0M$q=~?UH-VAVqaLXLW&=A;`aup1LYrdkujn8L^IP*|uj)Qo4!`GkU8raVCAt5nHv-7jAIdG$ z*KEY6O3uDY%ke#_lHiyMvuRq3PUC*f=R zY|EgKEvue}{D+-gD9Dq!?8T6tRJ8ZZ&v76XT?pWx*Wg!) zWG%{A#BIzq;SCw-u75`Mysq1~qpCPKKHd&FQTLaLQ2(49ov*VYuOgg`v+-G-fzQ zHsWQ29y{#Yk_0f0^Dc;`xtL0+J`-y`{op?zk092TfS;_2cP>WbnulG|f2-P=(`p`i9_Tf&)nJ!|f6yBiUgI9=tgIwA@1`^1^+*Sa;_hVZ_L6Gq#% z`4(0Ok!qLc=g3`t2vz~pz)9qfz>_i>_){hl*gyOr*!#>pS`tf}m%{@}(r|9IF?r(KCsS{3Zb;X=(lIZK7nQ)7dX6hgR?#k2P$}OBOjf}7zm_rTK z&^k{#)?~T?iTInLIB#3t*=~SesDED3fy$J1Z@WZG_Q?gmJ9HT{*XS=J(vMQtk4N^u z-ER8-i}tba-|znhv+n=CJ+PtwFECaA@9*^g`gh9T;sL>d7$@N$pKgD?+qZQ6wKr<6 zvB$VC`_!}kL{<4CpTG8AQqYPvW7i@-%w~`qee}8O`TS+|U%3fq*YXj=yx)Op@kgH% z;bqMP?GVkr|E{?*sPozmNb`zMjqBTb9TP0y59f7)TYJG4Pl&5N-tWu*7!T<=$3)qw z8T9LT*Y=_<07}SC`E)o|wZ5t&i_C~-R#4Y96NoXT?A=K5ilBLaW)_Glu!J~fLi z)EISk2a4~Z+I3T$CEIN{q>bsmfrpQ@B8gHm-nGzZt|655Z%>(|H-($7#I)KrSDqNw(WoT zSnOGJDD|D)_2UxnzaQWaKUBO|ie=hA`SyQ)<`;`r#*v)%jmuB`{Qy_5CKN2rI#UI( z&NlfUM!3zxt-Iex3OHG8HHZ{WAk_bHtHcjqqpA5%wAO2>Mv|T8#&VTiD&5LihZFW|oIUv=Tezs(9h$q2j~Eg3X^&}vRncFLwd{z_&*{Q1%1g`DuG;vWZ9=B+;%TuWEO zz3cz>x~`^?r?-E;0aIUMS;N%r61=u<&EMQPpEJ>e&%qxg8^hFne#`R@e$?dr$rg*6 zeFAiZYO=rG7SqL0H!KXN9=!8cwsZ{g>80`D?RJ@bd#PhEOO3sI`0w5lYZ1=p{{XN_ z30_C{_TLTBrzZc~ZQQlqWq)!Ci<`yqS5 zj4pM|e)c~N0zCTvmO-2<;6^pqU_{}8+?F@z%_CF_yn4FQsF6>#y-@RaC?u=e%V}MP z=*uGwb6hw5N4j8m2jd1YpL+SQS=#`}VfIqX_V1685PjCNtwikLX{vyE~f8Z%!nUe$* zr&{JMV@19N)-7^g=go9|U%+`Sd%6IuiEm>DELGKV2Niobl&b19s2;S$ z$?fs4JOU$_lv3qjUjaazdK(E$uGukUe zr+Nmj{$2rxF0K5B9`qI!kX8q{G58f_n5&}fKIbL(la8>lFJXlWgZ@VJw7_<@KW&!L z?py40xg}v?wnTte(E}R-`&I^`0~8cr;C=nkaQnj=fIwE(^Kr|7Iw5^3N3=0(17Sd_BKja$QKB`LN zYCRzWQfq8dK$E(@oelF54=bx|N*4kaDwNjMcBo1ufxm)gp7e4hVkK2ridQl0+%Ozw z067t_U&uZ=xtMalXGl(et+9kE(U?IpOVpxJwOfqxD{GBF{fdXtiA=0@UHCVypQgE9?!SGf8QA2 z;l~;)j%C)$T(e&Dy64TDB=9q0N->(QG+nF)7~H-SS|h5asFYah%yar~Tj>0h8xVtwjt&>pmCA&QJtUx>)sqLHq^ggdoIlPo8;o5zvWy%h3?nNeFQrw z`$v({ql%jku`(o_4$OO|y`8mOj_e(xhJjX-V8a5vs2L_HRBGKA<;Pd2yFnj)L&{C4 z-=nXyPJu;TlZB96uv@g|MceE)LF%^R0?$@qSbQQ848 zY;)!0$&)%wA4>xlCOp5VIH^5Ce;>#vNH zCVZtZJM|+ym5GapxEj^`N~o^+5iPP=f9_6tw+E%jwpCnObhk1vkv%UH?bklTiR6tm zvS!FNJfC!>*H9{^=qD!^dh9%L4@=zd!U6+&Gdve3wbNH3&Au=aly)_2ZH=f{TssF=!$S9EqH=Nu=!?*Bub^D;jDA=1JQ@4v~^ z_u#AZry9pO4=SpL)uE#?Tgb6!h)=qnMVck2S?G;=g ziiRJ`pNH&@a6I~#82nSb;lZScy_6~X{E|L`$5u&8=SIf%B1rGZfiQaRg_=X-vL^Vw zDyAimN(?jVi=2nW%l%_#j~~{T23P4yczsSiU+j^^X<3fbXXM1%k+CG5!7^3os9(2C zxq$UM-0FHAFh=NmgsEEOaeNdJhMRj#ip!1CpQ4o0ccwu-S`yKuM`;$4BLUjViykI% z4y$#?zxTw??dEvgqL~}Yq#*sH|q;%9v8_YAf2n5{qlaPkZd(b)4JW&8OCFrt z5x#UO3PMcLbiIH1R3DzQl>7f+l|9lXx0AYW);U3ZE?(S*W$5Fj!nB<2%8ap9`l~G) z^DX-h94X)3(N(s+k&A0<{=<<@{~#C1qBJB+6L*4J92v7C+=AwhJ5{dNVuy_4hK!Bx z4AxxBnq~{OXR9^Pzb&o>FmCfZ^#Z`5t3Tn`k?c*-TaW4L9 zx#3w^Hl#<-5m(Qp0`oP^!UJYnFe=UIR^?k_T-jk8ox%~1+N8Wdt8!ZlOwWlAOYIkW z0#Q&##>?!_j*|tIq#yPsCUFdX7-Om=xM%(4k+vTfL4h_g5u82!qjeqL?{&kzO#WN*CF)W0rSNXX{ zhQ7LhV@Snu6pKU$Hf)G&K{%R&R{QF9wWwcZM1F*aBo&TICKe6}9Z(#WWQE~+U#>7D zZ>xDb^kVq^{urzpiEeQ=Y_i9bSrN9BB)v% zwK0Q_wg1BIrvJx3`!*obw8@$f#aQHJ2h!4-ws;nfW+A;hp?Fj@2VI#fxE*`CC|h7& zFafJZwV!JyfoAJNceU*6PvfYv+BPmOH7peAACI!*J73552jzfGgOC<>b+s?UYh}H} zqkle%P&swCnmJ55Lo+cROBO-E$CtB}AjWz~OH@d}>hLsCPWeZ>aa!r|S-d`~w`>sF zOgmwD$|YSo9kuvH52;Swij3ODAIfT3%PsrDD5PoYB_7j$c?rWx;~NJilGX+(FP#9R zG`iE&m2T)yk*Es5rf!zWoEp+UJ-{8GojZ571POx^cId>fw=G;A#|<^WVAVmNIbuP1 zjvHpXEfK^}A~_aUH*Lw$c-xT@lr^lVHP$ODNiY+sw%PqRK;_?pY&2j?uZ2o7gx!&n zf;rgBwgUU$-mTuuZy{lF9aW;j8!StdC6sf9^foluox}}Wgfwhnq{Me}?*7;qlrIvRX_Z-+K(AgBjsgPYtCXPlwJwyR&NQcZfd3K-bP^nU1Nlg^GK+9)TQB(dVJVF>FyM4BS zi+OC+Ri3BtdP(9Yy;`}sV32YV&1!(nr+ID~F`huB1N#8hqqIvQ9JT_3==ywTW*(-! z%rV|J4x|Re)$XmeI{m0YS8TlEQNC?=|1HD6o+Rf5X0^`L>8AM6zei!8JZvIu#6ChO z>k+hF#(a0LW)k@#$#P12^fM|>SP?FRhD@2-TkS%2Er}%c{sojS6tcK3m|NJp4D2Bn z8EYN2bgK(H+iAmUQ?E-+bl&-m#2`u;uQNwVT*l^|hAWwOtI5+O@*uN;MZ%u<;FjC6 z_gPGBZjMKx@&(^wOOI*5MW3hX3hXo-z+@-!*LjcCd(Iu#HjHx^(g2}Cdg^l=z6Ys8 z_E-?>j@|LYjGUZaB;EDS0K$+VzQO5HX0(e9;aejMx_+E(k|6IL2RAL zp#jPul-t@dbvK*V1{+T^vIvkv8VmaU74G}xEi`ipAuLqu}}oOHNP->$+2U_u}2kC<8L)o z?Qj@`3J#cCRQgVHL$TPQkp^dMb>@pVKZih^yII;a>$J@P*XkLBTZua#xG~ zoFq?&ZG~2$rS?Wm9k5@^t`;DNQwx=w2F<_Bb-x^^>_4a8vL+eIh;OL%8Ca~i-Epo9 z0n_+VY)`yw^Y+qPuXfSwb9K*!m87h+#3KCSwPx~i+>JFzPfj{~er>QRq2wxb3=93} zB$%NSwD{@f{QS?HR`tSJvxwm1qt4rG$&@u>q_o5W{(j22X0Fm_{Q9Z=$)_yiEI=9= zDOK03dmh!%U@C;f{se?48_r}Wy=EM6zndT*ZDD$cP^ zh@vLB+le?NamI+*UWm3Mdh)65`O(Ytw_V+AWVg%O8tLEIB1mmz_q%dE+kb06|%4xN}}gRzM_4LftyEFibw4OvTXiH zS7`~BMCztRmR*)Ta~U2=>VVyr&Ik%!%A(y1%!Kk$p=%=?ou_igN*oT~2-&?kTO=#w zk9CS|Nb&_)cI@4i_E9peo@odkIq4E~yU2dqIF3M^DbDr`43RJkkje5a-j4JFS!^TL z_)NtWe(g?i${4n!eUgp$#r3-a4%JzlzbJ`sAI0)n_qkC_pdJ3$jKg(`{I>DbzWq|^ zzTj1l&c(xLj;VW$yz0IKcL03NvcmHE(Oe@BF8{qC5651w>tOVD3i=s%^q%mJ1! zede-r7^d&+yxOJO)x4Y3$om|?7pk01c2?548?OFZI&=bE>pDUfQYE!+?RB3nD zQ)30?-qGZ_hSqMeMc9rd->`HWsf7*9q8(p?d=mjB-Nf)eQP=mtIvygx#_z7)Yx0B9y72-~u^~MEx*Xnconx#jxx7;u~dxtZy|3MWYaE+ZLB*y#!wg@ig>NsSVZy%2R zRZj2EIO-%o61lRD#nb{D2OJJe1M7jejROufYS^bQ%!b2$RH@?B0W0MhpIcyjE9Y8D-)?dS zVD7RAsXxGaelr6vEy{y{`c;hLidPAaM@^2CBi!M6NoR|)cZ9osUgu3~rWvnZl^vZ9 z8c>SkC!V*^OmWM_w>`+Y&uu0hFfnX5 zwjL{cHN>B1mdELBsB>9;RT^XR(aR${{>I1nw_4tvn26X5|1lsOp#G@jobsIBdS81^ zI7AQ@gk7I!KIg~m#XAE@cCH7{6tP;yZRoVbCG$`8A`^ef;L!8m+RsxwOmrq*t6sjV zL9J1D=MhKpP30#R4JXvy=@65CyfKj$s7By>@XHP(mv6Z}>XELxG%pSkSrwESR@hAxvf5S6Lv>lH6$G$F7nP^jHp9)Iw+ zsL4Jdz` zEbPn5bBpE3xQ&Gme%Wyfk|1NHq#z0W#c0SsZ{@|FHQ3UF=KZ9*iG5Yce;ItMvOTc z`}Ic$cN08_HTo!R=t0!lLUg(R6H#e*ZbUs&_ibp)nd;@arum+}P`l}ZuP3a_m1YUr zsBEBq@=k(o8^21E;^J-~N+%X-2{?wM#5<}s-IKJ`KRoG>?2Nx_WgKv9DEEkFRSG4+0s^eI|}5f`#=ta z0`Momguf~_Rq1UTpCkP=Ub)?=MZm_kwnmRKxXO-w5zC%r*OjZmEM#_b{#ZrYwsB*3 zb&$la+{u=B-J}rPAo*GN7leBPA1+Q6RG7Jv>TW9p6}t5scNe}s4jAgpusUBPH$<9C zcvNj@H;A7{YPWPqsX9to8?U*bX)(} zZ={s%cEQJ z^_hd0NpOVlA6dp2hc1f7J=*c7HTjW2C9J_M^vX3(DF3c-hT3t83TWdq6Pj=xF-3UE z5F7D3IXeI8`rbPkte4Wp=7Cm+97~Qr z#59A?h=ia@+=W(7=lQ(`&F?s4XBrVE^ySvOWuOW+Ok8ax-6}#HbUEN9;HOB!Xl8~E z?|ylJ7erAW1Axc~owWgOF?{7dkomjeN2r_1YsWUA#DUyqrFgv~-RbJE`#p|1y6WiC z9!_Cf;mAlni{4hC6vPMcJbBIvJFnr@7bLlsu(cXWMjN5O7vbZy{*V;^X?1@&TUG*c zk(nxSP}oLg(?!r~0?glj=lGu)breiH%x-UOEb^-&>Z%1V&4&`lK`MhrHnVHvLR!$A zk$6jcQA$80 zV$K(Le0_70^PRQTVNjuHtoCHARZl}lt(IWT`V3s$?oPifACTi#XDnw#-l_glhJ1gp(>lU@D}IZad-;=T`S47oPP;6q(7xiJ%U6)6_E~~))$_;w zi`_mat~M7TjA6M8p{(&}Vk8?1UQTyO@5j`BC{0hy6?Fv#Dgp>w-q8U!7Eskh7^NZO z3jfM|_$jq7qW@Q9_ttv>k;Pior6u}lam>dXgGJ*qH*7Q}%PON-4d{jS6dZLoMU84y zWrcKxX;9Xi4jW^Ve5s?~zpy*+?)|e*begXs3)IM^ga?JF#_|72?`(2|}?Vguxr0AkTr;`tg z{|Y~-;1LnJn7aAY^PJt|pI*7OYlAk%W&1CJC2jl8+Hy~O5Xw~FYOl?-FStndtin?s zwna(zIJ@Q2!X^v83O`)n0(HRnZ-Ey&etW{uT95{_d zDlYLI1mghxiyVVSwRAqNr#%K* z2;3FkfA$A711#(q@_~rKdVVcZNKIq|pK$kLG{kQ)RSzoBSe&-+sqbCJlYPd!|E$ht zvL~m&!pN(AFWcR#iNl2atdrd2&L#Z+tT@n^<2tww$`OT1KfS zy~g4R*;q$g0=7tO26DSsR6tcXny)HfjJVF28%vr+Sh(a63g=z4%!c~5i^e^Yj{A@iA-e%qt!))2tz^$+2e0lY2r$RFTN*Fs%ZzA{A z^Ja!<>Tu_st2aTPqJ!o;lW05&IQ}SWoX4m*D`X|7y^NV@YU!>~x4@ceDIXZQhP1x` z?8CkgytJUO5lqQWYiS&xhq?`+)Kkn>O_GlDvcU%(ZF`?UCfS{o_Ob5O!Lq8S4f;KL z8#s!E9MO7YT3VvF7f=Bqjar7 z-t83CT!*s^Qq4GCgjlMeD8v{l+ACN5-L50@~(OB*! zJ!_rkh;sv6rnxr+%(HB*O;~eJ8dO-B$gMJtMxUu3$n4eIs}}Mo<}$F0c%rlUc;Ve; z07gpP-U}!(wU`M@_^`!U?=W;Z1@#HqBuZ=LR6a1cp(XlVN=R4k?m%C}p+*r$-=e`=1X~AbLBHkeC=X!5YVw^xj^&FwN^25yFdHZys_}VnKh{nSGAw4SPkD8} zM)-%BXi~(}Nn^^d zyW`-)(d9aS?FIGm?ed6nLL1dTcNcw1+}(CL1LmahLIMWc#rNbT&AsBlwF5xYz%XnP zvs~D!-RvsOqxR^NZAkxE$_xAD;XNP=jtB_ZDkK+3oyzWu90wYgIBl+-&_HG%bc9K< ztX%;EY0JM`KX>d2DVhp;9iRUX{sQz0pU@XA}*7{u&UF;v=BQDMdv(I6hS-nCDhd41fh38$#H z=IaqSS&2*#^G(484<5X zU;YL$=veDhfJ9_&bkM|^FLuCwG|Fs0XNP$d4h|3R& z(`-A`e0qTy)1d(^+erCJb9}UJLRz&Wc|Jg{-nLR3rRfU1iGG{dNoOK!`HPk`{}Xc4<7I(_&pkE6af33UU3d3} z89A26N&wma0mU)t;;_5&5^TV}B_UBI;(@#QNN5x*Xkz7iiW~5{7E{z2hw)DVaFhoE zD?2X#UdA>E7Kp{if2Z>a^k#18@ zKeJcHxX!MN^sb2QqWbm4ScN(DQ)@(CSOAx~tN-`F8q~MqtP(HE{1jFTDDqam&>YUP zLs9~j9|7R(E0$fwwN8UsWWBe#)}?c2G`6toy(|SeF|H}8(B-cHK84AS(>iu7P0js2 zd_w*k+#Ma-J|mL6iTpKdKk)q4xlcmyhggs-S=4;Q=?dD-QaaUwlq7%Tj)~N=2TCa>+&&B;mH+Vbs~QM z#kd}B5Vs`K@tHBia9;SQ)cl|0J}F%&J1_S1Qa(i1ms&?* z&}w>0x!Bo$IHFEDrAC9BGnhQ=FSIjkwo`cQZb5S)Lx0uRRK%Qwbq7{gAHr8VU)5NN zc`nYh5U_kWZvI2LesKif8B^yCumfbT^7R{oEE|-2vKVS@i4sgbjyS1Yt&wmi-ch9wYj9%%M**4UXOS|m&HFoV= z=3^32mRw21ta}slM1AZ5H{-5fO?g*mJW|8Wh$=6}XwgX}w0OCqtB#sgprU*nR1#EA z$||xeS)pK55+j0Wt1~`_ z@c0+Pc&?n86yZCHM zKl6ZSY=(+2Wiz&9np>$y#OhUSoDTppKVbv@?fz450~{+d86+T-7CzdHF!^TCkJsyMj&P;-}QZ zsCAlLsB{=W13FJ}m#$0~g(Xh12`%4(zD?s_rG##6#&=ze2<-td)B|j)%BsuPyKHaV z%TRwYD@UbB^B$qFaeaF!y^JDKTR@d+eLUw?YZyjd2c@uwOPtF9^A@dpiqFEeYFwBw zMxM(qHom|AOS)cYun6!M)C$vsU$~~dh z*vI)mvZ3Y1T#wR@ve0`X3}UgHReOX_@Ln~S;N#-%IlZxwmeyh-7plCs*+zi1`QanG zQznOh5DDh)J%&O#r$xNtR{=w&ovp=K^Q~>!&Gqc|O^7;_q3Y!OJyctV4B6Op7RT$+ zD;dZ?{(K{{LONKdzJSH9a%@yvS5yOkC=P*Y2pC{E&J4wCIP_$Zw@$qEU+bHnL_Urs zn#6$n6&q7|Ei+euJ0EE<3FRk*QSR$!4~LonJ+6x-7RqZmPaikm#-$w*(fS3VH4#vp z)do@&Hu1yfarOcFab?iPf}HJPQyWgkSi;KudeYTKQnE3I6kB2yJ~ z>>U8$n*@~nuE7WeL=BokOArQOp*A7Yu|^&5tiqk@w>tBz;-2paU(wzIxHg^FJ~wDN z-XsSU)6^w>6S=li(8+?oQVM?>0tnOxG<*xRCGJY{^>~ccE8Pj~;!;mer9WS5c}Uod zQVX3+C#Bqv;>dg6!f$f>RbGlO%y;qG;eqw`s3?vSNcYH?FHhIXi(R+?IE7n?lPT|fhX@UUU23j<+|A5)}rJV zet}y&^TOHbG->d@11BW8m~S!faP^yE7S&6gemC-hzdIik#DqbqS-p25df^Q~;jpm|J~-_6w- zN<=41r;-Ki-HE$zvkBjVQc{3~R>d*i?7CT#6%-a>ick3%(ElAU^d#c7=DezSOU~y) z56ns`tx0zv=A&K3)s+;IZI)HY$|itVc&-FoO^nKp*VWzQqfh_#Jf-7>5C}^<%lzWH zK)j^2TtrNuBhFM7+0UqQJ`vi9UGVcsbolix{&Jot$1WmR>j)0J$y!qP^Y=gCZBAdvq^-R3q zWfLj@#vQ4Ajrr=JXN-)5w*Q=oV|ys0pW4ZT2EVA1lnxAYOM zcsTP6+M$0X}p-OXgJ&CQtrZ%jXh zO(PV0ND_&Nit>-|t^W~__pZY6aQ#N{o9r-}{yKT_e5Mza9AM_hl%aXB#fwFUc854 z6j~s7!Z=NpQeKZ-I)Q2*Yu^~#1G|j<>r$bAzs7JDo7vK2WjlBEQDu6`-A>kFgThTk z%L1MLrjyl_GZTQ}G^g@HQyu#&!{KNKVyjj*WWMdX>;`-i(yb*SP(Qg~V>g`25j%-K zLtE=kgEl)bcp}`j`Tocv7e%qsVL!^z8a^g_7c0q^@o>=mW2K`pIveO|+lV-!b~Aa4 z@`FTm_t4c4R`30)d$hW*G@s4y9Hf^P0dftQKpG$b4u+U4u9b!1Mlg-z4-fAz3A{sNvCAB8gJxGii0oMe-Ox?!18#Q=~o{~a$K`38>tqpMsV z06B+Uljdje2TtRDwhL;@3jVE8=s<{pK20$_oSl zjDDJ0qYxmSD56dknJDLAVl9!=XEd1Y-`!_Jh0cUR>7;o`Az>)kJYm^6LDB>Ex(C}%&nC&|Ugr9w*jgUg@!?|Dk zt}%|m?n3mHXpTm9jeU4P6WW_(<3&i~ZqCq!w!r&|&O0ux&^j_hUZNNlwn{t!V@%6r zAhMITHf$Rna3$xMg{v!-6qL+N(CYb-qiTccLPN@u2H1eWb*m(mqHJ<7K=2vKxS$d1 zIBbNGpUtODQ3LeFh6{A}KkMZ(zS^^W1MsC00A?y(kXLa-TlYylBR2>AYDZKh!WB}j zur{{+--`d2lQS?fz=wVB_!LcB8?&S1n6Db06NyEm(vD$O>eqtq;qpRtR@yV}@3iJ` zQ#Xfb2zUfm2WfLcgt&|`8~7^`_k|KG$7iV~R4#Tmn~*YAZ)!U*TgzfroZbV1i1+6B zDxZXQ+MEZ-vXAX>8ILdLSt8nK4iBpCaV87#Vb!KL0rvNl1%W6I^kSv`XLXXFlthHt zaydcqx6F3iEljl80fTu+G0MFnLK}mww{!g7F@NC<=p6F?s7ZAC^K;VV-*LSi*kbHVHNn}t5eJ6gkEV?Xi?1LPm$YO8+7Ml z+O^j8RIEMK9cu=!eM%M7)Qhap%3cDU8W9=F5FUHs%JZg!`O!P1|(RH zu((=05BQK&Fm#TpYuEXi)JQXmpS$u1zpz+ZuxS&tbveg77A=Tc z%WIQH{awX-kYDL_boAuzlNmqX_}!m({M(s4AaH|L?;Rp0KP%1OacMxH{q5XGWbSEh zkCFSClKd`z1A({zBl&N??Qi%0`7vVQ+|y{wI1u^iPju&Za3mK+*6oFZDMe z3j{i2hq^8!lPKF5IPtS_{2N>i1bTN8EH5b7C3sio7iRR&=lt8*b&>y9;_k-uj?V4e zCs>M{8RhtgLjTSXW|9mHW{b2KpugzJ-yY@X$B3HcxtF5h7!k?q2CY&W-o?}Z{APoU zovFZ^7_v9)RZWNf)7LROTBE$dn)rTKMuz_BrO&mgx4pXm^yTb7=hnSFCi-KZPaNoE zjQT%PEufN2-XWN)BgnZwWsgW{-NmWbz~lP-a|r?a+XU>r=zG3#$3wvm#~GcndBi}? zu77AW-M|bxv4;k0Gf)l^Ls*(mQD$OjQ1hdYf*#IyZreYzj*)wwo+U?<<%P^q%X8Gr zo(oP+9s%cLqkq7CE>6YuX8F!r%)I3gf&3G@thf+-;4Yvb-7Idi#-Cp9_XdHV9WL+S zJtlK6V6bNAb(zW}Z~ zDEv=;8E|3EKk>=Hb)VY)!CM5bJM&9z_>m2*VR0fxqH{tA|A$8!5`ROb z82oY|R!+tly3i$VqjdkMwG?+Ay(|BLVZ%;N6<^x&Fw@t-+ZbxvRe=kLE)Cegm(7dEErGYiZA z{p$a(3gn))$7uDbuhx;#(dhoqwx92|&V8rG4bQO_FJmlwSV9@IFSyfE1>($~; z;83=ct*>(LE8v2Hr!ZlEVf-LU&bS$h0X9RHO+OQje(A$4C`eJnoitE9Khq6Z(%@@X z6`8~%lf1yeftRg7#ss6 zxPd`o`JEPlQl5Nez%a~Bi@!!&Ccai@A5__{^)deiA5@SQn#vIR>Ok3s~1gR21WgkCaN>cj*EmuA&}@ef7|T->ex zAGSS;*3j$Q^JGX|6Dc5A+Uw1GzV-Bn-WcFJjcP8+-m|(%I0ziDY@3-dcho()eI2;nV*r(0@>%#4*rtjn7G7 zA2Pg6qCX}>Hv)IO<+ycK#H50GO;_+VFll}i2Y(-Ca{m0F-o@5qSL9wGK8LSBb_PrzH!OT_R;+Bl@_`i>ZJF__szw%hOS|NH;Hz}qhN_POiwYyuGy$!nr&qwO zt)rM%0iRIz-!-PRduQ~{dt<(oP!h5uT`&W{1WWuV{sFp6Ob3OQQ(K|I8e8vOTi#;o z-Bfn4aj{;2%{mWIEw4-;w0IB%EFXWeHD$OZYOG6sU*fU3GXM>)cBHO*j-&`j!R`dP zt~!z?uBb(tBdmnu0D2C|1XeE}viem*%q^NT{ZjfFF7vz)3#*fB6O>nJA%x(f(fUxs zRbb2k7p!i);3Tj>;R zrSZIp+{y$-Zz~rVyAXpU@Hea>OcV5)0DhSd&iUi#U2pasQ@Z65NLjx9X5acK`dCu! z@s$7ohm*v(R@@3FXBlQ175B&MErfJzqQ0;5inkQT>zfQ<2wL`jC3c{C zOs$d7E&WfG>Z5NetfoRWi8i^#Ro3tCT)B9gkQALi1gUUhl6plATaN897^Q&r{H zTI2d#6PekM@M;h4%uEG}$~anIlzX9Ne#^uEp0>$Mtaj=%!uVDAqS50Ig*rEOR~K+R zFC9tr@~DK*D46fMiO#|CpZe-&J(cAs!TQ#(^on6BS0aVYs*MtTeZu={EPz zCVV_=9-Q~A{<$oS6?GEUgq#aTn-d$(xvXEC#(Z2f;Sc?KYKBq`ij7Zk^?KEP{Xf@OP%5XJnredrr*z~0z}cXSDa3Z8v@!RN_vak_dqgl4 zv3qriH=N9&i_dFpW4Y{4+};RX9Yz>m>lGg~B|8-4&KwHqvWN+je<+og?H;y}mf$K5 zGMBuSY2{#w`25l1>ZYV%>7B0Xi%$7Khp*vQ#+8U$1JWvqdWD50chn^@6zHhby6qMQ z(UP=vXS_Jd@y>7CuUYTOg?!eeh7O2hzv!keANuj^r zS2fR#7q!N2Q(5Sn3^z8*^jme@W=l%v5g6RZiuxT^o)V`6qjPjd#B z$L#XRSJsiL{`k;Q%rnQqfwOgBVT0I_`35y*>1259p4RT%UK-ec2>vpUFNpVDKkYlf z_TW}0c-yX$GkZ;T1`T;#QvK|vJ=S_F*&31QJ@T!@-)8BZu|aoLjPXI<`_UMpznk1A z@cVXI-TobjP;=UiGbYx(NSU+@C##x`Mb5qQYh-UuU2D^Es_$XNTcLDx@>( zE-0Q(K4y}RbKuMp()b#Xy`Hes-Uw#zcoTUOeZeHLV(}ttWkVrN%JY5gi{rRc?aT`X zvy~1uE%jE_)nALHx*osXKg-;_JQV{?ndargR-Wm&kL#d7YIEgGgfi9$9kG;lGaLb& zW~E!&K=n%xx_j5DdK$}owImY;itPr7{?v2a62qsd7^zoD#dVeT@Uwf(6MegUYx36f zSF$_FCM@f{7o%}OF^8+3P2sJ6-%U46&2IaDq)a8 z$SuqQ_I%-cheUOAj1&Uod8a=1BZQ#P?@Q=#$bHn#MgEAqFzW=h!nRH}1zJ|{x@<<> z)Q3`%v3lk~`IiqUy17yBufzv3b~vF{>gyW7BOYtTtV2-wkIUy8t1upyHhBOq0(Azw z$b0wkQf&4Jy5T+3DEMGT)nI5~Y*2g>Wh>aGOZCKA^1g}5=;(c8|2@O(I4ySYrsTkZ zAIDEKAv&H4x*}E_yc4-EklL~ck3}oFAZ>8i;OllMICM;MPAjOGczqTcw@YURJ+S)K z$iOc-zHRy1wOTJvfJ`l(nV;t(Kf>5tkjqpT^U}%MQ>xqbW5-RaS9(#;Q|oUC>z}pS zYEM`5GBlOjHm)JErnI#V|F+ZdPMF_&b@?64meajO#sih6{*;@VA-D@-%6#>uJzixA1X;&WHPS2OFVdAXN!DB%TDo6AWp z4`01+=KxL63?5bi3w2eg(t@S9L@!>`;UMCGTtb;K)tD3Bx2;r1$hbUoI2OH-L7ia- zB|Q_Z{W+KdO2){1(fXnNqk{>tMZC5Hz;Zx&31A&+CzApV3?5OK3$~ik-NS1?Ot0-N z^ii6__kqk@&pUF4ll|?qR0?w=Dbu9e2N+i?T>&k!my~#k6<5qUJp-(7a4t;9u<=r) zuF4$XwY>o|1hQagXl(Dz$?1(XV(LncMpeoI)~iZ%b-AoQ)uv`&Cz`B=)e+xZx{S~P(PG#nLFxDVblQ!Gc7 z2GavM!yQHm*VpJ{uN>xrgB;&D2WzD2mRvgaTAf;hyT}`Man|C$bWjAz^y>xMjYTuN zQ&-P0X3FLsTc=s+3)j$+=+EE~*O)zJyUK$?>oS7Bl*EncUA=)nPW-qIoj9$mEBc69 z4lHT_68Ki|ZS%U?2jW9BH(={a7dp>7O)$S&x#$)ls3_>|Ai~zTX{Ud!@DHQiIZ?xw zTldVFQb3B2|9etCc5*B$8E0kjVaZ6{R0U+19;j5WBRh?v_`W;fk7KLtV~%CyyU$^8 zx!di$2O=WTagIIfz*L#aIFBDlsgsqPj1Yg{nTFv~2++zE) z(ge6RrUUHM6;#g*XY^XN7k-M~*K=Cyq1$+g&pD*VxieI0CNtxOvc`-W)v>hUCWBA9s`sr%w>htE`KI*(Rg8H#TJwKQTa zhmh68Eca}9OiPx}9OJTpQm(#HXM5DZZwpheXfAD^2Rjem#It}{r7Gp|zEREnfPo_Z zbg`Y+YVkgDa3UwfL}P8VnIHYkJ>cZ+L@}LQ@^x)<<-38D)*0Ou!a`{)Zs4>#k`*(= z+m)vb-}-F_2^)(gWUv!u=T;&O1r86KeCVk`&!w_qoSpbH#@r> zDu2ej?pBAO{%aG5By43$*GlTlhu}aHt?K=*XOHJ^6C-FjKi?sl*B~nsm+5dPyT4#| zU`1|ooUiAz-DVZg_C|SQi*3M-G75^hu8uEjk%MoZ7Za~Yx`u?ct&6Yx8l~)-l;arOzZP7v7ph|CS7dYC@h-PS9qVOsBwS*Z8Z2qNl zY}s;wD`d*fHd;2(26?mqr+?}|$H%_rg4?jp(MQuue(jQ%c zMC!m(v#p9fO=VKOE-BkmGIsC?mP-FU^?L4+Ja@gDQdoY)zRo3cCMHJvP-#flgYdjE zM6T5g1AL!un`UON{%Im5qHm@>RSSYgYvQJfvzA80-OB?`7V@9)VTHjo#93fnVq^0; zu}k?Y)_#2*9J5-L>Fs|^7?j5tze6=ySUHa6J=YHDoAN*vnhguW?aR)JjaA_v*Ochd z*GI)Dyc?xI(!0FS=&=Uo|JAXpgZ;A)4~=299d*YxB9aJ~q`>dP!!zXbMaj#{-tGwu z$u@p<(dQRtLZYLs=(S;addcD*_3B3vDoco+xAIYLhG~Px>M!1b_3KKm&{~=DrZlm= zwx(Sb>Fdh(kh6a2!!eK12T<{p{(`i8KL1Hoq}-Opr%N0b{mjzbXx9UG2dRBs&qoS8 zT&Z@57ouRd>u6A&>8;l$x=U9UQ>(sKT^L!Qqb1gs^q;J8*Zbj|E!Yv1>}rMk zVQB-Uj=T*MFx;5GXoJXrEyR9%D6~Ki!ku_i3JywB&qkc{*;+(2T&encUdA{6hC{t0 zKn^mxuVeaD$|D7-L#yq3TH8T?PJH`z)*4srPqUDT%LU@D6(c=(7&lj0=@-||Uwb2^ z-`Mt|d5Yt)`y0L8R%~LW_{w$J*08GCTB95NoBIe_R1NIuo{?^^hUPk2k4yIqKF({) z5Zki3`!EEam%qHG4rlMti>l*eTsiOnXHMR;QzA+ti&!b`a$i z7`uaPa^p%Jp{%1D*vxXbdiw3rcVE`UUd;AjOs1st!!Fnp9pT0g#(wmNZ$GZk zCvcPOu#{NTxo+=#zm;SgN_WPf6KBi!4O)d!c>`2?mHkqMQ%L7Wdb&_c_0}A-BhGFz z#wtLhp859O++0*N2{Y}Z4oJg~ z=k1i66_SXuwv1vz(Qw6Vn^N`B7yM*0^n>x=+uA8X_&gzT9S*8vy* z5Q`88>(>A9`?ycYywvqZF8_sd5=u}j!UrcvMR>|gByyB~hP(o-8`Z7J%&hN#FuKh6 z9{iED?2XQG0M;VpBwejky5(dnZG9(adc!^Ugk{CGY{fHfRo%5l+QFOq#%`|g>*gsS zXl4!(>+=27pvv4L+pP4{$JC0qzO4XDIJg0eqYh5(Wi$*?x)KprVsO;R3rur%mDvGQ znJ$AhZZRK6aP-;%jwLs7cv?CT1lT1;EL1h<&&d1?`_wFc@I0(Cc4V;DA^~iuxlKIb z3$Jz&LI$v;zaxrYdChK=@wJ)1k%OzG);jOw&$xNPSUF~9&k6ml73nmrs+s1;e)o`B zKc_m6!r|EluZ}XU+Ldq8=&%7L4%^?wLSvXZU(p6X;zN z2FRrJGmdiV$gHbcww>HiARr{)rJ)hw7H)!>zPO2(OeJk*jHXP4!cxViDxv^SK;!0jM2<(jC-3b>Zc@tK1L*?35@mwRc3M;@tT4XP9!6_OB?iUDwNxGBH~a1waf@95-6(b) z)7bGgfLaz@>t-g6W%;7zy>&{9M)qGQR!CnbFfh?XPD0Gy%JB@VYho~FEYGgE^2 z5s-^*Nlu3u1?=e{-jFN&v%#c~>SCJ+Sv0Esx8nXJTZE6r4ddt`TRLq&1j z&#(G0BcYY6n%HCAVQLqJI&}h|y8a)=-ozj3_3t0A<3vYEol0eGIW5PMveqytMY2}5 z!BA-ohMCCN#!@*&*(xD4mh5JWF$hD8$iB`D#*8A#j4@fpXc)flIp@Cb@BRCHKHtaV z_aB&gUGM98J-3&g>TofJzS#7VPdwseH~<1(!sk}j5b!t&XG`77E_LhT^xDW~ z0Fm!i-{wtL{c(_@jX8MJ2>l-U!o^e~#>{3oAzb#cj&;5g`;2S5k9@hcb_2>`_cLO0Y#MGiP_r99R5k@}qBX zZrpL~5l;+lYjZBTqMMPE1UkN?>i^vr6Yb*t+eV2Dx4fYEPLI2xH8-kP6f-fNrU>V4 zmrjZsU!X9?(G2rh8O+FUw<@Cg-_U!y33weHzQv73O;S(3j#*qFZ-y7F`NfNhT6-%6 zMVPGl+7;ZpaVCf-ctb;i3zSA9X8xH?bg*%!3x0>C8pf@P=WXBgnK)<#wnR%|HYF)r zhnr2`Sj;YOop74zZMKk8=)x(1CW5L3I-T!r|9*EIsCxq zw2MAzd5a^N$z1;^Z4FY2hu&;Ku*Yg;6;!wq!c+gfV^Cm(PepP|6JG8S=^d|rSZq{nzpyJiE9>1|WS5`+o?Q3xaWGR|r+vu4w-$b5kE2711 zrZhz@|C}kzXiKv$-{_yS|0oc=;y(bykAD?fUMZEx_>bgkprF9#^`g2@{i7&hbgCip zYxXs@m=eM}(3w!o$OtiI)^vSl?Q58l%U1zOI%WpFC1P58#UO$Ox&iaF3|JG6wA+&F zc4L4rTA_5`%$b;wA^tP;fUXrA*!9C+5^S5g!^%jTdgm;0A4T@gO#8Ir@GWKqyMPyB;={U~+RHyIIQf7W z;7~mD*>ao5pSPnXwS<)I*Rvw|KnY^i6_~dae0=!df zqeotQ(}$2Uo2krSWR@c$>V7+%Li2=v2w3(?FP5-$XXaYSN-&ozw3J%$N8R8^!{wp} z!4$iGu1yqHt72IUJf6SoYd(ASXS2_j$K&QaJBq23eDq4?^!vUiu_{(V{qObZNG2}T ztdj=MM_i7SbhU|r{Q~oi4R*$FwuUM4m2(+R^p?Qs!;?`HF%8b#Ht+jY9VNqc$la;w&-^p}172p7 zv+$7i$-v2&^hVJ&fb+@-YYh5noV)ot&b|ggM;|4{JO=p6VXaPomo{`mqd^JqCJ$ml zS|_Pw)d8S+j72cXXo}x$e{wHe>XwI>Jt`iM2zmb^>Lnughn?tX%sEXz$dx>z{QcN-`q$o;^Sw;LG*bL%Y)!q&xhwdW@7p4hgFJoORJvY?yO4*dFw@alduG_&jGAi=pEed!6|3RBN zP$Wbh7`paXTCW_}aAn*jDrRG{!(A61*Uz=L#}o&h>;y7G#ith^fzSkEsZ2|C#bT-X zdeECM1XP7Nh}iIH~lchIlq#Z!2!m`RnaFS$hgu4EoqtAUNMq~l4L6ZR6#~bZL zypZN19;(xFX5AFxua0kg9{j@?v60EP$*5=sX55F;NmyGVdig|Q`(uWj=~5aKRrTqz zVKenU@&~PZ{YmwO6cSL)CM8ynh7=d=O(ZPZh{Q;X(zV(*^xOspOYg7!fk)&;Qo3@MPz2V z9LpI^O)=+wcROHu&{D7&yk>wbED97nVTVU3&-H(}*QVo55;gL&Z&rxE5)xf6Vxa66 zH!!my_NyNkBXAw5@EqUflu@?sH;r-5dYDkCg~LB$_5@*!J45NIomhO;pM?8Vb;G64 z>dEm{3_!tY?*B&RvfG{kmG9UND{kRzHU7`YMqWm*Um|k6!p>LF9@-r_{=Y5*uxj9E z&A?Z`=|WTKU?qf6soGzI$Y?-XnEQXe|IpvFc#d5Yve@?S{$QSy)E~LgmT}~{#_4`Z zo8TX&h|d|GjJs##G#!qbsz~>86OuPfjQsjquzlGPN5FL}fPUET`&V_gm3?d6fZppK zcT1_A`r%jN*q+#RJMT@N!OHO&u?@a{lPdw69`LTUy~?lNSJ(d;gt_@F%P`@TK{OEK z^9dR_T_Vg1J8~!&8@D+$VJhSobR^lPgd~ob4r|n;Vx_N&IWMe|#T8MEWNP9Ymx_I>-_VKv~Bz5x1T@<2&F%=ih5bJA0MqA9mF^86dQ z07vZk&9X+R3#uIjk=fm4C3ox(U6;G`q$2M`S@9hQfiW|WKA3iNvObY*7_-yN`L-8d z_}&_&M@w%EKGIqF95cUNw=zO%_k?ir%dv!EIZTAywX+ol<)e9~;;A2$t`2><3R9qY z%7T@UNYV{uSqrDiqJ+7J17Kf)fT}LujT$->e1LJJE%<{@ZZsDlH@C&bnYVN2*J+{j zYw?53?0Gn?GQ2>K+uKL6iOQj*DO|@v9(zV%0n?0Qm{$t4->Ud||$J-7TFr6H{{7t>OJTAKK8>r~|1`uH`1r zJ(?-FID>W@;fPeV8I=H{sUY&|U3~KFYbp{CI=6df82S-BvzuZa_f2BPN?b|~y+T1? zwqv0ugS%01ah=H*!GW^CmofXZeTJNx<2l!tvtvvoJ^136ci4MvJHG+~c$&N>Qn;ZrO{A4v#|(o|D0g4P{;`bM5q?tpjU&a;?kTgQ@|K zsT3EvooE~PHcF{<#>}HkH$!oYM;2q3(nfTNlHSDt+HWkR`4Q5+sRO+$1^47+t0TD4 zYwgpvanpJ`nbH(Lv)mLdPvW~>q{ijY&Mf_|KxWNxLuJhtZ;nOWa_IrcP>`y2&d>EW zpn_HAK~99>?;*1wAGy0ecU5kl#hQVpLrm7cmyI7a#Tb4X@ZUtJvC4e<-$y}#xqXM? z^$dN)lMZ(Hsp|XG?2G3*9f^Jx^=B^4$~jm(2ZS%bNhJoW>XOQZR>7;o%p&+#^h#u*X;2gQBd@Iu5N-*Ux9+!5>H628muaz&1XkU-Px6h%yT*Z+&ND( zQkg)no%+`~*QPzd&%JLP3eiT31<2Qz(}UNVm2Bs>Rmd zsK5HcsUS@<=kBL5z;nQsiFo4hbi}&SXt`?h0^LaMnBnM>VSz)|`@-ximzv?*a(th# zD`WS^a8h&Ey<_dOlP{4MIsB6ZpAiXUO%n|H{-8fqygn?7CB?4 zJy88f$eh2lLwY;poQKl(r!m>?f5RRC&Eq)3^U{bm;Pa0`m|nf{J9zscaK5V)?Hh1M z7H+@L6;l44^;PzK5mv0uPs%()c?Ma3coeqbR_+#;+_nrl4`{l z2jd@xUO9H?riidqdI)kbK)+#v-9eJYRfaEnnnPuK$Bv^H} z{V9jukW#*5lwp0Bu8jV^;Mv{IWJjDg;r!OfTi z>T5h`aba(~)T@d(|Idv+PbrHN61lMlCdP~Me5B}aDr9!Kio4foAGYEH9y`6cb#Efm zGXki_9vd<1@3&Ze4f3N01T7*=xFai(>&b}j3tLt)ZFN0wdZv&LR?F;--B z*m=;?t59&=lQtzHoc;TbUr1};ogpRBK!zKD z$mMhMxBTP{6IM+ZIvVf`5H4=qNer47`7L$`hn;yLz(Zg(b;Mu%zi^NWgXg&MIJ5j@ z5$I{_otYTwI?8{I+WMspeGFF{$z|3>ky0q3tcSNd{L<3A6DUmvuq}9`N~(TBGPg_8 zG&+cx&T`7UcmZGkA6Q7gt4Dj({UBH$o#??LR!(V*jscPCL9ijlbzJ#DOZ<-grDGevb%3+lC!7dm5-Uo_3{(WbJh0IhHOyfyl`3$X$~;dP&m*y*|SgJ4*X2CN4iFZX)&`{$uJOUe9DXi2iIMO zB}YY$;;fo)7$YL^9mfJo(R+Tsteu+7B(fur(GO<~P;NLi1+8tsZ>xknrP+&mx<2Us zh@7%n!=i8EdIvB6ZIXbr>bp%vM%k_n=4s37j<1G0t{5x>8%yk@w@1RrVLTmj$JeDQ zO#tti&8Nvh%Jj^Fm_6XPtxVNj@c_C%fMC8U!&X<)kWN2K zO|DUFspziCA@G5pk2oB@a+BzEHMcMR3*_+kCti@TzS~1^>K{*?m*|F!>Ac_O#6vEs2t{+Cf3ygH5rlMsZtu z?Xl#B@X%u|F|~NR{NcK&!GnG%tR{7l>25&h)`3b+QrEuS@~UJhJ0$I9&Y!6TT@k2u zKiS)xU3|c`30ge_HSMfpdseFwAs7m@v_xjO76*zE=mE-N=Nj#F+OrW)y~)?L(Bl<5 zD&9esRb`))AqyA!+`YyNr0@CFT&CSva*MovpJQCH`hDg{#W)8%uzK#o><}P^_nMf3 z{~R0;7*I^}qP|U;!@elBqc2O2hSJO8&Zp=8oM(irm zYUA?5eu?k`R!hJ&40+@dm{`02^b~ZC56b82w_>rPkp`#mE!@uT?j@?m!m%%qA8Iuu zuEd2|nm#Bn%2qQN`-3=M0&QqSc-GsbWR~~rj2GV23b`4mK(SxSm)CxY|50_m%WdPm zHL(|(YqD%dqqLi3s(KV4-pt+MY}9+koEBg6EN57?H(-3^?g#OGIh#w=%4GEH(a%59uXtr};6KI9a|+G{O!d9Hyz zN=zCjoDh{-D-3W-asQ8JN61(t*|grofh+3!fOY}gp(d!%lDoqeW-CGb!G+qQ#xNI{(e-R$t)s75~eW({k6++pKJ7ym$cERmWWGdeN$E^gH`>T5M=MvC2N=gReb)4rS@@1=((C%ztuuh#0 zTmELVoAYsp09+0tB67O67N5qglfLLn|8>h*yvJ$%ofpWhy0?Ex1gTCt8*xO~9T$^e z78`Y*L;hxQAUA>Pj0n?E;~w*(Lh8gRAF}2P(V8s$mCjr1c=O~O~)HleH|J*w4sShw?419J#~h?1Xp)UzwG`w+i8&% zC^bGPFwc3aOA6H1N>a{jn5T3%d~2CP*KfDWT$Me6BOp4pZsT)a%^bY(v`Lyv{@!9o z$^#G(K=;Tc)q)s5_d(OTviEAIuCgZXxJKWQ?HL0$_t*j^oF9sqQ@Nampx9wLftmJh zhZ|7c8teY;K&D!y^TT9H?(9f~vJGO&W~?TqS(pEAD`XT;ozbZ;8yW{v;I)~I@56Q5 zwSut;q>D3=)so@Qbvd@LU-d`-oPdRE!+92*N*dK6s484-S;@^LUQ<{W$BcA*jVxxM z<$4rn6I}Ops-uREHFHLpX?KngB%|K0e*E$CqcwJ(;s)Q5QiJ#o16*cBK>t~+$qwL- zQ{ry8xsc_;2HH~3^lKI3p9V!-En>M81)OFQjEc3cT4ee6P79JF#nOJ0lTJCFy7?G+ zXr+!ORU14!-to3EGFedgRV6V%0A<3j<`G(-N3<#C#JJkf*B?iXODvmMH;V>0-ZcSy zM9S@^)4r-ruZ6ew(;kK7nG$s&*b#TH4F-2!G%xke$#f_#Xp|6^GauTq`#bpYFp{OT zt5W^n86wAGtMt0MS7nSw^q^GXXn9|IU7`Iq>b}r%9T1cEo0g>%mmn5YB466$T zlgO${iu1GPSY>;>G<~MM&EVRza=sm~ZJ>(z&g+^kZa5!Qo)yi1v+>BHttmG+KxI`V zEOF;sdzvmx$NFx6+gU%qOTKC_Y!ugf*Y!A{U=@w@>ZLvDVGf7;K*cXTbLl=x&mhxb zkq{$BP^IOTgDBv62}d3fhZ;y{HUnmF%iZ;4$*yny9#*~{La12v7yH4_Mh~Q ztU7$MDclJ5C_1+;De$P|CYYy4jsw0vJOii-$%c?9h|DmrUX3(wr%-u0eVNN4JbKsM zsKo|nV}7A}9^PKj7B+ZhXJI^N6n)wR3C$be$+c9B0Mgg=1J3*U+CcKxR*q_Q#}0x^ z5s_J;`G_&!ahU8oV#uBBRg`~s1v;ea|5YVkRWB4M=3$46>y`LO+{4{AfXrjCuP1oDR;mPh2H|NNzv@?8!B}#MeNYPty=pHTK-}yvpUQQGIUoBBxYx z5Li_%Jb%`{Yeq|N_IcWm_RfHwjN&Td{qR|HSrFFg&bppGj4W~z!=-_BEPdbub*T>* z%4PYKG7lZ5)Be@0`u$-=g-pa7>PCJ`QT?`)(g!Az1wmQuS?_G;`$y}@GsfhivU2XsQ`nDD12_jrbkWAyFj--!L%2mieP7LEm zVg;bM*`4t`r{hnOdOzCPj?Z?1ng=@(jO;d_qm0V2|NxcktstI zF(J%E`OYUW6xBP}(<>pPRNhr!z6&Jl1w3#R%}$`*B@2&>JnxA;&(STnD*|PL!NvrR zvFrwB8g)hgQ|$HYrI_tk&&jKh*j%r5flK=;CoJFlTDaLps`; zJL460wK3<*blqJoIL6EL_5o4qBxD(|P1&t3Nk6HG$)wHw4FYvq-+xlqnEkSaAW|a4 zoXNOX1i5i6J!dowxE*9JhUe*8bERx+zYJalys`Kc7_@M*J_yJCt4rOzIGw~spGFu# z#W=Ccnm?z;f|`SJTil>0iSc{Ox!=;y&7c=J-!FDF)y$T`)#(%oLDdiX`nrJt2ct9!pBk+spx5A?QdMoo>u z9RL=kM}&?AHJ=+j+@?Vof6H`Pd$NI#v}G?>LZ(Xn@~omi0&bwY?x~63=|+vjSUh}LAqUWul2x_I=4Zo69Z z3wYdrctl+FO>h0bXGCe}mVbV_Tu%#|+1V2+R;8Wl<2xC43~lPWtE2Crr~5?uEr)+m z_x^Bx?O~P5`SH^A^+t46Qr=svFpOml?3otfBMQcmTy#;6!HIM1h~C0>(XzOu*;4;& zh9;CfG@_Qb2ymtW4!O6UsN6)!+?n~7kNmv^r92v78DY3D5F2v#WmpXGEUI#vYPz4I zSeLH9QqQb$S9|x!Tf3J~=`T<&&k|D6qxyj4yBdZP+)kI#aP~1>x)7JXv`L$D3i!)l5VLV=>(BGwqV;TIlHUh z$;x(@&1HGEIj)`-KY6*b<`{hqc4=&f6V?Vz4p%zBXf8hAY*2SFI=5{V;Uw)k@`4eY zRoYYtbj%(Zi(HLskBgXCxWp$!x1m|#4u7e>-Y@^@)3rloOHDQ$K7f%bvzHeXRg}Dh z3mx#mx!)pmzm5p#4JUol+v_v9ibae;@>(k+nxeJjCdy`)V?7(X!jlftyC1(= zcBmC?NNh$OIdxI};)Aq#yxRMQ*gXvNWbk1FoaQ{e-Kf_+J-R-YbRd@EFJG{_1 z*;gaGJ{rtIA@mDR+-!EWU|F$E<=-o%U?$XYLl#T)(|`)?L&Hu8`4^Zdk9`Xr z#<+bEu!@n2MqPsZd&$_xMlVNr^`P8NF4m-WYnZ~G_U>W&N4uNQfnXTmnaG7z<7oRz zF|6g=vrA$P+f4=WtjoZXxNAmE@*ff4n})*owf(&r)0&r=`7PdLu;B>7Lr<%Z_EABsc55Mc=>Ti zOKWW2jI^x=HD#_cv<2g%(kz_;17rVmjvH&dhvE6hO%*Yoo}A=gklGD2w+AiUiDD!A z?n}cF4xz>e?WOp8zAZ1q#z|V?Aa4V&{%6HhShSJ$uQtuI(3T zX1>hhDi_5F?OrV-(^lq6wkjiWRNRmX_Z*4?HKO(2`T;4vKe)H#Ji2lq-AlQuBafC_ zta!Rmg^wIyb8toC-{zSEdt)uhChMA#?ao%LW4Q%KRb)GrUc8kIJQHyAeuox4oBvp{o%>1(iQq^$A$F^bh@5^5-?>wtAp2PI% zA5^W@h+RqZR^n&wwMki(o^6=o4JXPxm60XDYZ{Q z3Ivh}?;~>B$e?W-jDDQG*Ml5~7?Cs_yJgf|8hKIrzCxBT8sw^?gLL-_9cT-`R*3B- zK1o)06QW^d-P74CJNhJ{(4Ze!6)`5**~SF)E`Z%Qf7QU39w7FbF7Nq`L{wv-1-G@e z>~Rd<7=mKwsRAa=4!-d}2P@Y(!fO4bF<8{m30VA_DpOKmJ#eoSH~GqO%|hgnw$ad& z{?05b*hA6z#f}qO&g{wkLBG=c*J#=DS>QXQazbq43>-yAvM*Gd6qOOAG@7%ej<)QB zTOfaeKMthC{I^!HTm>aqQ5;d1O?SEov{7Q?NuHDa0^P5zj?L;>2eEeSswDmgq%V^N z>Tv9T7J&`;M-0o6WS4UCb)wVuVNlveOu{vNd%3sKYvuba0}GoI@gslkRi&KsR~+LK zj_9xSN_S*&Zr3U;89X8GGyJ6r^o(|c^bS^&YtjZh;BvYiuF)9V8rW|i#mabE)>kh& z_+P(|Zh~Wl^P4)C(nc1Me|#sq-@W7`mtr=%4?z9Ti@TT0PsPyR9?>uym~xejw{@n< zJjHWE-Q(4}#(K6pv@osb&)$`9H)=bs;Pa@)wG&)UxT4qKWF)2`R#<<9q_jM0!2O~; zAMl9X9bL|=rmA=;SM}k2BDF~1{*?J?+sun4(iwg}X9y2Ck?8Fg5hWcpPixIi~xmGXtVEq{yRnIx)k8sCDj;MV|q# zyEMy`x8HHDMD64a`+fB5?%j%t+G*zI4T|@)C^vXFyg|!#+Zi<+rM{|RJU3o?2tpMA z@emtNE->_5@vct56w{N&Rd-IF`D|NNCGA?N3>0c}E zu%H!?-mLe0b$i7n5W}2_k@Bq9ATq<}lSbNP=wB2S$6iL9%2M|I@W{8f8k6B{0o9$O zi>TSVs+lckFMoA`o}6mw->?++&~*#&04_>CKF@g(1g%y2Ch!V}<$2o2$Lc>clb64Y z%5y2nQm;J;imIk>AhEli-6rp^!biw@)N+gX8f;I&A1G{S5_6t6OZxx!+3tS~5m~igl}ZlSc|5~gTj?O@#d>C} z*y;DLPNi?|!zDzw>k9ALEwh}k4@}U_h62V@75Q)E)+em34sGJpLjf zqGZ&!DKO1F4{E3!l6J5uVmMLSZY?@eWoAC2>|UtiZ8(a&%RYf8$jt$%vm zaBKC;bD_ih4BBtET6K?2$>mlBABi^CO|yXbJ_f~fTLJ}Gv1g`Y7eG4IgUT>Ji#}5%snovTqF}V1;84v#WR_g z2Pa&4Xz?jzSSu`>;}^T$IiAKq)%|3*3f^|S4Pl)!fGS*0$3f)76FWKhcQMaORx!|uA5S7Qqw+@p%zGv-%|m<0+Qv=}FTD)%ln zn`o46aHn3nPdxxe!sTvAk{FtaT!M(L=Y6AI>mWgnPpch|oc?f23H+ytibct~N#je2 z?A2XG>}OL9Pm;lc>%W0D4^y=p6e0p2zJgV8X6otIVmu?n{$v(s)Eh#* z>ifyPH))l*gc^%Ehkp!9H`F1e91va$`Ovt&jWlZ=A4^lqr6Joj25&l0n*i+_0sk4wbg2jba|0-p z_xWXPR(cKl#wcg63CcL>8rEn5CWJ?w8I(*Ye0`F@d z4Z^a|yQnYf7ZN)Rs6LF7v?ES=NsQFw&hzE>)*={ka(`Vr;h=lkf7vEbO{P!pjPn=B zgCCj)mA!I8l4i2v79Gd$b^w;<0sptyW$ccxS@Wwno(bT)uq328Z~iKQ2J_UhVCK*j z#>tj>KnNzMYe>?$pTen2AHLn(Thk8;wWExpM(aFZAmc~PH|=@rgw-KRg;uzPIgXSW zyvfJ|!Y4O?Bu+BSZQLZUmOu-fWZ++>aG89@3+gsi-(go=C|{g%@Q@yys8n_;@pAONTEF0k=a6Yx+*WQ z_UavI6^{S0*$l`V|8pS5)r1|tjr1RxaUC)MfCR=Ckll zbwp7Q0*XWD`hfp35A@N<91sHguM8@-m2V$xju7WM=k>1>y0cFf<^tMFm$zh1%QIM- zc2iFv10&w#M_uS~N8zJ4U93ep#f-wQVy!lRUy@Q7bZfp$U;Xy~5zIUvdS@&{=!JV@K z+Bcs{te?8bzCHc98Gn-3zlC^vN^J_Da*>TjcS>yJzEMT>Mv7eZVdC9}TBOGR8hb0A z!HL7Fudhq)0Fu(48dKE6q{D{4>wN~k{|Qq&h)?FbEz%#bL07++5z+uJGobiFJh6vD zHDM7M^W7hi>4mPQohG%Tr}_0`k7Q5#wGt)k&_+tnTUC7U{oJTJd_y<6$hNsw^?jkt z3*RgxQ6r#ub7t zmKB@yJXzr={!D!gglPmoC4@73c4>6F&tXyDntvLI`|7OjFOuHy3K9gi$B=y(Pv%#- zZi^iV6#U_1!4J7D$Et~(FN!OO8$K=bHAx_{s4ZX_L32Uxh?KfD>0pa9v-Jo|lQe^T zz4r^dJ~xPZ3K`!T7pwI=$Hnv80UK&5XT-DF1QT)o^kG;P zSkIZ!D_QNdaL4#V12m`JufG@HyW6zS4V|&_E;6DuP-bN2L)ylg>JO>-mS7vO_G z;i`p${^NA;a)F+(2M^f`=O#fzUhAO|3r~rmfukGtrdNHv-G!MyhpG+g64q4 z2iGc>?c5soGr&L|1unOXk?Wzn9&0c4?9-EaB5mON8Y|86djsrH*;hIE@JeowWkmfE z=y<#jYyi_5S3+0>N3($lYKZv-LyLec$XAQ=#&6xnQBUuEN!Z;FSRQUgu_=+yg6PSh z^hDXy-$#kDlQ{+RZ}ME=3A}2}UR?lL5rX${;aStp4d0-dOq$Q10hZ7({U-xCXfyl$ zLJmiEFY|7vU6=Ybkp4-d#`=eHV|}Y`XZL1anW;JyQ)fjFNDmr$Ccv!ToO5ZP)pI+p zTJ$(!m`H7UII=xcolFEU@~!-sTwpWI#i}ONiK2B?YRQ4RiD*Dhl>4?>&6hvw(Na-ER^MeBsKTlooTO-z(SPmhWcwIwQ7bQT|rvh#3i%NOW zsT3NTkbGkb=5dT`#0Vy(U1MT^;{J`nmrUu;B;4A%2Mu?MzzYr_md9X zMF;l5tGx%%PPz{wxjyB+$_(h%&EDynxW=au=q_gg98#oN32>ME2v{EN;v(>6|9i@_ zUBS=0L`orY&BA-f)9#owHE|UQH8r)-rIF-~%cP_M#7rpghVlXT8L{L)6Lx2YNwWG@ zD#ujY;GW^_0xe-Wyx-(6=c&@@62RH)#q?t9ZwByv5FSWQ16I$9*a&VB&9z@fEh}Tl zw)nwaUQ@!H`QA5~`~wWgpz!v>Y>3f?mip0uOZ7Xb+~SwJ?c5a+&RLsY3PK>nm zmqy4boCx+l)$6Hudv^6X@S>F-@q2y4*tG{VJ~&N9$_{rwHkylR5jRE{+IdeZsVRo! z<^sJGYMQv+m;77raNo9Lo>h7>wqJ0wk9+#q1gvEu1ibyg8r3NYwx2n{@#-|L9i`CF zZ&WB$sI{%wYqOW!_2%jI>qB?5c!cy z+V%|qeNuAjF0jSOfSjbZrzHMSknLM_H)kwl8Yha;C!;*8zIKDv!0OKcC-01qClL+d<*-l_##zXIo+dfs$C@sk_YkEcf zyq$A?)r;5lBNs*&L~C-^Z+MJn%I>JesP!SVXWWRZNo-L9%ndLtEOK5DIK5SuAUC;R zX}g_dhPuwVk+4<0|1;Os{_s}apE&J_SIy&nE6p7xp(Gw~1vpbtQF$zl!X>t|Nd+>|lLwdjeT7I~R-euxDFfmg(8yAHCgO?caFWF{1_byEJ#)>!}=8mcULoYBR- zMczRTbv$)WN>A|o04mQl7qFt?7Ts=m=^xWeYYjS{%L@6xL{{zn+kcR#=i3$T6Tf6u zuSu)xzh=st`Qk^rrzT&olt}gcJS_Y(k)2T8BV3AT1{`u<%N-)(c2BgHi0!C?5VE