From c34f51ac8f2044b37a87a0fc2b91c03f85a37454 Mon Sep 17 00:00:00 2001 From: huangzhong <568134056@qq.com> Date: Sat, 11 Nov 2023 17:38:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BID-EVALUATION-STEP/META-INF/MANIFEST.MF | 3 +- .../composite/FactorEvaluationComposite.java | 141 +- .../composite/BidOpeningHallComposite.java | 6 + .../SubTenderProjectEnterMenuComposite.java | 8 +- .../TenderProjectEnterMenuComposite.java | 8 +- .../MultyProjectFocusDecryptBidFilThread.java | 12 + ...MultyProjectRemoteDecryptBidFilThread.java | 12 + ...rojectRemoteStartBidopeningHallThread.java | 12 + ...tyProjectUploadBidOpeningResultThread.java | 6 + OBE-ACTION/META-INF/MANIFEST.MF | 4 +- .../src/com/gx/obe/action/bean/FAction.java | 26 + .../SupplierEvaluationFactorService.java | 35 + .../com/gx/obe/web/utils/ObeHttpUtils.java | 31 + .../gx/obe/web/vo/FactorClearBidContent.java | 39 + .../com/gx/utils/BusinessNowTimeUtils.java | 190 +++ .../org.eclipse.core.resources.prefs | 2 + .../obe/thread/AutoDownloadProjectThread.java | 16 + .../thread/NewDownloadProjectInfoThread.java | 6 + .../NewReDownloadProjectInfoThread.java | 6 + OBE-COMPONENTS-CORE/META-INF/MANIFEST.MF | 5 +- .../entity/SupplierEvaluationFactor.java | 152 ++ .../com/gx/obe/components/core/Constants.java | 94 ++ .../core/enumeration/EvaluationStepEnum.java | 8 +- .../components/core/enumeration/ShowType.java | 37 + .../gx/obe/components/core/global/Global.java | 31 + .../components/core/inter/ExcelReport.java | 12 + .../core/inter/LoadPdfFileView.java | 9 + .../components/core/inter/PdfFileView.java | 15 + .../gx/obe/components/core/vo/TableXML.java | 21 +- .../src/com/gx/obe/components/core/vo/Td.java | 42 + .../src/com/gx/obe/components/core/vo/Tr.java | 42 + .../entity/evaluation/EvaluationContent.java | 100 ++ .../entity/evaluation/EvaluationFactor.java | 35 + OBE-COMPONENTS-MESSAGES/bin/.gitignore | 1 + .../BidOpeningResultLoadComposite.java | 5 +- .../common/dialog/DownloadProjectDialog.java | 5 + .../dialog/ServerAuthenticationDialog.java | 6 + OBE-CONFIG/config.properties | 19 +- .../com/gx/obe/config/ConfigConstants.java | 10 +- OBE-MANAGEMENT/META-INF/MANIFEST.MF | 3 +- .../EvaluationFactorsManagerComposite.java | 45 +- .../SubPackageMenuEnterComposite.java | 8 +- .../TenderProjectEnterMenuComposite.java | 8 +- OBE-UTILS/META-INF/MANIFEST.MF | 1 + .../com/gx/obe/util/element/ElementClass.java | 72 + .../com/gx/obe/util/element/FieldInfo.java | 68 + .../com/gx/obe/util/utils/ElementUtils.java | 23 + OBE-UTILS/src/com/gx/obe/util/utils/Keys.java | 4 + .../com/gx/obe/util/utils/PredicateUtil.java | 12 + .../com/gx/obe/util/utils/PredicateUtils.java | 20 + com.gx.obe.bind/.classpath | 7 + com.gx.obe.bind/.gitignore | 1 + com.gx.obe.bind/.project | 28 + .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 7 + com.gx.obe.bind/META-INF/MANIFEST.MF | 24 + com.gx.obe.bind/build.properties | 5 + .../src/com/gx/obe/bind/Activator.java | 50 + .../src/com/gx/obe/bind/base/P.java | 134 ++ .../src/com/gx/obe/bind/call/Call.java | 59 + .../src/com/gx/obe/bind/call/Callback.java | 5 + .../com/gx/obe/bind/exception/ExFunction.java | 7 + .../gx/obe/bind/exception/ExceptionFun.java | 46 + .../src/com/gx/obe/bind/fun/Fun.java | 63 + .../src/com/gx/obe/bind/promise/Promise.java | 137 ++ .../src/com/gx/obe/bind/prop/Comp.java | 34 + .../src/com/gx/obe/bind/prop/Prop.java | 103 ++ .../src/com/gx/obe/bind/prop/RProp.java | 34 + .../com/gx/obe/bind/recursion/RStream.java | 21 + .../com/gx/obe/bind/recursion/Recursions.java | 167 ++ .../gx/obe/bind/recursion/TreeForEach.java | 7 + .../src/com/gx/obe/bind/rx/RxBind.java | 80 + .../src/com/gx/obe/bind/rx/Status.java | 35 + .../src/com/gx/obe/bind/rx/Tangent.java | 21 + .../src/com/gx/obe/bind/stream/MapStream.java | 59 + .../com/gx/obe/bind/utils/CollectorUtils.java | 14 + .../src/com/gx/obe/bind/utils/PropUtils.java | 20 + .../com/gx/obe/bind/view/ChangeListener.java | 15 + .../src/com/gx/obe/bind/view/MView.java | 3 + .../src/com/gx/obe/bind/view/RView.java | 3 + .../src/com/gx/obe/bind/view/Read.java | 8 + .../src/com/gx/obe/bind/view/View.java | 8 + .../src/com/gx/obe/bind/view/Write.java | 8 + .../org.eclipse.core.resources.prefs | 2 + com.gx.obe.common.file/META-INF/MANIFEST.MF | 6 +- .../obe/common/file/utils/BidFileUtils.java | 24 + .../gx/obe/common/file/utils/FileUtils.java | 60 + .../common/file/utils/ParsingXmlUtils.java | 57 +- .../gx/obe/common/file/widget/FileButton.java | 150 ++ .../org.eclipse.core.resources.prefs | 2 + com.gx.obe.common.widget/META-INF/MANIFEST.MF | 4 +- .../widget/button/RectangleRadioButton.java | 38 + .../widget/dialog/ProgressMessageTangent.java | 33 + .../listener/ProgressMessageAdapter.java | 6 + .../listener/ProgressMessageListener.java | 9 + .../com/gx/obe/common/widget/rt/Tangent.java | 21 + .../widget/shell/ProgressMessageDialog.java | 6 + .../common/widget/text/EvalFactorText.java | 52 + com.gx.obe.component/.classpath | 9 + com.gx.obe.component/.gitignore | 1 + com.gx.obe.component/.project | 28 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 7 + com.gx.obe.component/META-INF/MANIFEST.MF | 29 + com.gx.obe.component/build.properties | 5 + .../src/com/gx/obe/component/Activator.java | 50 + .../gx/obe/component/comparison/Column.java | 23 + .../component/comparison/ComparisonData.java | 68 + .../component/comparison/ComparisonTable.java | 124 ++ .../src/com/gx/obe/component/form/FForm.java | 134 ++ .../src/com/gx/obe/component/form/IForm.java | 19 + .../src/com/gx/obe/component/grid/FGrid.java | 92 + .../gx/obe/component/handler/ISelection.java | 22 + .../obe/component/handler/RaidoHandler.java | 74 + .../gx/obe/component/handler/TabHandler.java | 74 + .../component/listener/SelectionListener.java | 7 + .../com/gx/obe/component/menu/ListMenu.java | 90 + .../src/com/gx/obe/component/rx/RxSwt.java | 58 + .../obe/component/tabfolder/CTabFolder.java | 182 ++ .../obe/component/tabfolder/FTabFolder.java | 73 + .../com/gx/obe/component/table/CTable.java | 299 ++++ .../com/gx/obe/component/table/Column.java | 111 ++ .../com/gx/obe/component/table/FTable.java | 203 +++ .../src/com/gx/obe/component/table/Link.java | 14 + .../src/com/gx/obe/component/table/Text.java | 9 + .../obe/component/text/CapitalMoneyText.java | 146 ++ .../gx/obe/component/text/DocumentText.java | 122 ++ .../gx/obe/component/text/FStyledText.java | 66 + .../gx/obe/component/text/IntegerText.java | 32 + .../com/gx/obe/component/text/MoneyText.java | 52 + .../obe/component/text/OrdinaryMoneyText.java | 84 + .../src/com/gx/obe/component/tree/ITree.java | 47 + .../com/gx/obe/component/tree/ParseTrees.java | 214 +++ .../src/com/gx/obe/component/tree/Tree.java | 46 + .../com/gx/obe/component/tree/TreeSpan.java | 35 + .../obe/component/utils/CompositeUtils.java | 24 + .../gx/obe/component/verify/FormVerify.java | 57 + .../verify/IntegerVerifyListener.java | 50 + .../component/verify/MoneyVerifyListener.java | 89 + .../com/gx/obe/component/verify/Verify.java | 11 + .../eclipse/wb/swt/SWTResourceManager.java | 447 +++++ .../org.eclipse.core.resources.prefs | 2 + .../obe/step/dialog/EvaluationStepDialog.java | 4 +- com.gx.obe.struct/.classpath | 8 + com.gx.obe.struct/.gitignore | 1 + com.gx.obe.struct/.project | 28 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 7 + com.gx.obe.struct/META-INF/MANIFEST.MF | 51 + com.gx.obe.struct/build.properties | 5 + com.gx.obe.struct/lib/Utils-1.0.0.jar | Bin 0 -> 476051 bytes .../enumeration/StructBusinessTypeEnum.java | 226 +++ .../struct/enumeration/StructEnum.java | 85 + .../enumeration/StructTechnologyTypeEnum.java | 121 ++ .../src/com/gx/obe/struct/Activator.java | 50 + .../com/gx/obe/struct/beans/AbsoluteDO.java | 49 + .../gx/obe/struct/beans/AbsoluteModelDO.java | 43 + .../gx/obe/struct/beans/AttachmentFile.java | 120 ++ .../com/gx/obe/struct/beans/BalanceSheet.java | 156 ++ .../gx/obe/struct/beans/BidderBasicInfo.java | 442 +++++ .../gx/obe/struct/beans/BusinessLicense.java | 202 +++ .../com/gx/obe/struct/beans/CashSheet.java | 60 + .../com/gx/obe/struct/beans/Certificate.java | 94 ++ .../com/gx/obe/struct/beans/ConditionDO.java | 101 ++ .../gx/obe/struct/beans/CustomModelDo.java | 54 + .../src/com/gx/obe/struct/beans/Finance.java | 372 +++++ .../obe/struct/beans/IntelligentEvalDO.java | 244 +++ .../com/gx/obe/struct/beans/LiftRateDO.java | 159 ++ .../com/gx/obe/struct/beans/ModelData.java | 54 + .../com/gx/obe/struct/beans/ParamValueDO.java | 32 + .../com/gx/obe/struct/beans/Performance.java | 658 ++++++++ .../gx/obe/struct/beans/ProfitlossSheet.java | 132 ++ .../gx/obe/struct/beans/ProjectLeader.java | 216 +++ .../gx/obe/struct/beans/Qualification.java | 154 ++ .../com/gx/obe/struct/beans/RespItemDO.java | 82 + .../gx/obe/struct/beans/ScoreOptionsDO.java | 35 + .../gx/obe/struct/beans/SelfEvalParamsDO.java | 70 + .../gx/obe/struct/beans/StructDateInfo.java | 59 + .../gx/obe/struct/beans/TemplateDataItem.java | 100 ++ .../gx/obe/struct/beans/TemplateTable.java | 82 + .../com/gx/obe/struct/beans/TimeModelDO.java | 138 ++ .../gx/obe/struct/beans/WorkExperience.java | 126 ++ .../struct/composite/AttachmentComposite.java | 56 + .../ClearBidReviewEntryComposite.java | 317 ++++ .../composite/EvaluationContentComposite.java | 242 +++ .../struct/composite/ModelDataComposite.java | 129 ++ .../composite/ModelDataDetailComposite.java | 147 ++ .../TemplateTableComparisonComposite.java | 124 ++ .../composite/TemplateTableListComposite.java | 125 ++ .../dialog/AuxevaluationFullScreenDialog.java | 49 + .../obe/struct/dialog/EditOpinionShell.java | 429 +++++ .../dialog/FactorClearBidStepDialog.java | 176 ++ .../struct/dialog/SelectStepExpertDialog.java | 166 ++ .../gx/obe/struct/enums/DataCategoryEnum.java | 35 + .../enums/EvaluationFactorTypeEnum.java | 23 + .../obe/struct/enums/ModelDataClassEnum.java | 30 + .../obe/struct/enums/ModelDataTypeEnum.java | 126 ++ .../obe/struct/enums/PerformanceStatus.java | 39 + .../obe/struct/factory/ModelDataFactory.java | 1476 +++++++++++++++++ .../handler/FactorClearBidContentFactory.java | 73 + .../handler/FactorClearBidContentHandler.java | 58 + .../FactorClearBidContentStepHandler.java | 86 + .../handler/FactorClearBidFileHandler.java | 84 + .../struct/handler/RelChapterTypeHandler.java | 42 + .../struct/inters/IFactorClearBidContent.java | 23 + .../com/gx/obe/struct/inters/IModelData.java | 25 + .../obe/struct/inters/IModelDataDetail.java | 19 + .../listener/CellDoubleClickListener.java | 8 + .../struct/listener/EditOpinionListener.java | 6 + .../obe/struct/listener/GoBackListener.java | 5 + .../obe/struct/listener/ReturnListener.java | 5 + .../parse/BidFileIndexTreeXmlParse.java | 69 + .../struct/parse/SelfEvaluatesXmlParse.java | 138 ++ .../struct/service/AttachmentFileService.java | 30 + .../obe/struct/service/BidderInfoService.java | 32 + .../service/BusinessLicenseService.java | 28 + .../struct/service/CertificateService.java | 30 + .../service/EvaluationContentService.java | 76 + .../gx/obe/struct/service/FinanceService.java | 28 + .../obe/struct/service/ModelDataService.java | 31 + .../struct/service/PerformanceService.java | 28 + .../struct/service/ProjectLeaderService.java | 32 + .../struct/service/QualificationService.java | 28 + .../struct/service/TemplateTableService.java | 29 + .../struct/service/WorkExperienceService.java | 30 + .../com/gx/obe/struct/thread/MyThread.java | 58 + .../struct/thread/ParsingStructThread.java | 303 ++++ .../thread/ParsingSupplierRespItemThread.java | 129 ++ .../ParsingSupplierSelfOpinionThread.java | 170 ++ .../obe/struct/tree/EvaluationFactorTree.java | 71 + .../com/gx/obe/struct/utils/ElementUtils.java | 20 + .../struct/utils/ParsingStructXmlUtils.java | 813 +++++++++ .../gx/obe/struct/value_list/CreditGrade.java | 43 + .../com/gx/obe/struct/value_list/Finance.java | 42 + .../com/gx/obe/struct/value_list/Goods.java | 41 + .../gx/obe/struct/value_list/ParamValue.java | 31 + .../gx/obe/struct/value_list/ParamValues.java | 23 + .../gx/obe/struct/value_list/Performance.java | 43 + .../obe/struct/value_list/SimilarProduct.java | 64 + .../com/gx/obe/struct/widget/TabButton.java | 68 + 240 files changed, 17727 insertions(+), 39 deletions(-) create mode 100644 OBE-ACTION/src/com/gx/obe/action/bean/FAction.java create mode 100644 OBE-BUSINESS/src/com/gx/obe/web/vo/FactorClearBidContent.java create mode 100644 OBE-BUSINESS/src/com/gx/utils/BusinessNowTimeUtils.java create mode 100644 OBE-COMMON/.settings/org.eclipse.core.resources.prefs create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/ShowType.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/global/Global.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/ExcelReport.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/LoadPdfFileView.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/PdfFileView.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Td.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Tr.java create mode 100644 OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationContent.java create mode 100644 OBE-COMPONENTS-MESSAGES/bin/.gitignore create mode 100644 OBE-UTILS/src/com/gx/obe/util/element/ElementClass.java create mode 100644 OBE-UTILS/src/com/gx/obe/util/element/FieldInfo.java create mode 100644 OBE-UTILS/src/com/gx/obe/util/utils/ElementUtils.java create mode 100644 OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtil.java create mode 100644 com.gx.obe.bind/.classpath create mode 100644 com.gx.obe.bind/.gitignore create mode 100644 com.gx.obe.bind/.project create mode 100644 com.gx.obe.bind/.settings/org.eclipse.core.resources.prefs create mode 100644 com.gx.obe.bind/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.gx.obe.bind/META-INF/MANIFEST.MF create mode 100644 com.gx.obe.bind/build.properties create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/Activator.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/base/P.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/call/Call.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/call/Callback.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/exception/ExFunction.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/exception/ExceptionFun.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/fun/Fun.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/promise/Promise.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/prop/Comp.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/prop/Prop.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/prop/RProp.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/recursion/RStream.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/recursion/Recursions.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/recursion/TreeForEach.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/rx/RxBind.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/rx/Status.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/rx/Tangent.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/stream/MapStream.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/utils/CollectorUtils.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/utils/PropUtils.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/view/ChangeListener.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/view/MView.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/view/RView.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/view/Read.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/view/View.java create mode 100644 com.gx.obe.bind/src/com/gx/obe/bind/view/Write.java create mode 100644 com.gx.obe.common.file/.settings/org.eclipse.core.resources.prefs create mode 100644 com.gx.obe.common.file/src/com/gx/obe/common/file/utils/BidFileUtils.java create mode 100644 com.gx.obe.common.file/src/com/gx/obe/common/file/widget/FileButton.java create mode 100644 com.gx.obe.common.widget/.settings/org.eclipse.core.resources.prefs create mode 100644 com.gx.obe.common.widget/src/com/gx/obe/common/widget/button/RectangleRadioButton.java create mode 100644 com.gx.obe.common.widget/src/com/gx/obe/common/widget/dialog/ProgressMessageTangent.java create mode 100644 com.gx.obe.common.widget/src/com/gx/obe/common/widget/rt/Tangent.java create mode 100644 com.gx.obe.common.widget/src/com/gx/obe/common/widget/text/EvalFactorText.java create mode 100644 com.gx.obe.component/.classpath create mode 100644 com.gx.obe.component/.gitignore create mode 100644 com.gx.obe.component/.project create mode 100644 com.gx.obe.component/.settings/org.eclipse.core.resources.prefs create mode 100644 com.gx.obe.component/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.gx.obe.component/META-INF/MANIFEST.MF create mode 100644 com.gx.obe.component/build.properties create mode 100644 com.gx.obe.component/src/com/gx/obe/component/Activator.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/comparison/Column.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonData.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonTable.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/form/FForm.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/form/IForm.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/grid/FGrid.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/handler/ISelection.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/handler/RaidoHandler.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/handler/TabHandler.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/listener/SelectionListener.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/menu/ListMenu.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/rx/RxSwt.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/tabfolder/CTabFolder.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/tabfolder/FTabFolder.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/table/CTable.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/table/Column.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/table/FTable.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/table/Link.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/table/Text.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/text/CapitalMoneyText.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/text/DocumentText.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/text/FStyledText.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/text/IntegerText.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/text/MoneyText.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/text/OrdinaryMoneyText.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/tree/ITree.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/tree/ParseTrees.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/tree/Tree.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/tree/TreeSpan.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/utils/CompositeUtils.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/verify/FormVerify.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/verify/IntegerVerifyListener.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/verify/MoneyVerifyListener.java create mode 100644 com.gx.obe.component/src/com/gx/obe/component/verify/Verify.java create mode 100644 com.gx.obe.component/src/org/eclipse/wb/swt/SWTResourceManager.java create mode 100644 com.gx.obe.step/.settings/org.eclipse.core.resources.prefs create mode 100644 com.gx.obe.struct/.classpath create mode 100644 com.gx.obe.struct/.gitignore create mode 100644 com.gx.obe.struct/.project create mode 100644 com.gx.obe.struct/.settings/org.eclipse.core.resources.prefs create mode 100644 com.gx.obe.struct/.settings/org.eclipse.jdt.core.prefs create mode 100644 com.gx.obe.struct/META-INF/MANIFEST.MF create mode 100644 com.gx.obe.struct/build.properties create mode 100644 com.gx.obe.struct/lib/Utils-1.0.0.jar create mode 100644 com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructBusinessTypeEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructTechnologyTypeEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/Activator.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteModelDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/AttachmentFile.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/BalanceSheet.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/BidderBasicInfo.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/BusinessLicense.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/CashSheet.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/Certificate.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/ConditionDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/CustomModelDo.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/Finance.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/IntelligentEvalDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/LiftRateDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/ModelData.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/ParamValueDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/Performance.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/ProfitlossSheet.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/ProjectLeader.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/Qualification.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/RespItemDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/ScoreOptionsDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/SelfEvalParamsDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/StructDateInfo.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateDataItem.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateTable.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/TimeModelDO.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/beans/WorkExperience.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/AttachmentComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/ClearBidReviewEntryComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/EvaluationContentComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataDetailComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableComparisonComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableListComposite.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/dialog/AuxevaluationFullScreenDialog.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/dialog/EditOpinionShell.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/dialog/FactorClearBidStepDialog.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/dialog/SelectStepExpertDialog.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/enums/DataCategoryEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/enums/EvaluationFactorTypeEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataClassEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataTypeEnum.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/enums/PerformanceStatus.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/factory/ModelDataFactory.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentFactory.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentHandler.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentStepHandler.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidFileHandler.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/handler/RelChapterTypeHandler.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/inters/IFactorClearBidContent.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelData.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelDataDetail.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/listener/CellDoubleClickListener.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/listener/EditOpinionListener.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/listener/GoBackListener.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/listener/ReturnListener.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/parse/BidFileIndexTreeXmlParse.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/parse/SelfEvaluatesXmlParse.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/AttachmentFileService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/BidderInfoService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/BusinessLicenseService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/CertificateService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/EvaluationContentService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/FinanceService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/ModelDataService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/PerformanceService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/ProjectLeaderService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/QualificationService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/TemplateTableService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/service/WorkExperienceService.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/thread/MyThread.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingStructThread.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierRespItemThread.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierSelfOpinionThread.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/tree/EvaluationFactorTree.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/utils/ElementUtils.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/utils/ParsingStructXmlUtils.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/CreditGrade.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/Finance.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/Goods.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValue.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValues.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/Performance.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/value_list/SimilarProduct.java create mode 100644 com.gx.obe.struct/src/com/gx/obe/struct/widget/TabButton.java diff --git a/BID-EVALUATION-STEP/META-INF/MANIFEST.MF b/BID-EVALUATION-STEP/META-INF/MANIFEST.MF index 5727fc4b..e0a32181 100644 --- a/BID-EVALUATION-STEP/META-INF/MANIFEST.MF +++ b/BID-EVALUATION-STEP/META-INF/MANIFEST.MF @@ -24,7 +24,8 @@ Require-Bundle: org.eclipse.ui, com.gx.obe.answer, com.gx.obe.sameness, com.gx.obe.credit, - org.eclipse.swt + org.eclipse.swt, + com.gx.obe.struct;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: BID-EVALUATION-STEP Bundle-ActivationPolicy: lazy diff --git a/BID-EVALUATION-STEP/src/com/gx/obe/evaluation/step/composite/FactorEvaluationComposite.java b/BID-EVALUATION-STEP/src/com/gx/obe/evaluation/step/composite/FactorEvaluationComposite.java index e9089461..74296d7f 100644 --- a/BID-EVALUATION-STEP/src/com/gx/obe/evaluation/step/composite/FactorEvaluationComposite.java +++ b/BID-EVALUATION-STEP/src/com/gx/obe/evaluation/step/composite/FactorEvaluationComposite.java @@ -73,6 +73,7 @@ import com.gx.obe.components.core.enumeration.CommonEnum; import com.gx.obe.components.core.enumeration.EvaluationFactorEnum; import com.gx.obe.components.core.enumeration.EvaluationStepEnum; import com.gx.obe.components.core.enumeration.ExpertEnum; +import com.gx.obe.components.core.enumeration.ShowType; import com.gx.obe.config.ConfigConstants; import com.gx.obe.config.utils.PropertiesUtils; import com.gx.obe.evaluation.step.composite.struct.EvaluationView; @@ -94,6 +95,7 @@ import com.gx.obe.evaluation.step.widgets.EvalLeftGroupButton; import com.gx.obe.evaluation.step.widgets.LeftMenuEnum; import com.gx.obe.evaluation.step.widgets.LeftMenuMouseAdapter; import com.gx.obe.message.Messages; +import com.gx.obe.struct.composite.TemplateTableListComposite; import com.gx.obe.util.utils.CollectionUtils; import com.gx.obe.util.utils.FileUtils; import com.gx.obe.util.utils.LogUtils; @@ -131,7 +133,7 @@ public class FactorEvaluationComposite extends EvaluationView { private Composite viewContentComposite; private Composite evaluation_panel_composite; private Text supplier_name; - + private ImageButton curShowButton; // private EvalLeftButton file_panel_both_ver; // private EvalLeftButton file_panel_both_hor; // private EvalLeftButton show_file_only; @@ -166,7 +168,7 @@ public class FactorEvaluationComposite extends EvaluationView { private EvalLeftGroupButton opinionGroupButton; private EvalLeftGroupButton creditGroupButton; private EvalLeftGroupButton radioGroupButton; - + private ShowType showType; // private EvalLeftButton evaluationPanelBtn; // private EvalLeftGroupButton bid_file_only; // private EvalLeftButton bidding_file_only; @@ -234,6 +236,8 @@ public class FactorEvaluationComposite extends EvaluationView { private List<SupplierDTO> supplierDTOList; private OpenFileTipsShell openFileTipsShell; private Map<String,String> supplierNameMap = new HashMap<String,String>(); + private Composite buttonComposite; + private TemplateTableListComposite templateTableListComposite; { LogUtils.logClass(FactorEvaluationComposite.class); @@ -393,7 +397,7 @@ public class FactorEvaluationComposite extends EvaluationView { right_composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); Composite supplier_composite = new Composite(right_composite, SWT.NONE); - GridLayout gl_supplier_composite = new GridLayout(6, false); + GridLayout gl_supplier_composite = new GridLayout(10, false); supplier_composite.setLayout(gl_supplier_composite); supplier_composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); supplier_composite.setBackgroundImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/title_bg.png")); @@ -410,6 +414,19 @@ public class FactorEvaluationComposite extends EvaluationView { supplier_name.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE)); supplier_name.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + ESepator verAfter = new ESepator(supplier_composite, SWT.VERTICAL); + verAfter.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); + + buttonComposite = new Composite(supplier_composite, SWT.NONE); + RowLayout rl_composite = new RowLayout(SWT.HORIZONTAL); + rl_composite.marginBottom = 0; + rl_composite.marginTop = 0; + buttonComposite.setLayout(rl_composite); + + ESepator verFront = new ESepator(supplier_composite, SWT.VERTICAL); + verFront.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); + + viewCredit_link = new ELink(supplier_composite, SWT.NONE); viewCredit_link.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/view.png")); viewCredit_link.setText("查看å¾ä¿¡"); @@ -691,6 +708,8 @@ public class FactorEvaluationComposite extends EvaluationView { gl_evaluation_panel_composite.marginWidth = 0; evaluation_panel_composite.setLayout(gl_evaluation_panel_composite); + templateTableListComposite = new TemplateTableListComposite(opinionComposite, SWT.NONE); + evaluation_talbe_composite = new Composite(evaluation_panel_composite, SWT.NONE); evaluation_talbe_composite.setLayout(new FillLayout(SWT.HORIZONTAL)); evaluation_talbe_composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); @@ -790,7 +809,63 @@ public class FactorEvaluationComposite extends EvaluationView { }); return imageButton; } - + private void initShowButton() { + showType = ShowType.getByKey(PropertiesUtils.getProperty(ConfigConstants.SHOW_TYPE, ShowType.FILE.getKey())); + + ImageButton fileButton = createShowButton(ShowType.FILE); + ImageButton opinionButton = createShowButton(ShowType.OPINION); + ImageButton comparisonTableButton = createShowButton(ShowType.COMPARISON_TABLE); +// ImageButton structButton = createShowButton(ShowType.STRUCT); + + switch (showType) { + case FILE: + curShowButton = fileButton; + break; + case OPINION: + curShowButton = opinionButton; + break; + case COMPARISON_TABLE: + curShowButton = comparisonTableButton; + break; +// case STRUCT: +// curShowButton = structButton; +// break; + } + curShowButton.setSelection(true); + } + + /** + * @Description: 获得查看按钮 + * @author chenxw + * @param type + * @param buttonName + * @return + */ + private ImageButton createShowButton(ShowType type) { + ImageButton button = new ImageButton(buttonComposite, SWT.NONE); + button.setRightMargin(10); + button.setLeftMargin(10); + button.setTopMargin(5); + button.setBottomMargin(5); + button.setRightMargin(10); +// button.setFont(SWTResourceManager.getFont("微软雅黑", 11, SWT.NORMAL)); + button.setForeground(ColorConstants.FONT_BLACK_COLOR); + button.setActiveForeground(SWTResourceManager.getColor(255, 153, 0)); + button.setSelectionForeground(ColorConstants.FONT_BLUE_COLOR); + button.setData(type.getKey()); + button.setText(type.getName()); + button.addMouseListener(new MouseAdapter() { + public void mouseUp(MouseEvent e) { + curShowButton.setSelection(false); + curShowButton = button; + curShowButton.setSelection(true); + showType = type; + PropertiesUtils.saveProperty(ConfigConstants.SHOW_TYPE, type.getKey()); + refreshShowComposite(); + } + }); + return button; + } /** * @Description: æ˜¾ç¤ºæŠ•æ ‡æ–‡ä»¶æˆ– æ‹›æ ‡æ–‡ä»¶ * @author guoyr @@ -893,7 +968,7 @@ public class FactorEvaluationComposite extends EvaluationView { */ private void init() { menuFunctionUtils.initFunctionAuthority(menu); - + initShowButton(); initLayoutPanelGroup(); initFilePanelGroup(); initOpinionGroup(); @@ -1383,6 +1458,29 @@ public class FactorEvaluationComposite extends EvaluationView { opinionComposite.layout(); } + private void refreshShowComposite() { +// supplier_name.setText(curSupplier.getSupplierName()); + switch (showType) { + case FILE: + opinionStackLayout.topControl = viewContentComposite; + showBidFileAction(); + break; +// case OPINION: +// opinionStackLayout.topControl = factorOpinionComposite; +// showFactorOpenionAction(); +// break; + case COMPARISON_TABLE: + opinionStackLayout.topControl = templateTableListComposite; + templateTableListComposite.refresh(curTender.getId(), curEvaluationFactor.getFactorCode(), supplierList); + break; +// case STRUCT: +// showStackLayout.topControl = structComposite; +// showStructTableAction(); +// break; + } + opinionComposite.layout(); + } + /** * @Description: é€‰ä¸æŠ•æ ‡äººæˆ–æŒ‡æ ‡ * @author guoyr @@ -1392,6 +1490,7 @@ public class FactorEvaluationComposite extends EvaluationView { private void selectSupplierAndFactorAction(Supplier supplier, EvaluationFactor evaluationFactor, ExpertEvaluationResult expertEvaluationResult) { curEvaluationFactor = evaluationFactor; // å¦‚æžœä¸æ˜¯åœ¨æ¯”é€‰ç•Œé¢ + refreshShowComposite(); if (null != supplier) { if (null == curSupplier || (null != curSupplier && !curSupplier.getId().equals(supplier.getId()))) { // æ˜¾ç¤ºä¾›åº”å•†çš„æŠ•æ ‡æ–‡ä»¶ @@ -1452,6 +1551,38 @@ public class FactorEvaluationComposite extends EvaluationView { } } + + + private void showBidFileAction() { + listSupplierBidFiles(curSupplier); + fileStackLayout.topControl = bidFileComposite; + fileComposite.layout(); + + // åœ¨åªæ˜¾ç¤ºè¯„æ ‡é¢æ¿æ—¶ä¸åŠ è½½æ–‡ä»¶ + if (evaluationPanelOnly) return; + +// fileAndPanelbothAction(evalPanlGoientation); + // æ˜¾ç¤ºå½“å‰æŒ‡æ ‡çš„评审点 + listFactorEvaluationPoints(curSupplier, curEvaluationFactor); + + // å¦‚æžœæœªèƒ½é€šè¿‡è¯„å®¡ç‚¹å®šä½æ–‡ä»¶ï¼Œåˆ™ç›´æŽ¥å®šä½ä¾›åº”商的文件 + if (!locationBidFileByFactorPointAction()) { + loacationBidFileByDocumtntAction(); + } + + if (bidFileGrid.getSelectionCount() > 0) { + // 如果显示所有评审点的界é¢ï¼Œåˆ™åˆ·æ–°æ‰€æœ‰è¯„审点 + if (null != showEvalPointShell && !showEvalPointShell.isDisposed()) { + // æ ¹æ®æŠ•æ ‡äººåŠ è½½æŠ•æ ‡åˆ†å†Œå’Œè¯„å®¡ç‚¹ + if (!ObjectUtils.getObjString(showEvalPointShell.getData("supplierId")).equals(curSupplier.getId())) { + showEvalPointShell.refreshEvalPointGrid(curTender.getId(), curSupplier.getId()); + showEvalPointShell.setData("supplierId", curSupplier.getId()); + } + } + } + } + + /** * @Description: åˆ—å‡ºå½“å‰æŒ‡æ ‡çš„评审点 * @author guoyr diff --git a/BID-OPENING/src/com/gx/obe/opening/composite/BidOpeningHallComposite.java b/BID-OPENING/src/com/gx/obe/opening/composite/BidOpeningHallComposite.java index 347ff001..b26febc4 100644 --- a/BID-OPENING/src/com/gx/obe/opening/composite/BidOpeningHallComposite.java +++ b/BID-OPENING/src/com/gx/obe/opening/composite/BidOpeningHallComposite.java @@ -619,6 +619,12 @@ public class BidOpeningHallComposite extends Composite { }); } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }; new NewUpdateTenderProjectInfoThread(tenderProjectEntity, listener).start(); diff --git a/BID-OPENING/src/com/gx/obe/opening/composite/SubTenderProjectEnterMenuComposite.java b/BID-OPENING/src/com/gx/obe/opening/composite/SubTenderProjectEnterMenuComposite.java index a5ff4aa3..1eab2553 100644 --- a/BID-OPENING/src/com/gx/obe/opening/composite/SubTenderProjectEnterMenuComposite.java +++ b/BID-OPENING/src/com/gx/obe/opening/composite/SubTenderProjectEnterMenuComposite.java @@ -280,7 +280,13 @@ public class SubTenderProjectEnterMenuComposite extends Composite implements Act new AutoVerifyUserRemotePasswordThread(tenderProject,Constants.USER.getEncodePassWord()).start(); // å¦‚æžœæœªèŽ·å–æœ€æ–°æŠ•æ ‡ä¿¡æ¯ï¼Œåˆ™è‡ªåŠ¨èŽ·å– if(!tenderProjectService.isGetLatestBidinfo(tenderProject.getId())){ - new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){}).start(); + new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){ + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + }}).start(); } tenderNoLabel.addMouseListener(new ChangeTextListener()); } diff --git a/BID-OPENING/src/com/gx/obe/opening/composite/TenderProjectEnterMenuComposite.java b/BID-OPENING/src/com/gx/obe/opening/composite/TenderProjectEnterMenuComposite.java index 3bb6a25d..cfd10835 100644 --- a/BID-OPENING/src/com/gx/obe/opening/composite/TenderProjectEnterMenuComposite.java +++ b/BID-OPENING/src/com/gx/obe/opening/composite/TenderProjectEnterMenuComposite.java @@ -250,7 +250,13 @@ public class TenderProjectEnterMenuComposite extends Composite implements Action // å¦‚æžœæœªèŽ·å–æœ€æ–°æŠ•æ ‡ä¿¡æ¯ï¼Œåˆ™è‡ªåŠ¨èŽ·å– if(!tenderProjectService.isGetLatestBidinfo(tenderProject.getId())){ - new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){}).start(); + new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){ + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + }}).start(); } tenderNoLabel.addMouseListener(new ChangeTextListener()); tenderNameLabel.addMouseListener(new ChangeTextListener()); diff --git a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectFocusDecryptBidFilThread.java b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectFocusDecryptBidFilThread.java index 268f5383..de08eb02 100644 --- a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectFocusDecryptBidFilThread.java +++ b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectFocusDecryptBidFilThread.java @@ -86,6 +86,12 @@ public class MultyProjectFocusDecryptBidFilThread implements Runnable{ } showMessage(flag, tenderProjectEntity); } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); batchFocusDecryptBidFilThread.start(); myRunnableList.add(batchFocusDecryptBidFilThread); @@ -98,6 +104,12 @@ public class MultyProjectFocusDecryptBidFilThread implements Runnable{ startRemoteBidOpeningListener.startRemoteBidOpening(flag, tenderProjectService.getTenderPackOpeningInfo(tenderProjectEntity.getId(), bidopeningStage), ""); showMessage(flag, tenderProjectEntity); } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }, synchronizedInfoOnly); startRemoteDecryptBidFilThread.start(); myRunnableList.add(startRemoteDecryptBidFilThread); diff --git a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteDecryptBidFilThread.java b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteDecryptBidFilThread.java index 05900e7d..7f01508f 100644 --- a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteDecryptBidFilThread.java +++ b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteDecryptBidFilThread.java @@ -82,6 +82,12 @@ public class MultyProjectRemoteDecryptBidFilThread implements Runnable{ } showMessage(flag, tenderProjectEntity); } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); batchRemoteDecryptBidFilThread.start(); myRunnableList.add(batchRemoteDecryptBidFilThread); @@ -94,6 +100,12 @@ public class MultyProjectRemoteDecryptBidFilThread implements Runnable{ startRemoteBidOpeningListener.startRemoteBidOpening(flag, tenderProjectService.getTenderPackOpeningInfo(tenderProjectEntity.getId(), bidopeningStage), ""); showMessage(flag, tenderProjectEntity); } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }, synchronizedInfoOnly); startRemoteDecryptBidFilThread.start(); myRunnableList.add(startRemoteDecryptBidFilThread); diff --git a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteStartBidopeningHallThread.java b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteStartBidopeningHallThread.java index ea1b40b8..5931b632 100644 --- a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteStartBidopeningHallThread.java +++ b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectRemoteStartBidopeningHallThread.java @@ -76,6 +76,12 @@ public class MultyProjectRemoteStartBidopeningHallThread implements Runnable{ callBack.message(MessageFormat.format(Messages.Tips_startProjectOpeningHallFail, tenderProjectEntity.getTenderName()), -1); } } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); // new OpenRemoteHallListener(){ // public void openRemoteHall(final boolean openRemoteHall, TenderProjectEntity tenderProjectEntity, String msg){ @@ -101,6 +107,12 @@ public class MultyProjectRemoteStartBidopeningHallThread implements Runnable{ callBack.message(MessageFormat.format(Messages.Tips_startProjectOpeningHallFail, tenderProjectEntity.getTenderName()), -1); } } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); // new OpenRemoteHallListener(){ // public void openRemoteHall(final boolean openRemoteHall, TenderProjectEntity tenderProjectEntity, String msg){ diff --git a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectUploadBidOpeningResultThread.java b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectUploadBidOpeningResultThread.java index f6f34813..40b511eb 100644 --- a/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectUploadBidOpeningResultThread.java +++ b/BID-OPENING/src/com/gx/obe/opening/thread/MultyProjectUploadBidOpeningResultThread.java @@ -138,6 +138,12 @@ public class MultyProjectUploadBidOpeningResultThread implements Runnable{ listener.showMessage(-1, "["+projectOpeningInfo.getTenderProject().getTenderNo() + projectOpeningInfo.getTenderProject().getTenderName() +"]完æˆå¼€æ ‡å¹¶ä¸Šä¼ 结果失败ï¼"); } } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); uploadBidOpeningResultThread.start(); listener.showMessage(0, "[" + projectOpeningInfo.getTenderProject().getTenderName() + "]æ£åœ¨å®Œæˆå¹¶ä¸Šä¼ 结果..."); diff --git a/OBE-ACTION/META-INF/MANIFEST.MF b/OBE-ACTION/META-INF/MANIFEST.MF index 3a747727..9a6e0abe 100644 --- a/OBE-ACTION/META-INF/MANIFEST.MF +++ b/OBE-ACTION/META-INF/MANIFEST.MF @@ -10,7 +10,9 @@ Require-Bundle: org.eclipse.ui, org.eclipse.swt.core, com.gx.obe.common.icons, com.gx.obe.components.messages;bundle-version="1.0.0", - com.gx.obe.business + com.gx.obe.business, + com.gx.obe.component, + com.gx.obe.bind;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: OBE-ACTION Bundle-ActivationPolicy: lazy diff --git a/OBE-ACTION/src/com/gx/obe/action/bean/FAction.java b/OBE-ACTION/src/com/gx/obe/action/bean/FAction.java new file mode 100644 index 00000000..02ea566d --- /dev/null +++ b/OBE-ACTION/src/com/gx/obe/action/bean/FAction.java @@ -0,0 +1,26 @@ +package com.gx.obe.action.bean; + +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.action.listener.ActionListener; +import com.gx.obe.component.rx.RxSwt; + +public abstract class FAction<T> extends Action { + + @Override + public void run() { + ActionListener listener = this.getListener(); + listener.onLoad(this); + RxSwt.run(this::supply).checkWidget(listener.getParentComposite()).exe(this::loadComposite); + } + + private void loadComposite(T t) { + ActionListener listener = this.getListener(); + listener.loadComposite(this, consume(listener.getParentComposite(), t)); + } + + protected abstract T supply(); + + protected abstract Composite consume(Composite parent, T t); + +} diff --git a/OBE-BUSINESS/src/com/gx/obe/web/service/SupplierEvaluationFactorService.java b/OBE-BUSINESS/src/com/gx/obe/web/service/SupplierEvaluationFactorService.java index edac0acc..635b0683 100644 --- a/OBE-BUSINESS/src/com/gx/obe/web/service/SupplierEvaluationFactorService.java +++ b/OBE-BUSINESS/src/com/gx/obe/web/service/SupplierEvaluationFactorService.java @@ -7,13 +7,16 @@ import java.util.Map; import org.apache.log4j.Logger; +import com.gx.obe.business.entity.Result; import com.gx.obe.business.entity.SupplierEvaluationFactor; import com.gx.obe.components.core.Constants; import com.gx.obe.web.utils.NetworkRequest; +import com.gx.obe.web.utils.ObeHttpUtils; import com.gx.obe.http.json.JsonUtil; import com.gx.obe.http.util.WebReflecUtill; import com.gx.obe.web.utils.ResultStatus; import com.gx.obe.web.vo.BatchSaveOrUpdateVo; +import com.gx.obe.web.vo.FactorClearBidContent; import com.gx.obe.web.vo.UpdateAssignPropertyVo; /** @@ -206,4 +209,36 @@ public class SupplierEvaluationFactorService { return 0; } } + /** + * @Description: è®¡ç®—æŒ‡æ ‡æ¸…æ ‡æ„è§ + * @author chenxw + * @param stepId + * @return + */ + public Result<Void> calculateFactorClearBidOpinion(String stepId) { + Map<String, Object> param = new HashMap<String, Object>(); + param.put("stepId", stepId); + return ObeHttpUtils.getResult(URL + "/calculateFactorClearBidOpinion", param, Void.class); + } + /** + * @Description: èŽ·å–æŒ‡æ ‡æ¸…æ ‡å†…å®¹ + * @author chenxw + * @param stepId + * @return + */ + public FactorClearBidContent getFactorClearBidContent(String stepId) { + Map<String, Object> param = new HashMap<String, Object>(); + param.put("stepId", stepId); + return ObeHttpUtils.getOne(URL + "/getFactorClearBidContent", param, FactorClearBidContent.class); + } + /** + * @Description: èŽ·å–æ‰“åˆ†æŒ‡æ ‡æ¸…æ ‡å†…å®¹ + * @param tenderId + * @return + */ + public FactorClearBidContent getScoreFactorClearBidContent(String tenderId) { + Map<String, Object> param = new HashMap<String, Object>(); + param.put("tenderId", tenderId); + return ObeHttpUtils.getOne(URL + "/getScoreFactorClearBidContent", param, FactorClearBidContent.class); + } } diff --git a/OBE-BUSINESS/src/com/gx/obe/web/utils/ObeHttpUtils.java b/OBE-BUSINESS/src/com/gx/obe/web/utils/ObeHttpUtils.java index 4075bd90..155bb8df 100644 --- a/OBE-BUSINESS/src/com/gx/obe/web/utils/ObeHttpUtils.java +++ b/OBE-BUSINESS/src/com/gx/obe/web/utils/ObeHttpUtils.java @@ -6,8 +6,10 @@ import java.util.Map; import org.apache.log4j.Logger; +import com.gx.obe.business.entity.Result; import com.gx.obe.components.core.Constants; import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.http.jsons.JSONNull; import com.gx.obe.web.utils.NetworkRequest; import com.gx.obe.web.utils.ResultStatus; @@ -50,5 +52,34 @@ public class ObeHttpUtils { } return new ArrayList<>(); } + public static boolean getBoolean(String path, Map<String, Object> param) { + String strWebServerUrl = Constants.getServiceUrl(path); + try { + return ResultStatus.getReultStatusBoolean(NetworkRequest.get(strWebServerUrl, param)); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return false; + } + } + public static <T> Result<T> getResult(String path, Map<String, Object> param, Class<T> tclass) { + String strWebServerUrl = Constants.getServiceUrl(path); + try { + String result = NetworkRequest.get(strWebServerUrl, param); + if (ResultStatus.getReultStatusOK(result)) { + @SuppressWarnings("unchecked") + Result<T> jsonToBean = JsonUtil.jsonToBean(result, Result.class); + if (jsonToBean != null) { + T data = jsonToBean.getData(); + if (data != null && data != JSONNull.NULL) { + jsonToBean.setData(JsonUtil.jsonToBean(data, tclass)); + } + return jsonToBean; + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } } diff --git a/OBE-BUSINESS/src/com/gx/obe/web/vo/FactorClearBidContent.java b/OBE-BUSINESS/src/com/gx/obe/web/vo/FactorClearBidContent.java new file mode 100644 index 00000000..d1f769b8 --- /dev/null +++ b/OBE-BUSINESS/src/com/gx/obe/web/vo/FactorClearBidContent.java @@ -0,0 +1,39 @@ +package com.gx.obe.web.vo; + +import java.util.List; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; + +public class FactorClearBidContent { + + private List<Supplier> supplierList; + private List<EvaluationFactor> factorList; + private List<SupplierEvaluationFactor> supplierEvaluationFactorList; + + public List<Supplier> getSupplierList() { + return supplierList; + } + + public void setSupplierList(List<Supplier> supplierList) { + this.supplierList = supplierList; + } + + public List<EvaluationFactor> getFactorList() { + return factorList; + } + + public void setFactorList(List<EvaluationFactor> factorList) { + this.factorList = factorList; + } + + public List<SupplierEvaluationFactor> getSupplierEvaluationFactorList() { + return supplierEvaluationFactorList; + } + + public void setSupplierEvaluationFactorList(List<SupplierEvaluationFactor> supplierEvaluationFactorList) { + this.supplierEvaluationFactorList = supplierEvaluationFactorList; + } + +} \ No newline at end of file diff --git a/OBE-BUSINESS/src/com/gx/utils/BusinessNowTimeUtils.java b/OBE-BUSINESS/src/com/gx/utils/BusinessNowTimeUtils.java new file mode 100644 index 00000000..981b8b14 --- /dev/null +++ b/OBE-BUSINESS/src/com/gx/utils/BusinessNowTimeUtils.java @@ -0,0 +1,190 @@ +package com.gx.utils; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.apache.log4j.Logger; + +import com.gx.obe.message.Messages; +import com.gx.obe.web.service.ConnectionService; + +/** + * @Description: 获å–当剿—¶é—´ + * @author guoyr + */ +public class BusinessNowTimeUtils { + + private static long NOW_TIME = 0l; + private static Calendar GET_DATETIME_START_CALLENDAR;// 记录获å–当剿—¶é—´çš„æ—¶é—´ç‚¹ + private static final String weak[] = {Messages.Weak_sun, Messages.Weak_mon, Messages.Weak_tues, Messages.Weak_wed, Messages.Weak_thur, Messages.Weak_fri, Messages.Weak_sat}; + private static final String weakDay[] = {Messages.Weak_sunday, Messages.Weak_monday, Messages.Weak_tuesday, Messages.Weak_wednesday, Messages.Weak_thursday, Messages.Weak_friday, Messages.Weak_saturday}; +// private static final String weakEn[] = {"Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"}; +// private static final String weakEnDay[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + private static Logger LOG = Logger.getLogger(BusinessNowTimeUtils.class); + public static String NOW_DATE_SOURCE = "本机时间"; + private static boolean setTime = false; + private static ConnectionService connectionService = new ConnectionService(); + + /** + * @Description: è®¾ç½®å½“å‰æ—¶é—´ + * @author guoyr + * @param nowDate + */ + public static void setNowTime(Date nowDate){ + Calendar cal = Calendar.getInstance(); + + cal.setTime(nowDate); + NOW_TIME = cal.getTimeInMillis(); + GET_DATETIME_START_CALLENDAR = Calendar.getInstance(); + + // æ ‡è®°ä¸ºå·²è®¾ç½®å½“å‰æ—¶é—´ + setTime = true; + + LOG.info("licenseè®¾ç½®å½“å‰æ—¶é—´ä¸ºï¼š" + nowDate); + } + + /** + * @Description: èŽ·å–æ•°æ®åº“或时间æœåС噍ä¸çš„当剿—¶é—´ + * @author guoyr + * @return + */ + private static long getNowTime() { + // å¦‚æžœè¿˜æœªè®¾ç½®å½“å‰æ—¶é—´ + if(!setTime){ + return new Date().getTime() ; + } + return NOW_TIME + (Calendar.getInstance().getTimeInMillis()-GET_DATETIME_START_CALLENDAR.getTimeInMillis()); + } + + /** + * @Description: èŽ·å¾—å½“å‰æ—¶é—´ + * @author guoyr + * @return + */ + public static Date getNowDate(){ + // å¦‚æžœè¿˜æœªè®¾ç½®å½“å‰æ—¶é—´ + if(!setTime){ + return new Date(); + } + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(getNowTime()); + return calendar.getTime(); + } + + /** + * @Description: 获得当å‰å¹´ä»½ + * @author guoyr + * @return + */ + public static int getYear() { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(getNowDate()); + return calendar.get(Calendar.YEAR); + } + + /** + * @Description: èŽ·å¾—å½“å‰æ˜ŸæœŸ + * @author guoyr + * @return + */ + public static String getWeak(){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(getNowDate()); + int dayOfWeak = calendar.get(Calendar.DAY_OF_WEEK)-1; + return weak[dayOfWeak]; + } + /** + * @Description: èŽ·å¾—å½“å‰æ˜ŸæœŸ + * @author guoyr + * @return + */ + public static String getWeakDay(){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(getNowDate()); + int dayOfWeak = calendar.get(Calendar.DAY_OF_WEEK)-1; + return weakDay[dayOfWeak]; + } + + + /** + * @Description: èŽ·å¾—å½“å‰æ—¥æœŸ + * @author guoyr + * @return + */ + public static String getDate(){ + return new SimpleDateFormat("yyyy-MM-dd").format(getNowDate()); + } + + /** + * @Description: èŽ·å¾—å½“å‰æ—¶é—´ + * @author guoyr + * @return + */ + public static String getTime(){ + return new SimpleDateFormat("HH:mm:ss").format(getNowDate()); + } + + /** + * @Description: èŽ·å¾—å½“å‰æ—¥æœŸå’Œæ—¶é—´ + * @author guoyr + * @return + */ + public static String getDateTime(){ + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getNowDate()); + } + + /** + * @Description: æœåŠ¡å™¨çš„å½“å‰æ—¶é—´ + * @author guoyr + * @return + */ + private static Date getServiceNowTime(){ + Date nowDate = null; + long startTime = System.currentTimeMillis(); //获å–开始时间 + nowDate = connectionService.getServiceDate(); + long endTime = System.currentTimeMillis(); //获å–ç»“æŸæ—¶é—´ + if(null != nowDate){ + long ms = endTime - startTime; + if(ms > 1000){ + int second= (int) (ms / 1000); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(nowDate); + calendar.add(Calendar.SECOND, second); + nowDate = calendar.getTime(); + } + } + return nowDate; + } + + /** + * @Description: èŽ·å–æ—¶é—´æœåŠ¡å™¨æ—¶é—´ + * @author guoyr + * @return + */ +// private static Date getNowDateFormDateServer(){ +// Date nowDate = null; +// try { +// String xmlStr = WebServiceUtil.invokeWebservice(PropertiesUtils.getWebserviceProperty(WebserviceConstants.WEBSERVICE_ADDRESS,"") + PropertiesUtils.getWebserviceProperty(WebserviceConstants.NOW_TIME_URL,""), PropertiesUtils.getWebserviceProperty(WebserviceConstants.NOW_TIME_METHOD,""), new Object[]{}, null); +// if(!"".equals(xmlStr)){ +// Document document = DocumentHelper.parseText(xmlStr); +// Element root = document.getRootElement(); +// String operTag = root.element("header").elementTextTrim("operTag"); +// if(null != operTag && "Y".equals(operTag)){ +// String timeStr = root.element("body").elementTextTrim("time"); +// nowDate = DateUtils.toDate(timeStr); +// LOG.debug("èŽ·å–æ—¶é—´æœåŠ¡å™¨æ—¶é—´ä¸º" + nowDate); +// }else { +// LOG.error(root.element("header").elementTextTrim("operDesc")); +// LOG.error(root.element("header").elementTextTrim("operException")); +// } +// }else { +// LOG.error("èŽ·å–æ—¶é—´æœåŠ¡å™¨æ—¶é—´å‡ºé”™ï¼"); +// } +// } catch (Exception e) { +// LOG.error("", e); +// nowDate = null; +// } +// return nowDate; +// } +} diff --git a/OBE-COMMON/.settings/org.eclipse.core.resources.prefs b/OBE-COMMON/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/OBE-COMMON/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/OBE-COMMON/src/com/gx/obe/thread/AutoDownloadProjectThread.java b/OBE-COMMON/src/com/gx/obe/thread/AutoDownloadProjectThread.java index c53c83e3..c194db03 100644 --- a/OBE-COMMON/src/com/gx/obe/thread/AutoDownloadProjectThread.java +++ b/OBE-COMMON/src/com/gx/obe/thread/AutoDownloadProjectThread.java @@ -82,6 +82,11 @@ public class AutoDownloadProjectThread extends MyThread{ getNeedDownloadProjectList(); } } + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); thread.start(); @@ -190,6 +195,12 @@ public class AutoDownloadProjectThread extends MyThread{ }else { tenderfailureSum ++; } + } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; }; }); thread.start(); @@ -212,6 +223,11 @@ public class AutoDownloadProjectThread extends MyThread{ }else { tenderfailureSum ++; } + } + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; }; }); downloadProjectInfoThread.start(); diff --git a/OBE-COMMON/src/com/gx/obe/thread/NewDownloadProjectInfoThread.java b/OBE-COMMON/src/com/gx/obe/thread/NewDownloadProjectInfoThread.java index 9ef9551a..96b086de 100644 --- a/OBE-COMMON/src/com/gx/obe/thread/NewDownloadProjectInfoThread.java +++ b/OBE-COMMON/src/com/gx/obe/thread/NewDownloadProjectInfoThread.java @@ -336,6 +336,12 @@ public class NewDownloadProjectInfoThread extends MyThread{ callBack.message(msg, flag); } + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } + }; //ä¸‹è½½æŠ•æ ‡äºº // NewDownloadSupplierThread downloadSupplierListThread = new NewDownloadSupplierThread(tenderProjectEntity, otherInfoLoadingListener); diff --git a/OBE-COMMON/src/com/gx/obe/thread/NewReDownloadProjectInfoThread.java b/OBE-COMMON/src/com/gx/obe/thread/NewReDownloadProjectInfoThread.java index 96d32765..d653ee66 100644 --- a/OBE-COMMON/src/com/gx/obe/thread/NewReDownloadProjectInfoThread.java +++ b/OBE-COMMON/src/com/gx/obe/thread/NewReDownloadProjectInfoThread.java @@ -97,6 +97,12 @@ public class NewReDownloadProjectInfoThread extends MyThread{ public void message(String msg, int flag) { callBack.message(msg, flag); } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }; } diff --git a/OBE-COMPONENTS-CORE/META-INF/MANIFEST.MF b/OBE-COMPONENTS-CORE/META-INF/MANIFEST.MF index 4aa266f4..622bfe1e 100644 --- a/OBE-COMPONENTS-CORE/META-INF/MANIFEST.MF +++ b/OBE-COMPONENTS-CORE/META-INF/MANIFEST.MF @@ -9,7 +9,8 @@ Require-Bundle: org.eclipse.ui, com.gx.obe.config, com.gx.obe.utils, com.gx.obe.lib, - com.gx.obe.components.messages;bundle-version="1.0.0" + com.gx.obe.components.messages;bundle-version="1.0.0", + com.gx.obe.bind;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: com.gx.obe.components.core Export-Package: com.fasterxml.jackson.annotation, @@ -47,6 +48,8 @@ Export-Package: com.fasterxml.jackson.annotation, com.gx.obe.business.entity, com.gx.obe.components.core, com.gx.obe.components.core.enumeration, + com.gx.obe.components.core.global, + com.gx.obe.components.core.inter, com.gx.obe.components.core.util, com.gx.obe.components.core.vo, com.gx.obe.enttiytdo, diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/business/entity/SupplierEvaluationFactor.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/business/entity/SupplierEvaluationFactor.java index ac899b3d..5c3e64d7 100644 --- a/OBE-COMPONENTS-CORE/src/com/gx/obe/business/entity/SupplierEvaluationFactor.java +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/business/entity/SupplierEvaluationFactor.java @@ -2,8 +2,12 @@ package com.gx.obe.business.entity; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import com.gx.obe.util.utils.SerializeUtils; import com.gx.obe.util.utils.XmlAnnotation; /** @@ -86,6 +90,23 @@ public class SupplierEvaluationFactor { private int childCount = 0; private int level = 1; + @XmlAnnotation(element = "paramValues") + private String paramValues; + /** + * ä¿®æ”¹è¯„è®®åŽŸå› + */ + private String modifyReason; + + /** + * 修改评议时间 + */ + private Date modifyTime; + + /** + * 修改评议人 + */ + private String modifyUserName; + @XmlAnnotation(element = "remark") private String opinion; @@ -94,8 +115,26 @@ public class SupplierEvaluationFactor { private String scoreStatus; + + private Map<String, Object> paramsMap = null; + private List<EvaluationFactorItem> evaluationFactorItemList = new ArrayList<EvaluationFactorItem>(); + /** + * + */ + private String respItemList; + + + @XmlAnnotation(element = "finance") + private String finance; + + @XmlAnnotation(element = "performance") + private String performance; + + @XmlAnnotation(element = "creditGrade") + private String creditGrade; + public void addChild(EvaluationFactorItem factor) { evaluationFactorItemList.add(factor); } @@ -368,5 +407,118 @@ public class SupplierEvaluationFactor { public void setScoreStatus(String scoreStatus) { this.scoreStatus = scoreStatus; } + + public String getModifyReason() { + return modifyReason; + } + + public void setModifyReason(String modifyReason) { + this.modifyReason = modifyReason; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyUserName() { + return modifyUserName; + } + + public void setModifyUserName(String modifyUserName) { + this.modifyUserName = modifyUserName; + } + /** + * @Description: ä¸ºè¯„æ ‡æ¥éª¤è®¾ç½®å‚æ•° + * @author guoyr + * @param paramKey + * @param featureList + */ + public void setParam(String paramKey, Object paramValue) { + if (null != computerParams) { + if (null == paramsMap) { + paramsMap = SerializeUtils.deserializeObject(getComputerParams()); + } + } + if (null == paramsMap) { + paramsMap = new HashMap<String, Object>(); + } + if (null != paramValue) { + paramsMap.put(paramKey, paramValue); + } else { + + paramsMap.remove(paramKey); + } + if (paramsMap.isEmpty()) { + computerParams = null; + paramsMap = null; + } else { + computerParams = SerializeUtils.serializeObject(paramsMap); + } + } + /** + * @Description: èŽ·å¾—è¯„æ ‡æ¥éª¤çš„傿•° + * @author guoyr + * @param paramKey + * @return + */ + @SuppressWarnings("unchecked") + public <T> T getParamByKey(String paramKey) { + if (null != computerParams) { + if (null == paramsMap) { + paramsMap = SerializeUtils.deserializeObject(getComputerParams()); + } + if (null != paramsMap) { + return (T) paramsMap.get(paramKey); + } + } + return null; + } + public String getParamValues() { + return paramValues; + } + + public void setParamValues(String paramValues) { + this.paramValues = paramValues; + } + + public String getPageNumber() { + return null == getParamByKey("pageNumber") ? "" : getParamByKey("pageNumber").toString(); + } + + public String getRespItemList() { + return respItemList; + } + + public void setRespItemList(String respItemList) { + this.respItemList = respItemList; + } + + public String getFinance() { + return finance; + } + + public void setFinance(String finance) { + this.finance = finance; + } + + public String getPerformance() { + return performance; + } + + public void setPerformance(String performance) { + this.performance = performance; + } + + public String getCreditGrade() { + return creditGrade; + } + + public void setCreditGrade(String creditGrade) { + this.creditGrade = creditGrade; + } } diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/Constants.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/Constants.java index 09eed6ac..e10c49f1 100644 --- a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/Constants.java +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/Constants.java @@ -1,5 +1,10 @@ package com.gx.obe.components.core; +import java.io.File; + +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import com.gx.obe.config.utils.ProjectUtils; import com.gx.obe.config.utils.PropertiesUtils; import com.gx.obe.web.entity.auth.AuthUser; @@ -7,6 +12,32 @@ public class Constants { public static final String PRODUCE_EN_NAME = "OBE"; public static final String PRODUCE_VERSION = "V7.0"; + /** + * æ‹›æ ‡æ–‡ä»¶ç›®å½• + **/ + public static String BIDDING_FILE_FOLDER = "biddingFile"; + /** + * æŠ•æ ‡æ–‡ä»¶ç›®å½• + **/ + public static String BID_FILE_FOLDER = "bidFile"; + + /** + * 系统的当å‰è·¯å¾„ + **/ + public static String PRODUCT_ROOT = getPluginPath(CoreActivator.getDefault()); + public static String getPluginPath(AbstractUIPlugin plugin){ + String root = ProjectUtils.toFullPath(plugin, "/"); + // 如果å‰é¢æœ‰/ï¼Œè¯»å–æ–‡ä»¶æ—¶æ‰¾ä¸åˆ° + if(root.charAt(0)=='/'){ + root = root.substring(1); + } + return root; +// if(null == PRODUCT_ROOT || "".equals(PRODUCT_ROOT)){ +// +// PRODUCT_ROOT = root; +// } +// return PRODUCT_ROOT; + } /** * 当å‰ç™»å½•的用户 **/ @@ -194,5 +225,68 @@ public class Constants { public static final String TIANYAN_CHECK_NOTE = "TIANYAN_CHECK_NOTE.pdf"; + + /** + * æ ‡ä¹¦æ–‡ä»¶è·¯å¾„ + **/ + public static String BID_FILE_PATH = PropertiesUtils.getProperty(com.gx.obe.config.ConfigConstants.BID_FILE_PATH, PRODUCT_ROOT).concat(File.separator); + + /** + * @Description: èŽ·å¾—é¡¹ç›®çš„æŠ•æ ‡æ–‡ä»¶è·¯å¾„ + * @author guoyr + * @param tenderId + + */ + public static String getBidFilePath(String tenderId){ + return BID_FILE_PATH.concat(tenderId).concat(File.separator).concat(BID_FILE_FOLDER).concat(File.separator); + } + /** + * @Description: èŽ·å¾—æŠ•æ ‡äººçš„æŠ•æ ‡æ–‡ä»¶è·¯å¾„ + * @author guoyr + * @param tenderId + * @param supplierId + * @return + */ + public static String getBidFilePath(String tenderId, String supplierId){ + return BID_FILE_PATH.concat(tenderId).concat(File.separator).concat(BID_FILE_FOLDER).concat(File.separator).concat(supplierId).concat(File.separator); + } + /** + * æŠ•æ ‡ä¿¡å° signType + */ + public static String SIGNTYPE = "DianJu"; + public static String ETB = ".etb";// ç”µåæŠ•æ ‡æ–‡ä»¶ + public static String EZG = ".etb";//".ezg";// 电åèµ„æ ¼æŠ•æ ‡æ–‡ä»¶ + public static String EZB = ".ezb";// ç”µåæ‹›æ ‡æ–‡ä»¶ + public static String ECN = ".enc"; + public static String ENC = ".enc"; + public static String XLS = ".xls"; + public static String PDF = ".pdf"; + public static String DOC = ".doc"; + public static String DOCX = ".docx"; + public static String XML = ".xml"; + public static String LOG = ".log"; + public static String XLSX = ".xlsx"; + public static String ZIP = ".zip"; + /** + * @Description: æ‹›æ ‡æ–‡ä»¶è·¯å¾„ + * @author guoyr + * + * @param tenderId + * @return + */ + public static String getBiddingFilePath(String tenderId){ + return BID_FILE_PATH.concat(tenderId).concat(File.separator).concat(BIDDING_FILE_FOLDER).concat(File.separator); + } + /** + * æ‹›æ ‡ID + */ + public static final String BIDDING_ID = "biddingId"; + public static String getAuxiliaryPlatformUrl(String str){ + String strWebServerUrl = PropertiesUtils.getProperty(com.gx.obe.config.ConfigConstants.AUXILIARY_SERVICE_URL, ""); + if(!strWebServerUrl.endsWith("/")){ + strWebServerUrl = strWebServerUrl + "/"; + } + return strWebServerUrl + str; + } } diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/EvaluationStepEnum.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/EvaluationStepEnum.java index e347e066..58d7e61f 100644 --- a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/EvaluationStepEnum.java +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/EvaluationStepEnum.java @@ -28,11 +28,14 @@ public class EvaluationStepEnum { public static final String BUSINESS_VETO = "18"; public static final String FIXED_FACTOR = "21";// 定档 public static final String ASSOCIATION_QUERY = "22";// å…³è”æŸ¥è¯¢è¯„审æ¥éª¤ - + public static final String FACTOR_CLEAR_BID = "23"; public static final String BILL_ZBT = "bill_zbt"; public static final String BILL_YT = "bill_yt"; public static final String BILL_BZ = "bill_bz"; - + /** + * 傿•°ï¼šæ¸…æ ‡å†…å®¹å®Œæˆè®¡ç®— + */ + public static final String COMPLETE_CALCULATION = "COMPLETE_CALCULATION"; /** * 是å¦å¯¹æŠ•æ ‡äººè¿›è¡Œç›é€‰[00:ä¸ç›é€‰ï¼›01:ç›é€‰] */ @@ -386,5 +389,6 @@ public class EvaluationStepEnum { * 打分评审强制录入æ„è§ */ public static final String NEED_OPINION = "NEED_OPINION"; + public static final String EVALUATION_FACTOR_TYPE = "EVALUATION_FACTOR_TYPE"; } diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/ShowType.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/ShowType.java new file mode 100644 index 00000000..c8d99486 --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/enumeration/ShowType.java @@ -0,0 +1,37 @@ +package com.gx.obe.components.core.enumeration; + +import java.util.Arrays; + +import com.gx.obe.message.Messages; + +public enum ShowType { + + FILE("file", Messages.Button_veiwBidFile), + + OPINION("opinion", "查看评议æ„è§"), + + COMPARISON_TABLE("comparisonTable", "查看对比表"); + +// STRUCT("struct", "查看结构化数æ®"); + + private String key; + private String name; + + private ShowType(String key, String name) { + this.key = key; + this.name = name; + } + + public String getKey() { + return key; + } + + public String getName() { + return name; + } + + public static ShowType getByKey(String key) { + return Arrays.stream(values()).filter(t -> t.getKey().equals(key)).findAny().get(); + } + +} \ No newline at end of file diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/global/Global.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/global/Global.java new file mode 100644 index 00000000..27d566fa --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/global/Global.java @@ -0,0 +1,31 @@ +package com.gx.obe.components.core.global; + +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.components.core.inter.ExcelReport; +import com.gx.obe.components.core.inter.LoadPdfFileView; +import com.gx.obe.components.core.inter.PdfFileView; + +public class Global { + + /** + * @Description: Excel报表 + */ + public static ExcelReport EXCEL_REPORT; + + /** + * @Description: pdf文件显示器 + */ + public static LoadPdfFileView PDF_FILE_VIEW = (Composite parent, int style) -> new PdfFileView() { + public void setFileNotExistMessage(String fileNotExistMessage) {} + + public void setCacheNumber(int cacheNumber) {} + + public void releaseFile(String filePath) {} + + public void openFile(String filePath, int page) {} + + public void openFile(String filePath) {} + }; + +} diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/ExcelReport.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/ExcelReport.java new file mode 100644 index 00000000..38ba6aa3 --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/ExcelReport.java @@ -0,0 +1,12 @@ +package com.gx.obe.components.core.inter; + +import java.util.Map; + +import com.gx.obe.bind.promise.Promise; +import com.gx.obe.web.entity.tender.TenderProjectEntity; + +public interface ExcelReport { + + Promise<String> generate(TenderProjectEntity tenderProject, String templatePath, String reportOutPath, Map<String, Object> dateMap); + +} diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/LoadPdfFileView.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/LoadPdfFileView.java new file mode 100644 index 00000000..24166ff1 --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/LoadPdfFileView.java @@ -0,0 +1,9 @@ +package com.gx.obe.components.core.inter; + +import org.eclipse.swt.widgets.Composite; + +public interface LoadPdfFileView { + + PdfFileView load(Composite parent, int style); + +} diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/PdfFileView.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/PdfFileView.java new file mode 100644 index 00000000..4f58cf75 --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/inter/PdfFileView.java @@ -0,0 +1,15 @@ +package com.gx.obe.components.core.inter; + +public interface PdfFileView { + + void setFileNotExistMessage(String fileNotExistMessage); + + void setCacheNumber(int cacheNumber); + + void openFile(String filePath); + + void openFile(String filePath, int page); + + void releaseFile(String filePath); + +} diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/TableXML.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/TableXML.java index 76dd4513..2d7f435e 100644 --- a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/TableXML.java +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/TableXML.java @@ -16,6 +16,21 @@ public class TableXML { private List<Tr> headList = new ArrayList<TableXML.Tr>(); private List<Tr> bodyList = new ArrayList<TableXML.Tr>(); + public List<Tr> getHeadList() { + return headList; + } + + public void setHeadList(List<Tr> headList) { + this.headList = headList; + } + + public List<Tr> getBodyList() { + return bodyList; + } + + public void setBodyList(List<Tr> bodyList) { + this.bodyList = bodyList; + } /** * @Description: åˆå§‹åŒ– * @author chenxw @@ -150,16 +165,10 @@ public class TableXML { this.headList.add(tr); } - public List<Tr> getHeadList() { - return headList; - } public void addBody(Tr tr) { this.bodyList.add(tr); } - public List<Tr> getBodyList() { - return bodyList; - } } diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Td.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Td.java new file mode 100644 index 00000000..e1882446 --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Td.java @@ -0,0 +1,42 @@ +package com.gx.obe.components.core.vo; + +public class Td { + + private String colType; + private String content; + private int width; + private boolean needFill; + + public String getColType() { + return colType; + } + + public String getContent() { + return content; + } + + public int getWidth() { + return width; + } + + public void setColType(String colType) { + this.colType = colType; + } + + public void setContent(String content) { + this.content = content; + } + + public void setWidth(int width) { + this.width = width; + } + + public boolean isNeedFill() { + return needFill; + } + + public void setNeedFill(boolean needFill) { + this.needFill = needFill; + } + +} \ No newline at end of file diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Tr.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Tr.java new file mode 100644 index 00000000..71f4e240 --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/components/core/vo/Tr.java @@ -0,0 +1,42 @@ +package com.gx.obe.components.core.vo; + +public class Tr { + + private Td[] tds; + private boolean isTitle; + private boolean isCount; + private String subjectTableID; + + public void setTds(Td[] tds) { + this.tds = tds; + } + + public Td[] getTds() { + return tds; + } + + public void setTitle(boolean isTitle) { + this.isTitle = isTitle; + } + + public boolean isTitle() { + return isTitle; + } + + public void setSubjectTableID(String subjectTableID) { + this.subjectTableID = subjectTableID; + } + + public String getSubjectTableID() { + return subjectTableID; + } + + public void setCount(boolean isCount) { + this.isCount = isCount; + } + + public boolean isCount() { + return isCount; + } + +} \ No newline at end of file diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationContent.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationContent.java new file mode 100644 index 00000000..c8e6aa2d --- /dev/null +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationContent.java @@ -0,0 +1,100 @@ +package com.gx.obe.web.entity.evaluation; + +/** + * @Description: 评审内容 + * @author chenxw + */ +public class EvaluationContent { + + private String id; + private String tenderId; + private String factorCode; + private String relChapterType; + private String dataCategory; + private String dataCode; + private String evalRule; + private String tenderStructName; + private String evalPointName; + private Integer sortNo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getFactorCode() { + return factorCode; + } + + public void setFactorCode(String factorCode) { + this.factorCode = factorCode; + } + + public String getRelChapterType() { + return relChapterType; + } + + public void setRelChapterType(String relChapterType) { + this.relChapterType = relChapterType; + } + + public String getDataCategory() { + return dataCategory; + } + + public void setDataCategory(String dataCategory) { + this.dataCategory = dataCategory; + } + + public String getDataCode() { + return dataCode; + } + + public void setDataCode(String dataCode) { + this.dataCode = dataCode; + } + + public String getEvalRule() { + return evalRule; + } + + public void setEvalRule(String evalRule) { + this.evalRule = evalRule; + } + + public String getTenderStructName() { + return tenderStructName; + } + + public void setTenderStructName(String tenderStructName) { + this.tenderStructName = tenderStructName; + } + + public String getEvalPointName() { + return evalPointName; + } + + public void setEvalPointName(String evalPointName) { + this.evalPointName = evalPointName; + } + + public Integer getSortNo() { + return sortNo; + } + + public void setSortNo(Integer sortNo) { + this.sortNo = sortNo; + } + +} \ No newline at end of file diff --git a/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationFactor.java b/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationFactor.java index 03f56988..45ceae2c 100644 --- a/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationFactor.java +++ b/OBE-COMPONENTS-CORE/src/com/gx/obe/web/entity/evaluation/EvaluationFactor.java @@ -111,6 +111,15 @@ public class EvaluationFactor { private Integer childCount = 0; private Integer level = 1; + /** 2022-10-26 + * 智能评审规则å˜å‚¨å±žæ€§ï¼ˆä»¥jsonå½¢å¼å˜å‚¨å—符串) + */ + private String intelligentEval; + + /** + * 智能评审规则 + */ + private String remarks; /** * æ·»åŠ å节点 @@ -118,6 +127,15 @@ public class EvaluationFactor { * @param libraryNode * å节点 */ + + private List<EvaluationContent> evaluationContentList; + public List<EvaluationContent> getEvaluationContentList() { + return evaluationContentList; + } + + public void setEvaluationContentList(List<EvaluationContent> evaluationContentList) { + this.evaluationContentList = evaluationContentList; + } public void addChild(EvaluationFactor factor) { childFactorList.add(factor); } @@ -397,5 +415,22 @@ public class EvaluationFactor { public AIDataParams getAIDataParams() { return SerializeUtils.deserializeObject(dataParams); + } + + public String getIntelligentEval() { + return intelligentEval; + } + + public void setIntelligentEval(String intelligentEval) { + this.intelligentEval = intelligentEval; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; } + } diff --git a/OBE-COMPONENTS-MESSAGES/bin/.gitignore b/OBE-COMPONENTS-MESSAGES/bin/.gitignore new file mode 100644 index 00000000..c2d9872a --- /dev/null +++ b/OBE-COMPONENTS-MESSAGES/bin/.gitignore @@ -0,0 +1 @@ +/com/ diff --git a/OBE-COMPONENTS/src/com/gx/obe/common/composite/BidOpeningResultLoadComposite.java b/OBE-COMPONENTS/src/com/gx/obe/common/composite/BidOpeningResultLoadComposite.java index 7b55a45e..38d31492 100644 --- a/OBE-COMPONENTS/src/com/gx/obe/common/composite/BidOpeningResultLoadComposite.java +++ b/OBE-COMPONENTS/src/com/gx/obe/common/composite/BidOpeningResultLoadComposite.java @@ -483,7 +483,10 @@ public class BidOpeningResultLoadComposite extends Composite { public void run() { // 如果没有获å–è¿‡æœ€æ–°æŠ•æ ‡ä¿¡æ¯ï¼Œåˆ™è‡ªåŠ¨ä¸‹è½½ä¾›åº”å•† if(!tenderProjectService.isGetLatestBidinfo(tenderProject.getId())){ - RefreshProjectSupplierTenderInfoThread thread = new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){}); + RefreshProjectSupplierTenderInfoThread thread = new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){ + public int getErrorMessagesSize() { + return 0; + }}); thread.start(); thread.join(); } diff --git a/OBE-COMPONENTS/src/com/gx/obe/common/dialog/DownloadProjectDialog.java b/OBE-COMPONENTS/src/com/gx/obe/common/dialog/DownloadProjectDialog.java index 36e0ca54..d97a614c 100644 --- a/OBE-COMPONENTS/src/com/gx/obe/common/dialog/DownloadProjectDialog.java +++ b/OBE-COMPONENTS/src/com/gx/obe/common/dialog/DownloadProjectDialog.java @@ -705,6 +705,11 @@ public class DownloadProjectDialog extends EDialog { public void finish(boolean flag) { } + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }; List<Future<?>> allDownloadFutureList = new ArrayList<Future<?>>(); diff --git a/OBE-COMPONENTS/src/com/gx/obe/common/dialog/ServerAuthenticationDialog.java b/OBE-COMPONENTS/src/com/gx/obe/common/dialog/ServerAuthenticationDialog.java index a0058279..dff9422f 100644 --- a/OBE-COMPONENTS/src/com/gx/obe/common/dialog/ServerAuthenticationDialog.java +++ b/OBE-COMPONENTS/src/com/gx/obe/common/dialog/ServerAuthenticationDialog.java @@ -433,6 +433,12 @@ public class ServerAuthenticationDialog extends EDialog { } } + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } }); thread.start(); } diff --git a/OBE-CONFIG/config.properties b/OBE-CONFIG/config.properties index c1027b6c..33c6efed 100644 --- a/OBE-CONFIG/config.properties +++ b/OBE-CONFIG/config.properties @@ -1,5 +1,5 @@ #update -#Tue Oct 10 09:20:36 CST 2023 +#Sat Nov 11 14:15:13 CST 2023 allowImportBidFile= decryptType=11 controlBidOpening=01 @@ -43,7 +43,7 @@ defaultStepProgress=02 passwordPattern=^(?\![0-9]+$)(?\![a-zA-Z]+$)[0-9A-Za-z\!@\#$%^&*?]{6,10}$ rebackEvaluation=01 monitoringCenterAddress=http\://1.202.77.139\:9587/ -properties_path=/D\:/Developer/EclipseTool/eclipse-rcp-photon-R-win32/../../../GitHub/\u4EAC\u80FD/jingneng/OBE-CONFIG/config.properties +properties_path=/E\:/gitWorkSpace/v7/jingneng/OBE-CONFIG/config.properties templateUpdateTime=2023-09-14 13\:11\:12 appServiceIsParallel=true serverName=\u4EAC\u80FD\u96C6\u56E2\u7535\u5B50\u5546\u52A1\u5E73\u53F0(\u6D4B\u8BD5) @@ -100,6 +100,7 @@ appServiceSignMode=RSA evalFullScreen=01 netService=JNJTService ifShowVideoCloseButton=1 +showType=comparisonTable batchFileSignature=01 bidOpeningFullscreen=00 caSignaturePdf= @@ -142,28 +143,28 @@ lastDownloadProjectTime=1696900836876 defaultRecommonedCount= passwordPatternTips=\u5BC6\u7801\u5FC5\u987B\u5305\u542B\u5B57\u6BCD\u548C\u6570\u5B57\uFF0C\u4E14\u57286~10\u4F4D\u4E4B\u95F4\uFF01 lockStep= -saomaSignaturePdf= evalBidRoomId=aadd606ff7c1445184b9ad780c5feb60 +saomaSignaturePdf= oldCharsetName= newCharsetName= isAIEvaluation=00 excelRowStart=2 -volume=100 groupByEvalBidRoom=00 -obeLicenseServerUrl=http\://127.0.0.1\:8080/ +volume=100 verifyEvalMachineExpert=00 +obeLicenseServerUrl=http\://127.0.0.1\:8080/ checkNewVersion=01 gfaServiceAddress=http\://60.209.80.97\:28443/soa/WSMServlet videoMeetingUrl=114.116.148.159\:8181 versionUpdateType=OBE_Service creditChinaDetialURL=https\://test.powerbeijing-ec.com/jndzzb/creditChinaController.do?getZhixingDetail&creditNo\= -qrCodeServcerAddress=http\://39.96.40.58\:8811/gxapp/scanning/ zipEncoding=GBK -viewEvaluationResult=01 +qrCodeServcerAddress=http\://39.96.40.58\:8811/gxapp/scanning/ bidOpeningSupplierSytle=01 +viewEvaluationResult=01 isUseAutomaticDownload=01 -faceCompare=http\://1.202.77.139\:8001/api/face/compare torrentServer= +faceCompare=http\://1.202.77.139\:8001/api/face/compare bidFilePath=c\:\\bidFile lessThanThreeFilter= ftpBuffersize=1024 @@ -171,5 +172,5 @@ expertLimit= useSpecialPdf=01 speed=0 bidFileCacheCount=5 +obeWebServerUrl=http\://127.0.0.1\:9863/ OPENOFFICE_SERVER_port=8100 -obeWebServerUrl=http\://47.95.161.231\:6850/ diff --git a/OBE-CONFIG/src/com/gx/obe/config/ConfigConstants.java b/OBE-CONFIG/src/com/gx/obe/config/ConfigConstants.java index 8af91b72..abf34740 100644 --- a/OBE-CONFIG/src/com/gx/obe/config/ConfigConstants.java +++ b/OBE-CONFIG/src/com/gx/obe/config/ConfigConstants.java @@ -669,5 +669,13 @@ public class ConfigConstants { } return false; } - + //webæœåŠ¡ç«¯åœ°å€ + public static final String AUXILIARY_SERVICE_URL = "auxiliaryServiceUrl"; + + /** + * è¯„æ ‡ç•Œé¢æ ‡ä¹¦åŒºåŸŸæ˜¯å¦é»˜è®¤æ˜¾ç¤ºæ¸…æ ‡æ„è§ + */ +// public static final String IS_SHOW_FACTOR_OPINION = "isShowFactorOpinion"; + + public static final String SHOW_TYPE = "showType"; } diff --git a/OBE-MANAGEMENT/META-INF/MANIFEST.MF b/OBE-MANAGEMENT/META-INF/MANIFEST.MF index dbd69200..1cbeb7ca 100644 --- a/OBE-MANAGEMENT/META-INF/MANIFEST.MF +++ b/OBE-MANAGEMENT/META-INF/MANIFEST.MF @@ -33,7 +33,8 @@ Require-Bundle: org.eclipse.ui, com.gx.obe.software;bundle-version="1.0.0", com.gx.obe.meeting;bundle-version="1.0.0", com.gx.obe.step, - com.gx.obe.template;bundle-version="1.0.0" + com.gx.obe.template;bundle-version="1.0.0", + com.gx.obe.struct;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: com.gx.obe.management Bundle-ActivationPolicy: lazy diff --git a/OBE-MANAGEMENT/src/com/gx/obe/management/composite/EvaluationFactorsManagerComposite.java b/OBE-MANAGEMENT/src/com/gx/obe/management/composite/EvaluationFactorsManagerComposite.java index 8ce00448..27885ecb 100644 --- a/OBE-MANAGEMENT/src/com/gx/obe/management/composite/EvaluationFactorsManagerComposite.java +++ b/OBE-MANAGEMENT/src/com/gx/obe/management/composite/EvaluationFactorsManagerComposite.java @@ -9,8 +9,10 @@ import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.core.CallBack; import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.core.listener.LoadingAdatper; import org.eclipse.swt.core.utils.FileDialogUtils; import org.eclipse.swt.core.utils.WidgetUtils; +import org.eclipse.swt.core.widgets.ConfirmDialog; import org.eclipse.swt.core.widgets.ELink; import org.eclipse.swt.core.widgets.ESepator; import org.eclipse.swt.core.widgets.ImageButton; @@ -35,6 +37,7 @@ import com.gx.obe.common.dialog.BidRegulationsConfigDialog; import com.gx.obe.common.file.enumeration.FileConstants; import com.gx.obe.common.icons.IconsActivator; import com.gx.obe.common.widget.dialog.MessageViewDialog; +import com.gx.obe.common.widget.shell.ProgressMessageDialog; import com.gx.obe.common.widget.thread.MyRunnable; import com.gx.obe.common.widget.thread.SyncThread; import com.gx.obe.common.widget.utils.MenuFunctionUtils; @@ -53,6 +56,7 @@ import com.gx.obe.management.thread.ImportBillOfQuantitiesThread; import com.gx.obe.management.thread.NewExportEvaluationFactorThread; import com.gx.obe.management.thread.SupplierEvaluationFactorXmlResolverThread; import com.gx.obe.message.Messages; +import com.gx.obe.struct.thread.ParsingStructThread; import com.gx.obe.thread.SyncThreadSet; import com.gx.obe.util.utils.CollectionUtils; import com.gx.obe.util.utils.LogUtils; @@ -100,6 +104,7 @@ public class EvaluationFactorsManagerComposite extends Composite { private boolean isInProgress = false; private boolean returnFlag = false; private MenuFunctionUtils menuFunctionUtils = new MenuFunctionUtils(); + private ELink importStructInfoLink; { LogUtils.logClass(EvaluationFactorsManagerComposite.class); @@ -230,6 +235,17 @@ public class EvaluationFactorsManagerComposite extends Composite { importsupplierFactorResponse.setText(Messages.Button_analysisResponse); menuFunctionUtils.addFunction(importsupplierFactorResponse, "ANALYSIS_RESPONSE"); + + importStructInfoLink = new ELink(eval_method_composite, SWT.WRAP); + importStructInfoLink.addMouseListener(new MouseAdapter() { + public void mouseUp(MouseEvent e) { + importStructInfoAction(); + } + }); + importStructInfoLink.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/import.png")); + importStructInfoLink.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1)); + importStructInfoLink.setText("一键解æžç»“构化数æ®"); + importBillOfQuantities = new ELink(eval_method_composite, SWT.WRAP); importBillOfQuantities.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { @@ -1024,7 +1040,34 @@ public class EvaluationFactorsManagerComposite extends Composite { thread.start(); } } - + /** + * @Description: è§£æžç»“æž„åŒ–æ•°æ® + * @author huangzhong + */ + private void importStructInfoAction() { +// MessageViewDialog dialog = new MessageViewDialog(getShell(), -1); +// dialog.setTitle("è§£æžç»“构化数æ®"); +// new Thread(new ParsingStructThread(tenderProjectEntity.getId(), dialog.getCallBack())).start(); +// dialog.open(); + + ConfirmDialog confirmDialog = new ConfirmDialog(getShell(), null, "ç¡®è®¤å·²ä¸‹è½½æ ‡ä¹¦æ–‡ä»¶å¹¶è§£æžç»“构化数æ®å—? ", null); + confirmDialog.addButton("一键解æž", "01", null); + confirmDialog.addCancel(Messages.Button_close, null); + confirmDialog.open(); + if(!confirmDialog.getClickStatus().equals("01")){ + return; + } + ProgressMessageDialog messageProgress = new ProgressMessageDialog(getShell(), false, -1, new LoadingAdatper() { + public void finish(boolean flag) { + } + }); + messageProgress.setTitle("一键解æžç»“构化数æ®"); + messageProgress.setOperateVisible(true); + messageProgress.setCountDownTime(2); + new Thread(new ParsingStructThread(tenderProjectEntity, messageProgress)).start(); + messageProgress.open(); + + } /** * @Description: éªŒè¯æ˜¯å¦å·²ç»è¿›å…¥è¯„分环节 * @author guoyr diff --git a/OBE-MANAGEMENT/src/com/gx/obe/management/composite/SubPackageMenuEnterComposite.java b/OBE-MANAGEMENT/src/com/gx/obe/management/composite/SubPackageMenuEnterComposite.java index b9d8b870..eae3a8db 100644 --- a/OBE-MANAGEMENT/src/com/gx/obe/management/composite/SubPackageMenuEnterComposite.java +++ b/OBE-MANAGEMENT/src/com/gx/obe/management/composite/SubPackageMenuEnterComposite.java @@ -409,7 +409,13 @@ public class SubPackageMenuEnterComposite extends Composite implements ActionLis public void run() { // å¦‚æžœæœªèŽ·å–æœ€æ–°æŠ•æ ‡ä¿¡æ¯ï¼Œåˆ™è‡ªåŠ¨èŽ·å– if(!tenderProjectService.isGetLatestBidinfo(tenderProject.getId())){ - new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){}).start(); + new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){ + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + }}).start(); }else if(!CommonEnum.YES.equals(tenderProject.getIsPack())) { //京能ä¸è¦è‡ªåŠ¨ä¸‹è½½ä¸“å®¶ if(!MenuFunction.HIDE.equals(menuFunctionUtils.getAuthority(MenuFunctionEnum.AUTO_DOWN_EXPERT))){ diff --git a/OBE-MANAGEMENT/src/com/gx/obe/management/composite/TenderProjectEnterMenuComposite.java b/OBE-MANAGEMENT/src/com/gx/obe/management/composite/TenderProjectEnterMenuComposite.java index 8947ee0f..b94a8061 100644 --- a/OBE-MANAGEMENT/src/com/gx/obe/management/composite/TenderProjectEnterMenuComposite.java +++ b/OBE-MANAGEMENT/src/com/gx/obe/management/composite/TenderProjectEnterMenuComposite.java @@ -285,7 +285,13 @@ public class TenderProjectEnterMenuComposite extends Composite implements Action public void run() { // å¦‚æžœæœªèŽ·å–æœ€æ–°æŠ•æ ‡ä¿¡æ¯ï¼Œåˆ™è‡ªåŠ¨èŽ·å– if(!tenderProjectService.isGetLatestBidinfo(tenderProject.getId())){ - new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){}).start(); + new RefreshProjectSupplierTenderInfoThread(tenderProject, new ProgressMessageAdapter(){ + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + }}).start(); }else if(!CommonEnum.YES.equals(tenderProject.getIsPack())) { //京能ä¸è¦è‡ªåŠ¨ä¸‹è½½ if(!MenuFunction.HIDE.equals(menuFunctionUtils.getAuthority(MenuFunctionEnum.AUTO_DOWN_EXPERT))){ diff --git a/OBE-UTILS/META-INF/MANIFEST.MF b/OBE-UTILS/META-INF/MANIFEST.MF index b9e1220a..e43ad607 100644 --- a/OBE-UTILS/META-INF/MANIFEST.MF +++ b/OBE-UTILS/META-INF/MANIFEST.MF @@ -18,6 +18,7 @@ Bundle-ClassPath: ., lib/aspectjweaver-1.9.1.jar, lib/aspose-words-14.9.0-jdk16.jar Export-Package: com.gx.obe.util, + com.gx.obe.util.element, com.gx.obe.util.entity, com.gx.obe.util.pdf, com.gx.obe.util.thread, diff --git a/OBE-UTILS/src/com/gx/obe/util/element/ElementClass.java b/OBE-UTILS/src/com/gx/obe/util/element/ElementClass.java new file mode 100644 index 00000000..2a99df7b --- /dev/null +++ b/OBE-UTILS/src/com/gx/obe/util/element/ElementClass.java @@ -0,0 +1,72 @@ +package com.gx.obe.util.element; + + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +public class ElementClass<T> { + + private Class<T> tClass; + + private List<FieldInfo> fieldInfoList; + + public static <T> ElementClass<T> of(Class<T> tClass) { + return new ElementClass<>(tClass); + } + + public ElementClass(Class<T> tClass) { + this.tClass = tClass; + this.fieldInfoList = Arrays.stream(tClass.getDeclaredFields()).map(this::createFieldInfo).filter(t -> t != null).collect(Collectors.toList());; + } + + private FieldInfo createFieldInfo(Field field) { + PropertyDescriptor descriptor = null; + try { + descriptor = new PropertyDescriptor(field.getName(), tClass); + } catch (IntrospectionException e) { + return null; + } + return new FieldInfo(field, descriptor.getWriteMethod()); + } + + public T create(Element element) { + T t; + try { + t = tClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + return null; + } + fieldInfoList.forEach(fieldInfo -> fieldInfo.mapValue(t, element)); + return t; + } + + public List<T> createList(Element element) { + List<?> elements = element.elements(); + return elements.stream().map(t -> create((Element) t)).collect(Collectors.toList()); + } + + public T create(String xml) { + try { + return create(DocumentHelper.parseText(xml).getRootElement()); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + } + + public List<T> createList(String xml) { + try { + return createList(DocumentHelper.parseText(xml).getRootElement()); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/OBE-UTILS/src/com/gx/obe/util/element/FieldInfo.java b/OBE-UTILS/src/com/gx/obe/util/element/FieldInfo.java new file mode 100644 index 00000000..f87c72a6 --- /dev/null +++ b/OBE-UTILS/src/com/gx/obe/util/element/FieldInfo.java @@ -0,0 +1,68 @@ +package com.gx.obe.util.element; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.util.List; +import java.util.stream.Collectors; + +import org.dom4j.Element; + +import com.gx.obe.util.utils.ElementUtils; + + + +public class FieldInfo { + + private String name; + + private Method writeMethod; + + private FieldType type; + + private Class<?> fClass; + + public FieldInfo(Field field, Method writeMethod) { + this.name = field.getName(); + this.writeMethod = writeMethod; + this.fClass = field.getType(); + if (fClass == String.class) this.type = FieldType.STRING; + else if (fClass == List.class) { + ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); + this.fClass = (Class<?>) parameterizedType.getActualTypeArguments()[0]; + this.type = fClass == String.class ? FieldType.LIST_STRING : FieldType.LIST_OBJECT; + } else this.type = FieldType.OBJECT; + } + + public void mapValue(Object obj, Element element) { + Object value = getValue(element); + if (value == null) return; + try { + writeMethod.invoke(obj, value); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {} + } + + private Object getValue(Element element) { + Element fieldElement = element.element(name); + if (fieldElement == null) return null; + List<?> elements = fieldElement.elements(); + switch (type) { + case STRING: + return fieldElement.getTextTrim(); + case OBJECT: + return ElementClass.of(fClass).create(fieldElement); + case LIST_STRING: + return elements.stream().map(ElementUtils::as).map(Element::getTextTrim).collect(Collectors.toList()); + case LIST_OBJECT: + return elements.stream().map(ElementUtils::as).map(ElementClass.of(fClass)::create).collect(Collectors.toList()); + default: + return null; + } + } + + public enum FieldType { + STRING, OBJECT, LIST_STRING, LIST_OBJECT; + } + +} diff --git a/OBE-UTILS/src/com/gx/obe/util/utils/ElementUtils.java b/OBE-UTILS/src/com/gx/obe/util/utils/ElementUtils.java new file mode 100644 index 00000000..e197b62f --- /dev/null +++ b/OBE-UTILS/src/com/gx/obe/util/utils/ElementUtils.java @@ -0,0 +1,23 @@ +package com.gx.obe.util.utils; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import org.dom4j.Element; + +public class ElementUtils { + + public static Function<Element, Stream<Element>> toStreamFun(String listName, String itemName) { + return e -> { + List<?> elements = Optional.ofNullable(e).map(t -> t.element(listName)).map(t -> t.elements(itemName)).orElse(null); + if (elements == null) return null; + return elements.stream().map(t -> (Element) t); + }; + } + + public static <T> Element as(T t) { + return (Element) t; + } +} diff --git a/OBE-UTILS/src/com/gx/obe/util/utils/Keys.java b/OBE-UTILS/src/com/gx/obe/util/utils/Keys.java index c1b56a75..7dd3fe03 100644 --- a/OBE-UTILS/src/com/gx/obe/util/utils/Keys.java +++ b/OBE-UTILS/src/com/gx/obe/util/utils/Keys.java @@ -15,6 +15,10 @@ public class Keys { this.keys = keys; } + public static Keys of(Object... ks) { + return new Keys(ks); + } + @SafeVarargs public static <T> Function<T, Keys> fun(Function<T, Object>... functionKeys) { return t -> new Keys(Arrays.stream(functionKeys).map(f -> f.apply(t)).toArray()); diff --git a/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtil.java b/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtil.java new file mode 100644 index 00000000..b7b137fc --- /dev/null +++ b/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtil.java @@ -0,0 +1,12 @@ +package com.gx.obe.util.utils; + +import java.util.function.Function; +import java.util.function.Predicate; + +public class PredicateUtil { + + public static <T, R> Predicate<T> get(Function<T, R> function, Predicate<R> predicate) { + return t -> predicate.test(function.apply(t)); + } + +} diff --git a/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtils.java b/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtils.java index ea914583..5b1a3b6c 100644 --- a/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtils.java +++ b/OBE-UTILS/src/com/gx/obe/util/utils/PredicateUtils.java @@ -29,4 +29,24 @@ public class PredicateUtils { return t -> predicate.test(function.apply(t)); } + /** + * @Description: 大于 + * @author chenxw + * @param higher + * @return + */ + public static Predicate<Integer> higher(int higher) { + return t -> t > higher; + } + + /** + * @Description: å°äºŽ + * @author chenxw + * @param lower + * @return + */ + public static Predicate<Integer> lower(int lower) { + return t -> t < lower; + } + } diff --git a/com.gx.obe.bind/.classpath b/com.gx.obe.bind/.classpath new file mode 100644 index 00000000..1fa3e680 --- /dev/null +++ b/com.gx.obe.bind/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/com.gx.obe.bind/.gitignore b/com.gx.obe.bind/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/com.gx.obe.bind/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/com.gx.obe.bind/.project b/com.gx.obe.bind/.project new file mode 100644 index 00000000..9ca57854 --- /dev/null +++ b/com.gx.obe.bind/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>com.gx.obe.bind</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/com.gx.obe.bind/.settings/org.eclipse.core.resources.prefs b/com.gx.obe.bind/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..c01d71d1 --- /dev/null +++ b/com.gx.obe.bind/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 +separateDerivedEncodings=true diff --git a/com.gx.obe.bind/.settings/org.eclipse.jdt.core.prefs b/com.gx.obe.bind/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..0c68a61d --- /dev/null +++ b/com.gx.obe.bind/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.gx.obe.bind/META-INF/MANIFEST.MF b/com.gx.obe.bind/META-INF/MANIFEST.MF new file mode 100644 index 00000000..75d32f3f --- /dev/null +++ b/com.gx.obe.bind/META-INF/MANIFEST.MF @@ -0,0 +1,24 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Bind +Bundle-SymbolicName: com.gx.obe.bind +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: com.gx.obe.bind.Activator +Bundle-Vendor: GX +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Automatic-Module-Name: com.gx.obe.bind +Bundle-ActivationPolicy: lazy +Export-Package: com.gx.obe.bind, + com.gx.obe.bind.base, + com.gx.obe.bind.call, + com.gx.obe.bind.exception, + com.gx.obe.bind.fun, + com.gx.obe.bind.promise, + com.gx.obe.bind.prop, + com.gx.obe.bind.recursion, + com.gx.obe.bind.rx, + com.gx.obe.bind.stream, + com.gx.obe.bind.utils, + com.gx.obe.bind.view diff --git a/com.gx.obe.bind/build.properties b/com.gx.obe.bind/build.properties new file mode 100644 index 00000000..5f4af4c1 --- /dev/null +++ b/com.gx.obe.bind/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . +javacDefaultEncoding.. = UTF-8 \ No newline at end of file diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/Activator.java b/com.gx.obe.bind/src/com/gx/obe/bind/Activator.java new file mode 100644 index 00000000..c2b1a6d1 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/Activator.java @@ -0,0 +1,50 @@ +package com.gx.obe.bind; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "com.gx.obe.bind"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/base/P.java b/com.gx.obe.bind/src/com/gx/obe/bind/base/P.java new file mode 100644 index 00000000..1d54121d --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/base/P.java @@ -0,0 +1,134 @@ +package com.gx.obe.bind.base; + +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.UUID; +import java.util.function.BiConsumer; +import java.util.function.BiPredicate; +import java.util.function.Supplier; + +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.RView; +import com.gx.obe.bind.view.Write; + +public class P<T> implements RView<T> { + + private boolean log; + + private T value; + + private Map<String, BiConsumer<T, T>> writeMap = new HashMap<>(); + + private List<ChangeListener> changeListenerList = new ArrayList<>(); + + private String name; + + private BiPredicate<T, T> predicate = (o, n) -> true; + + private T defaultValue; + + private Supplier<T> other = () -> defaultValue; + + public P<T> as(String name) { + this.name = Objects.requireNonNull(name); + this.log = true; + return this; + } + + public P<T> orElseGet(Supplier<T> other) { + this.other = Objects.requireNonNull(other); + this.value = other.get(); + return this; + } + + public P<T> orElse(T defaultValue) { + this.defaultValue = defaultValue; + this.value = defaultValue; + return this; + } + + public P<T> limit(BiPredicate<T, T> predicate) { + this.predicate = Objects.requireNonNull(predicate); + return this; + } + + public T get() { + return value; + } + + public void bind(Write<T> write) { + bind(UUID.randomUUID().toString(), write); + } + + public void bind(String key, Write<T> write) { + Objects.requireNonNull(write); + this.writeMap.put(key, (o, n) -> write.set(n)); + } + + public void watch(BiConsumer<T, T> biConsumer) { + watch(UUID.randomUUID().toString(), biConsumer); + } + + public void watch(String key, BiConsumer<T, T> biConsumer) { + Objects.requireNonNull(biConsumer); + this.writeMap.put(key, biConsumer); + } + + public void bindExe(Write<T> write) { + bindExe(UUID.randomUUID().toString(), write); + } + + public void bindExe(String key, Write<T> write) { + Objects.requireNonNull(write); + write.set(value); + this.writeMap.put(key, (o, n) -> write.set(n)); + } + + public void clearBind() { + this.writeMap.clear(); + this.value = other.get(); + } + + public void clearListener() { + this.changeListenerList.clear(); + } + + private void _change(T value) { + if (log) System.out.println(name + " --source:" + this.value + " --change:" + value); + this.value = Optional.ofNullable(value).orElseGet(other); + this.changeListenerList.forEach(ChangeListener::change); + } + + protected void change(T value) { + T old = this.value; + if (!predicate.test(old, value)) return; + _change(value); + this.writeMap.values().stream().forEach(c -> c.accept(old, get())); + } + + protected void change(T value, String key) { + T old = this.value; + if (!predicate.test(old, value)) return; + _change(value); + this.writeMap.entrySet().stream().filter(e -> !e.getKey().equals(key)).map(e -> e.getValue()).forEach(c -> c.accept(old, get())); + } + + public boolean isBind() { + return !writeMap.isEmpty(); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + this.changeListenerList.add(Objects.requireNonNull(changeListener)); + } + + @Override + public String toString() { + return "P:" + Objects.toString(value); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/call/Call.java b/com.gx.obe.bind/src/com/gx/obe/bind/call/Call.java new file mode 100644 index 00000000..42d70036 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/call/Call.java @@ -0,0 +1,59 @@ +package com.gx.obe.bind.call; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import com.gx.obe.bind.view.Read; +import com.gx.obe.bind.view.Write; + +public class Call { + + private final List<Callback> callbackList = new ArrayList<>(); + + public static Call of(Callback callback) { + return new Call().bind(callback); + } + + public boolean isBind() { + return !callbackList.isEmpty(); + } + + public Call bind(Callback callback) { + callbackList.add(callback); + return this; + } + + public Call bindExe(Callback callback) { + callback.call(); + return bind(callback); + } + + public void exe() { + callbackList.stream().forEach(Callback::call); + } + + public <T> Consumer<T> toSet() { + return t -> exe(); + } + + public <T> Supplier<T> toGet() { + return () -> { + exe(); + return null; + }; + } + + public <T> Write<T> toWrite() { + return t -> exe(); + } + + public <T> Read<T> toRead() { + return () -> { + exe(); + return null; + }; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/call/Callback.java b/com.gx.obe.bind/src/com/gx/obe/bind/call/Callback.java new file mode 100644 index 00000000..3a561413 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/call/Callback.java @@ -0,0 +1,5 @@ +package com.gx.obe.bind.call; + +public interface Callback { + void call(); +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/exception/ExFunction.java b/com.gx.obe.bind/src/com/gx/obe/bind/exception/ExFunction.java new file mode 100644 index 00000000..f3c80b22 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/exception/ExFunction.java @@ -0,0 +1,7 @@ +package com.gx.obe.bind.exception; + +public interface ExFunction<T, R> { + + R apply(T t) throws Exception; + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/exception/ExceptionFun.java b/com.gx.obe.bind/src/com/gx/obe/bind/exception/ExceptionFun.java new file mode 100644 index 00000000..994cdb95 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/exception/ExceptionFun.java @@ -0,0 +1,46 @@ +package com.gx.obe.bind.exception; + +import java.math.BigDecimal; +import java.util.function.Function; + +public class ExceptionFun<T, R> implements Function<T, R> { + + private ExFunction<T, R> function; + + public static <T, R> ExceptionFun<T, R> of(ExFunction<T, R> function) { + return new ExceptionFun<>(function); + } + + public ExceptionFun(ExFunction<T, R> function) { + this.function = function; + } + + public R get(T t) { + return getOrDefault(t, null); + } + + public R getOrDefault(T t, R defaultValue) { + try { + return function.apply(t); + } catch (Exception e) { + return defaultValue; + } + } + + public R getOrThrow(T t) { + try { + return function.apply(t); + } catch (Exception e) { + throw new NullPointerException(e.getMessage()); + } + } + + public static final ExceptionFun<String, BigDecimal> toBigDecimal = of(BigDecimal::new); + public static final ExceptionFun<String, Integer> toInteger = of(Integer::valueOf); + + @Override + public R apply(T t) { + return get(t); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/fun/Fun.java b/com.gx.obe.bind/src/com/gx/obe/bind/fun/Fun.java new file mode 100644 index 00000000..5aa16b46 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/fun/Fun.java @@ -0,0 +1,63 @@ +package com.gx.obe.bind.fun; + +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; + +import com.gx.obe.bind.view.Read; +import com.gx.obe.bind.view.Write; + +public class Fun<T, R> { + + private Function<T, R> function; + + private Fun(Function<T, R> function) { + this.function = function; + } + + public <V> Fun<T, V> andThen(Function<R, V> after) { + return Fun.of(function.andThen(after)); + } + + public <V> Fun<V, R> compose(Function<V, T> before) { + return Fun.of(function.compose(before)); + } + + public Function<T, R> toFun() { + return function; + } + + public Supplier<R> toGet(T t) { + return () -> function.apply(t); + } + + public Supplier<R> toGet(Supplier<T> supplier) { + return () -> function.apply(supplier.get()); + } + + public Read<R> toRead(T t) { + return () -> function.apply(t); + } + + public Read<R> toRead(Read<T> read) { + return () -> function.apply(read.get()); + } + + public Consumer<T> toSet(Consumer<R> consumer) { + return t -> consumer.accept(function.apply(t)); + } + + public Write<T> toWrite(Consumer<R> consumer) { + return t -> consumer.accept(function.apply(t)); + } + + public Predicate<T> toTest(Predicate<R> predicate) { + return t -> predicate.test(function.apply(t)); + } + + public static <T, R> Fun<T, R> of(Function<T, R> function) { + return new Fun<>(function); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/promise/Promise.java b/com.gx.obe.bind/src/com/gx/obe/bind/promise/Promise.java new file mode 100644 index 00000000..58106643 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/promise/Promise.java @@ -0,0 +1,137 @@ +package com.gx.obe.bind.promise; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class Promise<T> { + + private STATUS status = STATUS.PENDING; + + private T value; + private Exception error; + + private Consumer<T> onFullFilled = t -> {}; + private Consumer<Exception> onRejected = e -> {}; + + enum STATUS { + PENDING, RESOLVE, REJECT; + } + + public Promise(Fun<T> fun) { + Consumer<T> resolve = t -> { + this.status = STATUS.RESOLVE; + this.value = t; + this.onFullFilled.accept(t); + synchronized (this) { + this.notify(); + } + }; + Consumer<Exception> reject = e -> { + this.status = STATUS.REJECT; + this.error = e; + this.onRejected.accept(e); + synchronized (this) { + this.notify(); + } + }; + try { + fun.call(resolve, reject); + } catch (Exception e) { + reject.accept(e); + } + } + + public static <T> Promise<T> thread(Fun<T> fun) { + return new Promise<>((resolve, reject) -> { + new Thread(() -> { + try { + fun.call(resolve, reject); + } catch (Exception e) { + e.printStackTrace(); + reject.accept(e); + } + }).start(); + }); + } + + public static <T> Promise<T> empty() { + return new Promise<>((resolve, reject) -> {}); + } + + public static <T> Promise<T> resolve(T value) { + return new Promise<>((resolve, reject) -> resolve.accept(value)); + } + + public static <T> Promise<T> reject() { + return reject(new RuntimeException("Promise reject error")); + } + + public static <T> Promise<T> reject(Exception err) { + return new Promise<>((resolve, reject) -> reject.accept(err)); + } + + public static <T, R> Function<T, Promise<R>> resolveFun(Function<T, R> function) { + return t -> new Promise<R>((resolve, reject) -> resolve.accept(function.apply(t))); + } + + public <R> Promise<R> then(Function<T, Promise<R>> onFullFilled) { + switch (this.status) { + case RESOLVE: + return onFullFilled.apply(this.value); + case REJECT: + return new Promise<R>((resolve, reject) -> reject.accept(this.error)); + default: + return new Promise<R>((resolve, reject) -> { + this.onFullFilled = t -> onFullFilled.apply(t).then(resolve, reject); + this.onRejected = reject; + }); + } + } + + public void then(Consumer<T> onFullFilled, Consumer<Exception> onRejected) { + switch (status) { + case RESOLVE: + if (onFullFilled != null) onFullFilled.accept(value); + break; + case REJECT: + if (onRejected != null) onRejected.accept(error); + break; + default: + if (onFullFilled != null) this.onFullFilled = onFullFilled; + if (onRejected != null) this.onRejected = onRejected; + break; + } + } + + public void thenThrow(Consumer<T> onFullFilled) { + then(onFullFilled, e -> { + throw new RuntimeException(e.getMessage()); + }); + } + + public T waitOrGet() throws Exception { + return waitOrGet(0); + } + + public T waitOrGet(long timeout) throws Exception { + switch (status) { + case RESOLVE: + return value; + case REJECT: + throw error; + default: + synchronized (this) { + this.wait(timeout); + } + if (STATUS.PENDING.equals(status)) { + throw new RuntimeException(); + } + return waitOrGet(timeout); + } + } + + public interface Fun<T> { + void call(Consumer<T> resolve, Consumer<Exception> reject); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/prop/Comp.java b/com.gx.obe.bind/src/com/gx/obe/bind/prop/Comp.java new file mode 100644 index 00000000..c16be4fd --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/prop/Comp.java @@ -0,0 +1,34 @@ +package com.gx.obe.bind.prop; + +import java.util.Arrays; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import com.gx.obe.bind.view.View; +import com.gx.obe.bind.view.Write; + +public class Comp<T> extends Prop<T> { + + public Comp(Supplier<T> supplier, String name, View... properties) { + super(Objects.requireNonNull(supplier).get()); + Arrays.stream(Objects.requireNonNull(properties)).forEach(p -> p.addChangeListener(() -> set(supplier.get()))); + } + + @Override + public Comp<T> as(String name) { + super.as(name); + return this; + } + + @Override + public void bind(Write<T> write) { + super.bind(write); + } + + public Comp<T> addSet(Consumer<T> consumer) { + super.addChangeListener(() -> consumer.accept(get())); + return this; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/prop/Prop.java b/com.gx.obe.bind/src/com/gx/obe/bind/prop/Prop.java new file mode 100644 index 00000000..6adab503 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/prop/Prop.java @@ -0,0 +1,103 @@ +package com.gx.obe.bind.prop; + +import java.util.Objects; +import java.util.UUID; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import com.gx.obe.bind.base.P; +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.MView; +import com.gx.obe.bind.view.Read; +import com.gx.obe.bind.view.View; +import com.gx.obe.bind.view.Write; + +public class Prop<T> extends P<T> implements MView<T> { + + private Lock lock = new Lock(); + + public Prop() {} + + public Prop(T value) { + set(value); + } + + public Prop<T> orElseGet(Supplier<T> other) { + super.orElseGet(other); + return this; + } + + public Prop<T> orElse(T defaultValue) { + super.orElse(defaultValue); + return this; + } + + @Override + public Prop<T> as(String name) { + super.as(name); + return this; + } + + @Override + public Prop<T> limit(BiPredicate<T, T> predicate) { + super.limit(predicate); + return this; + } + + public boolean isLock() { + return lock.isLock(); + } + + public void replace(Function<T, T> function) { + set(Objects.requireNonNull(function).apply(get())); + } + + public void changer(Consumer<T> consumer) { + Objects.requireNonNull(consumer).accept(get()); + set(get()); + } + + public void bindBidirectional(MView<T> mView) { + Objects.requireNonNull(mView); + String key = UUID.randomUUID().toString(); + bind(key, mView); + mView.addChangeListener(() -> set(mView.get(), key)); + } + + public void bindBidirectional(Write<T> write, Read<T> read, View model) { + Objects.requireNonNull(write); + Objects.requireNonNull(read); + Objects.requireNonNull(model); + + String key = UUID.randomUUID().toString(); + bind(key, write); + model.addChangeListener(() -> set(read.get(), key)); + } + + @Override + public void set(T value) { + lock.sync(() -> change(value)); + } + + private void set(T value, String key) { + lock.sync(() -> change(value, key)); + } + +} + +class Lock { + private boolean lock = false; + + public boolean isLock() { + return lock; + } + + public void sync(ChangeListener changeListener) { + if (lock) return; + lock = true; + changeListener.change(); + lock = false; + } +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/prop/RProp.java b/com.gx.obe.bind/src/com/gx/obe/bind/prop/RProp.java new file mode 100644 index 00000000..f0a64f66 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/prop/RProp.java @@ -0,0 +1,34 @@ +package com.gx.obe.bind.prop; + +import java.util.Objects; +import java.util.function.BiPredicate; + +import com.gx.obe.bind.base.P; +import com.gx.obe.bind.view.RView; +import com.gx.obe.bind.view.Read; +import com.gx.obe.bind.view.View; + +public class RProp<T> extends P<T> { + + public void reader(Read<? extends T> read, View model) { + Objects.requireNonNull(read); + Objects.requireNonNull(model); + + model.addChangeListener(() -> change(read.get())); + } + + public void reader(RView<? extends T> rView) { + reader(rView, rView); + } + + public RProp<T> as(String name) { + super.as(name); + return this; + } + + public RProp<T> limit(BiPredicate<T, T> predicate) { + super.limit(predicate); + return this; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/recursion/RStream.java b/com.gx.obe.bind/src/com/gx/obe/bind/recursion/RStream.java new file mode 100644 index 00000000..6ca61d1b --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/recursion/RStream.java @@ -0,0 +1,21 @@ +package com.gx.obe.bind.recursion; + +import java.util.List; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public interface RStream<T> { + + void forEach(Consumer<T> action); + + void forEach(TreeForEach<T> treeForEach); + + void forEach(BiConsumer<List<Integer>, T> indexConsumer); + + Optional<T> findAny(Predicate<T> predicate); + + List<T> filter(Predicate<T> predicate); + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/recursion/Recursions.java b/com.gx.obe.bind/src/com/gx/obe/bind/recursion/Recursions.java new file mode 100644 index 00000000..a2f61bdf --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/recursion/Recursions.java @@ -0,0 +1,167 @@ +package com.gx.obe.bind.recursion; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public class Recursions<T> { + + private Function<T, Stream<T>> toStreamFun; + + public static <T> Recursions<T> array(Function<T, T[]> toArrayFun) { + return new Recursions<>(toArrayFun.andThen(t -> Optional.ofNullable(t).map(Stream::of).orElse(null))); + } + + public static <T> Recursions<T> list(Function<T, List<T>> toListFun) { + return new Recursions<>(toListFun.andThen(t -> Optional.ofNullable(t).map(List::stream).orElse(null))); + } + + public static <T> Recursions<T> stream(Function<T, Stream<T>> toStreamFun) { + return new Recursions<>(toStreamFun); + } + + public Recursions(Function<T, Stream<T>> toStreamFun) { + this.toStreamFun = toStreamFun; + } + + public RStream<T> toStream(T obj) { + return toStream(Stream.of(obj)); + } + + public RStream<T> toStream(T[] array) { + return toStream(Stream.of(array)); + } + + public RStream<T> toStream(List<T> stream) { + return toStream(stream.stream()); + } + + public RStream<T> toStream(Stream<T> stream) { + return new RStream<T>() { + + public void forEach(Consumer<T> action) { + new ForEachRecursion(action).exe(stream); + } + + public void forEach(TreeForEach<T> treeForEach) { + new TreeForEachRecursion(treeForEach).exe(stream); + } + + public void forEach(BiConsumer<List<Integer>, T> indexConsumer) { + new IndexForEachRecursion(indexConsumer).exe(stream); + } + + public Optional<T> findAny(Predicate<T> predicate) { + Data data = new Data(); + new AnyMatchRecursion(t -> { + boolean test = predicate.test(t); + if (test) data.t = t; + return test; + }).exe(stream); + return Optional.ofNullable(data.t); + } + + public List<T> filter(Predicate<T> predicate) { + List<T> list = new ArrayList<>(); + new ForEachRecursion(t -> { + if (predicate.test(t)) list.add(t); + }).exe(stream); + return list; + } + + }; + } + + private class AnyMatchRecursion { + + private Predicate<T> predicate; + + public AnyMatchRecursion(Predicate<T> predicate) { + this.predicate = predicate; + } + + private boolean exe(Stream<T> stream) { + return stream.anyMatch(t -> { + if (predicate.test(t)) return true; + return Optional.ofNullable(t).map(toStreamFun).map(this::exe).orElse(false); + }); + } + + } + + private class ForEachRecursion { + + private Consumer<T> consumer; + + public ForEachRecursion(Consumer<T> consumer) { + this.consumer = consumer; + } + + private void exe(Stream<T> stream) { + stream.forEach(t -> { + consumer.accept(t); + Optional.ofNullable(t).map(toStreamFun).ifPresent(this::exe); + }); + } + + } + + private class TreeForEachRecursion { + + private TreeForEach<T> treeForEach; + + public TreeForEachRecursion(TreeForEach<T> treeForEach) { + this.treeForEach = treeForEach; + } + + private void exe(Stream<T> stream) { + recursion(stream.iterator(), true); + } + + private void recursion(Iterator<T> iterator, boolean root) { + iterator.forEachRemaining(t -> { + Iterator<T> citerator = Optional.of(t).map(toStreamFun).map(Stream::iterator).orElse(null); + boolean leaf = citerator == null || !citerator.hasNext(); + treeForEach.action(root, leaf, t); + if (!leaf) recursion(citerator, false); + }); + } + + } + + private class IndexForEachRecursion { + + private BiConsumer<List<Integer>, T> indexConsumer; + + public IndexForEachRecursion(BiConsumer<List<Integer>, T> indexConsumer) { + this.indexConsumer = indexConsumer; + } + + private void exe(Stream<T> stream) { + recursion(stream, new ArrayList<>()); + } + + private void recursion(Stream<T> stream, List<Integer> pIndex) { + AtomicInteger i = new AtomicInteger(1); + stream.forEach(t -> { + List<Integer> index = new ArrayList<>(pIndex); + index.add(i.getAndIncrement()); + indexConsumer.accept(index, t); + Optional.ofNullable(t).map(toStreamFun).ifPresent(s -> recursion(s, index)); + }); + } + + } + + private class Data { + private T t; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/recursion/TreeForEach.java b/com.gx.obe.bind/src/com/gx/obe/bind/recursion/TreeForEach.java new file mode 100644 index 00000000..0bb32172 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/recursion/TreeForEach.java @@ -0,0 +1,7 @@ +package com.gx.obe.bind.recursion; + +public interface TreeForEach<T> { + + void action(boolean root, boolean leaf, T t); + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/rx/RxBind.java b/com.gx.obe.bind/src/com/gx/obe/bind/rx/RxBind.java new file mode 100644 index 00000000..214767b7 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/rx/RxBind.java @@ -0,0 +1,80 @@ +package com.gx.obe.bind.rx; + +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class RxBind<T> { + + private Supplier<T> supplier = () -> null; + private Consumer<Runnable> supplierSync = Runnable::run; + private Consumer<Runnable> consumerSync = Runnable::run; + private Supplier<Boolean> check = () -> true; + private Supplier<T> other = () -> null; + private Tangent tangent = Tangent.TEMP; + + public RxBind(Supplier<T> supplier) { + this.supplier = supplier; + } + + public static <T> RxBind<T> run(Supplier<T> supplier) { + return new RxBind<T>(supplier); + } + + public RxBind<T> tangent(Tangent tangent) { + this.tangent = tangent; + return this; + } + + public RxBind<T> supplierSync(Consumer<Runnable> supplierSync) { + this.supplierSync = supplierSync; + return this; + } + + public RxBind<T> consumerSync(Consumer<Runnable> consumerSync) { + this.consumerSync = consumerSync; + return this; + } + + public RxBind<T> check(Supplier<Boolean> check) { + this.check = check; + return this; + } + + public RxBind<T> other(Supplier<T> other) { + this.other = other; + return this; + } + + public void exe(Consumer<T> consumer) { + supplierSync.accept(() -> { + Status<T> supplyStatus = supplyStatus(); + consumerSync.accept(() -> { + if (check.get()) return; + if (supplyStatus.isErrer()) { + tangent.error(supplyStatus.getException()); + } else { + tangent.after(); + try { + consumer.accept(Optional.ofNullable(supplyStatus.getT()).orElseGet(other)); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + }); + tangent.before(); + } + + public Status<T> supplyStatus() { + Status<T> status = new Status<>(); + try { + status.setT(supplier.get()); + } catch (Exception e) { + status.setErrer(true); + status.setException(e); + } + return status; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/rx/Status.java b/com.gx.obe.bind/src/com/gx/obe/bind/rx/Status.java new file mode 100644 index 00000000..fc3edefc --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/rx/Status.java @@ -0,0 +1,35 @@ +package com.gx.obe.bind.rx; + +public class Status<T> { + + private Exception exception; + + private T t; + + private boolean errer; + + public Exception getException() { + return exception; + } + + public void setException(Exception exception) { + this.exception = exception; + } + + public T getT() { + return t; + } + + public void setT(T t) { + this.t = t; + } + + public boolean isErrer() { + return errer; + } + + public void setErrer(boolean errer) { + this.errer = errer; + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/rx/Tangent.java b/com.gx.obe.bind/src/com/gx/obe/bind/rx/Tangent.java new file mode 100644 index 00000000..f3b05a8b --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/rx/Tangent.java @@ -0,0 +1,21 @@ +package com.gx.obe.bind.rx; + +public interface Tangent { + + static Tangent TEMP = new Tangent() { + public void error(Exception e) { + e.printStackTrace(); + } + + public void before() {} + + public void after() {} + }; + + void before(); + + void after(); + + void error(Exception e); + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/stream/MapStream.java b/com.gx.obe.bind/src/com/gx/obe/bind/stream/MapStream.java new file mode 100644 index 00000000..dae1bce7 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/stream/MapStream.java @@ -0,0 +1,59 @@ +package com.gx.obe.bind.stream; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public class MapStream<K, V> { + + private Map<K, V> map; + + public MapStream(Map<K, V> map) { + this.map = map; + } + + public static <K, V> MapStream<K, V> of(Map<K, V> map) { + return new MapStream<>(map); + } + + public <T> MapStream<K, T> valueMap(Function<V, T> function) { + Map<K, T> map = new HashMap<>(); + this.map.forEach((k, v) -> map.put(k, function.apply(v))); + return MapStream.of(map); + } + + public <T> void valueMap(Function<V, T> function, Map<K, T> map) { + this.map.forEach((k, v) -> map.put(k, function.apply(v))); + } + + public MapStream<K, V> removeValueIsNull() { + Map<K, V> map = new HashMap<>(); + this.map.forEach((k, v) -> { + if (v != null) map.put(k, v); + }); + return MapStream.of(map); + } + public MapStream<K, V> removeValue(Predicate<V> predicate) { + Map<K, V> map = new HashMap<>(); + this.map.forEach((k, v) -> { + if (!predicate.test(v)) map.put(k, v); + }); + return MapStream.of(map); + } + + public Stream<K> keyStream(Predicate<V> vPredicate) { + return map.entrySet().stream().filter(e -> vPredicate.test(e.getValue())).map(e -> e.getKey()); + } + + public Map<K, V> toMap() { + return map; + } + + public void forEach(BiConsumer<K, V> action) { + map.forEach(action); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/utils/CollectorUtils.java b/com.gx.obe.bind/src/com/gx/obe/bind/utils/CollectorUtils.java new file mode 100644 index 00000000..4463c334 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/utils/CollectorUtils.java @@ -0,0 +1,14 @@ +package com.gx.obe.bind.utils; + +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +public class CollectorUtils { + + public static <T, K1, K2> Collector<T, ?, Map<K1, Map<K2, T>>> groupingToMap(Function<? super T, ? extends K1> classifier, Function<? super T, ? extends K2> keyMapper) { + return Collectors.groupingBy(classifier, Collectors.toMap(keyMapper, Function.identity())); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/utils/PropUtils.java b/com.gx.obe.bind/src/com/gx/obe/bind/utils/PropUtils.java new file mode 100644 index 00000000..a11601e3 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/utils/PropUtils.java @@ -0,0 +1,20 @@ +package com.gx.obe.bind.utils; + +import java.util.function.Function; + +import com.gx.obe.bind.prop.Prop; + +public class PropUtils { + + public static <T, R> void bindBidirectional(Prop<T> tProp, Prop<R> rProp, Function<T, R> trFunction, Function<R, T> rtFunction) { + tProp.addChangeListener(() -> { + if (rProp.isLock()) return; + rProp.set(trFunction.apply(tProp.get())); + }); + rProp.addChangeListener(() -> { + if (tProp.isLock()) return; + tProp.set(rtFunction.apply(rProp.get())); + }); + } + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/view/ChangeListener.java b/com.gx.obe.bind/src/com/gx/obe/bind/view/ChangeListener.java new file mode 100644 index 00000000..1f5cbcae --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/view/ChangeListener.java @@ -0,0 +1,15 @@ +package com.gx.obe.bind.view; + +public interface ChangeListener { + + void change(); + + default ChangeListener andThen(ChangeListener changeListener) { + return () -> { + this.change(); + changeListener.change(); + }; + } + + static ChangeListener EMPTY = () -> {}; +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/view/MView.java b/com.gx.obe.bind/src/com/gx/obe/bind/view/MView.java new file mode 100644 index 00000000..f4b036fd --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/view/MView.java @@ -0,0 +1,3 @@ +package com.gx.obe.bind.view; + +public interface MView<T> extends RView<T>, Write<T> {} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/view/RView.java b/com.gx.obe.bind/src/com/gx/obe/bind/view/RView.java new file mode 100644 index 00000000..9c1fbc4b --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/view/RView.java @@ -0,0 +1,3 @@ +package com.gx.obe.bind.view; + +public interface RView<T> extends View, Read<T> {} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/view/Read.java b/com.gx.obe.bind/src/com/gx/obe/bind/view/Read.java new file mode 100644 index 00000000..ca4ee6ce --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/view/Read.java @@ -0,0 +1,8 @@ +package com.gx.obe.bind.view; + +@FunctionalInterface +public interface Read<T> { + + T get(); + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/view/View.java b/com.gx.obe.bind/src/com/gx/obe/bind/view/View.java new file mode 100644 index 00000000..e249f6f5 --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/view/View.java @@ -0,0 +1,8 @@ +package com.gx.obe.bind.view; + +@FunctionalInterface +public interface View { + + void addChangeListener(ChangeListener changeListener); + +} diff --git a/com.gx.obe.bind/src/com/gx/obe/bind/view/Write.java b/com.gx.obe.bind/src/com/gx/obe/bind/view/Write.java new file mode 100644 index 00000000..3fdc89ea --- /dev/null +++ b/com.gx.obe.bind/src/com/gx/obe/bind/view/Write.java @@ -0,0 +1,8 @@ +package com.gx.obe.bind.view; + +@FunctionalInterface +public interface Write<T> { + + void set(T t); + +} diff --git a/com.gx.obe.common.file/.settings/org.eclipse.core.resources.prefs b/com.gx.obe.common.file/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/com.gx.obe.common.file/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/com.gx.obe.common.file/META-INF/MANIFEST.MF b/com.gx.obe.common.file/META-INF/MANIFEST.MF index bfffb927..321891b8 100644 --- a/com.gx.obe.common.file/META-INF/MANIFEST.MF +++ b/com.gx.obe.common.file/META-INF/MANIFEST.MF @@ -16,7 +16,8 @@ Require-Bundle: org.eclipse.ui, com.gx.obe.utils, com.gx.obe.common.icons, com.gx.obe.common.widget, - com.gx.obe.action;bundle-version="1.0.0" + com.gx.obe.action;bundle-version="1.0.0", + com.gx.obe.bind;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: com.gx.obe.common.file Bundle-ActivationPolicy: lazy @@ -34,4 +35,5 @@ Export-Package: com.gx.obe.common.file.adapter, com.gx.obe.common.file.thread, com.gx.obe.common.file.upload, com.gx.obe.common.file.upload.infer, - com.gx.obe.common.file.utils + com.gx.obe.common.file.utils, + com.gx.obe.common.file.widget diff --git a/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/BidFileUtils.java b/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/BidFileUtils.java new file mode 100644 index 00000000..543f9a0a --- /dev/null +++ b/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/BidFileUtils.java @@ -0,0 +1,24 @@ +package com.gx.obe.common.file.utils; + +import java.util.Optional; + +import com.gx.obe.components.core.Constants; +import com.gx.obe.util.utils.StringUtils; + +public class BidFileUtils { + + /** + * @Description: èŽ·å¾—æŠ•æ ‡æ–‡ä»¶æ–‡ä»¶å + * @author chenxw + * @param fileItem + * @param isEnc + * @return + */ + public static Optional<String> getBidFileName(String fileId, String fileName) { + Optional<String> suffix = Optional.ofNullable(fileId).map(FileUtils::removeFileNameENC).map(FileUtils::getFileNameBack).filter(t -> { + return !Constants.ZIP.equals(t); + }); + return Optional.ofNullable(fileName).map(FileUtils::getFileNameFront).map(t -> t.concat(suffix.orElse(""))).filter(StringUtils::isNotEmpty); + } + +} diff --git a/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/FileUtils.java b/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/FileUtils.java index 585f3035..99a8d792 100644 --- a/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/FileUtils.java +++ b/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/FileUtils.java @@ -18,10 +18,14 @@ import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Properties; +import java.util.function.Function; import java.util.regex.Pattern; import org.apache.log4j.Logger; +import com.gx.obe.components.core.Constants; +import com.gx.obe.util.utils.StringUtils; + public class FileUtils { public FileUtils() { @@ -981,4 +985,60 @@ public class FileUtils { public static String filterFileName(String fileName){ return fileName==null?null:FilePattern.matcher(fileName.trim()).replaceAll(""); } + + public static Function<String, String> funGetSuffix = fileName -> { + if (fileName == null) return ""; + int indexOf = fileName.lastIndexOf("."); + if (indexOf == -1) return ""; + return fileName.substring(indexOf + 1); + }; + /** + * @Description: 去除文件å.encåŽç¼€ + * @author chenxw + * @param fileName + * @return + */ + public static String removeFileNameENC(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return fileName; + } + if (fileName.endsWith(Constants.ENC)) { + return fileName.substring(0, fileName.lastIndexOf(Constants.ENC)); + } + return fileName; + } + + /** + * @Description: èŽ·å–æ–‡ä»¶ååŽéƒ¨ + * @author chenxw + * @param fileName + * @return + */ + public static String getFileNameBack(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return fileName; + } + int lastIndex = fileName.lastIndexOf("."); + if (lastIndex == -1) { + return ""; + } + return fileName.substring(lastIndex); + } + /** + * @Description: èŽ·å–æ–‡ä»¶åå‰éƒ¨ + * @author chenxw + * @param fileName + * @return + */ + public static String getFileNameFront(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return fileName; + } + int lastIndex = fileName.lastIndexOf("."); + if (lastIndex == -1) { + return fileName; + } + return fileName.substring(0, lastIndex); + } + } diff --git a/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/ParsingXmlUtils.java b/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/ParsingXmlUtils.java index e54594c7..f7959c50 100644 --- a/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/ParsingXmlUtils.java +++ b/com.gx.obe.common.file/src/com/gx/obe/common/file/utils/ParsingXmlUtils.java @@ -4,6 +4,9 @@ import java.io.File; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.dom4j.Document; import org.dom4j.Element; @@ -40,6 +43,7 @@ import com.gx.obe.util.utils.UuidUtils; import com.gx.obe.util.utils.XmlUtils; import com.gx.obe.web.entity.AttachmentFile; import com.gx.obe.web.entity.Struct; +import com.gx.obe.web.entity.evaluation.EvaluationContent; import com.gx.obe.web.entity.evaluation.EvaluationFactor; import com.gx.obe.web.entity.evaluation.EvaluationStep; import com.gx.obe.web.entity.price.BidPrice; @@ -663,10 +667,59 @@ public class ParsingXmlUtils { } } } - + resolverEvaluationContent(evaluationFactor, element); return evaluationFactor; } - + /** + * @Description: è§£æžè¯„审内容 + * @author chenxw + * @param evaluationFactor + * @param element + */ + private static void resolverEvaluationContent(EvaluationFactor evaluationFactor, Element element) { + resolverEvaluationContent(evaluationFactor.getTenderId(), evaluationFactor.getFactorCode(), element.element("evaluationContentList")) + .ifPresent(evaluationFactor::setEvaluationContentList); + } + + /** + * @Description: è§£æžè¯„审内容 + * @author chenxw + * @param tenderId + * @param factorCode + * @param evaluationContentListElement + * @return + */ + public static Optional<List<EvaluationContent>> resolverEvaluationContent(String tenderId, String factorCode, Element evaluationContentListElement) { + return Optional.ofNullable(evaluationContentListElement).map(t -> t.elements("evaluationContent")).map(l -> { + return streamElement(l).map(ParsingXmlUtils::initEvaluationContent).peek(t -> { + t.setTenderId(tenderId); + t.setFactorCode(factorCode); + }).collect(Collectors.toList()); + }); + } + private static Stream<Element> streamElement(List<?> list) { + return list.stream().map(t -> (Element) t); + } + /** + * @Description: åˆå§‹åŒ–评审内容 + * @author chenxw + * @param evaluationContentElement + * @return + */ + private static EvaluationContent initEvaluationContent(Element evaluationContentElement) { + EvaluationContent evaluationContent = new EvaluationContent(); + evaluationContent.setId(UuidUtils.getUUID()); + evaluationContent.setRelChapterType(evaluationContentElement.elementTextTrim("relChapterType")); + evaluationContent.setDataCategory(evaluationContentElement.elementTextTrim("dataCategory")); + evaluationContent.setDataCode(evaluationContentElement.elementTextTrim("dataCode")); + evaluationContent.setEvalRule(evaluationContentElement.elementTextTrim("evalRule")); + evaluationContent.setTenderStructName(evaluationContentElement.elementTextTrim("tenderStructName")); + evaluationContent.setEvalPointName(evaluationContentElement.elementTextTrim("evalPointName")); + try { + evaluationContent.setSortNo(Integer.valueOf(evaluationContentElement.elementTextTrim("Order"))); + } catch (Exception e) {} + return evaluationContent; + } /** * @Description: è§£æžç»“æž„åŒ–æ•°æ® * @author chenxw diff --git a/com.gx.obe.common.file/src/com/gx/obe/common/file/widget/FileButton.java b/com.gx.obe.common.file/src/com/gx/obe/common/file/widget/FileButton.java new file mode 100644 index 00000000..0816e5e7 --- /dev/null +++ b/com.gx.obe.common.file/src/com/gx/obe/common/file/widget/FileButton.java @@ -0,0 +1,150 @@ +package com.gx.obe.common.file.widget; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.core.widgets.EMenu; +import org.eclipse.swt.core.widgets.EMenu.ClickListener; +import org.eclipse.swt.core.widgets.ImageButton; +import org.eclipse.swt.events.MenuDetectEvent; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.call.Callback; +import com.gx.obe.common.file.utils.FileUtils; +import com.gx.obe.common.icons.IconsActivator; +import com.gx.obe.util.utils.RuntimeUtils; +import com.swtdesigner.ResourceManager; +import com.swtdesigner.SWTResourceManager; + +public class FileButton extends Composite { + + protected File file; + + protected ImageButton imageButton; + + private List<ItemParam> itemParamList = new ArrayList<>(); + + public FileButton(Composite parent, File file) { + this(parent, file, Optional.of(file).map(File::getName).get()); + } + + /** + * @wbp.parser.constructor + */ + public FileButton(Composite parent, File file, String fileName) { + super(parent, SWT.NONE); + + this.file = file; + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + imageButton = new ImageButton(this, SWT.BOTTOM | SWT.CENTER | SWT.WRAP); + GridData gd_imageButton = new GridData(SWT.CENTER, SWT.FILL, false, true, 1, 1); + gd_imageButton.widthHint = 100; + imageButton.setLayoutData(gd_imageButton); + + imageButton.setForeground(SWTResourceManager.getColor(100, 100, 100)); + imageButton.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL)); + + imageButton.setActiveBorderColor(SWTResourceManager.getColor(77, 163, 19)); + imageButton.setActiveForeground(SWTResourceManager.getColor(100, 100, 100)); + imageButton.setActiveBgColor(SWTResourceManager.getColor(205, 225, 205)); + + imageButton.setGAP(0); + imageButton.setAlpha(120); + imageButton.setArcWidth(6); + + imageButton.setText(fileName); + imageButton.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, getFileImagePath(fileName))); + imageButton.addMouseListener(MouseListener.mouseDoubleClickAdapter(this::openFile)); + imageButton.addMenuDetectListener(this::menuDetect); + } + + /** + * @Description: æ·»åŠ èœå•项 + * @author guoyr + * @param menuItemText + * @param menuItemImage + * @param enabled + * @param callBack + */ + public void addMenuItem(String menuItemText, Image menuItemImage, boolean enabled, Callback clickListener) { + itemParamList.add(new ItemParam(menuItemText, menuItemImage, enabled, clickListener)); + } + + private void menuDetect(MenuDetectEvent e) { + EMenu menu = new EMenu(getShell()); + menu.addMenuItem("打开", null, true, new ClickListener() { + public void click() { + openFile(null); + } + }); + for (ItemParam itemParam : itemParamList) { + menu.addMenuItem(itemParam.menuItemText, itemParam.menuItemImage, itemParam.enabled, new ClickListener() { + public void click() { + itemParam.clickListener.call(); + } + }); + } + menu.open(); + } + + + + protected void openFile(MouseEvent e) { + if (!file.exists()) { + MessageDialog.openShortMessage("文件ä¸å˜åœ¨ï¼"); + return; + } + RuntimeUtils.openFIle(file); + } + + /** + * @Description: + * @author mazc + * @param fileName + * @return + */ + private String getFileImagePath(String fileName) { + switch (FileUtils.funGetSuffix.apply(fileName)) { + case "pdf": return "icons/pdf_64.png"; + case "xml": return "icons/xml_64.png"; + case "doc": case "docx": return "icons/word_64.png"; + case "xls": case "xlsx": return "icons/excel_64.png"; + case "png": case "bmp": case "gif": case "psd": case "jpg": case "jpeg": return "icons/image_64.png"; + default: return "icons/unknown_64.png"; + } + } + + public File getFile() { + return file; + } + + static class ItemParam { + + String menuItemText; + Image menuItemImage; + boolean enabled; + Callback clickListener; + + public ItemParam(String menuItemText, Image menuItemImage, boolean enabled, Callback clickListener) { + this.menuItemText = menuItemText; + this.menuItemImage = menuItemImage; + this.enabled = enabled; + this.clickListener = clickListener; + } + + } + +} diff --git a/com.gx.obe.common.widget/.settings/org.eclipse.core.resources.prefs b/com.gx.obe.common.widget/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/com.gx.obe.common.widget/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/com.gx.obe.common.widget/META-INF/MANIFEST.MF b/com.gx.obe.common.widget/META-INF/MANIFEST.MF index 1efd367c..8f9806ed 100644 --- a/com.gx.obe.common.widget/META-INF/MANIFEST.MF +++ b/com.gx.obe.common.widget/META-INF/MANIFEST.MF @@ -13,7 +13,8 @@ Require-Bundle: org.eclipse.ui, com.gx.obe.common.icons;bundle-version="1.0.0", com.gx.obe.business, com.gx.obe.lib;bundle-version="1.0.0", - com.gx.obe.utils;bundle-version="1.0.0" + com.gx.obe.utils;bundle-version="1.0.0", + com.gx.obe.component;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: com.gx.obe.common.widget Bundle-ActivationPolicy: lazy @@ -24,5 +25,6 @@ Export-Package: com.gx.obe.common.widget, com.gx.obe.common.widget.inter, com.gx.obe.common.widget.listener, com.gx.obe.common.widget.shell, + com.gx.obe.common.widget.text, com.gx.obe.common.widget.thread, com.gx.obe.common.widget.utils diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/button/RectangleRadioButton.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/button/RectangleRadioButton.java new file mode 100644 index 00000000..46f4f86d --- /dev/null +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/button/RectangleRadioButton.java @@ -0,0 +1,38 @@ +package com.gx.obe.common.widget.button; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.widgets.ImageButton; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.ColorConstants; +import com.gx.obe.component.handler.ISelection; +import com.swtdesigner.SWTResourceManager; + + +public class RectangleRadioButton extends ImageButton implements ISelection { + + public RectangleRadioButton(Composite parent, int style) { + super(parent, style | SWT.CENTER); + this.setRightMargin(10); + this.setLeftMargin(10); + this.setTopMargin(5); + this.setBottomMargin(5); + this.setRightMargin(10); + this.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); + + this.setForeground(ColorConstants.NOTE_TIPS_COLOR); + this.setBackgroundColor(SWTResourceManager.getColor(245, 245, 245)); + this.setForeground(ColorConstants.NOTE_TIPS_COLOR); + this.setBackgroundColor(SWTResourceManager.getColor(245, 245, 245)); + + this.setActiveForeground(ColorConstants.SKIN_ACTIVE_FOREGROUND); + this.setActiveBackgroundColor(ColorConstants.SKIN_ACTIVE_BG);// 橙色 + + this.setSelectionForeground(ColorConstants.SKIN_SELECTOIN_FOREGROUND); + this.setSelectionBgColor(ColorConstants.SKIN_BG);// è“色 +// this.setArcWidth(90); + +// this.setImage(ResourceManager.getPluginImage(SWTCoreActivator.PLUGIN_ID, "icons/evaluaton_step/default.png"), 16, 16); + } + +} diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/dialog/ProgressMessageTangent.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/dialog/ProgressMessageTangent.java new file mode 100644 index 00000000..dbff48c7 --- /dev/null +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/dialog/ProgressMessageTangent.java @@ -0,0 +1,33 @@ +package com.gx.obe.common.widget.dialog; + +import org.eclipse.swt.widgets.Shell; + +import com.gx.obe.common.widget.rt.Tangent; +import com.gx.obe.common.widget.shell.ProgressMessageDialog; + +public class ProgressMessageTangent implements Tangent { + + private ProgressMessageDialog dialog; + + public ProgressMessageTangent(Shell parentShell, String title) { + this.dialog = new ProgressMessageDialog(parentShell, false, -1, null); + this.dialog.setTitle(title); + } + + @Override + public void before() { + dialog.open(); + } + + @Override + public void after() { + dialog.finish(dialog.getErrorMessagesSize() == 0); + } + + @Override + public void error(Exception e) { + dialog.message(e.getMessage(), -1); + dialog.finish(false); + } + +} diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageAdapter.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageAdapter.java index c6861264..859b7ea3 100644 --- a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageAdapter.java +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageAdapter.java @@ -9,5 +9,11 @@ public class ProgressMessageAdapter implements ProgressMessageListener { public void setMaximumProgress(int maximumProgress) {} public void finish(boolean flag) {} + + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } } \ No newline at end of file diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageListener.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageListener.java index 60d4188c..23a50fe6 100644 --- a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageListener.java +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/listener/ProgressMessageListener.java @@ -7,6 +7,9 @@ public interface ProgressMessageListener { public void message(String message, int flag) {} public void finish(boolean flag) {} public void addProgress(int addProgress) {} + public int getErrorMessagesSize() { + return 0; + } }; public void message(String message, int flag); @@ -32,4 +35,10 @@ public interface ProgressMessageListener { * @param failCount */ public void finish(boolean flag); + + /** + * 获å–é”™è¯¯ä¿¡æ¯ + * @return + */ + public abstract int getErrorMessagesSize(); } \ No newline at end of file diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/rt/Tangent.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/rt/Tangent.java new file mode 100644 index 00000000..837aaae9 --- /dev/null +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/rt/Tangent.java @@ -0,0 +1,21 @@ +package com.gx.obe.common.widget.rt; + +public interface Tangent { + + static Tangent TEMP = new Tangent() { + public void error(Exception e) { + e.printStackTrace(); + } + + public void before() {} + + public void after() {} + }; + + void before(); + + void after(); + + void error(Exception e); + +} diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/shell/ProgressMessageDialog.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/shell/ProgressMessageDialog.java index 7516d21e..104eb74e 100644 --- a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/shell/ProgressMessageDialog.java +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/shell/ProgressMessageDialog.java @@ -537,6 +537,12 @@ public class ProgressMessageDialog extends Shell implements ProgressMessageListe return finishFlag; } + @Override + public int getErrorMessagesSize() { + // TODO Auto-generated method stub + return 0; + } + } diff --git a/com.gx.obe.common.widget/src/com/gx/obe/common/widget/text/EvalFactorText.java b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/text/EvalFactorText.java new file mode 100644 index 00000000..c1e9c57f --- /dev/null +++ b/com.gx.obe.common.widget/src/com/gx/obe/common/widget/text/EvalFactorText.java @@ -0,0 +1,52 @@ +package com.gx.obe.common.widget.text; + +import java.text.NumberFormat; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.component.text.FStyledText; +import com.gx.obe.components.core.enumeration.EvaluationFactorEnum; +import com.gx.obe.message.Messages; +import com.gx.obe.util.utils.StringUtils; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; +import com.swtdesigner.SWTResourceManager; + +public class EvalFactorText extends FStyledText { + + protected EvaluationFactor curFactor; + + public EvalFactorText(Composite parent) { + super(parent); + } + + public void refresh(EvaluationFactor curFactor) { + this.curFactor = curFactor; + clear(); + if (curFactor != null) initItem(); + refresh(); + } + + protected void initItem() { + addEvalFactor(); + addScoreRange(); + addEvalExplain(); + } + + protected void addEvalFactor() { + add(Messages.EvalFactor + ":", curFactor.getFactorName(), SWTResourceManager.getColor(20, 20, 20), SWT.NORMAL); + } + + protected void addScoreRange() { + if (EvaluationFactorEnum.AUDIT_COMPLIANCE.equals(curFactor.getAuditType())) return; + String factorMinScore = NumberFormat.getInstance().format(curFactor.getFactorMinScore()); + String factorMaxScore = NumberFormat.getInstance().format(curFactor.getFactorMaxScore()); + add(Messages.ScoreRange + ":", "[" + factorMinScore + "-" + factorMaxScore + Messages.Points + "]", SWTResourceManager.getColor(77, 163, 19), SWT.BOLD); + } + + protected void addEvalExplain() { + if (StringUtils.isEmpty(curFactor.getMemo())) return; + addWrap(Messages.EvalExplain + ":", curFactor.getMemo(), SWTResourceManager.getColor(100, 100, 100), SWT.NORMAL); + } + +} diff --git a/com.gx.obe.component/.classpath b/com.gx.obe.component/.classpath new file mode 100644 index 00000000..fd421dbc --- /dev/null +++ b/com.gx.obe.component/.classpath @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="lib" path="/org.eclipse.swt.core/lib/de.kupzog.KTable.jar"/> + <classpathentry kind="lib" path="/org.eclipse.swt.core/lib/org.eclipse.nebula.widgets.grid.jar"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/com.gx.obe.component/.gitignore b/com.gx.obe.component/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/com.gx.obe.component/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/com.gx.obe.component/.project b/com.gx.obe.component/.project new file mode 100644 index 00000000..5762f292 --- /dev/null +++ b/com.gx.obe.component/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>com.gx.obe.component</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/com.gx.obe.component/.settings/org.eclipse.core.resources.prefs b/com.gx.obe.component/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/com.gx.obe.component/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/com.gx.obe.component/.settings/org.eclipse.jdt.core.prefs b/com.gx.obe.component/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..0c68a61d --- /dev/null +++ b/com.gx.obe.component/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.gx.obe.component/META-INF/MANIFEST.MF b/com.gx.obe.component/META-INF/MANIFEST.MF new file mode 100644 index 00000000..871ab47c --- /dev/null +++ b/com.gx.obe.component/META-INF/MANIFEST.MF @@ -0,0 +1,29 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Component +Bundle-SymbolicName: com.gx.obe.component +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: com.gx.obe.component.Activator +Bundle-Vendor: GX +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + org.eclipse.swt.core, + com.gx.obe.bind, + com.gx.obe.utils, + com.gx.obe.components.core +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Automatic-Module-Name: com.gx.obe.component +Bundle-ActivationPolicy: lazy +Export-Package: com.gx.obe.component.comparison, + com.gx.obe.component.form, + com.gx.obe.component.grid, + com.gx.obe.component.handler, + com.gx.obe.component.listener, + com.gx.obe.component.menu, + com.gx.obe.component.rx, + com.gx.obe.component.tabfolder, + com.gx.obe.component.table, + com.gx.obe.component.text, + com.gx.obe.component.tree, + com.gx.obe.component.utils, + com.gx.obe.component.verify diff --git a/com.gx.obe.component/build.properties b/com.gx.obe.component/build.properties new file mode 100644 index 00000000..5f4af4c1 --- /dev/null +++ b/com.gx.obe.component/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . +javacDefaultEncoding.. = UTF-8 \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/Activator.java b/com.gx.obe.component/src/com/gx/obe/component/Activator.java new file mode 100644 index 00000000..5f7e674f --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/Activator.java @@ -0,0 +1,50 @@ +package com.gx.obe.component; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "com.gx.obe.component"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/comparison/Column.java b/com.gx.obe.component/src/com/gx/obe/component/comparison/Column.java new file mode 100644 index 00000000..b56d4e54 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/comparison/Column.java @@ -0,0 +1,23 @@ +package com.gx.obe.component.comparison; + +public class Column { + + private String id; + + private String name; + + public Column(String id, String name) { + super(); + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonData.java b/com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonData.java new file mode 100644 index 00000000..8479879f --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonData.java @@ -0,0 +1,68 @@ +package com.gx.obe.component.comparison; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.util.utils.Keys; + +public class ComparisonData { + + private List<Column> headColList = new ArrayList<>(); + private List<Column> titleColList = new ArrayList<>(); + private List<Column> itemColList = new ArrayList<>(); + private List<String> rowList = new ArrayList<>(); + + private Map<Keys, String> headContentMap = new HashMap<>(); + private Map<Keys, String> comparisonContentMap = new HashMap<>(); + + public boolean addHeadCol(Column col) { + return headColList.add(col); + } + + public boolean addTitleCol(Column col) { + return titleColList.add(col); + } + + public boolean addItemCol(Column col) { + return itemColList.add(col); + } + + public boolean addRow(String row) { + return rowList.add(row); + } + + public String putHeadContent(String rowId, String headId, String value) { + return headContentMap.put(Keys.of(rowId, headId), value); + } + + public String putComparisonContent(String rowId, String titleId, String itemId, String value) { + return comparisonContentMap.put(Keys.of(rowId, titleId, itemId), value); + } + + public List<Column> getHeadColList() { + return headColList; + } + + public List<Column> getTitleColList() { + return titleColList; + } + + public List<Column> getItemColList() { + return itemColList; + } + + public List<String> getRowList() { + return rowList; + } + + public Map<Keys, String> getHeadContentMap() { + return headContentMap; + } + + public Map<Keys, String> getComparisonContentMap() { + return comparisonContentMap; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonTable.java b/com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonTable.java new file mode 100644 index 00000000..8687e2f1 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/comparison/ComparisonTable.java @@ -0,0 +1,124 @@ +package com.gx.obe.component.comparison; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.IntStream; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.util.utils.Keys; + +import de.kupzog.ktable.KTable; +import de.kupzog.ktable.KTableCellRenderer; +import de.kupzog.ktable.SWTX; +import de.kupzog.ktable.model.CommonKtableCModel; +import de.kupzog.ktable.renderers.FixedWrapCellRenderer; +import de.kupzog.ktable.renderers.TextWrapCellRenderer; + +public class ComparisonTable extends KTable { + + /** + * @Description: æ¢è¡Œæ–‡æœ¬æ¸²æŸ“ + */ + private static final FixedWrapCellRenderer FIXED_RENDERER = new FixedWrapCellRenderer(); + /** + * @Description: æ¢è¡Œæ–‡æœ¬æ¸²æŸ“ + */ + private static final TextWrapCellRenderer TEXT_RENDERER = new TextWrapCellRenderer(); + + /** + * @Description: 固定行数 + */ + private static final int HEAD_ROW = 2; + + private final CommonKtableCModel model; + + private final List<Column> headColList; + private final List<Column> titleColList; + private final List<Column> itemColList; + private final List<String> rowList; + + private final Map<Keys, String> headContentMap; + private final Map<Keys, String> comparisonContentMap; + + public ComparisonTable(Composite parent, ComparisonData comparisonData) { + super(parent, SWTX.AUTO_SCROLL | SWT.FULL_SELECTION | SWTX.EDIT_ON_KEY | SWTX.FILL_WITH_LASTCOL); + + comparisonData = Optional.ofNullable(comparisonData).orElseGet(ComparisonData::new); + + this.headColList = comparisonData.getHeadColList(); + this.titleColList = comparisonData.getTitleColList(); + this.itemColList = comparisonData.getItemColList(); + this.rowList = comparisonData.getRowList(); + + this.headContentMap = comparisonData.getHeadContentMap(); + this.comparisonContentMap = comparisonData.getComparisonContentMap(); + + this.model = new CommonKtableCModel(this, HEAD_ROW, headColList.size(), this.rowList.size(), titleColList.size() * itemColList.size()); + this.setModel(model); + + IntStream.range(0, headColList.size()).forEach(i -> model.addRowSpan(0, i, HEAD_ROW)); + IntStream.range(0, titleColList.size()).map(i -> i * itemColList.size()).map(i -> i + headColList.size()).forEach(i -> model.addColSpan(0, i, itemColList.size())); + + IntStream.range(0, titleColList.size() * itemColList.size( )+ headColList.size()).forEach(i -> model.setColumnWidth(i, 100)); + + this.model.setRowHeightRender($ -> 30); +// this.model.setCellBackgroundRender(($, $$) -> SWTResourceManager.getColor(SWT.COLOR_WHITE)); + + this.model.setCellContentRender(this::receiveContent); + this.model.setCellRender(this::receiveCellRender); + this.model.setCellAlignmentRender(this::receiveCellAlignment); + } + + /** + * @Description: åŠ è½½å†…å®¹ + * @author chenxw + * @param row + * @param col + * @return + */ + private String receiveContent(int row, int col) { + if (col < headColList.size()) { + if (row == 0) return Optional.of(headColList.get(col)).map(Column::getName).orElse(""); + if (row == 1) return ""; + return Optional.of(Keys.of(rowList.get(row - 2), headColList.get(col).getId())).map(headContentMap::get).orElse(""); + } + col -= headColList.size(); + int itemSize = itemColList.size(); + if (row == 0) return Optional.of(titleColList.get(col / itemSize)).map(Column::getName).orElse(""); + if (row == 1) return Optional.of(itemColList.get(col % itemSize)).map(Column::getName).orElse(""); + try { + return Optional.of(Keys.of(rowList.get(row - 2), titleColList.get(col / itemSize).getId(), itemColList.get(col % itemSize).getId())).map(comparisonContentMap::get).orElse(""); + } catch (Exception e) { + return ""; + } + } + + /** + * @Description: åŠ è½½æ¸²æŸ“å™¨ + * @author chenxw + * @param row + * @param col + * @return + */ + private KTableCellRenderer receiveCellRender(int row, int col) { + if (this.model.isFixedCell(col, row)) { + return FIXED_RENDERER; + } + return TEXT_RENDERER; + } + + /** + * @Description: åŠ è½½å•å…ƒæ ¼å¯¹é½æ–¹å¼ + * @author chenxw + * @param row + * @param col + * @return + */ + private int receiveCellAlignment(int row, int col) { + return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_CENTER; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/form/FForm.java b/com.gx.obe.component/src/com/gx/obe/component/form/FForm.java new file mode 100644 index 00000000..2561ec91 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/form/FForm.java @@ -0,0 +1,134 @@ +package com.gx.obe.component.form; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; +import org.eclipse.wb.swt.SWTResourceManager; + +public class FForm<T> extends Composite { + + private final IForm<T> iForm; + + private final List<Consumer<T>> consumerList = new ArrayList<>(); + + private int numColumns; + + public FForm(Composite parent, int numColumns) { + super(parent, SWT.NONE); + this.numColumns = numColumns; + + setBackground(SWTResourceManager.getColor(215, 215, 215)); + setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gridLayout = new GridLayout(numColumns * 2, false); + gridLayout.verticalSpacing = 1; + gridLayout.horizontalSpacing = 1; + gridLayout.marginHeight = 1; + gridLayout.marginWidth = 1; + setLayout(gridLayout); + + iForm = new IForm<T>() { + + @Override + public void addNull() { + CLabel lblNewLabel = new CLabel(FForm.this, SWT.RIGHT); + lblNewLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_lblNewLabel.heightHint = 30; + gd_lblNewLabel.widthHint = 100; + lblNewLabel.setLayoutData(gd_lblNewLabel); + + CLabel lblNewLabel_1 = new CLabel(FForm.this, SWT.NONE); + lblNewLabel_1.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel_1 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_lblNewLabel_1.heightHint = 30; + gd_lblNewLabel_1.widthHint = 200; + lblNewLabel_1.setLayoutData(gd_lblNewLabel_1); + } + + public void add(String title, Function<T, String> getValueFun) { + CLabel lblNewLabel = new CLabel(FForm.this, SWT.RIGHT); + lblNewLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_lblNewLabel.heightHint = 30; + gd_lblNewLabel.widthHint = 100; + lblNewLabel.setLayoutData(gd_lblNewLabel); + lblNewLabel.setText(title); + + CLabel lblNewLabel_1 = new CLabel(FForm.this, SWT.NONE); + lblNewLabel_1.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel_1 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_lblNewLabel_1.heightHint = 30; + gd_lblNewLabel_1.widthHint = 200; + lblNewLabel_1.setLayoutData(gd_lblNewLabel_1); + consumerList.add(t -> lblNewLabel_1.setText(Optional.ofNullable(t).map(getValueFun).orElse(""))); + } + + public void addLong(String title, Function<T, String> getValueFun) { + CLabel lblNewLabel = new CLabel(FForm.this, SWT.RIGHT); + lblNewLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); + gd_lblNewLabel.heightHint = 30; + lblNewLabel.setLayoutData(gd_lblNewLabel); + lblNewLabel.setText(title); + + CLabel lblNewLabel_1 = new CLabel(FForm.this, SWT.NONE); + lblNewLabel_1.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel_1 = new GridData(SWT.FILL, SWT.CENTER, true, false, numColumns * 2 - 1, 1); + gd_lblNewLabel_1.heightHint = 30; + lblNewLabel_1.setLayoutData(gd_lblNewLabel_1); + consumerList.add(t -> lblNewLabel_1.setText(Optional.ofNullable(t).map(getValueFun).orElse(""))); + } + + public void addBig(String title, Function<T, String> getValueFun, int height) { + CLabel lblNewLabel = new CLabel(FForm.this, SWT.RIGHT); + lblNewLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_lblNewLabel = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); + gd_lblNewLabel.heightHint = height; + lblNewLabel.setLayoutData(gd_lblNewLabel); + lblNewLabel.setText(title); + + Composite composite = new Composite(FForm.this, SWT.NONE); + composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, false, numColumns * 2 - 1, 1); + gd_composite.heightHint = height; + composite.setLayoutData(gd_composite); + GridLayout gl_composite = new GridLayout(1, false); + gl_composite.marginWidth = 1; + composite.setLayout(gl_composite); + + Text lblNewLabel_1 = new Text(composite, SWT.WRAP | SWT.V_SCROLL); + lblNewLabel_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + lblNewLabel_1.setEditable(false); + consumerList.add(t -> lblNewLabel_1.setText(Optional.ofNullable(t).map(getValueFun).orElse(""))); + } + + }; + + } + + public void init(Consumer<IForm<T>> consumer) { + consumer.accept(iForm); + Composite composite_1 = new Composite(this, SWT.NONE); + GridData gd_lblNewLabel = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); + gd_lblNewLabel.heightHint = 0; + composite_1.setLayoutData(gd_lblNewLabel); + composite_1.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, numColumns * 2, 1)); + } + + public void refresh(T t) { + consumerList.forEach(c -> c.accept(t)); + } + + @Override + protected void checkSubclass() {} +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/form/IForm.java b/com.gx.obe.component/src/com/gx/obe/component/form/IForm.java new file mode 100644 index 00000000..cf321764 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/form/IForm.java @@ -0,0 +1,19 @@ +package com.gx.obe.component.form; + +import java.util.function.Function; + +public interface IForm<T> { + + void addNull(); + + void add(String title, Function<T, String> getValueFun); + + void addLong(String title, Function<T, String> getValueFun); + + void addBig(String title, Function<T, String> getValueFun, int height); + + default void addBig(String title, Function<T, String> getValueFun) { + addBig(title, getValueFun, 95); + } + +} \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/grid/FGrid.java b/com.gx.obe.component/src/com/gx/obe/component/grid/FGrid.java new file mode 100644 index 00000000..ebcde67c --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/grid/FGrid.java @@ -0,0 +1,92 @@ +package com.gx.obe.component.grid; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +import org.eclipse.nebula.widgets.grid.Grid; +import org.eclipse.nebula.widgets.grid.GridColumn; +import org.eclipse.nebula.widgets.grid.GridItem; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.RView; + +public class FGrid<T> extends Grid implements RView<T> { + + private final List<Column<T>> columnList = new ArrayList<>(); + + private final List<ChangeListener> changeListeners = new ArrayList<>(); + + private T t; + + @SuppressWarnings("unchecked") + public FGrid(Composite parent) { + super(parent, SWT.H_SCROLL | SWT.V_SCROLL); + this.setHeaderVisible(true); + this.setItemHeight(30); + this.addSelectionListener(org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter(e -> { + GridItem gridItem = (GridItem) e.item; + t = (T) gridItem.getData(); + changeListeners.forEach(ChangeListener::change); + })); + } + + public GridColumn addIndexColumn(String name) { + columnList.add(new IndexColumn<>()); + GridColumn gridColumn = new GridColumn(this, SWT.CENTER); + gridColumn.setText(name); + return gridColumn; + } + + public GridColumn addColumn(String name, Function<T, String> function, int style) { + columnList.add(new Column<>(function)); + GridColumn gridColumn = new GridColumn(this, style); + gridColumn.setText(name); + return gridColumn; + } + + public void refresh(List<T> tList) { + this.removeAll(); + if (tList != null) for (int i = 0; i < tList.size(); i++) { + T t = tList.get(i); + GridItem gridItem = new GridItem(this, SWT.NONE); + gridItem.setData(t); + for (int j = 0; j < columnList.size(); j++) { + Column<T> column = columnList.get(j); + if (column instanceof IndexColumn) { + gridItem.setText(j, i + 1 + ""); + } else { + gridItem.setText(j, Optional.ofNullable(column.function.apply(t)).orElse("")); + } + } + } + } + + private static class Column<T> { + private Function<T, String> function; + + private Column(Function<T, String> function) { + this.function = function; + } + } + + private static class IndexColumn<T> extends Column<T> { + private IndexColumn() { + super(null); + } + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + this.changeListeners.add(changeListener); + } + + @Override + public T get() { + return t; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/handler/ISelection.java b/com.gx.obe.component/src/com/gx/obe/component/handler/ISelection.java new file mode 100644 index 00000000..31e951ef --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/handler/ISelection.java @@ -0,0 +1,22 @@ +package com.gx.obe.component.handler; + +import org.eclipse.swt.events.MouseListener; + +public interface ISelection { + + ISelection selection = new ISelection() { + + public void setText(String text) {} + + public void setSelection(boolean selection) {} + + public void addMouseListener(MouseListener mouseUpAdapter) {} + }; + + void setText(String text); + + void addMouseListener(MouseListener mouseUpAdapter); + + void setSelection(boolean selection); + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/handler/RaidoHandler.java b/com.gx.obe.component/src/com/gx/obe/component/handler/RaidoHandler.java new file mode 100644 index 00000000..560ad310 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/handler/RaidoHandler.java @@ -0,0 +1,74 @@ +package com.gx.obe.component.handler; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.MView; +import com.gx.obe.component.utils.CompositeUtils; + +public class RaidoHandler<T extends ISelection, R> implements MView<R> { + + private ISelection tab = ISelection.selection; + + private Composite composite; + private Function<Composite, T> iSelectionFunction; + + private Prop<R> prop = new Prop<>(); + + private Map<R, T> map = new HashMap<>(); + + public RaidoHandler(Composite composite, Function<Composite, T> iSelectionFunction) { + this.composite = composite; + this.iSelectionFunction = iSelectionFunction; + } + + public RaidoHandler<T, R> start() { + CompositeUtils.disposeChildren(composite); + return this; + } + + public RaidoHandler<T, R> hand(R r, String text) { + return hand(r, t -> t.setText(text)); + } + + public RaidoHandler<T, R> hand(R r, Consumer<T> setConsumer) { + T t = iSelectionFunction.apply(composite); + setConsumer.accept(t); + t.addMouseListener(MouseListener.mouseUpAdapter($ -> prop.set(r))); + map.put(r, t); + return this; + } + + public void end() { + prop.bind(r -> { + tab.setSelection(false); + tab = map.get(r); + tab.setSelection(true); + }); + composite.layout(); + composite.getParent().layout(); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + prop.addChangeListener(changeListener); + } + + @Override + public R get() { + return prop.get(); + } + + @Override + public void set(R r) { + prop.set(r); + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/handler/TabHandler.java b/com.gx.obe.component/src/com/gx/obe/component/handler/TabHandler.java new file mode 100644 index 00000000..897e2bc8 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/handler/TabHandler.java @@ -0,0 +1,74 @@ +package com.gx.obe.component.handler; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.call.Callback; +import com.gx.obe.component.utils.CompositeUtils; + +public class TabHandler<T extends ISelection> { + + private ISelection tab; + + private final Composite composite; + private final Function<Composite, T> iTabFunction; + + private Callback firstCall; + + public TabHandler(Composite composite, Function<Composite, T> iTabFunction) { + this.composite = composite; + this.iTabFunction = iTabFunction; + } + + public TabHandler<T> start() { + CompositeUtils.disposeChildren(composite); + firstCall = null; + return this; + } + + public <R> TabHandler<T> hand(String text, Callback callback) { + return hand(null, (t, r) -> t.setText(text), r -> callback.call()); + } + + public <R> TabHandler<T> hand(Consumer<T> setConsumer, Callback callback) { + return hand(null, (t, r) -> setConsumer.accept(t), r -> callback.call()); + } + + public <R> TabHandler<T> hand(R r, BiConsumer<T, R> setBiConsumer, Consumer<R> consumer) { + T t = iTabFunction.apply(composite); + setBiConsumer.accept(t, r); + t.addMouseListener(MouseListener.mouseUpAdapter($ -> { + tab.setSelection(false); + tab = t; + tab.setSelection(true); + consumer.accept(r); + })); + if (firstCall == null) firstCall = () -> consumer.accept(r); + return this; + } + + public void end() { + composite.layout(); + composite.getParent().layout(); + CompositeUtils.getFirst(composite).ifPresent(t -> { + tab = (ISelection) t; + tab.setSelection(true); + firstCall.call(); + }); + } + + public <R> TabHandler<T> listHand(List<R> tList, Function<R, String> getTestFunction, Consumer<R> consumer) { + return listHand(tList, (t, r) -> t.setText(getTestFunction.apply(r)), consumer); + } + + public <R> TabHandler<T> listHand(List<R> tList, BiConsumer<T, R> setBiConsumer, Consumer<R> consumer) { + if (tList != null) tList.forEach(r -> hand(r, setBiConsumer, consumer)); + return this; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/listener/SelectionListener.java b/com.gx.obe.component/src/com/gx/obe/component/listener/SelectionListener.java new file mode 100644 index 00000000..9b8e1a8b --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/listener/SelectionListener.java @@ -0,0 +1,7 @@ +package com.gx.obe.component.listener; + +public interface SelectionListener<T> { + + void selection(T t); + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/menu/ListMenu.java b/com.gx.obe.component/src/com/gx/obe/component/menu/ListMenu.java new file mode 100644 index 00000000..dd5d14ea --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/menu/ListMenu.java @@ -0,0 +1,90 @@ +package com.gx.obe.component.menu; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; + +import org.eclipse.nebula.widgets.grid.Grid; +import org.eclipse.nebula.widgets.grid.GridColumn; +import org.eclipse.nebula.widgets.grid.GridItem; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Widget; + +import com.gx.obe.bind.fun.Fun; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.util.utils.PredicateUtils; + +public class ListMenu<T> extends Composite { + + protected Consumer<T> consumer = t -> {}; + + private Prop<List<T>> tListProp = new Prop<>(new ArrayList<>()); + private Prop<Integer> menuWidth = new Prop<>(300); + + /** + * @author chenxw + * @param parent + * @param style + */ + public ListMenu(Composite parent, Function<T, String> menuNameFun, Function<Composite, Consumer<T>> function) { + super(parent, SWT.NONE); + setLayout(new GridLayout(2, false)); + + Composite menuComposite = new Composite(this, SWT.NONE); + menuComposite.setLayout(new GridLayout(1, false)); + menuComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); + + Grid grid = new Grid(menuComposite, SWT.V_SCROLL); + grid.addSelectionListener(SelectionListener.widgetSelectedAdapter(this::widgetSelected)); + grid.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + tListProp.bind(l -> { + grid.removeAll(); + l.stream().forEach(t -> { + GridItem gridItem = new GridItem(grid, SWT.NONE); + gridItem.setText(menuNameFun.apply(t)); + gridItem.setData(t); + gridItem.setHeight(30); + }); + Optional.of(grid).filter(Fun.of(Grid::getItemCount).toTest(PredicateUtils.higher(0))).ifPresent(g -> g.select(0)); + Optional.of(grid).map(Grid::getSelection).map(Stream::of).flatMap(Stream::findFirst).ifPresent(this::selectItemAction); + }); + + GridColumn gridColumn = new GridColumn(grid, SWT.NONE); + menuWidth.bind(gridColumn::setWidth); + + Composite content = new Composite(this, SWT.NONE); + content.setLayout(new FillLayout(SWT.HORIZONTAL)); + content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + consumer = Optional.ofNullable(function).orElseGet(() -> p -> t -> {}).apply(content); + } + + public void refresh(List<T> tList) { + tListProp.set(tList); + } + + public void setMenuWidth(int menuWidth) { + this.menuWidth.set(menuWidth); + } + + private void widgetSelected(SelectionEvent e) { + selectItemAction(e.item); + } + + private void selectItemAction(Widget item) { + @SuppressWarnings("unchecked") + T t = (T) item.getData(); + consumer.accept(t); + } + + @Override + protected void checkSubclass() {} +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/rx/RxSwt.java b/com.gx.obe.component/src/com/gx/obe/component/rx/RxSwt.java new file mode 100644 index 00000000..fef7a3e4 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/rx/RxSwt.java @@ -0,0 +1,58 @@ +package com.gx.obe.component.rx; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Widget; + +import com.gx.obe.bind.promise.Promise; +import com.gx.obe.bind.rx.RxBind; +import com.gx.obe.bind.rx.Tangent; + +public class RxSwt<T> { + + private final RxBind<T> rxBind; + + private Tangent tangent = Tangent.TEMP; + private Supplier<Boolean> check = () -> false; + private Supplier<T> other = () -> null; + + public static <T> RxSwt<T> run(Supplier<T> run) { + return new RxSwt<T>(run); + } + + public RxSwt<T> setTangent(Tangent tangent) { + this.tangent = tangent; + return this; + } + + private RxSwt(Supplier<T> run) { + rxBind = RxBind.run(run); + } + + public RxSwt<T> checkWidget(Widget widget) { + if (widget != null) { + this.check = widget::isDisposed; + } + return this; + } + + public RxSwt<T> other(Supplier<T> other) { + this.other = other; + return this; + } + + public Promise<T> exe() { + return new Promise<>((s, f) -> exe(s)); + } + + public void exe(Consumer<T> consumer) { + rxBind.supplierSync(this::startThead).consumerSync(Display.getDefault()::asyncExec).tangent(tangent).check(check).other(other).exe(consumer); + } + + private void startThead(Runnable runnable) { + new Thread(runnable).start(); + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/tabfolder/CTabFolder.java b/com.gx.obe.component/src/com/gx/obe/component/tabfolder/CTabFolder.java new file mode 100644 index 00000000..e71432fb --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/tabfolder/CTabFolder.java @@ -0,0 +1,182 @@ +package com.gx.obe.component.tabfolder; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.utils.WidgetUtils; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.core.widgets.ImageButton; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.call.Callback; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.component.utils.CompositeUtils; +import com.swtdesigner.SWTResourceManager; + +/** + * @Description: 选项å¡å¸ƒå±€ + * @author chenxw + */ +public abstract class CTabFolder extends Composite { + + private final StackLayout stackLayout = new StackLayout(); + + private final Composite itemComposite; + private final Composite contentComposite; + + private CTabItem curTabItem; + private Composite actionComposite; + private int index; + + /** + * @author chenxw + * @param parent + * @param style + */ + public CTabFolder(Composite parent, int style) { + super(parent, style); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.verticalSpacing = 0; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + Prop<Boolean> showItemList = new Prop<Boolean>(false); + + itemComposite = new Composite(this, SWT.NONE); + RowLayout rl_composite = new RowLayout(SWT.HORIZONTAL); + rl_composite.marginBottom = 0; + rl_composite.marginTop = 0; + rl_composite.marginRight = 0; + rl_composite.marginLeft = 0; + itemComposite.setLayout(rl_composite); + itemComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + showItemList.bind(t -> WidgetUtils.setControlVisible(itemComposite, t)); + + ESepator timeSep = new ESepator(this, SWT.HORIZONTAL); + timeSep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + timeSep.setBackground(ColorConstants.SKIN_BG); + timeSep.setLineWidth(3); + showItemList.bind(t -> WidgetUtils.setControlVisible(timeSep, t)); + showItemList.bind(t -> layout()); + + contentComposite = new Composite(this, SWT.NONE); + contentComposite.setLayout(stackLayout); + contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + actionComposite = new Composite(contentComposite, SWT.NONE); + actionComposite.setLayout(new FillLayout(SWT.HORIZONTAL)); + + init(); + + showItemList.set(itemComposite.getChildren().length > 1); + } + + public void notifyMouseUp() { + CompositeUtils.notifyMouseUp(itemComposite); + } + + public void refresh() { + if (curTabItem != null) curTabItem.refresh(); + else CompositeUtils.notifyMouseUp(itemComposite); + } + + /** + * @Description: åˆå§‹åŒ– + * @author chenxw + */ + protected abstract void init(); + + /** + * @Description: é€‰é¡¹å¡ + * @author chenxw + */ + protected class CTabItem extends ImageButton { + + private Consumer<Composite> consumer = t -> {}; + + private Callback callback = () -> {}; + + private boolean action; + private boolean refresh; + + private int index = 0; + + /** + * @author chenxw + * @param text + * @param function + */ + public CTabItem(String text) { + super(itemComposite, SWT.NONE); + + this.setBorderColor(null); + + this.setForeground(SWTResourceManager.getColor(127, 127, 127)); + this.setBackgroundColor(SWTResourceManager.getColor(221, 221, 221)); + + this.setActiveForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + this.setActiveBgColor(SWTResourceManager.getColor(255, 153, 0)); + + this.setSelectionForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + this.setSelectionBgColor(SWTResourceManager.getColor(60, 138, 226)); + + this.setLeftMargin(15); + this.setRightMargin(15); + this.setTopMargin(6); + this.setBottomMargin(6); + + setText(text); + setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.BOLD)); + addMouseListener(MouseListener.mouseUpAdapter(this::mouseUpAction)); + } + + public void action(Consumer<Composite> consumer) { + this.consumer = Objects.requireNonNull(consumer); + this.action = true; + } + + public void refresh(Function<Composite, Callback> function) { + this.callback = Objects.requireNonNull(function).apply(contentComposite); + this.refresh = true; + this.index = ++CTabFolder.this.index; + } + + /** + * @Description: é¼ æ ‡ç‚¹å‡»äº‹ä»¶ + * @author chenxw + * @param e + */ + private void mouseUpAction(MouseEvent e) { + Optional.ofNullable(curTabItem).ifPresent(t -> t.setSelection(false)); + this.setSelection(true); + curTabItem = this; + if (action) stackLayout.topControl = actionComposite; + if (refresh) stackLayout.topControl = contentComposite.getChildren()[index]; + contentComposite.layout(); + refresh(); + } + + private void refresh() { + if (action) { + CompositeUtils.disposeChildren(actionComposite); + consumer.accept(actionComposite); + actionComposite.layout(); + } + if (refresh) callback.call(); + } + + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/tabfolder/FTabFolder.java b/com.gx.obe.component/src/com/gx/obe/component/tabfolder/FTabFolder.java new file mode 100644 index 00000000..b5f7bccb --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/tabfolder/FTabFolder.java @@ -0,0 +1,73 @@ +package com.gx.obe.component.tabfolder; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.RView; + +/** + * @Description: 选项å¡å¸ƒå±€ + * @author chenxw + * @param <T> + */ +public abstract class FTabFolder<T> extends CTabFolder implements RView<T> { + + private ChangeListener changeListener; + + private RView<T> rView; + + /** + * @author chenxw + * @param parent + * @param style + */ + public FTabFolder(Composite parent, int style) { + super(parent, style); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + this.changeListener = Objects.requireNonNull(changeListener); + notifyMouseUp(); + } + + @Override + public T get() { + return Optional.ofNullable(rView).map(RView::get).orElse(null); + } + + /** + * @Description: é€‰é¡¹å¡ + * @author chenxw + */ + protected class FTabItem extends CTabFolder.CTabItem { + + /** + * @author chenxw + * @param text + * @param function + */ + public FTabItem(String text) { + super(text); + } + + /** + * @Description: + * @author chenxw + * @param function + */ + public void action(Function<Composite, RView<T>> function) { + super.action(t -> { + rView = function.apply(t); + rView.addChangeListener(changeListener); + changeListener.change(); + }); + } + + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/table/CTable.java b/com.gx.obe.component/src/com/gx/obe/component/table/CTable.java new file mode 100644 index 00000000..15d8b1da --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/table/CTable.java @@ -0,0 +1,299 @@ +package com.gx.obe.component.table; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; + +import com.swtdesigner.SWTResourceManager; + +import de.kupzog.ktable.KTable; +import de.kupzog.ktable.KTableCellRenderer; +import de.kupzog.ktable.SWTX; +import de.kupzog.ktable.editors.KTableCellEditorLink; +import de.kupzog.ktable.editors.KTableCellEditorText; +import de.kupzog.ktable.model.CommonKtableCModel; +import de.kupzog.ktable.renderers.FixedWrapCellRenderer; +import de.kupzog.ktable.renderers.LinkCellRenderer; +import de.kupzog.ktable.renderers.TextWrapCellRenderer; + +public class CTable<T> extends KTable { + + /** + * @Description: æ¢è¡Œæ–‡æœ¬æ¸²æŸ“ + */ + private static final FixedWrapCellRenderer FIXED_RENDERER = new FixedWrapCellRenderer(); + /** + * @Description: æ¢è¡Œæ–‡æœ¬æ¸²æŸ“ + */ + private static final TextWrapCellRenderer TEXT_RENDERER = new TextWrapCellRenderer(); + + /** + * @Description: 固定行数 + */ + private static final int HEAD_ROW = 1; + + /** + * @Description: 默认最å°åˆ—宽 + */ + private static int COLUMN_MIN_WIDTH = -1; + /** + * @Description: 默认最å°åˆ—宽 + */ + private static int COLUMN_WIDTH = -1; + /** + * @Description: 默认最大列宽 + */ + private static int COLUMN_MAX_WIDTH = -1; + + /** + * @Description: é»˜è®¤åˆ—å¯¹é½æ–¹å¼ + */ + private static int ALIGN_HORIZONTAL = SWTX.ALIGN_HORIZONTAL_CENTER; + + /** + * @Description: 固定列 + */ + private final List<Column> headColumnList; + /** + * @Description: 内容列 + */ + private final List<Column> contentColumnList; + + /** + * @Description: æ˜¾ç¤ºæ•°æ® + */ + private final List<T> tList; + + /** + * @Description: è¡¨æ ¼æ¨¡åž‹ + */ + private final CommonKtableCModel commonKtableCModel; + + public CTable(Composite parent, List<Column> headColumnList, List<Column> contentColumnList, List<T> tList) { + super(parent, SWTX.AUTO_SCROLL | SWT.FULL_SELECTION | SWTX.EDIT_ON_KEY | SWTX.FILL_WITH_LASTCOL); + this.headColumnList = headColumnList; + this.contentColumnList = contentColumnList; + this.tList = Optional.ofNullable(tList).orElseGet(ArrayList::new); + this.commonKtableCModel = new CommonKtableCModel(this, HEAD_ROW, headColumnList.size(), this.tList.size(), contentColumnList.size()); + show(); + } + + /** + * @Description: 显示 + * @author chenxw + */ + private void show() { + for (int col = 0; col < commonKtableCModel.getColCount(); col++) { + int minWidth; + int width; + int maxWidth; + if (col < headColumnList.size()) { + minWidth = getHeadColumn(col).getMinWidth(); + width = getHeadColumn(col).getWidth(); + maxWidth = getHeadColumn(col).getMaxWidth(); + } else { + minWidth = Optional.of(getContentColumn(col)).map(Column::getMinWidth).orElse(COLUMN_MIN_WIDTH); + width = Optional.of(getContentColumn(col)).map(Column::getWidth).orElse(COLUMN_WIDTH); + maxWidth = Optional.of(getContentColumn(col)).map(Column::getMaxWidth).orElse(COLUMN_MAX_WIDTH); + } + commonKtableCModel.setColumnMinWidth(col, minWidth); + commonKtableCModel.setColumnWidth(col, width); + commonKtableCModel.setColumnMaxWidth(col, maxWidth); + } + + commonKtableCModel.setRowHeightRender(row -> 30); + commonKtableCModel.setCellBackgroundRender((a, b) -> SWTResourceManager.getColor(SWT.COLOR_WHITE)); + + commonKtableCModel.setCellContentRender(this::receiveContent); + commonKtableCModel.setCellRender(this::receiveCellRender); + commonKtableCModel.setCellEditorRender(this::receiveCellEditor); + commonKtableCModel.setCellImageRender(this::receiveCellImage); + commonKtableCModel.setCellAlignmentRender(this::receiveCellAlignment); + commonKtableCModel.setCellEditContentRender(this::receiveContent); + + this.setModel(commonKtableCModel); + } + + /** + * @Description: åŠ è½½å†…å®¹ + * @author chenxw + * @param row + * @param col + * @return + */ + private String receiveContent(int row, int col) { + if (row < HEAD_ROW) { + if (col < headColumnList.size()) { + return getHeadColumn(col).getName(); + } + return getContentColumn(col).getName(); + } + if (col < headColumnList.size()) { + return getHeadColumn(col).getFunction().apply(row); + } + return Optional.ofNullable(getContentColumn(col).getFunction().apply(row)).orElse(""); + } + + /** + * @Description: 编辑å•å…ƒæ ¼å†…å®¹ + * @author chenxw + * @param row + * @param col + * @param content + * @return + */ + private void receiveContent(int row, int col, Object content) { + if (commonKtableCModel.isFixedCell(col, row)) { + return; + } + Column contentColumn = getContentColumn(col); + if (!(contentColumn instanceof Text)) { + return; + } + @SuppressWarnings("unchecked") + Text<T> textContentColumn = (Text<T>) contentColumn; + textContentColumn.action(getT(row), content); + redraw(); + } + + /** + * @Description: åŠ è½½æ¸²æŸ“å™¨ + * @author chenxw + * @param row + * @param col + * @return + */ + private KTableCellRenderer receiveCellRender(int row, int col) { + if (commonKtableCModel.isFixedCell(col, row)) { + return FIXED_RENDERER; + } + Column contentColumn = getContentColumn(col); + if (!(contentColumn instanceof Link)) { + return TEXT_RENDERER; + } + @SuppressWarnings("unchecked") + Link<T> linkContentColumn = (Link<T>) contentColumn; + LinkCellRenderer linkCellRenderer = new LinkCellRenderer(); + linkCellRenderer.setEnable(linkContentColumn.enable(getT(row))); + return linkCellRenderer; + } + + /** + * @Description: åŠ è½½ç¼–è¾‘å™¨ + * @author chenxw + * @param row + * @param col + * @return + */ + private Object receiveCellEditor(int row, int col) { + if (commonKtableCModel.isFixedCell(col, row)) { + return null; + } + Column contentColumn = getContentColumn(col); + if (contentColumn instanceof Link) { + return new KTableCellEditorLink(this, this::receiveAction); + } else if (contentColumn instanceof Text) { + @SuppressWarnings("unchecked") + Text<T> textContentColumn = (Text<T>) contentColumn; + KTableCellEditorText cellEditorText = new KTableCellEditorText(); + cellEditorText.setTextLimit(textContentColumn.getTextLimit()); + return cellEditorText; + } + return null; + } + + /** + * @Description: 按钮点击事件 + * @author chenxw + * @param row + * @param col + */ + private void receiveAction(int row, int col) { + if (commonKtableCModel.isFixedCell(col, row)) { + return; + } + Column contentColumn = getContentColumn(col); + if (!(contentColumn instanceof Link)) { + return; + } + @SuppressWarnings("unchecked") + Link<T> linkContentColumn = (Link<T>) contentColumn; + linkContentColumn.action(getT(row)); + } + + /** + * @Description: åŠ è½½å›¾ç‰‡ + * @author chenxw + * @param row + * @param col + * @return + */ + private Image receiveCellImage(int row, int col) { + if (row < HEAD_ROW) { + return null; + } + if (col < headColumnList.size()) { + return getHeadColumn(col).getImage(); + } + return getContentColumn(col).getImage(); + } + + /** + * @Description: åŠ è½½å•å…ƒæ ¼å¯¹é½æ–¹å¼ + * @author chenxw + * @param row + * @param col + * @return + */ + private int receiveCellAlignment(int row, int col) { + if (row < HEAD_ROW) { + return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_CENTER; + } + int align; + if (col < headColumnList.size()) { + align = Optional.of(getHeadColumn(col)).map(Column::getAlign).orElse(ALIGN_HORIZONTAL); + } else { + align = Optional.of(getContentColumn(col)).map(Column::getAlign).orElse(ALIGN_HORIZONTAL); + } + return SWTX.ALIGN_VERTICAL_CENTER | align; + } + + /** + * @Description: 获å–固定列 + * @author chenxw + * @param col + * @return + */ + private Column getHeadColumn(int col) { + return headColumnList.get(col); + } + + /** + * @Description: 获å–内容列 + * @author chenxw + * @param col + * @return + */ + private Column getContentColumn(int col) { + return contentColumnList.get(col - headColumnList.size()); + } + + /** + * @Description: 获å–T + * @author chenxw + * @param row + * @return + */ + public T getT(int row) { + row -= HEAD_ROW; + if (tList.size() > row) { + return tList.get(row); + } + return null; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/table/Column.java b/com.gx.obe.component/src/com/gx/obe/component/table/Column.java new file mode 100644 index 00000000..924916aa --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/table/Column.java @@ -0,0 +1,111 @@ +package com.gx.obe.component.table; + +import java.util.function.Function; + +import org.eclipse.swt.graphics.Image; + +import de.kupzog.ktable.SWTX; + +/** + * @Description: 列 + * @author chenxw + */ +public class Column { + + public static final int ALIGN_LEFT = SWTX.ALIGN_HORIZONTAL_LEFT; + public static final int ALIGN_CENTER = SWTX.ALIGN_HORIZONTAL_CENTER; + public static final int ALIGN_RIGHT = SWTX.ALIGN_HORIZONTAL_RIGHT; + + /** + * @Description: åç§° + */ + private String name; + /** + * @Description: æ ¹æ®åºå·èŽ·å–展示内容 + */ + private Function<Integer, String> function; + /** + * @Description: 图片 + */ + private Image image; + /** + * @Description: 坹齿–¹å¼ + */ + private Integer align; + /** + * @Description: 最å°åˆ—宽 + */ + private Integer minWidth; + /** + * @Description: 列宽 + */ + private Integer width; + /** + * @Description: 最大列宽 + */ + private Integer maxWidth; + + /** + * @author chenxw + * @param name + * @param function + */ + public Column(String name, Function<Integer, String> function) { + this.name = name; + this.function = function; + } + + public String getName() { + return name; + } + + public Function<Integer, String> getFunction() { + return function; + } + + public Column image(Image image) { + this.image = image; + return this; + } + + public Image getImage() { + return image; + } + + public Column align(int align) { + this.align = align; + return this; + } + + public Integer getAlign() { + return align; + } + + public Column minWidth(int minWidth) { + this.minWidth = minWidth; + return this; + } + + public Integer getMinWidth() { + return minWidth; + } + + public Column width(int width) { + this.width = width; + return this; + } + + public Integer getWidth() { + return width; + } + + public Column maxWidth(int maxWidth) { + this.maxWidth = maxWidth; + return this; + } + + public Integer getMaxWidth() { + return maxWidth; + } + +} \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/table/FTable.java b/com.gx.obe.component/src/com/gx/obe/component/table/FTable.java new file mode 100644 index 00000000..7abef998 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/table/FTable.java @@ -0,0 +1,203 @@ +package com.gx.obe.component.table; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.component.listener.SelectionListener; +import com.gx.obe.component.utils.CompositeUtils; + +import de.kupzog.ktable.KTableCellSelectionAdapter; + +/** + * @Description: 函数å¼è¡¨æ ¼ + * @author chenxw + * @param <T> + */ +public abstract class FTable<T> extends Composite { + + /** + * @Description: + */ + private CTable<T> cTable; + + /** + * @Description: 获å–t函数 + */ + private final Function<Integer, T> tFun = this::getT; + + /** + * @Description: 固定列 + */ + private final List<Column> headColumnList = new ArrayList<>(); + /** + * @Description: 内容列 + */ + private final List<Column> contentColumnList = new ArrayList<>(); + + private List<SelectionListener<T>> selectionListenerList = new ArrayList<>(); + + /** + * @author chenxw + * @param parent + * @param tList + */ + public FTable(Composite parent, int style) { + super(parent, style); + setLayout(new FillLayout(SWT.HORIZONTAL)); + init(); + } + + /** + * @Description: åˆå§‹åŒ– + * @author chenxw + */ + protected abstract void init(); + + /** + * @Description: 刷新 + * @author chenxw + * @param tList + */ + public void refresh(List<T> tList) { + CompositeUtils.disposeChildren(this); + this.cTable = new CTable<>(this, headColumnList, contentColumnList, tList); + cTable.addCellSelectionListener(new KTableCellSelectionAdapter() { + public void cellSelected(int col, int row, int statemask) { + selection(row); + } + }); + this.layout(); + this.getParent().layout(); + selection(1); + } + + private void selection(int row) { + T t = getT(row); + if (t != null) selectionListenerList.forEach(l -> l.selection(t)); + } + + public void addSelectionListener(SelectionListener<T> selectionListener) { + this.selectionListenerList.add(selectionListener); + } + + /** + * @Description: 获å–T + * @author chenxw + * @param row + * @return + */ + private T getT(int row) { + return this.cTable.getT(row); + } + + /** + * @Description: 索引列 + * @author chenxw + */ + protected class IndexColumn extends Column { + public IndexColumn(String name) { + this(name, 50, String::valueOf); + } + + public IndexColumn(String name, int width, Function<Integer, String> function) { + super(name, function); + headColumnList.add(this); + width(width).minWidth(width).maxWidth(width); + } + } + + /** + * @Description: 固定列 + * @author chenxw + */ + protected class HeadColumn extends Column { + public HeadColumn(String name, int width, Function<T, String> function) { + super(name, tFun.andThen(function)); + headColumnList.add(this); + width(width).minWidth(width).maxWidth(width); + } + } + + /** + * @Description: 内容列 + * @author chenxw + */ + protected class ContentColumn extends Column { + public ContentColumn(String name, Function<T, String> function) { + super(name, tFun.andThen(function)); + contentColumnList.add(this); + } + } + + /** + * @Description: 链接内容列 + * @author chenxw + */ + protected class LinkContentColumn extends ContentColumn implements Link<T> { + private Consumer<T> consumer; + private Predicate<T> predicate = t -> true; + + public LinkContentColumn(String name, String content, Image image, Consumer<T> consumer) { + super(name, t -> content); + image(image); + this.consumer = consumer; + } + + public void enable(Predicate<T> predicate) { + this.predicate = Objects.requireNonNull(predicate); + } + + @Override + public boolean enable(T t) { + return predicate.test(t); + } + + @Override + public void action(T t) { + consumer.accept(t); + } + } + + /** + * @Description: 文本编辑内容列 + * @author chenxw + */ + protected class TextContentColumn<R> extends ContentColumn implements Text<T> { + + private Function<Object, R> format; + private BiConsumer<T, R> biConsumer; + private int textLimit = 1000; + + public TextContentColumn(String name, Function<T, String> function, Function<Object, R> format, BiConsumer<T, R> biConsumer) { + super(name, function); + this.format = format; + this.biConsumer = biConsumer; + } + + public void limit(int textLimit) { + this.textLimit = textLimit; + } + + @Override + public void action(T t, Object content) { + biConsumer.accept(t, format.apply(content)); + } + + @Override + public int getTextLimit() { + return textLimit; + } + + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/table/Link.java b/com.gx.obe.component/src/com/gx/obe/component/table/Link.java new file mode 100644 index 00000000..7b41ca8a --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/table/Link.java @@ -0,0 +1,14 @@ +package com.gx.obe.component.table; + +/** + * @Description: 链接 + * @author chenxw + * @param <T> + */ +interface Link<T> { + + boolean enable(T t); + + void action(T t); + +} \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/table/Text.java b/com.gx.obe.component/src/com/gx/obe/component/table/Text.java new file mode 100644 index 00000000..1fc0cbf6 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/table/Text.java @@ -0,0 +1,9 @@ +package com.gx.obe.component.table; + +public interface Text<T> { + + void action(T t, Object content); + + int getTextLimit(); + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/text/CapitalMoneyText.java b/com.gx.obe.component/src/com/gx/obe/component/text/CapitalMoneyText.java new file mode 100644 index 00000000..dac9f267 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/text/CapitalMoneyText.java @@ -0,0 +1,146 @@ +package com.gx.obe.component.text; + +import java.math.BigDecimal; +import java.util.Objects; +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +import com.gx.obe.bind.fun.Fun; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.MView; +import com.gx.obe.components.core.util.MoneyUtils; +import com.swtdesigner.SWTResourceManager; + +/** + * @Description: 大写金颿–‡æœ¬æ¡† + * @author chenxw + */ +public class CapitalMoneyText extends Composite implements MView<BigDecimal> { + + private final Prop<BigDecimal> moneyProp = new Prop<>(BigDecimal.ZERO); + + private final Prop<Color> moneyColorProp = new Prop<>(SWTResourceManager.getColor(90, 147, 52)); + + private final Prop<Boolean> editableProp = new Prop<>(true); + + public CapitalMoneyText(Composite parent, String unit) { + super(parent, SWT.NONE); + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + + Objects.requireNonNull(unit); + + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.verticalSpacing = 0; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + Composite composite = new Composite(this, SWT.NONE); + composite.setBackground(SWTResourceManager.getColor(238, 238, 238)); + GridLayout gl_composite = new GridLayout(3, false); + gl_composite.marginHeight = 6; + gl_composite.marginWidth = 20; + gl_composite.horizontalSpacing = 20; + composite.setLayout(gl_composite); + composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + Label lblNewLabel = new Label(composite, SWT.NONE); + lblNewLabel.setForeground(SWTResourceManager.getColor(188, 188, 188)); + lblNewLabel.setFont(SWTResourceManager.getFont("微软雅黑", 11, SWT.NORMAL)); + lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblNewLabel.setText("å°å†™"); + + MoneyText text = new MoneyText(composite, SWT.RIGHT, unit); + text.setFont(SWTResourceManager.getFont("微软雅黑", 18, SWT.NORMAL)); + text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + moneyProp.bindBidirectional(text); + moneyColorProp.bind(text::setForeground); + editableProp.bind(text::setEditable); + + Label lblNewLabel_2 = new Label(composite, SWT.NONE); + lblNewLabel_2.setForeground(SWTResourceManager.getColor(160, 160, 160)); + lblNewLabel_2.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); + lblNewLabel_2.setText(unit); + + Composite composite_1 = new Composite(this, SWT.NONE); + composite_1.setBackground(SWTResourceManager.getColor(245, 245, 245)); + GridLayout gl_composite_1 = new GridLayout(2, false); + gl_composite_1.marginHeight = 6; + gl_composite_1.marginWidth = 20; + gl_composite_1.horizontalSpacing = 20; + composite_1.setLayout(gl_composite_1); + GridData gd_composite_1 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_composite_1.heightHint = 41; + composite_1.setLayoutData(gd_composite_1); + + Label lblNewLabel_1 = new Label(composite_1, SWT.NONE); + lblNewLabel_1.setForeground(SWTResourceManager.getColor(188, 188, 188)); + lblNewLabel_1.setFont(SWTResourceManager.getFont("微软雅黑", 11, SWT.NORMAL)); + lblNewLabel_1.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, true, 1, 1)); + lblNewLabel_1.setText("大写"); + + Text text_1 = new Text(composite_1, SWT.RIGHT); + text_1.setFont(SWTResourceManager.getFont("微软雅黑", 14, SWT.NORMAL)); + text_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1)); + text_1.setEditable(false); + moneyProp.bind(Fun.of(this::moneyToCapital).toWrite(text_1::setText)); + moneyColorProp.bind(text_1::setForeground); + + } + + /** + * @Description: 金é¢è½¬å¤§å†™ + * @author chenxw + * @param money + * @return + */ + private String moneyToCapital(BigDecimal money) { + return Optional.ofNullable(money).map(BigDecimal::doubleValue).map(MoneyUtils::amountToChinese).orElse(""); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + moneyProp.addChangeListener(changeListener); + } + + @Override + public void set(BigDecimal t) { + moneyProp.set(t); + } + + /** + * @Description: 设置金é¢å—体颜色 + * @author chenxw + * @param moneyColor + */ + public void setMoneyColor(Color moneyColor) { + moneyColorProp.set(moneyColor); + } + + /** + * @Description: 设置是å¦å¯ç¼–辑 + * @author chenxw + * @param editable + */ + public void setEditable(Boolean editable) { + editableProp.set(editable); + } + + @Override + public BigDecimal get() { + return moneyProp.get(); + } + + @Override + protected void checkSubclass() {} + +} \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/text/DocumentText.java b/com.gx.obe.component/src/com/gx/obe/component/text/DocumentText.java new file mode 100644 index 00000000..26bfb7df --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/text/DocumentText.java @@ -0,0 +1,122 @@ +package com.gx.obe.component.text; + +import java.util.function.Supplier; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.MView; +import com.gx.obe.component.verify.Verify; +import com.swtdesigner.SWTResourceManager; + +/** + * @Description: + * @author chenxw + */ +public class DocumentText extends Composite implements MView<String>, Verify<String> { + + /** + * @Description: æ ‡é¢˜ + */ + private final Prop<String> title = new Prop<>(); + /** + * @Description: 内容 + */ + private final Prop<String> content = new Prop<>(); + /** + * @Description: å¯ç¼–辑 + */ + private final Prop<Boolean> editable = new Prop<>(false); + + /** + * @Description: 获å–内容文本框 + */ + private Supplier<Control> contentTextGet; + + /** + * @author chenxw + * @param parent + * @param style + */ + public DocumentText(Composite parent, int style) { + super(parent, style); + + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + + GridLayout gl_composite = new GridLayout(1, false); + gl_composite.marginHeight = 0; + gl_composite.marginWidth = 50; + setLayout(gl_composite); + + Label titleLabel = new Label(this, SWT.NONE); + titleLabel.setFont(SWTResourceManager.getFont("微软雅黑", 12, SWT.NORMAL)); + titleLabel.setForeground(ColorConstants.TITLE_FONT_COLOR); + titleLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + title.bind(titleLabel::setText); + + StyledText contentText = new StyledText(this, SWT.WRAP | SWT.MULTI); + contentText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + contentText.setLineSpacing(10); + contentText.setIndent(30); + contentText.setFont(SWTResourceManager.getFont("微软雅黑", 12, SWT.NORMAL)); + contentText.setForeground(ColorConstants.FONT_BLACK_COLOR); + editable.bind(contentText::setEditable); + content.bindBidirectional(contentText::setText, contentText::getText, t -> contentText.addModifyListener(e -> t.change())); + contentTextGet = () -> contentText; + + Label memoTips = new Label(this, SWT.RIGHT); + memoTips.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + content.bind(t -> memoTips.setText("(" + t.length() + "/ " + "500)")); + } + + /** + * @Description: è®¾ç½®æ ‡é¢˜ + * @author chenxw + * @param title + */ + public void setTitle(String title) { + this.title.set(title); + } + + /** + * @Description: 设置å¯ç¼–è¾‘çŠ¶æ€ + * @author chenxw + * @param editable + */ + public void setEditable(boolean editable) { + this.editable.set(editable); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + content.addChangeListener(changeListener); + } + + @Override + public String get() { + return content.get(); + } + + @Override + public void set(String content) { + this.content.set(content); + } + + @Override + public Supplier<Control> getVerifyControl() { + return contentTextGet; + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/text/FStyledText.java b/com.gx.obe.component/src/com/gx/obe/component/text/FStyledText.java new file mode 100644 index 00000000..122e7094 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/text/FStyledText.java @@ -0,0 +1,66 @@ +package com.gx.obe.component.text; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyleRange; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; + +import com.swtdesigner.SWTResourceManager; + +public class FStyledText extends StyledText { + + private StringBuilder textBuilder = new StringBuilder(); + + private List<StyleRange> styleRangeList = new ArrayList<>(); + + public FStyledText(Composite parent) { + super(parent, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY); + this.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); + } + + public void clear() { + textBuilder.delete(0, textBuilder.length()); + styleRangeList.clear(); + } + + public void refresh() { + setText(textBuilder.toString()); + styleRangeList.forEach(this::setStyleRange); + } + + public void add(String title, String content, Color contentForeground, int contentFontStyle) { + if (textBuilder.length() != 0) textBuilder.append(" "); + addItem(title, content, contentForeground, contentFontStyle); + textBuilder.append(title).append(content); + } + + public void addWrap(String title, String content, Color contentForeground, int contentFontStyle) { + textBuilder.append("\r\n"); + addItem(title, content, contentForeground, contentFontStyle); + textBuilder.append(title).append(content); + } + + private void addItem(String title, String content, Color contentForeground, int contentFontStyle) { + StyleRange titleStyleRange = new StyleRange(); + titleStyleRange.start = textBuilder.length(); + titleStyleRange.length = title.length(); + titleStyleRange.foreground = SWTResourceManager.getColor(SWT.COLOR_BLUE); + titleStyleRange.fontStyle = SWT.BOLD; + styleRangeList.add(titleStyleRange); + + StyleRange contentStyleRange = new StyleRange(); + contentStyleRange.start = textBuilder.length() + title.length(); + contentStyleRange.length = content.length(); + contentStyleRange.foreground = contentForeground; + contentStyleRange.fontStyle = contentFontStyle; + styleRangeList.add(contentStyleRange); + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/text/IntegerText.java b/com.gx.obe.component/src/com/gx/obe/component/text/IntegerText.java new file mode 100644 index 00000000..76e3f775 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/text/IntegerText.java @@ -0,0 +1,32 @@ +package com.gx.obe.component.text; + +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; + +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.RView; +import com.gx.obe.component.verify.IntegerVerifyListener; + +public class IntegerText extends Text implements RView<Integer> { + + public IntegerText(Composite parent, int style) { + super(parent, style); + addVerifyListener(new IntegerVerifyListener(false)); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + addModifyListener(e -> changeListener.change()); + } + + @Override + public Integer get() { + String text = getText(); + if (text.isEmpty()) return null; + return Integer.valueOf(text); + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/text/MoneyText.java b/com.gx.obe.component/src/com/gx/obe/component/text/MoneyText.java new file mode 100644 index 00000000..f02efe36 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/text/MoneyText.java @@ -0,0 +1,52 @@ +package com.gx.obe.component.text; + +import java.math.BigDecimal; + +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; + +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.MView; +import com.gx.obe.component.verify.MoneyVerifyListener; +import com.gx.obe.components.core.enumeration.CommonEnum; +import com.gx.obe.components.core.util.MoneyUtils; + +/** + * @Description: 金é¢è¾“入框 + * @author chenxw + */ +public class MoneyText extends Text implements MView<BigDecimal> { + + private final String unit; + + /** + * @author chenxw + * @param parent + * @param style + * @param unit + */ + public MoneyText(Composite parent, int style, String unit) { + super(parent, style); + this.unit = unit; + addVerifyListener(new MoneyVerifyListener(false, CommonEnum.WAN_YUAN.equals(CommonEnum.getPriceUnitType(unit)))); + } + + @Override + public void set(BigDecimal t) { + setText(MoneyUtils.getMoneyFormatByUnit(t, unit)); + } + + @Override + public BigDecimal get() { + return MoneyUtils.getMoneyFromText(getText(), unit); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + addModifyListener(e -> changeListener.change()); + } + + @Override + protected void checkSubclass() {} + +} \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/text/OrdinaryMoneyText.java b/com.gx.obe.component/src/com/gx/obe/component/text/OrdinaryMoneyText.java new file mode 100644 index 00000000..b8e6d241 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/text/OrdinaryMoneyText.java @@ -0,0 +1,84 @@ +package com.gx.obe.component.text; + +import java.math.BigDecimal; +import java.util.Optional; +import java.util.function.UnaryOperator; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.bind.prop.RProp; +import com.gx.obe.bind.view.ChangeListener; +import com.gx.obe.bind.view.RView; +import com.swtdesigner.SWTResourceManager; + +/** + * @Description: å°å†™é‡‘颿–‡æœ¬æ¡† + * @author chenxw + */ +public class OrdinaryMoneyText extends Composite implements RView<UnaryOperator<BigDecimal>> { + + /** + * @Description: é‡‘é¢ + */ + private RProp<BigDecimal> moneyProp = new RProp<BigDecimal>(); + + /** + * @author chenxw + * @param parent + * @param unit + */ + public OrdinaryMoneyText(Composite parent, String unit) { + super(parent, SWT.NONE); + setBackground(SWTResourceManager.getColor(239, 243, 248)); + setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginWidth = 35; + setLayout(gridLayout); + + Composite composite = new Composite(this, SWT.NONE); + GridLayout gl_composite = new GridLayout(3, false); + gl_composite.verticalSpacing = 10; + gl_composite.horizontalSpacing = 25; + composite.setLayout(gl_composite); + composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1)); + + Label lblNewLabel = new Label(composite, SWT.NONE); + lblNewLabel.setFont(SWTResourceManager.getFont("微软雅黑", 20, SWT.NORMAL)); + lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblNewLabel.setText("Â¥"); + + MoneyText text = new MoneyText(composite, SWT.RIGHT, unit); + text.setForeground(SWTResourceManager.getColor(204, 204, 204)); + text.setFont(SWTResourceManager.getFont("微软雅黑", 20, SWT.NORMAL)); + text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + moneyProp.reader(text); + + Label lblNewLabel_1 = new Label(composite, SWT.NONE); + lblNewLabel_1.setForeground(SWTResourceManager.getColor(157, 157, 157)); + lblNewLabel_1.setText("万元"); + + ESepator timeSep = new ESepator(composite, SWT.HORIZONTAL); + timeSep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1)); + timeSep.setBackground(SWTResourceManager.getColor(153, 153, 153)); + timeSep.setLineWidth(3); + } + + @Override + public UnaryOperator<BigDecimal> get() { + return t -> Optional.ofNullable(moneyProp.get()).orElse(t); + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + moneyProp.addChangeListener(changeListener); + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/tree/ITree.java b/com.gx.obe.component/src/com/gx/obe/component/tree/ITree.java new file mode 100644 index 00000000..d9b9175b --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/tree/ITree.java @@ -0,0 +1,47 @@ +package com.gx.obe.component.tree; + +import java.util.List; + +/** + * @Description: æ ‘ + * @author chenxw + */ +public interface ITree<T extends ITree<T>> { + + /** + * @Description: èŽ·å–æ ‘æ ¹èŠ‚ç‚¹ + * @author chenxw + * @return + */ + ITree<T> getRoot(); + + /** + * @Description: åæ ‘列表 + * @author chenxw + * @return + */ + List<? extends T> getITrees(); + + /** + * @Description: åç§° + * @author chenxw + * @return + */ + String getName(); + + /** + * @Description: é”® + * @author chenxw + * @return + */ + String getKey(); + + /** + * @Description: 值 + * @author chenxw + * @param key + * @return + */ + String getValue(Object key); + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/tree/ParseTrees.java b/com.gx.obe.component/src/com/gx/obe/component/tree/ParseTrees.java new file mode 100644 index 00000000..ba161ef3 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/tree/ParseTrees.java @@ -0,0 +1,214 @@ +package com.gx.obe.component.tree; + +import java.util.ArrayList; +import java.util.List; + +import com.gx.obe.util.utils.CollectionUtils; + +/** + * @Description: è§£æžæ ‘ + * @author chenxw + */ +public class ParseTrees<T extends ITree<T>> { + + /** + * @Description: å¶å节点列表 + */ + private List<Tree<T>> leafList = new ArrayList<>(); + + /** + * @Description: æ ‘æ¨ªå‘åˆå¹¶åˆ—表 + */ + private List<TreeSpan> wideSpanList = new ArrayList<>(); + /** + * @Description: æ ‘ç«–å‘åˆå¹¶åˆ—表 + */ + private List<TreeSpan> highSpanList = new ArrayList<>(); + + /** + * @Description: 高度 + */ + private int height; + /** + * @Description: å¶å节点个数 + */ + private int leafCount; + + /** + * @Description: ç©ºæ ‘ + */ + private final Tree<T> NULL_TREE = new Tree<>(); + + /** + * @author chenxw + * @param iTreeList + */ + public ParseTrees(List<? extends T> iTreeList) { + if (CollectionUtils.isNull(iTreeList)) { + return; + } + initLeafList(iTreeList, 0, null); + initHeight(iTreeList, 1); + + initHighSpanList(); + initWideSpanList(iTreeList, 0, 0); + + initLeafCount(); + } + + /** + * @Description: åˆå§‹åŒ–å¶å节点列表 + * @author chenxw + * @param iTreeList + * @param level + * @param parent + */ + private void initLeafList(List<? extends T> iTreeList, int level, Tree<T> parent) { + for (T iTree : iTreeList) { + Tree<T> tree = new Tree<>(); + tree.setLevel(level); + tree.setParent(parent); + tree.setValue(iTree); + List<? extends T> iTrees = iTree.getITrees(); + if (CollectionUtils.isNull(iTrees)) leafList.add(tree); + else initLeafList(iTrees, level + 1, tree); + } + } + + /** + * @Description: åˆå§‹åŒ–æ ‘æ¨ªå‘åˆå¹¶åˆ—表 + * @author chenxw + * @param iTreeList + * @param level + * @param leafIndex + */ + private int initWideSpanList(List<? extends ITree<T>> iTreeList, int level, int leafIndex) { + for (ITree<T> iTree : iTreeList) { + List<? extends ITree<T>> iTrees = iTree.getITrees(); + if (CollectionUtils.isNull(iTrees)) leafIndex++; + else { + TreeSpan span = new TreeSpan(); + span.setLevel(level); + span.setLeafIndex(leafIndex); + span.setSpanCount(iTrees.size()); + wideSpanList.add(span); + leafIndex = initWideSpanList(iTree.getITrees(), level + 1, leafIndex); + } + } + return leafIndex; + } + + /** + * @Description: åˆå§‹åŒ–æ ‘ç«–å‘åˆå¹¶åˆ—表 + * @author chenxw + */ + private void initHighSpanList() { + for (int i = 0; i < leafList.size(); i++) { + Tree<T> tree = leafList.get(i); + if (height > tree.getLevel()) { + TreeSpan span = new TreeSpan(); + span.setLevel(tree.getLevel()); + span.setLeafIndex(i); + span.setSpanCount(height - tree.getLevel()); + highSpanList.add(span); + } + } + } + + /** + * @Description: åˆå§‹åŒ–æ ‘çš„é«˜åº¦ + * @author chenxw + * @param iTreeList + * @param level + */ + private void initHeight(List<? extends ITree<T>> iTreeList, int level) { + for (ITree<T> iTree : iTreeList) { + List<? extends ITree<T>> iTrees = iTree.getITrees(); + if (CollectionUtils.isNull(iTrees)) height = Math.max(height, level); + else initHeight(iTrees, level + 1); + } + } + + /** + * @Description: åˆå§‹åŒ–å¶åèŠ‚ç‚¹çš„æ•°é‡ + * @author chenxw + */ + private void initLeafCount() { + leafCount = leafList.size(); + } + + /** + * @Description: æ ¹æ®å¶å节点索引获å–å¶å节点 + * @author chenxw + * @param leafIndex + * @return + */ + public T get(int leafIndex) { + return leafList.get(leafIndex).getValue(); + } + + /** + * @Description: æ ¹æ®å±‚æ•°åŠå¶å节点索引获å–对应包å«è¿™ä¸ªå¶å节点是节点 + * @author chenxw + * @param level + * @param leafIndex + * @return + */ + public ITree<T> getITree(int level, int leafIndex) { + return getTree(level, leafList.get(leafIndex)).getValue(); + } + + /** + * @Description: æ ¹æ®å±‚数递归获å–节点 + * @author chenxw + * @param level + * @param tree + * @return + */ + private Tree<T> getTree(int level, Tree<T> tree) { + if (level > tree.getLevel() || level < 0) { + return NULL_TREE; + } + if (level == tree.getLevel()) { + return tree; + } + return getTree(level, tree.getParent()); + } + + /** + * @Description: èŽ·å–æ ‘横å‘åˆå¹¶åˆ—表 + * @author chenxw + * @return + */ + public List<TreeSpan> getWideSpanList() { + return wideSpanList; + } + + /** + * @Description: èŽ·å–æ ‘ç«–å‘åˆå¹¶åˆ—表 + * @author chenxw + * @return + */ + public List<TreeSpan> getHighSpanList() { + return highSpanList; + } + + /** + * @Description: èŽ·å–æ•°çš„高度 + * @author chenxw + * @return + */ + public int getHeight() { + return height; + } + + /** + * @Description: 获å–å¶å节点数 + * @author chenxw + * @return + */ + public int getLeafCount() { + return leafCount; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/tree/Tree.java b/com.gx.obe.component/src/com/gx/obe/component/tree/Tree.java new file mode 100644 index 00000000..f3357d00 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/tree/Tree.java @@ -0,0 +1,46 @@ +package com.gx.obe.component.tree; + +/** + * @Description: æ ‘ + * @author chenxw + */ +class Tree<T extends ITree<T>> { + + /** + * @Description: 层数 + */ + private int level; + /** + * @Description: 父节点 + */ + private Tree<T> parent; + /** + * @Description: 值 + */ + private T value; + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public Tree<T> getParent() { + return parent; + } + + public void setParent(Tree<T> parent) { + this.parent = parent; + } + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + +} \ No newline at end of file diff --git a/com.gx.obe.component/src/com/gx/obe/component/tree/TreeSpan.java b/com.gx.obe.component/src/com/gx/obe/component/tree/TreeSpan.java new file mode 100644 index 00000000..b5402341 --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/tree/TreeSpan.java @@ -0,0 +1,35 @@ +package com.gx.obe.component.tree; + +public class TreeSpan { + + private int level; + + private int leafIndex; + + private int spanCount; + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public int getLeafIndex() { + return leafIndex; + } + + public void setLeafIndex(int leafIndex) { + this.leafIndex = leafIndex; + } + + public int getSpanCount() { + return spanCount; + } + + public void setSpanCount(int spanCount) { + this.spanCount = spanCount; + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/utils/CompositeUtils.java b/com.gx.obe.component/src/com/gx/obe/component/utils/CompositeUtils.java new file mode 100644 index 00000000..b6189c2a --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/utils/CompositeUtils.java @@ -0,0 +1,24 @@ +package com.gx.obe.component.utils; + +import java.util.Arrays; +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class CompositeUtils { + + public static void disposeChildren(Composite composite) { + Arrays.stream(composite.getChildren()).forEach(Control::dispose); + } + + public static void notifyMouseUp(Composite composite) { + CompositeUtils.getFirst(composite).ifPresent(t -> t.notifyListeners(SWT.MouseUp, null)); + } + + public static Optional<Control> getFirst(Composite composite) { + return Arrays.stream(composite.getChildren()).findFirst(); + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/verify/FormVerify.java b/com.gx.obe.component/src/com/gx/obe/component/verify/FormVerify.java new file mode 100644 index 00000000..96ee3e8e --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/verify/FormVerify.java @@ -0,0 +1,57 @@ +package com.gx.obe.component.verify; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.widgets.Control; + +import com.gx.obe.bind.fun.Fun; + +public class FormVerify { + + List<Data> datas = new ArrayList<>(); + + public <T> void verify(Verify<T> verify, Function<T, Boolean> discontentCondition, String message) { + datas.add(new Data(verify.getVerifyControl(), Fun.of(discontentCondition).toGet(verify::get), message)); + } + + public void verify(Control control, Supplier<Boolean> discontentCondition, String message) { + datas.add(new Data(() -> control, discontentCondition, message)); + } + + public void add(FormVerify formVerify) { + datas.addAll(formVerify.getDatas()); + } + + public boolean isFail() { + for (Data data : datas) { + if (data.discontentCondition.get()) { + MessageDialog.openWarning(data.controlGet.get().getShell(), data.message); + data.controlGet.get().setFocus(); + return true; + } + } + return false; + } + + private List<Data> getDatas() { + return datas; + } + + class Data { + Supplier<Control> controlGet; + Supplier<Boolean> discontentCondition; + String message; + + public Data(Supplier<Control> controlGet, Supplier<Boolean> discontentCondition, String message) { + this.controlGet = controlGet; + this.discontentCondition = discontentCondition; + this.message = message; + } + + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/verify/IntegerVerifyListener.java b/com.gx.obe.component/src/com/gx/obe/component/verify/IntegerVerifyListener.java new file mode 100644 index 00000000..bdbf52ec --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/verify/IntegerVerifyListener.java @@ -0,0 +1,50 @@ +package com.gx.obe.component.verify; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.widgets.Text; + +/** + * @Description: 整数验è¯ç›‘å¬ + * @author chenxw + */ +public class IntegerVerifyListener implements VerifyListener { + + private boolean negativeSupport; + + /** + * @author chenxw + * @param negativeSupport + */ + public IntegerVerifyListener(boolean negativeSupport) { + this.negativeSupport = negativeSupport; + } + + @Override + public void verifyText(VerifyEvent event) { + if (event.keyCode == SWT.BS || event.keyCode == SWT.DEL) { + event.doit = true; + return; + } + event.doit = false; + char myChar = event.character; + Text text = (Text) event.widget; + String textStr = text.getText(); + if (myChar == '-') { + if (negativeSupport) { + if (textStr.indexOf("-") == -1) { + if (event.start == 0) { + event.doit = true; + } + } + } + } else { + // 其余的åªèƒ½è¾“å…¥æ•°å— + if ((myChar >= '0' && myChar <= '9')) { + event.doit = true; + } + } + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/verify/MoneyVerifyListener.java b/com.gx.obe.component/src/com/gx/obe/component/verify/MoneyVerifyListener.java new file mode 100644 index 00000000..0d90939e --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/verify/MoneyVerifyListener.java @@ -0,0 +1,89 @@ +package com.gx.obe.component.verify; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.widgets.Text; + +/** + * @Description: 金é¢éªŒè¯æŽ¥å¬ + * @author chenxw + */ +public class MoneyVerifyListener implements VerifyListener { + + private boolean negativeSupport; + private boolean tenThousand; + + /** + * @author chenxw + * @param negativeSupport + * @param tenThousand + */ + public MoneyVerifyListener(boolean negativeSupport, boolean tenThousand) { + this.negativeSupport = negativeSupport; + this.tenThousand = tenThousand; + } + + @Override + public void verifyText(VerifyEvent event) { + if (event.keyCode == SWT.BS || event.keyCode == SWT.DEL) { + event.doit = true; + return; + } + event.doit = false; + char myChar = event.character; + Text text = (Text) event.widget; + String textStr = text.getText(); + + // 当通过代ç set值时 + if (myChar == 0) { + event.doit = true; + } + // å½“è¾“å…¥è´Ÿå·æ—¶ + else if (myChar == '-') { + // 支æŒè´Ÿæ•° + if (negativeSupport) { + // 当剿–‡æœ¬ä¸æ²¡æœ‰è´Ÿå· + if (textStr.indexOf("-") == -1) { + // 第一次输入 + if (event.start == 0) { + event.doit = true; + } + } + } + } + // å½“è¾“å…¥å°æ•°ç‚¹æ—¶ + else if (myChar == '.') { + // 当剿–‡æœ¬ä¸æ²¡æœ‰å°æ•°ç‚¹ + if (textStr.indexOf(".") == -1) { + // 䏿˜¯ç¬¬ä¸€æ¬¡è¾“å…¥ + if (event.start != 0) { + event.doit = true; + } + } + } + // å½“è¾“å…¥æ•°å—æ—¶ + else if ((myChar >= '0' && myChar <= '9')) { + // 第一次输入 + if (textStr.isEmpty()) { + event.doit = true; + } else { + String integralPart = textStr; + int indexOf = textStr.indexOf('.'); + // 当剿–‡æœ¬ä¸æœ‰å°æ•°ç‚¹æ—¶æˆªå–整数部分 + if (indexOf != -1) { + integralPart = textStr.substring(0, indexOf); + } + // 当剿•´æ•°éƒ¨åˆ†æ˜¯ä»¥è´Ÿå·å¼€å§‹æ—¶åŽ»æŽ‰è´Ÿå· + if (integralPart.startsWith("-")) { + integralPart = integralPart.substring(1); + } + // 去掉负å·åŽçš„æ•´æ•°éƒ¨åˆ†é•¿åº¦ä¸èƒ½è¶…过金é¢é™å®šé•¿åº¦ + if (integralPart.length() < (tenThousand ? 10 : 14)) { + event.doit = true; + } + } + } + } + +} diff --git a/com.gx.obe.component/src/com/gx/obe/component/verify/Verify.java b/com.gx.obe.component/src/com/gx/obe/component/verify/Verify.java new file mode 100644 index 00000000..2eaf6acd --- /dev/null +++ b/com.gx.obe.component/src/com/gx/obe/component/verify/Verify.java @@ -0,0 +1,11 @@ +package com.gx.obe.component.verify; + +import java.util.function.Supplier; + +import org.eclipse.swt.widgets.Control; + +import com.gx.obe.bind.view.Read; + +public interface Verify<T> extends Read<T> { + Supplier<Control> getVerifyControl(); +} \ No newline at end of file diff --git a/com.gx.obe.component/src/org/eclipse/wb/swt/SWTResourceManager.java b/com.gx.obe.component/src/org/eclipse/wb/swt/SWTResourceManager.java new file mode 100644 index 00000000..d8a28580 --- /dev/null +++ b/com.gx.obe.component/src/org/eclipse/wb/swt/SWTResourceManager.java @@ -0,0 +1,447 @@ +/******************************************************************************* + * Copyright (c) 2011 Google, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Google, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.wb.swt; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; + +/** + * Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc. + * <p> + * !!! IMPORTANT !!! Application code must explicitly invoke the <code>dispose()</code> method to release the + * operating system resources managed by cached objects when those objects and OS resources are no longer + * needed (e.g. on application shutdown) + * <p> + * This class may be freely distributed as part of any application or plugin. + * <p> + * @author scheglov_ke + * @author Dan Rubel + */ +public class SWTResourceManager { + //////////////////////////////////////////////////////////////////////////// + // + // Color + // + //////////////////////////////////////////////////////////////////////////// + private static Map<RGB, Color> m_colorMap = new HashMap<RGB, Color>(); + /** + * Returns the system {@link Color} matching the specific ID. + * + * @param systemColorID + * the ID value for the color + * @return the system {@link Color} matching the specific ID + */ + public static Color getColor(int systemColorID) { + Display display = Display.getCurrent(); + return display.getSystemColor(systemColorID); + } + /** + * Returns a {@link Color} given its red, green and blue component values. + * + * @param r + * the red component of the color + * @param g + * the green component of the color + * @param b + * the blue component of the color + * @return the {@link Color} matching the given red, green and blue component values + */ + public static Color getColor(int r, int g, int b) { + return getColor(new RGB(r, g, b)); + } + /** + * Returns a {@link Color} given its RGB value. + * + * @param rgb + * the {@link RGB} value of the color + * @return the {@link Color} matching the RGB value + */ + public static Color getColor(RGB rgb) { + Color color = m_colorMap.get(rgb); + if (color == null) { + Display display = Display.getCurrent(); + color = new Color(display, rgb); + m_colorMap.put(rgb, color); + } + return color; + } + /** + * Dispose of all the cached {@link Color}'s. + */ + public static void disposeColors() { + for (Color color : m_colorMap.values()) { + color.dispose(); + } + m_colorMap.clear(); + } + //////////////////////////////////////////////////////////////////////////// + // + // Image + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps image paths to images. + */ + private static Map<String, Image> m_imageMap = new HashMap<String, Image>(); + /** + * Returns an {@link Image} encoded by the specified {@link InputStream}. + * + * @param stream + * the {@link InputStream} encoding the image data + * @return the {@link Image} encoded by the specified input stream + */ + protected static Image getImage(InputStream stream) throws IOException { + try { + Display display = Display.getCurrent(); + ImageData data = new ImageData(stream); + if (data.transparentPixel > 0) { + return new Image(display, data, data.getTransparencyMask()); + } + return new Image(display, data); + } finally { + stream.close(); + } + } + /** + * Returns an {@link Image} stored in the file at the specified path. + * + * @param path + * the path to the image file + * @return the {@link Image} stored in the file at the specified path + */ + public static Image getImage(String path) { + Image image = m_imageMap.get(path); + if (image == null) { + try { + image = getImage(new FileInputStream(path)); + m_imageMap.put(path, image); + } catch (Exception e) { + image = getMissingImage(); + m_imageMap.put(path, image); + } + } + return image; + } + /** + * Returns an {@link Image} stored in the file at the specified path relative to the specified class. + * + * @param clazz + * the {@link Class} relative to which to find the image + * @param path + * the path to the image file, if starts with <code>'/'</code> + * @return the {@link Image} stored in the file at the specified path + */ + public static Image getImage(Class<?> clazz, String path) { + String key = clazz.getName() + '|' + path; + Image image = m_imageMap.get(key); + if (image == null) { + try { + image = getImage(clazz.getResourceAsStream(path)); + m_imageMap.put(key, image); + } catch (Exception e) { + image = getMissingImage(); + m_imageMap.put(key, image); + } + } + return image; + } + private static final int MISSING_IMAGE_SIZE = 10; + /** + * @return the small {@link Image} that can be used as placeholder for missing image. + */ + private static Image getMissingImage() { + Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); + // + GC gc = new GC(image); + gc.setBackground(getColor(SWT.COLOR_RED)); + gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); + gc.dispose(); + // + return image; + } + /** + * Style constant for placing decorator image in top left corner of base image. + */ + public static final int TOP_LEFT = 1; + /** + * Style constant for placing decorator image in top right corner of base image. + */ + public static final int TOP_RIGHT = 2; + /** + * Style constant for placing decorator image in bottom left corner of base image. + */ + public static final int BOTTOM_LEFT = 3; + /** + * Style constant for placing decorator image in bottom right corner of base image. + */ + public static final int BOTTOM_RIGHT = 4; + /** + * Internal value. + */ + protected static final int LAST_CORNER_KEY = 5; + /** + * Maps images to decorated images. + */ + @SuppressWarnings("unchecked") + private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; + /** + * Returns an {@link Image} composed of a base image decorated by another image. + * + * @param baseImage + * the base {@link Image} that should be decorated + * @param decorator + * the {@link Image} to decorate the base image + * @return {@link Image} The resulting decorated image + */ + public static Image decorateImage(Image baseImage, Image decorator) { + return decorateImage(baseImage, decorator, BOTTOM_RIGHT); + } + /** + * Returns an {@link Image} composed of a base image decorated by another image. + * + * @param baseImage + * the base {@link Image} that should be decorated + * @param decorator + * the {@link Image} to decorate the base image + * @param corner + * the corner to place decorator image + * @return the resulting decorated {@link Image} + */ + public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { + if (corner <= 0 || corner >= LAST_CORNER_KEY) { + throw new IllegalArgumentException("Wrong decorate corner"); + } + Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner]; + if (cornerDecoratedImageMap == null) { + cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>(); + m_decoratedImageMap[corner] = cornerDecoratedImageMap; + } + Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage); + if (decoratedMap == null) { + decoratedMap = new HashMap<Image, Image>(); + cornerDecoratedImageMap.put(baseImage, decoratedMap); + } + // + Image result = decoratedMap.get(decorator); + if (result == null) { + Rectangle bib = baseImage.getBounds(); + Rectangle dib = decorator.getBounds(); + // + result = new Image(Display.getCurrent(), bib.width, bib.height); + // + GC gc = new GC(result); + gc.drawImage(baseImage, 0, 0); + if (corner == TOP_LEFT) { + gc.drawImage(decorator, 0, 0); + } else if (corner == TOP_RIGHT) { + gc.drawImage(decorator, bib.width - dib.width, 0); + } else if (corner == BOTTOM_LEFT) { + gc.drawImage(decorator, 0, bib.height - dib.height); + } else if (corner == BOTTOM_RIGHT) { + gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height); + } + gc.dispose(); + // + decoratedMap.put(decorator, result); + } + return result; + } + /** + * Dispose all of the cached {@link Image}'s. + */ + public static void disposeImages() { + // dispose loaded images + { + for (Image image : m_imageMap.values()) { + image.dispose(); + } + m_imageMap.clear(); + } + // dispose decorated images + for (int i = 0; i < m_decoratedImageMap.length; i++) { + Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i]; + if (cornerDecoratedImageMap != null) { + for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) { + for (Image image : decoratedMap.values()) { + image.dispose(); + } + decoratedMap.clear(); + } + cornerDecoratedImageMap.clear(); + } + } + } + //////////////////////////////////////////////////////////////////////////// + // + // Font + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps font names to fonts. + */ + private static Map<String, Font> m_fontMap = new HashMap<String, Font>(); + /** + * Maps fonts to their bold versions. + */ + private static Map<Font, Font> m_fontToBoldFontMap = new HashMap<Font, Font>(); + /** + * Returns a {@link Font} based on its name, height and style. + * + * @param name + * the name of the font + * @param height + * the height of the font + * @param style + * the style of the font + * @return {@link Font} The font matching the name, height and style + */ + public static Font getFont(String name, int height, int style) { + return getFont(name, height, style, false, false); + } + /** + * Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline + * flags are also supported. + * + * @param name + * the name of the font + * @param size + * the size of the font + * @param style + * the style of the font + * @param strikeout + * the strikeout flag (warning: Windows only) + * @param underline + * the underline flag (warning: Windows only) + * @return {@link Font} The font matching the name, height, style, strikeout and underline + */ + public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) { + String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline; + Font font = m_fontMap.get(fontName); + if (font == null) { + FontData fontData = new FontData(name, size, style); + if (strikeout || underline) { + try { + Class<?> logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$ + Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$ + if (logFont != null && logFontClass != null) { + if (strikeout) { + logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ + } + if (underline) { + logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ + } + } + } catch (Throwable e) { + System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + font = new Font(Display.getCurrent(), fontData); + m_fontMap.put(fontName, font); + } + return font; + } + /** + * Returns a bold version of the given {@link Font}. + * + * @param baseFont + * the {@link Font} for which a bold version is desired + * @return the bold version of the given {@link Font} + */ + public static Font getBoldFont(Font baseFont) { + Font font = m_fontToBoldFontMap.get(baseFont); + if (font == null) { + FontData fontDatas[] = baseFont.getFontData(); + FontData data = fontDatas[0]; + font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD); + m_fontToBoldFontMap.put(baseFont, font); + } + return font; + } + /** + * Dispose all of the cached {@link Font}'s. + */ + public static void disposeFonts() { + // clear fonts + for (Font font : m_fontMap.values()) { + font.dispose(); + } + m_fontMap.clear(); + // clear bold fonts + for (Font font : m_fontToBoldFontMap.values()) { + font.dispose(); + } + m_fontToBoldFontMap.clear(); + } + //////////////////////////////////////////////////////////////////////////// + // + // Cursor + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps IDs to cursors. + */ + private static Map<Integer, Cursor> m_idToCursorMap = new HashMap<Integer, Cursor>(); + /** + * Returns the system cursor matching the specific ID. + * + * @param id + * int The ID value for the cursor + * @return Cursor The system cursor matching the specific ID + */ + public static Cursor getCursor(int id) { + Integer key = Integer.valueOf(id); + Cursor cursor = m_idToCursorMap.get(key); + if (cursor == null) { + cursor = new Cursor(Display.getDefault(), id); + m_idToCursorMap.put(key, cursor); + } + return cursor; + } + /** + * Dispose all of the cached cursors. + */ + public static void disposeCursors() { + for (Cursor cursor : m_idToCursorMap.values()) { + cursor.dispose(); + } + m_idToCursorMap.clear(); + } + //////////////////////////////////////////////////////////////////////////// + // + // General + // + //////////////////////////////////////////////////////////////////////////// + /** + * Dispose of cached objects and their underlying OS resources. This should only be called when the cached + * objects are no longer needed (e.g. on application shutdown). + */ + public static void dispose() { + disposeColors(); + disposeImages(); + disposeFonts(); + disposeCursors(); + } +} \ No newline at end of file diff --git a/com.gx.obe.step/.settings/org.eclipse.core.resources.prefs b/com.gx.obe.step/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/com.gx.obe.step/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/com.gx.obe.step/src/com/gx/obe/step/dialog/EvaluationStepDialog.java b/com.gx.obe.step/src/com/gx/obe/step/dialog/EvaluationStepDialog.java index af34cff4..96913743 100644 --- a/com.gx.obe.step/src/com/gx/obe/step/dialog/EvaluationStepDialog.java +++ b/com.gx.obe.step/src/com/gx/obe/step/dialog/EvaluationStepDialog.java @@ -324,7 +324,9 @@ public abstract class EvaluationStepDialog extends EDialog { } return evaluationStep; } - + protected void setStepNameText(String text) { + stepNameText.setText(text); + } /** * @Description: æ˜¯å¦æ–°å¢ž * @author chenxw diff --git a/com.gx.obe.struct/.classpath b/com.gx.obe.struct/.classpath new file mode 100644 index 00000000..ee85e147 --- /dev/null +++ b/com.gx.obe.struct/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry exported="true" kind="lib" path="lib/Utils-1.0.0.jar"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/com.gx.obe.struct/.gitignore b/com.gx.obe.struct/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/com.gx.obe.struct/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/com.gx.obe.struct/.project b/com.gx.obe.struct/.project new file mode 100644 index 00000000..06a7711e --- /dev/null +++ b/com.gx.obe.struct/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>com.gx.obe.struct</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/com.gx.obe.struct/.settings/org.eclipse.core.resources.prefs b/com.gx.obe.struct/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/com.gx.obe.struct/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/com.gx.obe.struct/.settings/org.eclipse.jdt.core.prefs b/com.gx.obe.struct/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..0c68a61d --- /dev/null +++ b/com.gx.obe.struct/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.gx.obe.struct/META-INF/MANIFEST.MF b/com.gx.obe.struct/META-INF/MANIFEST.MF new file mode 100644 index 00000000..ee116365 --- /dev/null +++ b/com.gx.obe.struct/META-INF/MANIFEST.MF @@ -0,0 +1,51 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Struct +Bundle-SymbolicName: com.gx.obe.struct +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: GX +Automatic-Module-Name: com.gx.obe.struct +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + com.gx.obe.lib;bundle-version="1.0.0", + com.gx.obe.utils;bundle-version="1.0.0", + com.gx.obe.components.core, + com.gx.obe.business;bundle-version="1.0.0", + org.eclipse.swt.core, + com.gx.obe.common.file;bundle-version="1.0.0", + com.gx.obe.common.icons, + com.gx.obe.step, + com.gx.obe.action, + com.gx.obe.bind;bundle-version="1.0.0", + com.gx.obe.component;bundle-version="1.0.0", + com.gx.obe.common.widget +Export-Package: com.gx.obe.evaluation.struct.enumeration, + com.gx.obe.http, + com.gx.obe.http.converter, + com.gx.obe.http.core, + com.gx.obe.http.entity, + com.gx.obe.http.exception, + com.gx.obe.http.json, + com.gx.obe.http.jsons, + com.gx.obe.http.ssl, + com.gx.obe.http.test, + com.gx.obe.http.util, + com.gx.obe.struct, + com.gx.obe.struct.beans, + com.gx.obe.struct.composite, + com.gx.obe.struct.dialog, + com.gx.obe.struct.enums, + com.gx.obe.struct.factory, + com.gx.obe.struct.handler, + com.gx.obe.struct.inters, + com.gx.obe.struct.listener, + com.gx.obe.struct.parse, + com.gx.obe.struct.service, + com.gx.obe.struct.thread, + com.gx.obe.struct.tree, + com.gx.obe.struct.utils, + com.gx.obe.struct.value_list, + com.gx.obe.struct.widget +Bundle-ClassPath: lib/Utils-1.0.0.jar, + . diff --git a/com.gx.obe.struct/build.properties b/com.gx.obe.struct/build.properties new file mode 100644 index 00000000..9eee1b05 --- /dev/null +++ b/com.gx.obe.struct/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + lib/Utils-1.0.0.jar diff --git a/com.gx.obe.struct/lib/Utils-1.0.0.jar b/com.gx.obe.struct/lib/Utils-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..965669f4e629d3d0993b092029a6b38e017fd17d GIT binary patch literal 476051 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°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¦IE>O5! z<AFF=<0Us|=dSaZnM2C&pRM}oOcSi!Ao5pP?fKsAKj^@JKZpN!DF2BxRa%HsHxht= zl=Fgs5dANQ;%w^V{NMPFAx~IuRkeDzrL!YfH(OyC*7?exBox`KhKRFt^;W-v$VX|I z<>rHi<6@*F1Q#8I2vYk@H+$zoqaF$h3wteK?x76D_qYnD_xWufbcUbK794~i9==?z zujIi9CZD^XKlzEDbG+oUxn0gxKP%3I1iZgr_(^cf`uW=<C~<kmBqAt1Ul2SL*xe&y zH+hx#fu0_?3eR&eIeQ1`-oVhAgji*qOmaSRnTpBXHU9JIBW899LMJ}n83}NYZeAJ$ zz1_m?eg}wLQa<=2r+8k>3FGiSnPRW>(3#|C$H19~xiXS@IFD~h3US`f`GI7@>U;ae zfeK!otGy*={D)gyq+C1u=+Kq%4=tpTBVEb|hF`7Q62@(P1F#+(;|Ki+dLtJ;jWHb9 z-tnOvZ>I>haW|2sF9`_UNq%&(6G1~qIIN*q6W|GYdxgr~%Byw>%WA^*O^ww|FO>HV zRedY37CE(<BN+FsdhWxWjlp)ve{$bW8Mf&zF~>j$5xVCjCW3r%cE}(&WN0aP?NH)< z{|#Ixws^j<?>TqGRv+>3dY5=x-`%Qv>>L$dyqpkrYx7^<%^`j;5^hrvJ-?lLZeQ=| zzr65&72AJm1ZFaq#@}$ffNJh)+`B7^6W-s|yc))zqafYf-pb>&%@1_&e&8uR72bcQ zg=QjdUmaj>lkyT_IXvTj*g<_S@A^Oq{LEZs?83M&O&kGT8@xHZ^I~lNF5=Be7!g7u zN+@2LSna|4U`^E2(#EUGRYwC@gt23PKvUdQMsOX`V$!Aa1eU!=-9xe**Q5y;+pZ-6 zSkzVN(q@uWnkgI&i&`m^wRLskOJkSRW6j62Fl%fiMJ>_bN!g;6D4v6U+t4wEkHzcP z#*J~&>jiJyn%1pbcpR)J&%Hs$C$lLTV%9`0(nT$f9By1YQ>c&NroE-84X<Eo)G)@> zL}Av*lbuJP&4q~8g@s~dTangj0rg%d<dY;)OzagAvl{@v32MOchCRPr@y#l0qL#^x z?zA*Xl=Tsz_~t8#J41~(Fv2B|UK>bVv>XEo0|Ezx(s{#QvXZR|l3{^Nuaxq3D}`zT z-FdpPY)Z@e3&<mwy2)(ukqrHYS-<|Z6qfcNx=0cH<;`&ywnshf!l*l6mn^6wB->+v zp=g*NXK!B^iw^%S$E2Fzn`3NKB#)3!O8w$;nQpH<cS*Q5TThf!7+E<l&GYw=Mmj^g zy$pwz6mhPtHb#=oS$7?S^pxbJo*_pYYpo6KPIG-a<S>_0$DRZ&%h3BMBZf21$kh{< zP-cPoOkI;Gnyf%;eSTfdp>==$0Nr**;FbShIYPz$lND+B!C!}ZoNCdJ4=VO+6aj5y zUHAd#6;Z1Sw2Ggy)V@acY3rwNgJ6*{byhp&zvbl8<&wyWFgu(;+&rCq8sP?*&zCMI zj1a@o2Q4zQl=X?$h_?#HlcOurz$hg-nwZp8FsiVA(jG)N?JCB_h~RGIuo9vWYJ%)@ zFYJG(uel7xcO^5o@z!H5Uuj`PE~~n1O87XdAyP$}kH=j;ew;#85qnbv27Q6_o3&`q zsz)(GWl9Q{_R#6+>(Z4J%?XePQl^A0OQ7Dpp>G2)i(P93Euz(Xcx;_$cx{Vev!&^F z9i?%Bm@$7ja}*RGyYXIQ`}{;pIbLvzsAN;WV|||dkOp^mQ&1Q_b{a$eh91Qa)GyzT zQ|nq}*VtNVCqJCo2eo6dK<6IvULuAW)fl($e@9aA;Qv}^W$07!?EMEUYqK;tER|DL zHo4)3rlN%7UD>0o(Ktq(TNs(~)Bq-L7R?sgr8NF-V1&*rZgUrRYej}kGQHAkN{rBx z7bl<u)P{*UYT+id#d`|Ec+<KnHI4&ktY>g&AyZtYc{;cwKG@XDFbwF84Wp`hX%T!e zsayNFuqDae3_Mr9o!Gv1UMj;ya+OtB7NADsUq^U!&2dbi5t?qBNVEd67bvq)t3Gjg z{mYJD$mOA;DW%XlV5+uA)zp@4u?7?Mm|jJ(TDA(T^g=6lptZFKYU=wFB1pvCSjl?V zE7S~KI_Pmr$)bZAp0HK#@s-g>sdxbYM7L5zyK8uj-*e>Pq2wt>={v2BXA&jFle?;I zkX6{ouIuM8>dF&9K-mQzsyeg+i#v86rq$Y67-PsFK&tX@B}@XPo0>O80t#^7S-LSH zeEu<6x#i75SFVWJ65vX+d|xsFfra})NvDNk_wQF}R8^`=^8-UUv3aiRc2Qo29)IvQ zUqtSU<r~sNC9_x-dO7_=!*_cZOV&4DpZN?qpVepWP$S6sbhuM1OG}RvY2hK_e&1zo z9g=B_$!PVqE?+5skJKqNHAo^QNFr*iW3XtX^xr#P?U?<t#%k_%kgFCJ-6(qGpW$9R ze#h(1y4zNd+1+MR@XgqfpE%35$P$YAvA^DY5K;6@-K2dm^qAh;z3}bM-j%bx5`FN; z&|Ci-#{J<KE-w#BCPv{mN|dhCZ+x2^nH&Am20^ot7D>rCFyrV=KcQ=TKk`9=CbTK5 zZ~m5|0@~NMdO-P+n|8_as`52iROpO=ClhGP$*<HbbK*?#jpb*1kM(G7!c^bom+?XF zH^iD}1Ai3F#^!WTrv>6BT_`Kou1r5}qw$7*RIuySa#TX3^Sbd|-Tpm5d*jz~boWf; z{*gUV{p;20Yxr>BgI<{;G4|Gtf+#tsd$T66o!dWjY{Xvlqf2tNeAI-<JS`&m+(2#F zF#5=WN=1H>NA^fjUZpK*;}98%E%_((HZ9-ZUF)QgL!m5lnwtA`8j&BpD2Z8{RKZ~7 zLWQ!)fO5Je#F#YRuboostCZ-{5xFJZBN!nhSuLE{6;aYA;CZ-Q-V7ta5?@7?(Ivw9 zQ9Se|I3EmnURW=;q#;CJ;`-Awqr3+!&5h?rt{j`9=!{yRZ1RX5&bg`zqIyZXW!N7K z2f|8nM!HxMYeX2*O#Us^*K&|-N3292UP2IJISkccAdT|RpG0u7cBJ(f3x@m7RS}0= zXVuKs9Rr<Z&9<CWZw%@KyEc}sW#XmrK-^;S%yLme<3)=wpX#z<8hnSH={^k5-9-jL z#>vA$S)y>sQ1|UV(e;v_lD^#VWCXS5edlj4+!vn17GV^X7KaL04F2Odd1=Oh1g(v+ z(?)n1K)zFJ3rW!xX`Ag;b=%?nA*a4ypv`lm>vvLy+^!;N+^^+jO(dEd1zfL?BQ=($ z6bqL7h)R(_?d&1g?e086AyM0#b7O;b7J<(#Azx4$D?5>cai}eFI4U`X@Y4+`Dy;}L zT!VW`S=$PPpGS*`uw#VTuaFbKezZa?R&mSQtC&T@Py>SVc|IX+@@uI<TI+N~9usCc zyBSdu7s%!CWp(ipx8>Zg`vO!l6;u)%04Pb1u}e`t+D7kj*Q%~^5>b1TRN3HfjG7kN z>qeqg_j^aCLiYB5f$58Jc^*QG4RZ4HH>kEy8#~%78hdaa>ey<9)56riiX|d(mwC|o zszB<h>gW}TlAn&fHwN!2G_-|?h)fs4ocfe*Kb%W?jHFYme<!PGM+K%v)D`teVRN?{ z>C!2+;o9<JyEC<Vej4l!8T3W={lN;19f5B`FtZ-Ks4!|mG0_#%Z6xm)P2AERog)>< zJ{G%=SY2<=D9x_l?@%R?*NQ}za+c>dPsSI8j;#%F|3K1@Y}&dss3TJ^(Y0%TRIn3R zAxTXT`IzpvM=2H|w|?H(Xvq_x|JE!>(Yz{wyL*|=)A0uYyWe@Bn@etZir@pFCb9s@ zp(*w6&We8>l1&(?+i1{g#m)qu)>_%MGUN1#K?J#TfwARv3|jht<e@DwFD36qiHd|H z?Vd;c1Px=bvW5dSCUmT)yz4}YwADgI-AY5CspB7X8Tz6I+I!#E1^Ezt$Lg`te=Y=W z&n1M2Yzcjb;GYcRCaeNvDL?A^%E&wuihWcGvvrM@Km`P+Gc$}&kYj=q8#A>=D5-f? zJfn9YJSVl$i^7|GQhb=zk7b_}(SIG=u5hU8lj+=6!;O%R6LU>kHQF1C)DI^Ln)CVQ z!ym6s#{=1yoGfBA9p4Z7;;Xu>VdArDWNIQr?U~no@A|jJ7G$q;;zuDTu8-&k(ffaN z`nCpn*v1%doiC=1+L06%Nb>aOd-ku2DcW~(K47^<!=Ep^ic&5qBs2|U8q#%wy~d&y z3e$NzMzvRkyUoT&nar_{N-@Vb70U6q^3BFAfwt<jcvTellMI%?tZW0qyfbGC7icdO zGYC;)$?JTjB(Xv!?hyInI@X}!xnFPxH}12!0XS%<bQz+iteWuraKcFWppPJbYXsL4 zeZ`ReoM<Ay{d{A4Bj)CljorP<$7uvFlr0D%EYj+e$7!6%+d;;AEJfpy$PbsQe{igg zJIgWn=>-3@8qi#reLUU>(nW{6jtDB*qGf?JOr!u%^ZZ-zWT*Aevt)J2V~BX%&uT?? zW)e+l@$F#6D+H}<^&ww#=k*Rj*;u8NwkhESALd#=oVZ>Tw4l=57}+;w2q>b;7H62v za-`2dV@)_L<6fE)s&oze+Dh@_e1VBZF_D0O;?=v1+`y?8Qdl5r+#@UySYH@1Zm$PE z%dvcBxOT|Pr!KQRR&GE2^t^@;4?a6=Z9@~6dio6ivSxCeh9)JVcpke;g+x*|t4;T0 zTcFk+8{)x7dsepNRL$eXc7@tCEZGz(fzF~|q`ZXV1ZQymhvU}TKEZVe-(R<smOYtD zgfH9#c|GmOF9`d};@9Rv8T}Y`dQNWry!L&bGl=ZhY{~}9bNCu97{^(Z_0Wc4MdRRV zD|@=@a;6c*#&_kG*7=cM@#^R@dei)h3rc#z%2$C^^ye8#6W#tz_t(}!raL|qeM%Sj zbe1=QCES+Q;-JqjoxD)W07K=lTFTuq*z@b_%+09q;EXK(?ZbVv<vgsu!Ga&wj!hKr ziOzD5*u#<YjHs49ql%Fq=Z%qz0aB-Ak&|-l^oZell+D^x>cX|T$Vb-|G<Pq2&x-mI z;VU;!Ud<|Q+B}i$9{EoSKNT0ATPD)6B5k;anmHqZ`964b$F2s41cDV+f=?Z#0&)CU zoViHej8Oftp{8;}QOds!aSXhe{5w!B-1+Tq9Sydk1^cvT{V3yZ^mey>8sV!X_ME5e zFSdUD#q>nEeueYg4#D$<^?wV=F#vwX?SVW4cO3NJ_>l5TTK#|A+j9>doC0zL{SMO~ z5mM(Hcw=)8$R8>BQ@{EvPHQ#=XCBBO!Sux$@1Gu-?SL9DuAa#^`71Aao`FO~9Iu9+ zk(p;Vov~kmNV6Rute=59CC{%;Z~i?%q&-<8YNTz=MwzFgnZ{T?2sw1p<xj|*qd%At zr!^K_bvs5KH{RUYIVD)T=}vj^SaXg>SR!ZSQJ%ya^-uK9ugv0IziR~keu4R0FltyZ zK(XCv@vYEzTMnd&WDD0=#{Q+n`a~>@cza;-jMf{$*_yyRMf60g-yFf3*T!}!7Mw14 z<0*Bu?7eYFYR6lBdNv_B?u<T0q2ZN|=qW6d_~+P};ynI%P{Iw#2bBPn0&kJ5tq2O4 zCPT|8O9Lol=Q=QXd3=NIM3uT>c8#E%LIAYRkZur8AtzDRKqaoirwi*JJb^K0G-G<r z(e0q)BJ`{jm)1u0o*cG?jL-9{<fE9wuyKb$nSc+>44Wp3pe@j6A#PIVI7boCXTl7s z)++^e!!LT)vdVBMbb=y&_B?c0bP(Z?-a*sGTV&JgVwRLc*=;$M9RD7LCV!iZ+iejl z(PqV}M#Xr*;$E#p|G{MKiqihWJJ>d#Gtl6C(tqV<L&SWny?8H5P@H87wS>nDJ{xn? zUm_Wj8LZm>r*;-1@~HoTXGR%sTtIe;&3)e|p^fF%CYhEcNiJk27w8FSMniB2RMtB{ zepR^Ne?o7b$o_T9a||<swtC}@upU>)GOzzfmK$O0eqF8V)yQo<a*hObVvG`pWpMx< z`VSf-%4kz8Ia7}0x>U^iSao|SwK^%pEGdmX+nOWW#%Qlzpy&L+W+dSeNM$1uZyh6V z6%lWx0Iwy8&mj2Ouao*nXa}eh2Rp*3Wn}(rX!|gDcWh`6GNW$`hU2<Z*at;^@GkRv zdxjH~PW(cq&V#(t6I4Cu*P)$e751t;>PN!MZMo1r)9<`zYH(M6iT6;XFGmKSJfCC8 zA{ru+za9n`4`-xr*zq+8DX*}fl$DN*Z1W|zMjWAc<R0nprA)o|%nT9~@A_$bs2g%X zM2j^5xR&}lF};*G{_L*N8-4{>Q>xSti>fzB^`_-F^N5>Nc758pT6g@~E(gA+(V&te zyvHRb8kSS5D?=aV*aW~VM^%yp&MDJrt*<XUv)n`Um*_hTwy%VFlMyT_{m;3UB6I~Y z$1{EkUq6V|1%0lopc9_cTPiw{cSaG~I3gTKd}qcfH0UfM*ENp-2veKTDb>2{@<F&v zfDlVI8oTRUzyF+YWCq}F7MjT~<5-TH2X^&}1Xgo>$?GzoJOX*>ZI!@y7u!D4q(ubp zDf?<mXmVXBGmeFP%9BPm(4CtL8G`v$_I${Et_%ihh&K{**S;JXxf}(VVfUypex^`{ zsT;O$54ZY{rUZaR!wO9s5>f}`<b`nLCLmxcATo>#666RI!hD`vl@Vb{CzF*R+nKy! zB2#7UXiADjXo49H+GaV#G+heW&Z>&BE``mhhHrrxR&EB)*$5we^d$$3lR1#!SHiCt z_7j+=w-lW>&MML%y!S&aIrRwW2UqFUJj6b5R(p8VBQvdbV@7)I1Qu(KY;D5DUS*U7 zbko;@yxzz|E#D${_Rb*T1X~Ml>dO`3lj0DvvD;v>SFLUsDH)ZEhM!|fDF=hz`FX&h zlL%F)0NgS>2<}{jYN4XCA(SDM$a9Nd`hr5$B@SVs<_=(^3z8Fex?>jr#Qjw*cga6h zm!7EXXa%S~=nPc$^;Oe)d9I|MQUyIflOJqro%9-411AgU=UU8s0kq2swhvz8Y^$_i zic!B@gF0>R#~6Kjm4!7iC5QSk9akX<z9hj!Si~{_rt;+d>+0w6Z`JdL3?0Zc(ap2v zwH4t`DuGMfm?q=9mN)=ov;|Vn^$bjIqQFN(%UYm~y$$@*_%2IXpZkV^F1#*rU~Cc8 z#Re2*qhcV!c7cGr^Fri8E5NrGrd0%0&U188Y}HFRVFi4#HCP%v=W`MJuk=et9Q7sq z3)%4%EfWEG`j>1^Tedu+$qS1_Py?9eJ3zM;uhnH?b2vyhli859W}pYWnw_)_7g@?1 z{NtrWGK5_PbVrih8*S<^6Tt8tm2zM8NZO4k?!fbL`=dSRrs%>QersGCK)VyHdUn#7 zcmv#$yv{kak%YSmhW`8$bMLb_{!B{7*PH%9dp(Ba$mkpP{!rtAATXKejx{6f#UL<_ z(W!yAK|wr5mR1hycRg%e3T<Ylg!yL&;(B;3u0|mG@Hz`z#zBeexwjPhXj{R0(!c2x zM68`WAk^gooX4GR@%U_(z7Kk_Uh<X90@T%meR&Ps$#1jVz((q?C8bvBT^~T@3NktE z4wpGrDInx+z$}mG3%^*{UsRnIgE-u{2SZ_941$25HMOq<dlT;)#464Q#zR54k`xB| zF`VgkML3&(R!F}HM17ZP5bwRjv`-|-a3r!JUcE{{Qss92S4SytW6hv2ZV#F|>V1d! zZw417c$>`#Yo&VnK0ieI8fa7I`zo<9_{_W@ki_G;KdLZPph>6#0SI0Ks!v|{D~XGl zxdr*&$g7Sp=~F7bsRFaSzCV8M;c$oM7L$LJELKe^o|nZ=$aM+r5P3uuIIVB3(=BL1 zoT+alOV=!}VwKf({f(YBV4hUBcY!w(@#97Q79D8|g*4(-dBTV-?$x2PM?P8m2QgGe zZk6T>l_{n&N)K)Nqh+-IX3bw8Xe8;8u_+7|3mrY}2^N4o)+qqhMK$rzwd``Hyx-j} znECgx9}!DPimg}d$lSuIvtV54^0tHfA}?H$V4WEE8_?s)oNm+6SmxH4`A6laSHoaS zy1Z+>x~x)KgY%Er0d!e(asIN;Mb$ELxhzPPn4Om4Tmj$u&3cpYd%fboK<$2pR9gZo z1_*J$z6`>^bM)tL5^&=#d5S^%=$|ohlW-w?+q6$J%-*DwdE}ha6?Hq3-^Sm$g<Lyp zcBFCcyA9zHEi$7G*5&I~)8dFHkJtDzNG{<cbgo9BU~u+rF@K{!+2!Z5D}`+FGFpf& zx*EFTJt2X)a`2%1ww+{H4*`tLWHx%?^Pncth8;z^g2`TscfF!|7bG{d^0<T&VA(5; zOLXVK-o~Gx1nL)A`-Z>WPWZ2C#8Grb;9j$34AvA5dw^r~W~%nt&5?ZZEZuH2=Ij*H zzJRxf3l#CZ7z<ueI&=6*d%dvqUY?ZJ#LmimK%Srb&8L2ltAFEO_`%zMK-IcqkKPlI zaScO8w1)LabnlFl#)rnJ{K%=y@&-COv^hQqo8CGe?Xitdz#biFt6}aGx8E_Uu?rNm zKiDP@ysIMlN<ST%C*|g9biK&A!1<MeeYBlVgsS-+X@ILT^i+nF3egnZD<=;mg50Tq zw(_g~Vjx7QVFz^u-AWC}@T&joOoY_5z)f^Z5~+}gv-&K@&c4~Va*vF7qy1{x(chX` zBWjZvtJBtVzupGxtzk~KzbWD(-rsIo5`>)`H7K-Z=|7BNPQy{>*<I_DD7Sck{gm2C z_KRj<LmK07!DC!Qxn8Cv#4`KSDWIFxw)j_huslF8pc(j)vWbzv<tvd0{TC;}xK;bi z*<UTROtif`^_$92U%=O_B<V<q){0Ixl?_UzHovOfcp2L|mkp|_(!rbt5}SlAlsg)M zEr@yPY*FDzC7&kG0ZtRI+q@ikDug2O)xed8C`eW+yHL&IENff^;NDjCAe#Y}Yf<A= zL79$ZmT-V=O6eqI%@0vn%kCFAJ^s^V7Bs89E!~!y);TI;Re^yzPVv)PLZEF>@M4*u z<FvW?{S*`xY03V+3?->pTv>rF!n0zIRWMmG2Y2H-$1{wb>(AVihzBpih1t(2#1oX& ze)+AM7?eLxlIUmrudzn1KtJlB)SXB&M!5-mw7|FJ<}uVJUaDSC*Pbd?$|6RHmigMa z?(a?MlF&zjV|Cm-T2R&x?sSO(gtg}iPy+{t`#-G(zf87xr{Rt^t3%(l`GTdo5HwAy zRu(-SB<+#Nd?Sl?FdaFR+)f68%VASM7l(YGH4A`M@?oweiN_+D#U;XdHHC<_N?sMf zIU_^fcoBg{jRjE0omg;ASFU!{C_j}iv#9eHo*|LB<lU}GpI3E`zYfHl_pwA_D<gmO z*OEpmJ8G24mWVCG(7I3#egam#mCHSTx9X00Sfq9f8(Vlo$1WcY$P?T~8{Z0fLX)pr zyN3(R+=$YRXeJR$G*%wMDZkOZK{<&}KoKOqJ#WQ;XcsYR68w5+bOo|+$P|i^Uv|L( zQGx-gN<?besMGL|nD3Z-Z<g_rEr;r{E*EMxJN<Jq=T!Cmr1o&RA3d!90C!v&$>3KP zMTr;0+GyY4_vQuY;7{?S&;%(g`6I@kZH2;ZL|{h*3ID?A=MU|=87pVUPxGBZ9E^#_ zPwi_|axJ#i@f7_Aw!I#4DHCG%^R@7CyW=?2Z><gK<K*gEEn1|(7S<~@&CJ2u?K^N| z#hPeO|AGjYGn2LX+MxfsrQw`BZ-P+aPq_#%k3I=m?@-aHZ=ONUZ;JCyFpI2<_G>%1 zdv75*BRp4iz!8<BSw(dvAuah3Rq!l2+hKk+#vhkOp6R&2s#VBPSNqDsy5QKTrY<y{ z!?g?PO0|^BHHzs%;&o;aDy_`wbt08ook_Xy@m1O8oh;HncD~_s71<VPEXqAXb?*#6 zd%62T;dCpv09ZJ&pgZP%h%-oX3+iKb0JP5w&XX5)MHM{dLTRA?dMZLwwV}NH&W!Wl zU2*le%vU%gC2O<kY1&9>&si^1*|)B9BCC{u#rX4Gs>A1fG?3djGHa-h?=d3^LM_4n zLhk`dixInWb_wB*uJl8FlVmyLD!;=5;?vtP_Z#Xz2JnBkdH<gQ{2v^OXZ=OZ_FqbX z9ts46^#9KQ*0M0PHFq-nzddO_iEICf284W%okL}^12S1>6J~{_=7(4fZ-mtpYe-rx z)L@aZ<Sogo>!}_7H94Rbp-S?CAO&-dxTeTwZ)cev3z&Da7=M30Um*FT>Wv_e93vdp z4w+>}Paiv=^Dv3lmgS9h4<3jADS^wOcCX%rWbBOES3~arV`*OF=I9s!QpeHhW9uVy z0ajf;N6Wj|D%2M&;;7hBuVg8P#)`<0*BZ1^e29@Jk7gi*?bc5gU7D?%Cfz>GhAwk( zlcB1}#;?lfI9b{;PqvLltF`$8WZTwl&zovIJB-d<Hm*;b*BYK;T?*AMaOnRiSpj{x zL-fXvN(?KyXvdwW^+zk$O;m7|FQi@%eU;W3rQgW`xsF4&xvRPrYG}W)!8k0)wsenp z_yNxyY7eXX6SE-?whhW+a56NgX&QCCX7O^U4`9@73rahdvt`bcwPJr4PNV;-UG_0O zO0Ju^epJ3|JQO6QQeow)9mZk(Zo3PHI3AY0p~W&=0x}MqI+v#Qs$aiduG9?R8EMRS zY}w8p@PC3hya@=y+`1^C@8UUq6r3c+#0uS3CCI4&6R{2lf@Q*PVlIEIg>{5=n5Z%8 z4a5B-%tv)-zXEzW%6>o4PotJ;dkda}RKVj2pkNabIH{kMQd~Prw$s#rOYjmAb)Lhc zCJ7z;2rYjI{b80&uvAtN#N>^G?k4_;Lv{s!KTAYL7D%TuHI5!9hGepZMMf8B;w?n@ z8W?06r&g|+36}6Ec<OfNsT&tE!}Sq88Y&}-HV(q_(S?94v*~z1JW`Gq%DKGBIeBLj z0iBj?{yR5q&z@DJPs!%vzbaY&`;q?7^BpTguDV490STl1-)TOVe+(a^kfWoa$N!`G zmVSGAFD@kuoN&bMO#T8*_$8Qz0EG;bhyWUt_cKTWBs@eE_9m1$9bs&6Og1asptRja zcX6w^V{5r!s9hbUn8u~hWuO$prK71SwrNYEW2?J)OLwDMO<PyvqTuX#bH|Plw#VSI z<lCCR=i~ZdbBFK5_l9f7>)QLEi*g2ePRu(xRDE87&!o_A<;;Bkr7iR;@Jq$>OQu8~ zsY|qH_AGV&mDc04B~%Zn-*JjTt?x2t#qbs#>3dPIqWc&U`86VDcmCLOzoyO2$9S~C z{V6~0<~%O_>c>4)#9Oh@q1;`v03%J2ttl;Mo*9Z+OR!uE9#X4fz9k}5$1=)r<{&dw z_&|o_)h2o}rYwJVtICk9kse0Cz_8+x(dfgx<D53b!poaTd&nlE=j);7$=Tarx(<J+ zMqa~ppFvyWLD(I4B4ZP<i0Rpyf#tzD$~Lb-TN4+FC3CjYCVxUsXo;n=;ZfF^5`IVm zq^7sQW4~^1ukzVg%3N=0u`$@k1STAtkYvMBGV}D`1(e!A_{mNW|0YQR7}cvWuJ@VP z$-9a%30cvh*x;RBL;;(Fc@9pgt>nb}?+Er(W!KG0_!iJ)Sk#)t6MS5@0$s+YEp!zq z7W6sd!iO%Fi<S2VHk7o74#SH#64Il6KGO$e7b>2c|Art1U+nLRy6JkE+p#8SHd!Dg zlG5e=O4c5|TeCp>@q9A1+F^rtNKTM$f0#kP=i9Kcg>oSu!~#ye2p+wGJDuH7rq!*Q zQSn@zs=U#WGln5W!MyhyOs1ll*#-Xq3AXZ2Qt%bKso|1G<uAlJV*ncY;xdl?OL-OB zdO~(rEqmhSXpvF4Ef7*2JhDB?;nyHRc<91ev;7XX*8?~<n0~y$fdSciZa6tw1#;f4 zb9O5D^R@|HU*oaQFUxD#67GKpmMB_$X%kl>i2IEo2?<=9S<Ey20`LLkC4g0&KWyqm z-rhF07}JXm?Mfu-siXkfIIy$``bT+0%C$*3=Skudc%8cjYm>Ci7w|VtcAxy^oCl<2 zc-b@3?++r|H<vPdfdygO*!rmHvaLB;r}`R!^e_r$)GXPDoe_e}Ay|zw9YzQCfc)q_ z3Mxm@{n@*(>715HoLGu>7QWJ=g0le5U-aQo?2V83g=s)dt6aWm3dxspY`2j2_rh=n zpqe^^nV5HqJvYxD%^bQBDN2{EG4DFGai0WM&ImMmDvs*!Iv3*j@Fy|1!FeY8y>?NO zbXXZ@!w8(A4FY~_$ovqMt$GtmD#i>j{%Cbzi|nea1l=4)aO#XeY#qJWGW+k#qGEO# zv!QF|Dm;ngrNM$#OA48cp|-QJM18H3WMZAmu(8R){(;*pOe<Mu??se%<Sd)B_sopv z7EH9Cx<A)_?f0QkFORWRwgx#1PiYzVe^*VzM8nVM?zR1#L~msE%Yt!Lzp=4pm)|f; zTg$o#aP=ZvL(*ZaTZN0PYIF^Aruh@zUeKSDI6o)rWtokWpuW&7J3CX^on0DRon7k| zbCD&#mI9HdY4Wt>E?=@qk%3tRdYurS8Sli4x2Tm1w!8}+$(@YVL^VP%+DN36i!bS1 z9El2BZLGz6*UEOfltOrle_-1NN`H`NF!8uY=0yC2VcS5hP+P*H<h*{sbcf2aKy6Z0 zbvm3HS^0)Xe>r570&=bTsK}ZegZtGfnY9rdu^MdI#w@rumk>4xJzpo{_}GiT1a08x z6ID6A5RWe@R*-3wFeX1;G9M|{lIl8V%ZNBv$Qe7G>*@7s)D1ydnOc1W)k#(SK*Pv! zZ;5RZzwL3B=pCM#>5j<E%UE;d0;bG7cXjj>v@nV(V*)XeQ)B>$C0-Gn^WX%heVR65 zCPWO3CV)N|`*k>7edsSe)YO&gK|L^azfL^$qs%60g~CIZ#>cCuS<|w-M$8hg$Q6gz z{*t+nEAql5UF`48{=`uxn_hdoZ9jlRKIW)+#-Sqh>(7_6rFI+?7F4rI0d<@3>1K## zD<7rmER7*WI_ek(w?3>XtADsVZOB#E*YKxWoij$v22B&RQyg}*3l^i>EjyEQN2;5B z;51KHXC&d{y)6`kehF4*XX^8w@MZCadr#`ynSW}`g3rCDV8*OZ65--24Ws^4Ty_DY zC)Xsj^Yx=+P=|Aj=PR*WWF&9+(VUa46XKRyx`~<}jR(~-#?%@PJ6+YEvL!Uc?W~8W z7zD=WUUqz*F1<JYPlLsICyk`D<#3wnEaMosG@VA$JNHH&eErmO!Z^{=(I2Tr*~2gQ zmKBMx&+B|#GH}O6tu3^;S34;^JoJs7Nm|9j+^V=5C4i+Aa2>uq=U9jM5Z9MFv<ifg zh4W*t^dm~-#wf~DY=v3g9D`5yKYRzU?9r5~2GnVqlRX=r%3~K~dg^10Fj&#!5Yv7r zw3}|iODE-AJ1_p^S5nq+1ixG`W>O<h1it90OU%$&KJJ!OwW=|VjO*TqgFgcQYFoMy z$^zelrdOgW%nR}l8rID?r;2{RMW|LXrYN20qnID;<BwRom~~%?pEhN*aJ6AKl@c|Q z7~2K5$!>D<CH<R5>;@#mUSs1OzIsq#y)_375o+tZEBZ?IJM56qzXFQVK#)q7VnJ=6 z@KWQCwSY|O>CvkW0mW$8A_xNZR2g;hD|E{gJ;cEsaR_JWCSR!(73dMianb6iC=4l$ z(anXM0V(1<0QPf9@!Rdd9PXs3c@$o`k5b%vEW48PEb;f-zqsHQ0=mKXGiR3E{z~_E zKOPRK`%cF2c%7o0-=*p|<nt%=Sf@4%06@hwZY6Q?C+GYq8gi{MEnwhyjBRnn2&?nJ zOS`pLJ7&xr1|DBSrso;%!kb=FMn>JgKOk2l{EO5IoDw_{xr<`V68=%rLK9sNO|W_= z^`yan=E><5omM=p`|-5HV@>uiPx<;b8?oCqau3$M4g@|+UT7lX&?{B@w9A1*s$LEp z^0}j5?(k=e{L%ni88+3`Fqg^5kFhk3jVK1_%}Y!+MkL6FL*C)gKQjq2lrq)%>LSVJ zX%sePHVfxh`G)uWbew#lek-%uD}Go<2ZL^%A&wmMKROh*g(L0IV!L8e`1}G_?cNPL zagUTn+>Rpvlvx}^@n1QLnq$A@_{CS&&p~(C^6RO~*8r)<-HL0fOPBVNPBNvHs%#vb z#cSv^v?@~=?W`BVrbp#%z2sBnifgP(SxjotIk+?rWzGB;13rI47xi|ehjXiq!b?HF z@$UQ}zaZ7uBCYQHz>(AceP@;s#q4lO84Ts@U`iR^GWGp2Wx?`>JCif8GWET&dHk~J zp~PYj<t}7}lw%}5F?iRNEMV{q$np8l%W;#8@HDr~jrMTqyX|1Ubws>p;dY|=3JXkO zD}I7qn)5^4^L<b5(Tmbh?Xpxi<t(0m+op>%fvv*cNk6FFO8c`OJczVb`ZCQNI1uLz z9Z<T9N5#&^O7zPXLdElj@)w>;&z->u5wa@3fbOa8lRYSo;S##BH=Cnh--8Iz?4tgI zNwmKQvWmq-j0--11!>Ml#`9uCz}Pe<Kx_3x)DKb;{&MF{lhfVzfN<!~*tDE?bV#>c zU<Oo2*EWi^y*lU2;zhG(>detX>;gT8e6E#d;Km83xUF{A0htHQCEI{%M?*h7p#lrd zr84}|Vu-=bFZykd1cn-W0SOo2rDnNGJ$Xo_yot<1eX(@&WLz?ylP;O=MDayfq(TgS zwIF&G_IN{JU4vh+nl~KJJ5ELfo;cT*e3LUYeeukn&zmBOcKCxY+>0(eY#%}%H>6+P zsr+)!duEP2J^_S^lD5MLO>tk;u5<KhhfF?$gQ}Jii`_C;W{cLd?i~A%>Z>X-coVq+ zoA@65tY$KY<`WL81Z__!QT7)_7mrK>EY5G7S%T)JTrw<sKjeFMzJJJh;GyAaKf}rf zMdnIz^B7jgP0uM6B{EBydk=dwhuL?VpiVO++S{_jp2SIU(o^ht50hoR%l4mr`AKl* zgY5;u1)<R(%a;oN&lk$n6)ggCv~C*^cQJIj-Wd!Y;tp{Nf8Eic`6B4O5X=OAoc$^) z0YI6?<MH+-KcX`hm3ZLr4OBQhY{}~H{dl9%7t=q$?&`&Pqu7yTJm#`sxMAb6fFhc7 znw?|9Uj%Ymd_y1RDUcK({8+cnNh{tr;U?XeYr&Nf|JHI=Pw8KB5<e|!<2VbG9|#tR zUb7R)!o6fcQZmK@(z+UInU}9B^T;BOSnzvluq{E=FRtQp8sW8N0+%8FSX56dFO0>n z$j_TBoP+}8tfr8$R`YYDZ+&6YzQIC1;L>^!CjI0<Jt5P2q?aCXH%~YgC2JONJ;7i5 zG8d)o%8KbmG@KlS@x`_+21aoV;Kp3YLVsB<Fnts3V#_%+1$Z&sBd*nT(i!&GC1t&N zsTR8)sC@iLjx`9Av&V|EfH1LE>Az5WcT18nxrV6o{vm3nvXLN6t&$3s*)%e$#Db2H zBLvn`UF(`WUW=9)q7%F&W-dnEI=kDXJQOzcnmO8jU(dkeC(?hwe)YmTy0H52j~3iL zAXXYsYiE+JFG<MjVVAj(!^OR#(20N6N0{7D5~fsjWnin5q^&O{vr`JMmt;X~)2H_9 zeJlc`5t&G4H$f2#-4&auS{B#mkNIJ>eFl8>28b`Tfql{0RPs3y%VgqS3TX##QShaj z0i5V@zt&kwU%^KLYW3NWAU<?Y%WGrr81x{50tH)BfR16~?y&m~)UPNbPVSIZg7S4a z8p^c#vKsf~&TKW~URafE;9{0s5ZrPQX2ghmW!`p>!MhIGvs!}13xoY}E<%`UUbb!> z)AJ_$G8GO<X_7vmOm0bptSx8CECpR{_}Fu76rjgdFvCA8t-O>Jy(0f;k@q4|6Q>al zKbD+E9zSYNy$5l?aN<>E6YCsC>0t;LS;kVqkciQc2RVjM><G>v!z|7^Ej~7L;dkbO zH7_Oiv5bsqpjGOm6k}d`9hH&d-Up{P^~)JyE~4FYK~t6nC9anEmJ5D@*;`H1x*SHw z_8~CY$bWt0syNRu$!4lJXONoAfK|@B-9ta68k`?IwgAiU<Oa8d@Q4H6qlXR##C~<i z@sbpJ!cieqY-|7?gcnkJx<Icc#J9F1FubiNujnh($vGM+#dl^Q_9&;?1dK>{wUKj7 zNpy~p)ERmxk!~uqgpxsTlzP2*cDn+Bcjf@@^JH%gl+JG6&W4AONe1RY2&a1gGhoT- z1dy%DB9bj9uWC5tz|(2!UoPW}Fg=!t1WQ0il#$SL9f1KUTWN!`sZhEjGe?NfWOCDP z8vhnv1;0cpq9>!5c(_b2lJxVwKP7oAJlJ`2NP&1ZM|9DzO%gy%G#B743Z3+9(Kec1 zp7z0&IOZis!N~C{orZ7bKd};fbZ-ZmY8MF5qg$W4@9e%OVc@_o+05wswnY!@ICAqq z3+KlPaSSMcdZ#|%WN3mF+e~z#Prhv|N2i1yb50KZg5mi#PJ2P?y;r$>n~CW3>?@7x ztxoM*0U6LZy_v%HK%q@Gsb)%r#ir8*$K7r$2GTnNw`1T#XZ9M1N+RNB>RPuoFPxx! zrs-_XIQRW&yH&M&t(qr?Y7G8uJj~kdMbxOo?c^O%;l0S2{zf(qw1;t!D6yC(U6a%= zJ~8~un)TLlqCjfbT{5vLBM@_r!r7>jz09J<AfPh;+)_3__-57neDV0FZB+ZHG8Jh` zY+vy{Y@w>ZEa*j-uQB-OS_|qrH+;4kW4T~$ET2nqMTb?&NhSTbI9&@?%_8xkTO(i$ z`V4QJ_T#nbMUD~OOSg8VL8-(pW7r3N*eCO=Z`J!+ZBL4o>RQ7t)P|vF#y77HHCb9! zz0d`z%{nanr{585#$k<{D*HdD{wJ?caoo0*w9nrq(03pEJYY#FLCY8|F8-Hi$&98) zmYF(d6dxXt*6l4T0Q_k>k+i4M9${g*|N1IGB>tGPL|uxIUQneGzEr28KjLKG+J<my z;aH`q+267;7=6AR5RO^oSrvlYq@`6t4@6v7wwz0uJ6eZZ2QDr6+K>+^0vn-%m(_`t zz*ButMma4ge~rKP8W6S!y~W^k1wQH~)<T^TEqPpu_QFK30`PPtzeT^Tw_gTDqH_F% z6jUKY-s$8FQ%88zoVsNao!<x@yES`1-zC$c^R&&NvS}^g`!{&t8iB3a8;a=S42jG~ z??h=ken_riS5|Uhuo2p4?1SY!)b3ES9%WrJ4DtbJtURX;j3Zs!=15Q}c1Td(F;^0o zq!QL)Il0jA2rX$8LUufzS8$G2+5tY$kd0TpKG5|2O-|v>k?Iy5XGS(iY=HM9AGumX z6r(*c<Tev_tB1qxl&>jKNBU32pPDgQM@+#c{>O8%=m|<q;-T956E_K=ZE*S@zkl8( z?tuSC0RHbf+5c3~(2x}Pk^fa@S3v*o%Xt5#pb48A+Wy-PF%~g2wlMv_YZ<CGDyT~6 zzSWTobeUAiuUa8?{^Vt47$&${no-k1XRJOJnCtf0rVjQF=lW&I>}+hl*Ai^m4V5tc z5WgCpFZoV*XFR6c+`d0P@9=u*^j>%SI{!fO#?8?l<o{vd-Ivf27Y>LT!LJ)#M#GWm zWbm4+nl;PfQ!pii?6kT#n>u<rEbq0T(H<Rf%ry#*BHXCE>iRv#KDnx*+o1mVX{|hQ zed++p_0Y!zDIAS9FYY_DI5Xe_AT<ZLmPx{H$f2Q@>0Sv&re`EalFQln383gkefLzq zkYKU3H)VM?WME=@tz<;SfKSn#y@R3cNk&rVnCyX<!4x6L=rbO%csi&|q&1TA{Kg}K zBn+y6D7q>zJlc<6o((J$R%dBxEa=N)s2`cX=YBs|{6CDnV|1li+bvwNZQHhO+qP|2 zDz;g%%^jm+RBWeW+ZBH4?)Mo__c(8#^Nq3bWB<C>p7Zj$rj$@$9juR1UMbMAwrNzu zIbIN|w2}Yyq3cVQiXpjg+uX#-o|gHD`!}%m)0^^mZK&MGNi$s=R`tNPc4E&TUU=_a z$|=b!-c)jkt$3R-Uv=c54sp;|p=F3|+Ep@ZziBo}{}!bg{?<`c1XFCR9$@ZB5ybXR z6{_kKB=Dt+T3v97a~@ZH5HY75(n!>>btPr5l?hG5Np8@k6A|;7Auy7yQ*|aLPtc;; zIPjrLtL}+6m_%)3dF1Rwt7F?MoTFX7sVtddW(FM-VabHODB<Wyx4ojKmh5Y>)w8$z zjD)84iAlC;lamjj<3_zt`?D9RsYg#3|6P*B*G*x-jRIFFr_dT!k%%`6rYrHvlGL?G z>+#Sp3ffJzZ#hREfZSe}qb-f$Uj?Pwv3-p8JpP$9d{{<M$Zvs$uFhAecr&^2zjFFs z;JOQ;6NPC=+~QMV0EFUrW@ch00FGEFjC;1~tU~c0eH>oE`>_5svK19oQ@tlt!)=<j zAxK04fWCg7q?E}GqEq@3-JD1Jd;hS*NvQerLTI_RGsJ2V_ytEUfbhOY`EukozL-J$ zvyEiw_Fyzgf)s{j>nqL^)YRG*+A(Uj0pitb0mm_B;2lPI;m`S>VxW#8&r1h=6SM1{ z*)M<AssGNUf3j>oqJeMY^Fk)kr`*S9srvsAQu>o+;zlm6e`rvOJ2=}Jxso#dMYLjN zJ%>3)R6hGTa+xvq=Igim7`S@3=&S2xD+at2YA}6nwQp&o6IF|pZsfyaFIrc9r14Kc zuapB#IBI5J%Lo(wY85W{4)Mo+bqBmdZ-F(7s5(szzaf%Ug_Rlh50}J2z%GE47jc<V zUY<Q*cB;EmW2PFH51d|?G2Ag-mIhZ1X!XtEFU{t_OtXk&u*~yFLv2WV<-l<BM<&^# z!c7)dF%;x8S<Ebtuv*`)<2sS7X5c$DzEzFZrCSO~O6-SL216>i?|8iO#VOZ-D=k@; zgHJ&1P{!^{c1|Rx53cJLwDH7IN<CYwW9Fy0-9@2_7(zpZHvNK{3n`X&TovE}6?r89 z$2A>jizu0+cik6sVp%L&`W+;qv9>d+h&%2E5jKG1-dHa$s-sO(DS*LS?=p?zS)Rx` zHrhjD6uM%C#}6D@%|&W^td1w6Y3|9nq+_`J^qnj8;KwgJ1cl=n4Wl2-bPd4mdOwLH zqm7H5fF2SOk%d<);cfH8ef*RKoe~Nx{Lm)!g!v+y7%00|d^!UHZ^C3yUt$ZGsAwo{ z-O*?+0^lk&3*o=(^}8jf#Yt|76J2FJ+geN$J}6w#H%`H0%0hG=SJ-biM|n6d<*V;P zSI1Y-*hg;tiJHG-<G-l+<8~(0%2{^9r)_@xw9R7wFVrX+Ie&^fk%}0(m`T~YnAy8n zxmvlKshWAZs<=9TqRQfbZuS<d*{EP^VERus)Ya7_l(FTPR99Q70~=?4N2-vLY+@Zq zx2`{a`y#OptChYH#AfiE%dH~CFefkYDB<>;lR^zX&NyeZ%=e<7bKBYC^8S9<A^@~5 zxG_L#KgbxkcH%VL(*T9%QK+eOnH9myubioN-&TVESkUT_xEB}!j32vYQiZe3h%`(= z9{DuiLjpn;dX+<h%?7S+8qS)jwuuP4TYUKX)naYd%2XzhcG!>|KO)U+(-J1vsA_nJ z$svKe`FviFehvTkFaF92f&lhbohf^nDW}sme5sj~0{YH%>Oj$(*wYcU&}6-{UP?re zmZ2_Pf!Yw}Abrcl;GMlz<HolF;!Zq$u2>PQl(xgN%NoVB7kDv7y{&G__HIW%32q2u z30!I7;fQe=@XDk1J{s26%Sy+~w2BFgm1m=7Eu<AcDxG26#Wn_l#9{PD-)*vAUnT1Y zZH(gzTuwj4`Wd+>#VaBtptwvW@Al7y)~x1(8?dfJc)?ZyVMOUX0>xcTN>nibV1&@N z{I6KT$(F|cdC$8=f!<0~*Ya8`van@*ZcFZs=W2uPh0?4}=>AGvnw}5}w4EVTFlmk% z+p}DwN})Qafp)cA=U^}j*BOC!Fg#D|!oUtXlqO4k7@p#K3eODJDS@?gzCjLfz82d) zj-gS0xOA#@HhI?h;03J@0yy8chZrGsbfvf3O7%@@rC`s>t*|NtY9Wf@R)hk*D#hS> z;_D$?dvLHF+{3fWvO2ZVx^p|500UR^`1Yw$hxQ%Q9_ylz#q^Isjz>q4Gn~oo$Q$$( zkP?+SkeFb<jaz34j-Yrmh7B}kqesole}mwGsEUVr`ScvKlub!YIg*9C5h-kdtWl&K z7En*MdWgX)4X5m1VBVL;Z25v=G)D;~yNICSv$&$k&gvoewPF)#4=$k2_~=f69`P16 zh0@$Xz)g3Mdc~;+5XuS|k__qx7MH~36*EgfzQMn(&;)DT1@q${_bkg5v&=!gVTi^d z%ESXeRBGKAg}rH}X=aWTddXStWP6MDdHYt?(lcY2=t9O;*~Trcike_ko5a@V8Z?(u zulQGf@s<Q4FhYRRpn=1v-?m~;Z$b(~&j`Taz_`Lx_|>?H{7ztnCdqils)ywh#?yUD zVIMLGuRXF#w2a&vgdbAy(kEoF^k6KeGg0qY>nHQ-Ba2{V21+AE@6b&gFpBUkh1}-m zC#A>M+k?I*KNh4yP?EYy4{2Y!^{o273_D%$0sKb*_jgn9Pa_eY&Z$@X*}>=j)H~z; ze;NsAEBj9+DN<DrGh25vNe4G)aVs-h)4x1Twu+s?r)0SQg}s&*6}(Xa@rdd)lRovg zvfg-1SEtc0B*9agF)*kd?#JAF5KlC+^A7&Z-9JEOUxD7qO?V&OvA~&t8UZ|qcUgyC z7cQ#=KOVY4();LOsP>dChb19s_vE6r85v9LcPp5Ub}AyIP?j)PD-dvUOzY5b78+o8 z2k4)>VGsF~YR9<yP0Nv0vt#fmC}k{IBCX{~ocT%#PiFLxMj`S~C75wnCDP3#H{Ja> zGELGa@qD~ZQ+m@87A2+H_nw*k0mMJ0bv&rbARW|#YkqzgBUyEovh?1MxNF{j%R@rf zJ+5XN$BlXI!9C^>J|BS6id(04OD+0=WXF89E}4+8H*Y;_paX?D<WfvmPlv1Ugfoe! zr=DrPTVehkBc~$t*>Kd^#7{32wkvE3$+LK6DxM2AB(<5Y6TIAnwAh6UIb|58U=h&Q z-lCGwGy?b99zhk_9dJZL&9umj*G3FelR1v-XeK<dB5ATJ4k5qH8PvG<@hj3+cQ`r* z=VUR=2!+Gy{9~6#WT|_x_$IYV6n2uyfFKkfZU<c6soX4d6E{2EL9&n4S*&S@m5fYE z62^GAn!N&6M1n{pwYwU1gulH#h2w4m%e8n$EF}pQEk2LHaR0}*eF*`Q>zoEqx1e^e zp4|Q|hWH(Z8Ih*VRvfIzyu!J82^{qj4yIDK8b$%4dYH+p_K*x!g(sRAvtd0sT5k}? z*ml%D6=QYoMiae748Q~&Z%}oA(Y2*~ek}Z1-=3m&+t9ffPKZO<6FS~29`h>*_-~1c zq_}$R%*LbPuLqMmyx<XYq~}_?gjG@XL%Ac2y0i8POWJFWDr>}UPR07CM-Io~Qx;SK zPxw|(C2fsP4pD3NPHUM=*AOzmX>5~duCoCgV(7TbQc=xETc}mP{-DL*!T(QM5M4s* z4t>&s@RJsN|9@$rX76ZZYHDUG=V0$@`4493eKG^nU;cPe33?m|+Lrof^7RT8^-g$1 zMm#N+At=-4j2i@Hs=F0W-{lpB=WYzg04OR7O4l4u*BoX*<Talj3nT%QlT?RGPS)dZ z&tEwX0SNp+=>yTwXd=+g)TFSLij1?NO3~$*!@<CMgd){<KWSQvx7bAr0Cj*@%Y4qU zc<+PxXzLV>Lp_S+^u|^_vuWwr{;mSMC;msQlChGG;@Zn2`;b!{A;r1VK(kYqPy$|d z;P-*Xtgk*RNwQ#}Ptp6Dy&|Eh>sQc0x~`R3`Hi+*zWLp1+nWta^-xkNdUJIeuv5q{ zkjX)CQFlD81e!WUst1$abx6)Blp#u$PNnT<%+ZHGzYjI%uZ1?&2tXV4Dq7~{uN4@< z%+o;PTub}e#rVKtDAbZTvv5yM`(eWbad(*9XdAZ0)^5Rzd|=^A3o|y`ExSn%jCi~# z8>TZH#%L#hD*LP|CC!tyTx9r8B6~j8gDXIK!%6Apxn~24w&^ddjt0Meqk?;6s@@6= z1qR0~d3X7W&FacbiV#Gn&fbQ_cywrN8~tRZH=q<}-!3dZwjdKV!9J_I#HBRWmWb)_ zXthx^!&Wjmokjzn%hq+~wVpuM&)Rlrar>JW{ODVmp=DvI#z092T4C6#oFsLp6{|pC z>{-zHtgtXf*I;$f9ah5~*alz;J8T+7d72_r2B}w5lyGp9y>b^gp&P$EIWwi}s4%-s zH#i#o*?|BHFX}vBOn)QDcfHTUayBmBGS7*V7`f8FNaV)d)G<TeAiqg=L`_=4K$dh@ zIlD~OBJsqgNStN#^`sIZT*~tuJYr_tXCTB<hBA{FSW*Bf%|Bn_ImZ8Z3hCNag?9s0 zVHdk5Y2J{M{(eNlmNedu-CJ=W-(XFGlHno2Gi-6AjwlR{Cy#`q@0DW)DKo*+e>Yj7 z7%J9;x#s=PLcrf?@lV2RzY%)ze-ei0Ge!B|Cc*wnQLJpu<Qz=@rv?zBeCaT&h{}fm zO{a(TBjfwHTo!zK4Y8~o;n+Ac3W_TMw^Vp8bY+zcRY~#$!n;x|*`y`w%Nc=L=OrB6 zfLSN`<6fuFW!qs_x51AeZ=j03w~(aCs<vDC(O_6{ssr_-K{bT=%F2gmacD)Hsc1!9 z{7UiLnh8o~hWP!`g>#q38*$!0?2aY6KZFRLn+tyc@J`)6rYo30J5@sSJh&0B<AwBX zx-C05STNOpO`O5!rcX{6Z2IPNc4)7XnTE63E_t(@HPK!6*zy2KU^3nwVN-;6mwB1o zhFv?_w|$z|s?jW<DRACmk6GoW4!lj2M%jGOr`{+eyHA^KUe;h&Y!14p*~`}i8jf|5 z`Y+l`1nwlMG`FCNH=Twi_9Hg=JeDh`7~AEN)CvXexY2)^gulz#ITOKYy*Fa8+HO<z z-^3VWJA0OF)8AktOIk}_#~%;{k@mj=*g_SDk2_dd^eE+*HysFc@N#|a<n#w>OyI$r zPTvOr)^??`Q*`nU?107*yD!1zOeMqV+n5GBrG?T^Nb7yXn5p6WP`{NW3=I%lMXy+x zLf26Hi7|?waZ`uy)j$VoGLxkZklKR>PC-=eJt(a;)HHi5M&|gG_Mpu`k3sfk#V>%j z8*x_6)^``{$*nI$dO;#J#QA50p17aj%TtnrFcc?|kVI2JGf+ffppel_`DrC(--T#7 z3zilV#nV}|^N|X~X?TUlIU#snJixSqDThYXzLk{J$){<NeHK=<C4>yG{}jjkJLvui zM;D=4tJhDv-T0X`v;3?5{)D5lnUU#dMDy2|q>;U;?SF)~LKNf_`UDaEf|{DpK=*As zJ$pnqf;gCPS+S*LC5r+Kt-_R*TTDC1UfB^|zXT*Z$rO^8Ing_8`gUeKKD@VsJBHMR zrG~-xW=o-2$Z}rtP3$X2vSPICyZ+4FwMb<;eb?F;DUu$rWIi0ZgX(>w-U*R%QS;;^ zecEMJnoVAn#`~Z{3w3YtK+*r0$9?rS&r0Lo2?Kc7>j_o6YE5`^66=coj*?U-&aF$w zYD6rSV!7t?((d0KDj^3nd%BdNo_5HhgJA?uKA;3&lxA!njj?X;<#x~qP79*#A-ZpA zHrr&FoYM1tXREU~bvqzg-r`?H2T@&<!)<;4GqL>p5&rXVU-P1UJU+S3^ywTa{_ltD z@);wV{D<#J8_J)PpTi$(i}V|z3S$;jH^mPy1qFHNLWZH0Bb=(OSM=5OF#xF4`D-*^ z(A*vy2hgr7AYaOB+r(5rFjK~8&IaG1$NS;g!5>0-KvhN*5n!~?q;;fq(H*nx6pjR1 zfw(uoz+i#I>YVCas-aIMRvDA%{if<Kc>%L(V}ON6^L|BxQ~9oB9`o??l}p%AqX|HC zkb9#sVDsp6vNPJsUCjaalul*xZ7^MhV+u1BP_dzEldINYT;?{+rM4EkqWBo$Ynioj zuD(E-a7#sIBpFg{j(JZu(-3_-APEtgzlryA>F{&{yIoCXOnwYtZGZPQnt%Fx&65p2 zY>=5mZBFN`!iF&?z9a9R=Ky0497JS;&d+WdYgWyTin~Kil`BjIRMG_EtZ#0%Bcr6l zDqvGrS%pQ0C=7c$=)=w5oH|W4pBx@B4@CT8wPR>7$d*w;6W+18@l&_UB*L)W_Me5O z@tkZ0_`jcC^3-C*E={XiG`18sZc`&Pkzhy2UE3eDz4tGE`)LoVgpV*V(Wv*+w=W(( zXF*@jAtffxuD<{#&Bw=0iF@nHWnz6ffMLye+3$$%tN#G#oBd5h;LJ7k9bVB2KJgv! zsP8rfW<MA4FDvX`M8A*@HW3r-ep5Nm8qD6ZC~0HZ7AVp{DuULivQx5~kUj*_DWuaw zx`gEYFAA<+-!9gIr@r5L8H8gLJ5d|7_EhhH?HCY|{>CvLba9l513#icZ9ADg>}sX= z`&lYu13kCLC*lsDAVW=zeJJTNPAn{bpe)QoGdm(F@-y?+?EJ}3Mp6reNKa?@3p=nH zc{?}qe3MnnPaga6*FOav{*KuHV)>5=W?D1bq2^C4yM0bDll|YYtoAtz`k$g&wW^*1 ziV!MaBi)-Zm7?IQu&5FhDmtiGNIao&Fe)Ru=hdhk)@rX=%Stx#tHx0fHo-gx^1WD0 zz_6#qiu!=^eCz1sI+x2O7t7=3c-W=GCNSo(D=-r*Y5b5OuE>ZeQ<fkqi8W&ZW{hz( z5i^}Fkp-qO$gx}KRaRp!mUd&`!C1;UuZPA&r<f%5DXOf^hHHp6grR0?@Ngc(GP}ni z?c6OV-Ae<Q#Tw-WwtNl_8P%A$81z^x18ujs_{TD;h_8gFFm*VQK>P-?hipH3Y`s+Y z^>lJ^IY~NIG0hFyXiP^51vIsDGqjh=G0CR2j~*58j{aaGDdy%~6ZfeU6D!r{ZqX}) za%R#4513Bc5ECCI-BQ{VJcZ}J$KWxTS*KhkTJ}}~As8CAM1fWbOOaOC=$cuzw7`5a ziiy5CvPN9gV<AF^4EGt$QHPoOceU5idex6=`Rgpo)sm`K*PBt2O|E*qW>2~yr_xh0 zcku<XL)CR)fuq_~>%$mI2kQ&34nwY-x+odl)T|iFAvf8r&{$4nrS*BH2py&MMJI@X zlxIDWVXUl$nOIbjOQ;EXe2VpN`GxXanBLgTmFiop?n~!2ce~W53~eRoaf+yEugiko zpx)T%5k%}Q4V~?Eo$Lx8Jo$N;#lz&__iQr?P~ajgTHq71`9ZZkIZ63KrA!5ab_8^$ zrx5Ux1u^C&vvT^>o(bwinI<B&`CWpRwdlEdSgR7jO$z+OgCIY?ifG{--FcZD^-<ki zkn_lnSUs0l1b)M!BxQNAtf?^FL_)rCQ$__jXF2v2l6`^JdvTX!(3+Fk(alR6@VY~M z0m}_K76@50mulre%*m4zOTfhSj&nR9%Y48lr9gtjJFqSl!R<%;O+%0U;`<@fdN%de zx^t;F$Od>uimo^<{Y#$m?{NPo5olZjlS@7caQ68o{x>4X8M%J8aGd{2`2QF2_r>*r z#64JXa3#3^Q`voj^1s^d1)tLJ>@o3(b$Ow3;b<k!JhDXM;5A#XvjuyqE#tU(K)l_A zW6Du?g3wr4rir&M_j5FNw@J$PEYi}@cQP`}E_eCXm{_3GF(xLahNgzbUx38X#lg+N z(Ft?WMof$iL5v}zvI9Y6U4Z{wb@=yZ`|nf#Q6se>3Yc~I3|ZwMKXbi*ed<5*xxbz{ zL{&#cMFUeWY~8&NC>E%ga6Yn33K3Y<mIgJ3$=FhuF-%mY$s3YMRAeXE5HI%y<@r;5 z=omy_o97&`E0X){^SqcLztrM#GLUL*-rY30ns(XnqwDs?K;R8}ON1A)FX|q#hKQi2 z?aLV=c|DP0d`3Z!TObZFS>P0yJ@h(qE8SH{4_;sgaBNSBpw_nO7abyhbyRs8QPcux zrVy$S7U(%>7HFpstq`t|-(N1UAgjn1p(A`pdo)Yd*CR9thQEJLd2;V~W9(k4S=e1M zFYM~F6x5T_`{|+n+z{b=L(Ns6qhJB+*#H&mtpQ_0C5J^FP*A5_#{mm^KL0FE?L(Df zQK#!nQu<?FyXFYKVywLA1&g{$sfefVaisiG4HnbNK8u!|IV9Q6@bzGA?(S5t13Xr& z;8OEMj=kk5fKbIob@9QSou(SjqH!|e>qEls@whniW445R=LKtpQ^!UHTSe4Niw~Sd zrdg@Jt2Ud{f%hGIR(9n0+b|A`eg&KLxfw`51gK1Dp_sjc!;<?xrOiU<+@?*$aCnZ= zf^^3+7li`p&!iKp&7{@2%aI#KmnzogtW<nSj(4Y7i<a!0psL$xIbFJxQ+w~bsjn=0 zTqW2(JTeYZjpLF;9c@e08a49+dXjNd;V>vLH;|JVWyWhgM;{$b_2HQjQLPR)XxVH| z$fdGb=;4r}V8*~Iz!sn-VCJAZz>UBzz_*-({72ZX!9_msI|4>|9}_2@Fk|=TK^X{Q z1$rrm?3Wrp?bKVQHyTYhRyOo_KUYZ|r@X}C&YxOd@8A+#l77&E)5l6?eEAI+LrN>8 zAJ)xr{vACwM?cky>*2My&y{u<GDBhktywsWU@h?N36h|{he8#_^mj;3?-LMT?bb>u zv!i}(^5@7aM*UumfJ^{0Hnfk4K;I+urXOCR&s(WzW8<eI$UF3U61{dr!_NWwOkaoe z`v`D8@B>S0{q9`Qs|Kd1y|n_Lxcj)SJ*AdN43rZfq`FR-Ns1i@Cm7^YN4l3`K)YWw ztYP%Zf9rY(RWTM%9tf;YD2V@92<!%3|2o~PZkapd%=+Cu+dauWOua<S3c*rt^@64B z%>r^(7@(giby|2o2X2Xejz}kqQv`R8<D8D4ea#FWu9cc*;=dGcG~k9>*IUM+*heSc z9ksS>d}qg5#u5}(mN!9*U%04tj8e1@Y?y*B{*l{ycKj|>Um|-58Vx=r_AGGC(ph|E z6n97#nk!;;pR-h{rdWxTt56xQUg-Zry-OPp4iv!Lgsmc7$zMH0_hUh8t@i#!z2~F~ zfBHGSxN6c{<`khS4{iQAesQ=u9&MJp>OOeE=H8mG>>g?iAX^<))osAJV?=V6m{wgU z!_VGN|9b_#1JzLEEYVozEO9X3A9)yD5*HvT)EqWYibQ_jAVr$w*O1%q`TU%bbyy4r z9udYAYQ(>W#9v$3nYeql$mD*++2IUqaNQd)G5iik@C3tu^6N>}dtD}LF!Nyj&qCGT z&D4Jl*dOr=A>eku>odve{%rIR{hI-kcaU{3vH2ehrX;6;Dun3A2Fuf4RhLH@IhF>2 z!F1P4GL()eMT){3j@vph?w;q={C)g^@|6O?lX<%b;YtFl(t^C-e1$gb;&TzCTCM)a zn};9B7T)6b^uDn#*<WaY)S+S?rD<LQ85cHqiJv~>2Pl{P*&D*kVP>A_on#i6e5r!Z zb=k>Ll|>E;3ty+9Q06cwF!~0Rv$TEaohy}{3^8y0!p4-FgS{;HZD<;41zM=(8K5Q< zFe3JPj)cCl2^%(!)s>m^4+m>(yj{^gBc<S>6ejVG6*ccD-tTjKs$f<4jv)m;tW0o8 zX?8&jMjf^nEzI5=*39tjYa+I9Ok8Vf@FBX9wOIPId8Ll<?E})OmNwj%(Mx6sX%*r_ zrs+$H68Mn}c33hv7g4~|@=|mZtBcMSh>h{^0~p78e&E%a;rl}1LNyP#KTi-$JGk@m zZgnV;9$v>^s%w2EH(zdGX7j8Jcfx4p1TDgT3ODE)?Kw30+UV;Wd+-FvP~m#96I;Ix zh`Bq0y}vrywxd<;7f=^o7qdqlVM{$hKkgj%RCd!DQ1QnzzdQ41(~na#iAclK3aJr~ z*D=xXQW72e0Q#e7`S*YPpI8Xh*UatvZ1$1Ef8NOZS1h>M8Jjt4I5?aB)hPatH;++& zGf-K=`p|by@<FC2>td%Sj+CbYMHH2w<E|2nH<Z*y&MSAp-h%FpH$+Z$-_X|4X=&D3 zv-7L>@vyf&ZKpbqU${4O*jVkl4_MBvdjqW6Pq|#kg(ni63}@YD9q#+&9A;g*&=dIH z9ISnL*b+eikKZRc>^0g0I{=&X-0IcBNB8uc4hp*xgG0F8k-_dh3!G%)#z*o@KFsRj z3LIX3=j_kI@cf3MaI^ERN5k`-+9n6tb5$<Ng7*o#d-8Mn4exOO?b#Ka`&&s*i>H4e z8$-igV$T>b2ADq5Q*)08XgAFjU*ILotKe1`a2lvTsiW4`Ft7lUChAjp&lIRX{Z&N| z1E@aAQ*lo%Xbq$;nkKTR-WFV-0SqmS?p$5LHV3rsc0ztmPu({+2@#eEmWXCmV!j3R z35%rT@;7K|y4!0_LPYf~s+zvalKc_Jua5AfbECd3z!D~NWx!1wELPNI@MLr5p8oFZ z<3q^1RI`}*<D$fDnIq(0b~FpGuFR!*RICXZcHgxv$D+U6&HaAWUGwG7ux{KLW?mV6 zmvv`P;Al)vKP^f|V`WX<!^6sDqPTha{xhY3_UgjM7fn^{HX=erB!Y|Q`*+0itDA7C zXD|nGJvM$(w_@ktv~pTpR-HdHEk;rm6%#Uxjff<8=NKg|c+y4=#@|VQCxT>$>QEb( zWT+F`a_K1|m^CDqk654_>z>()2j0pOvnf!=6=zOn+6pixG}I2FOpIGlK<3h{*F8vj zI6-mug&%pMEV)H*0fFVIx*tE$ZO&e^Z*Fhv!Tp%K_G$KZpwk&9xRUtxL+uw!uB=?9 z7G6M~kE*K=Pw(v1%;sjz?$lFMEbA`SJ@@8t2e<t7PZ!E{jbAvB!v#h1+dy~(Tikf& zq_~l%kj9Gr25zr0Dm>qW@QCn3J)d~q^G&3QFBTK_rUM$RL)8lW4N2EIaE}V37{c#6 z(e_cGP?GTK>mjo(Yz;XDX_^F>na5QelkH}<-b|yw#oIu#0=KpUF|qoEXyQ|91V<XI z>zSx#Q|kk_>K25)ZPO~9B0Q`i=W8eG5U<rBZy<Yt$haa|bD~=W3Q0LWNStL{d71+_ z3#Dn@QzU66vs%X~nURYtM(rpup}|P9#1(|vZ&e<)<xuOMBcw9w?e%)`V$5E|WlAU} zLPn&(x}B@V@%ASt;tp-&?_+umwJ;4#yxtBPR+7Ae%~!Lvr;E@Fb|o{8%U=P$jg~4J z#`cr43e=Wwst8}@to@_L=WZiZFH)VM9gv*llO{&NDp95V0$wU~7_&J_pD3&GOUaZ3 z(iBW@+v-UvG#;YUN0KXDd)c22VW$t}2FWjA64{+(Mz~C;M4TTKMO32ZJQ=E2Tf3~> zpKFEMq=msQ3TMbtfcsfbQb7vBXU<AAjOO9-0YQ~-m-(|lq9f5bYcNmHl(|U9?O1Oo zsjZ<(YCvnSO<HpgTJO|crK9w5U|M!)&l!%kGp=za&7P|;PvY}KZD{EG4?X7TQ4HRi zP9n@sBE+P9%gn$o=+!#G6w(^S^~8&9F4P1MhVKRKHEqUxYDMA<M9_FP%~j{>U>(xh z!!y6bwqU@9uI@X#TJui`%j@+uvdQbW`K|(9m58y;5Y61ejA%_ZXds^fQLU9<M?%ro zdt3RjefPTk!Em5YvD3OTY>?={Ec9*ZzSN08Mc(n%Qbm36h#gz`GTt{=)+d}*)09zt zZLC%Q)>z(JIiy^@-{5UVp(J90!uq5XVvcD^BuC?(hX;4JqyqC$0Fpfr;&+$68KZSJ zyn8eRhC2||3Q@a_=*R1Q4gY-QfLl^Xpvu0R*MMhK41`pS^+*jeKvvRs7$K*yZH7xG zwfjP@j7!p0BD)1sR7kHVzr}e>tyqlP50!{(snni8C?yuwfUxU2CcpY-kWQE#^>EZr zDwSEJPD3rw3ojNV^^p=cLtUJN<44dxm>I`dz4VSTiL)#vL%gjT7|bb%!{`)EX8VBB zMzbJgybgWBU9&z*ZbH_{&PXS7b;U6(eqtKhIE>u<1l4nzp&R4`02N^{9!F(rKeO$W zSw8V7OLTTS(azc><J=^kEGM4CzcK&r19kuIJSdy|r8VkHIdPAKD(vHomk8W-IVVHm z&&xdag;+$R;sa!M)a4Poy%tLMfvHM6jN@X>-iK*o@3$d~$Vj}Rqj-ECIx!Hc<`u?H z+Ue9Fx*o+_Y8#%2$~;><SJM>LnmFbf68noGT)YjdJ3^T$qgc;03jGNbk;xq<UP>E1 zhXs?RlOC=}9`Oa{fQqelAOfYr#nb!68KI&mh->~0NQlWBq2*$=7q!s@Y-xYhpRavY z9pUF8(r1;s$k9CK-00g37WRAAcAZUV4%@N4BmnPZ`%_$YWj>yAl$R^eg@F8`h81Ho z7P1ttt=7O8RV^2guBMC~h;0E?^pBV6(|icF3&wd%UAD{ur_$}XAw6*y)*39jnN~*a zLZ{lXWwAnYzzk)yJNCxV#nI`qZurI45g%?>TA{$$Og64xTJ$DG;brQK9<#TAn8S6u zOaX%9-63cD_d*2cJ3i*;_~?s-nJ&~8H5#e5xPD;VMTL^*${QZXTw5iz#b0uV4~%{V zn|b0&;S}o-r5}G*#Qz=w{5LrGBh$rU^55Y2EOeoNX1f0x94I)t3LCjtnW%a>nn{?s ze)jtR3L0Zl&h3$fP(!EYp^I0w1x`Ken$WA<tJsFV5S4^r&yl|YaWLAFkFk%@YnjJ% zu?2Vn=_g;0)5B(Cxnm^4@j7gBU1FKTzrH=bAbi2?Rl<TFyNVDT-QOt)klM1je@%Qd zowo>-QQD5RT$Y|lg;Z_N!C^#_$P%nx<<W7?9>0hzW5nUp-?C;SPs~m`Oz{!`7Rt-X z4a2{<k)&Z>fIP#A_<e!aHY|i`bdvT>PdaVWvjB0K<uU!3)@0QQ^EpH(nS2tsdPKFc zCH*or|Ila)`6-KlT24Dgl(5cb!0fl_^yt^^5UYI%DHNArCrXx-FKon78Y4lx_af@P z@ewkWNz@NQ<~%g%i}1VMQ!u3@O;&2;iF|lon|l|!Q2L(Hvqc7ARLjHZ`#MQNIco>8 z9HyRXKg@>UGBBqz+_cA&p>QV)F!WihOqeU807kOyR8w|^jxn#RJVLyr(`}nQ5mQ6E zTmnT)sBO|O{wP2aKUT_dtQ(iC0N8XigbVdnzO~y)&2#3zTL{r}6pF1f`B4Bm@u!vS zQz!0%Hk%&<)*R6!VY%MU*z64AJLxfer5<cMzuJ0^dE;#y+p`=cHw;+MT(}X9lZRH^ zfpN?wBfbQZ#n;}O0dp8){U)D9PL3a|D`@@J3EhJFOI$z5ZO|j0W2<JzXXJ4^a3^de z&QRsrWRK!X^_pex@JjevW{=LZ*b~PKLZ8Mzs1wEk?UG0%zvKz;hQCwe6)5*^4rqGs zZ8zYLaP{xF`zIoY3QS0uK5H-9NT02Qe+ySX5h?FxYx}>VvRHjX9Y+oIT^^Ej3xEm$ zpjU}m1uAB)609bsFAA2WpjL=h+<P!*lZ#NWV3N}xhuC<Xf;<89e|;#a*$+Y35@}oa zF_+xh3zk}1KWntO^y|LN@{{jQ3ix<=A^5U1gWHSAkJn4(J7gXu7cy~Z+q}YSehc=U zVTIS|7VUfOif{jc4*Rd-D?ey&=mk{R!2HgAO?@FlLwkQ6!nPfLHZbwAR1<puwpyds zOeMS6&{$3W+M4&=&Lv~|-N|B3kMW8l&dRESR*SXyX->;`JFnF2jrDtW?Pk6CN7}-M zA2ypDd{edupyaW}O4I`#58Q&ke|pylT8gmEtyNt>>Soeh9toUi>3CRcMW%<QeZPdC zQP2JU(n+EgDF_zYQk7ZgQ%zodJdPWZ%qZKr&sG>wKH_Z61*Xo^uZe)GV8{*}6*->y zYp{`7lOp9HWnqJSTQ6E0C+#}Jm5xrf2=a4!&HZk+_2)d^!YnscC{2gFoFO@IY^7zN z6&6i2%e1s!>BE%77pD|^P>sv1Xm`$0JDo<ouDIskW);nNq@hqY3wFPkxKI2+-6~#Y zCZ9^{E;DBAcB$3Y`ktV`8>}l!jM!Yc=VcvQLoXH@v$ZpMy&wTRIKp8|bqq(7DQZF< z4V`a^bJmdSys+)Yr#?PyyDz<SkVeyW_ZSSIL+vGv_)_)0#d|Vi)xK6*-=LL4YSciT zHbJ<0ziHfu-`)(yR2JQG<9?9+=w63YJc2JTRw>WmQ)>?Ei?wa5E-|Xn^39-Fu=WkX zDB7mWTD*eKu}%*xH$tCcHC3Fe3vUmttYh__aA&36ZVTn9W80gVcEpGcCDw%_JG0gt zMgWGXy+()3O2iS)zAPmnwefQo*=pXQeDQTAE(yK-dSj)@?|;%8C;Em=D|YovT$}g? zxd<Yp5%n6gOYs6-6MxrtJ;$xQA=5+Rj$_#<T}={8k!<uif_Ao$rWXSL>y%3leKE%y z2aaeX#$J!^zObYroqE2>1BF|Ak<5P7>Y0Z-6m;mC{A~;`#PByEkB|Yu45cOR_$%0T zVir&q5ziik!Vaw#9c9lNr^N1F!U$^2x8Nh*UY2!}%-lSt6fMNs_$L)$+(#gaZ;6QU zT^>$>H%SuCD(CC0`<o;Jfsdo#d&S6BzRJ4uldq87m@}1<%KS9VNH@LRGpoxZ#YrAb zHBQtccR<oeHWgvkVj|Z{?W}wfluAt;W&iwv<dWN-a&(q?B`MvMV^pV)j%=k)_JNjs z#qQ?9P)mxPIEl?9aeriNSA=W@hk0d+X%u>IV~~$5gFNXCJ1P3UCLE1y1uEmLCEc`g zFQpDWaYYiDJART@m%KTNdF_&aEhMjGB6Y~m_v~<v-=XjDTve{A5+6`mQckVeOM$8* zq1Cpb<OLKkuzu0ceh$w5c0Kd)hduhc)%mAA>R#ZO>H74LVV^dM_22A~qR}5-(O%KP z!S=IhY+>f9Vf8udV{2sbm!nKkl~F)ZLVdTlSPkS}2L4uSTv-5^`<ZvKS5HJ#PL&eg zdlYHa)f^-OQL56vI^4G;UZ^ymr{vT>B+BSyq${;Ua5aT_y}qUtMIUW-uz8#A(|yTv zDF4Iv;|i(A2{)<$4q^>S=!Yh}m=h)laq6NWBt<3BFyez}2m`Y#+Cddf>ak{1B-go* zdo}ZTp1x}pG{_i>sQ6jtc^uPS$%j8nZbp9E@CHm4k$Rm?=W;rO(`B@pb1UU}DxJm9 zjqNss&_eC1TWIVY@O#y{1_fzyPVGV~$A#uScj=vC{@LXB6tOuvr^b^P81w!XJeQw0 zeisWRx=Y8ul)rMes8xG6Nr_2WgnN1RHXe>fd3J6(`u1f#RNoX!*$64;+bhNz*lWTA zJpd|r)G~L?0ytfAq}z(ys^y>)Re#-AuA79*cfi$-Q`izQYzjLm;?B+ll5npgE!4xc zhYI0!EtmHX#D^Bb27Q#ON&x!>-%=2jdz;G?aFL$KhP*U1!fqVPMxkPnl9dN22}as0 z<LK2QzDY&`B;n4X%j%cqZK69}P&F*$ur7O}&#;BXjp2UkcoE9mV5n->&U(i{>y-v^ zOiLxG-eT_ie6fPUB&P#HCH}sO-a`w<nBnOxiWftHqPB~dyppSK36gmOu4Ggrl8q-< zC0+7Okf9H-NqUK{)l$BW2fJkt6Co=oobO<UAv9Ms6St8#fFJot1c>lcWIZ#xi>Z@4 zk=qIu6@;bS`pveb#o9mvSy{OP7o4JIg11e}R~wS_7Ccg9m|JL}RZ{#V`*qslj`b}| zwSX?7^I2y+U9?RC^irfB<YZn1dx)gqExn9i2wA~s3(HxvBp~#VGY|u_S0-zK2DNUM zxc#Z}R%|wv^j)ewpDL0~%!9BX<lf<kG`}7b>~SmszXyJGFpqe?#a=Yv&sNFbN$^j4 z(1Uq0BYajFZ9cpH|Jo^4{+yt2u=}G|`aglA>YDQBP^ey5i5wM`7-#|yr7)Fbt3gqL zqR{j=7F0)H=h?euaB1Z^)ESE(!59YD#f;p$5KmhQPZ+T+e!{JkjGs$}lbWVBEo!?S z<oQ2dub_G$@y9SB^RcZFgNPVmM={}h5!gh-3j3JR`#8x#vrr*ajN3?T=a_e3)m$3O ze;?AEj=9`c!ZwY{*-5C}W@f0V#M-5=ScN+FF-OIkbK_`t4+OQ2DISZHp<8GKr5lxT z1yXQ;?Sxu!x*kM5*fUB((ez^xOZD&36rZ!UECF0|qM}o4_BmMBK0{1t`AJIV&$Z$< zIujQa>Y0^X!=JL9!y}cInHlxXOUDT#RLxPbBh2#>Y2FMKMDd5_i=#|+WT81nUTHFY zvS~CSSg`p3^}XQ;>PV~5Ar~eWGLqcw2f$(WT|=l!Y>5M%4Oold36fO${-hEaY<*eU zMzunVY?tZUy6b#X)<jb@%}hdVE2mkCZ8ig@aQR3%CddwW=tF>I$rd&?W;+0ov(3=J zW#U5f!%jQob0-JYdFQI%o4KQ<r>U#0ud%bV5DhmLHhsDB5FgliYb{|YKUO33LA>JC zms@D`E5%;oR8(GJ0=bc6G=<skx*lb*bG)!}X>-3xo;3Y4sjW>PKO%+*zxys}F;i8F zf(R!7@s+ML;>#m0LW9|xV`>*f+$K4$F65cusgy<Ob22wbfMnm@sLjcoh>#GM5xIsa zf>}cu@CBVhF6H*}OWw)K72I=csjgz3zb^w(Z+6hf0Kj!kK;;0`67ZJdFy|@rP3#Pw z;hlpSx~DeW!GI49&$SH44DFTe5D)KdgK)X84^I+Lxp;(i>$K;+41*?SBP`uc<@(l} zBBw;(s?AhmUtUb^-<gHYRQdd9>OFpRKcwZK`Cxz9aOIeeB78;^7f2w;J5l?|A!#9U zr@|yeK;3H<dgERQ%@LlI3pnbLdzSeI(=JKZs_>184Xm(LY*ToQ(tG5f5N~h)B{n>I zlOP`JMSL^GSh;Ied%Xha7}2OVA$x{Q-sVT;!ug-I{J-<)pA0j(lv7{$bUcQi_56RG ztNCP@g&C=etC{0}k~24jG3!1>M7~0+*@5}?i<&KB`_8DEsvU7eVB!2x1l@i_5-Z|S zx#JeMZHOnOoq<_7lQ5&nEUzph`NK<+uNcv|u(+^L>UK|p>0sZx-sh>8#40wMedNbG zb)YCVuzO<~0MjMq>01y^ych@+$dJ9n{^vEc4&|OoE2>bnjk>0t9>>=JJeMm;Px+q+ zDgNcoW7ZbqLTuz?3vQOUqaeCSXTJszqP|tC)tqM9^c`I?_04@avj<L#*q9<c*9HHA zI_*V&NaAY!Q4j?ogm4}U@yngz4_E#7^Z4gUy`B!uDt)F6>7SV_`M<epWixYIGZWYU z8l!4W7+)O=H-TYqU9D~>TpsBvPWdxlyV2NN*BuFD9{1VSdy@L>BBxALF(q5FhJ9)0 zRo02G)i&Bk_;nDiV42{vUxF6wdYO{RVWC56XlPu6?0P6|!G=sOXWZyEKVB{t?o(XJ zc!~vHJT5(c9CCfQOnzi3Onp4xE`?j7{JJOses2D5Uvf!#=V9MqMG$aV5|DQpIdvH^ zbxCs<NB<lsT-$mac1OaoKPM2eC=j(!+kQNJhr)DTYP|3xe0WOq*Ob^P2K1Zq_=g75 z_OJE3%R2(&{eZ~&59G#o9s-b$-IA_5nvg!@MVp=7fDJ&XKE~~b0$>xdngi{*DV_1$ z+}Pa-pWXa>)cMYN4<rxMH@oX6tY$N@{J1E4jOH!h8RuO|ddEg+r0b`YzFS>g%FpB= z=rAfm%wE4|aHmn!wm~t!HoO?0saX<$9wkxk>ABGvJSJ*W-nTD&;Xu<FZKc0-@!rLE z?$^@N)O@}%0VrU>#H+#StfcqmRpm&Qj9!c(>q}_wzPhp`okxd+56MiwdFcxx2^`R* z9hm1h{dO>^637zRE@^05S3`#!KK$K}Co?vk+ay0JL6K2u2~8SSOo8>h2WrrcZ^Q4c z3u5)z#~W@Xw$o3dNlaoVVp)?BDJFtyN77AU_+k=^(EC?+|3k0{k{q3dizjK;a<6G+ z1^<YtLsZU};9H)4lKhMM?cIFMfGtl@zQODnLqcapM3^XtuDKjc=;21~G7X-yFRQ{C zS0fom$BG8T@sJQ1+LaCccB!q0PgK#YY8LK74@O+MR#FdLgr<b-kVG=H?q<%H-87ik za=}3SbDIb6L*r6B_KLIb{%1Ozn9`Om?I8U`fl6xac8T0p;;>LwxV@5F7abYsrsE-D zHb0GtU74!aal#R-D$(q~;c3RU$7G|F<-FWkttLa%FZu!Ox2%nY_hiP~2|~xRw}u;A z$2C1=>xj`H`l_B>Dk7l|#;2@b8f;JIal?*ND`WvIY2yoCwllk>!8$rzgLOu2^H|SF z&>Do;79OcMiA)oA-trHSzn?eZvsrizQ}uosb23lgq=QFKTMOT)9J!malmxZ_ujv-j z|N0td6=2@84^B@;S?%N!2W}i_gv12duroe5El{Wul`oPC#0U{6>tsx);!u(U@}sR_ zq+|v&Q5u(hA1H(dtv&8oU54(!dA-WI6>bh_)eYS=BWd;~E)1B&nb;j#lz2!Urz(Qt z(0q`k01#$^8JT5P(fF0?k^NR7Sn#lZ8cGCnDtmiC@z=5?B{>J<^TxFzAv!Ly{~%xn zdw1OeEjsw(Oz;g66UsQsE~8<REfnS(iy7qH&AMA8p#>Jww9x`B8QhLb*f`(u&rzTd z4aTM^dAJfXE-t`Cm6(q`XG54sMMd)r=pAh`bQm&aG%L2ET=;gQaq4P~RI*H?dVnm= zp&|)0T({YXvv_gH_CaX@v>e9-lcY+@Wd~7&#Tp~k#t!ST`3}3xJ`;s2UrE^sXBz|d zr|d&EfZK*H4O_PIkn$}Q=Tmm}H?Jja<x^1L2&U;OR|{+f+I#A3=0*bvG87y*adodD zC4TPcZkeJ&BwTu@)+0E@fbey_r0{l1E0OT5XGIYm2XVPr{BEjpyr3L`^byX1Oa|+N zYu3z5;#H55&EZj*)bHB_!9<(1z06ksi|!QNhMstvAu+m!Y_<&w4k}sm)S_gv@(8ev z6&HhxYMcXA2W=g(#vpaJjzn)}v*-H3SasUu<WYX&7T28lCcA7Cx)hr!JD1rxW_jI- z-f({l_eZf|<KF3<I>Qj+IX{nV%~EB8`%2V8AH&CJnq=t!!GQ4Z!9OcKn||7OR!e)# zap|_qGR)<hzAi*m$5;;dRr6>g5x~H!Sw5x=MUos&5`+*Q3)AQpJF~qIBEG2AY-^`1 zIc0zD64~s*QG3Q~*Vvcq)Y_-ht-Vp-1g~!ciZxT3h|<Fz%!EL-S8mH_sq75$s95i- zroP-^PqELJPg(P7kq(dzD7eAzmfG)H&%c@Qjry6bTk4GAAfYVPSSU?U9G8!-cuaI5 zenmFgLQE-M?2VSMNsC>HDtt!>9QZXtktP%*VoUKzbWjQqBdV8xn4v8qQMFb&TY5A{ zeJ?2OjZ3#V)y0{Juih5-(yJr6+vr5(EdTQ>@6Gyex5LRwUqMRGcmyin%Aa9gg8L-C z-=$v$y{2ZCRQZ1nt9mDN=g+dZ$`v!rq$wG}pl*ZY7E9p@tTFJdl%)H{myhpF=Wl7! zW^vji{$SPN%h(apCS^=H95)ptk*Q*$$^(u;MORm|7{Y|E?17TK)f6?o|1zg+Ly62J zCqdyDwlIfmxTZ+Bh|z9B3woGQ{lK;-nLs%DWs8jr_g6^w+!xkUEMetduV=g>Qn9(c zeaDPqYG+lIq3m@b)Kr_wD$tg8*NW}dgJ5kh<4WY&aDdH4lLj25neMjd4Mpn>u7GU> zUX^pN?j=(3LDQQ^{ZaM~1`$*#8+3KO=2lg#Fy|(o+!;Q;93dBdgDB7}7myzza2C4- zn{@L#P`$qCj-OQ%FYY|_FXSzp2mtVCFH-(cj;1T;2EW!N8s|@TN`HWk$^KUA580Sl zGV=+=HuldwHV=1W7G7!>G({|o+}PMcgzQ>G{NHJ?Euz|0)rp1ZkP&&?$*SL0tmDoX zCzD<*z*UHp&5%a4O6b{zQoOsgjAArS>`El*1+WC$Xrew>m^V>!z_EcbS*zI~;nGfY zplhR6Ypoy(XG0Bcu}U+ptY$Wz{5<w|+OD=aJn)BT60}yJkxbJLDpfO3mEuqVLRztm zphOEVhcWP)kGaI3d*t`M<nVi(H3lfDZhL*<bMs``g#V?sL$R0qDb-+hNX#8vS|OLG zbIiDjF#QFux8B$ZWz)-(=ImBMX;XCd#=6Znfjz{&uu!zYE!uwgiD$ZbH@j8_UGS6> z?7sQ~nh$zYCx?7(yVCUXPA;LavZUidyK6)J@`{u9L1wS|o|B!O`%V9lblZT-wKk|$ z_Qy$Xybg>|svxSZFnvX-7a&D_mc3%o2Zc>~+c&)>ab20y?f?pU`@F9zi52qtKnV>_ z33DflIT@)@9;cBwosD+t^QsPLsW1t&7@Br$062W@jIzjzlHLl>SCi<S_J+&A3ir-R z-}g)^XE&E~6V+$deFA#-wcPw~{p<n1P|G!}Hr)*DV&DOCCmOU%=Y!Ai%g5%eVx{>Q z4~3vHQqz@3up3k{%4FLZTk6u)cFOJ;*Ep)>(|TCuTrg5fDuraEd@;Y-JI9tiGS(Tr zw>h~y`#7X-Lyp8$0EXhN!d&;1pgf@uJVl0RtIi^I%%3m4IwLB<oS)>=pqh_IhJ3Lt zs*?gzg9r&@4!K3h0-{=+@DiQE?gkU2UgYgy{!JQI*KTKd%3O3ocC2may%`Y&Uky=7 zprWH^oJSHs?YWW#6n>DAv58P_F^f==R+Dyk!#I9N*QU9XXGQbI*dKl5Swr*o05AAd z;&jxRUf_yla*7|bK!Hr1>?sACc_UxeZTE;&M`p)(qu)r|$)?}nX{v`gl6mZYDF#Kb zM0Vub{Cz|a&tA=B8~N1+;B&6BhgX`d?^D=++NypDSfIfl-0c))(+`taSw5<`Zb$Sp zQvsM}MT&J)xkskPCe58@wqk&1yrWMI6e84%-!U3~AnNWQX-i@t;l&YiGbrKM)AQXi zDb5#eWhzK^d3*`+9!H$+2#y8^1_{r6lm-PSMfYkTtE)3w;$t>HCszfBRRt%dX5a9I zPbnRhp%<m2xyuv&!GY4YP}{3A+xz18HN>XWzWc=uTKAqbg#<d)FCo>V;e(m$6@_0= zV}|N^yF3LmJy7Vjr?h7)H=kHnBN8gLbSmS?8Ldl!TKmh&CW4w~MS)U1CQ1cnpbo4T z%ib%=NJM2J{bAfR$>e&UUiZan?QHw1l=h6}VdgO9FPqDD;altAat-0}ng%Cl6Hheb zh>lNa>#~qMVINaX88_DE9dhA*uq|JostQkuOk?yEGknuANQ|@{3Jd{czN=~r*B!jL zuG!@yNUrT0UA&OBtXhHiAr>~HrY_9S56PdRgB1Rda<?i>;IJgZ{(XTCFc|ja2Hm}K z(v@-(AovCV{x-K2xv;Bx-pD6nQ(|eS0f!Biq+0AE?$jjS-rZff*AY7^rpGTjs4X>y zFE!?GCk|&muUmT`)fD5-w9`~t6N)HSSA{`+Pk4ymqXXhhVk>pW=Q#byv<s1b4Xye@ zg#5D-^Mz@4Ucr**4YkrgR_(`^ydTMV&=m&2t!)0(z_oti{Lw1#y~kp?dWo*glJavB zrZpRqaNKgXAbZ9k-~dA&yEqBbJ>z{bD!m|iywz6;*DH-AJ<uq*l2#8YNY#Py4ujG} z4zU}-J>K@U$ZPsucmgrgG2A{m&nQiMi(e+(GxP2XkQHs}mvsv~eDZO-$kq3&e3LOT zks29AZW~Shqf`|dKx<20DG@%|hN+jPjAJ-;SKlQ;AkiiZ7i>uc)~rx?%7GHu3mq^z z;4XDzj3vM3#}ibKCGrra0U7Y{h4LrxH_xCww@x;&&<Ge+bsAQ6TK@6*T9iYpz1=#; znu{7iu(kRXjvcZjLtJs{&RU`RSAHR#MH2i`F3_sNOzHjd``1aK1%=NVT@bq@yz}oF z<SY9#R1$0$J4C;7(SfM4uNW#wX^CNDmQW0ANJ>pYqGP1s{~urP7^GR$bPJYkv&-tT zZQHiGjHhhdwr$(C?dr0-Y)!p4X6C*(V!nykvCsZ<{_Kd%lV{~xE3G3G7+vPE-i!1g zC8h450E-8=vqVn^A#2rQXPlCm3k$z$C8>B>k>!dXpe!Z$4L~4y1m(|TTx49EK8Y7# zOU&<s%80GFKg(4Q$*UvKL=QXYw5OXR54(hl^-3RDD2RO{qwJ1g)=j)$LAvB78(;hK zk=-k|p{x{5QS6Gmc0_D<#O~XX_13`XtwRJ`7ys-?MsLCF?uvT0Wpgp?46<YYYKJ5Y zV^I5R_``|g+WXlFBAA~q6sAgb$*sZ|R*w0Nrg{ygdd;VNrCR4~9b5?IN(E=Nnl0}J znYIz(DbN(<c$ucI2Jr76&?WUh;0#`9WY59(@BKvW6&fkYbuLqp>7<%G{@o4EX~$ds zcFwV}H<t<DufMLt|F=%biFy{&Z?9MMY11J;)-?F(_W%U)jzs%cyF3VTY*O5UiXh*i z2fpqX^Y1o?kL=P)Cd$lcm>O)&Cr5{C%Qv34raT(5&P-7i%cIRjHyE{dq4w~RyW!ZV zpK9&QqDXzQ;+UyA=u~#QnUecNUg=&~g*f8jN}@*Z-84zig)*idzw!4M*v#F$2g5%$ z$CSUyeGDMmp?h*9P_v2^hur40qhq74^B#PV0o<^w9hpz}ykb9SLwT*RG`9+MA^pT* z$9j--t-o|_Or-f|@DLfc#m0omxpVw<D?4cVPhG`qm7k4+*qmmSzalqZTdyF^1-=al z(*Xq2ksI;atulf5r#v`EbdOP+b}6ABRzEmvHeY325B92|Dp>1Jb?{4I(&zz}7uHTp zMhZXN=m!+uJ#n>(J*>W5d2kQiMah!Zse2&?%0zdvRvDQlY_myi@Rt(TEv!e{zr|}n zFrT|~W&vB9_50N4F0CB+?DPSJ%yX>JpeYPMaP=QSaK~ht?!M?-2*M-m8*2~nP-kbQ z*bdoB@%Dady6tUrVw1QIeimwir9LCsi>VRG7l_dwwtXL~R{yF6K1pVNcXBSPkuP|c z+Dl{G3_BJB`<%YCKR&~-G|DkHfhEJM0`_{zc;VuHAj$@YV3etvy1$*&`Fl!?g@Eh# zLni=bkLri6XFEkNm}oa(p~vRl`D$C`pXE+66I$DA{SnfrTtlMu#d5{#mCTh>;857S zV}6CUV!Alog{DR)ysi<m(;NTxarOPbB%%Ke#r&Tj4bp*swBQe5jQ=C8`5&pN%BF^n zcK`QifM69}$3-<H-Uw4^wIJXFETcS0BEKsj%NNRG1PdXkzt|KEiu-JXiAF)lYf2+2 z={-&*y`_txNE-_lrT96oiuf~nl}kx*^HbZ)maelo+n%*MU-zTCKsEb57+kg*FEH%z zNpM~^dz6;M$HR`&LjhrSA~X>iO!2K{cA1oEX$*=ibyY+Md^)wY+l%%c^AR0#@17JJ zPuZn_t^>IJyo0u$)!2ayFx#4%nyPzK3rAx|=V<!fl~uMw>9^oj>=&G-4hZ9t_N6r) z0IS#2DWOR6$|{3y4IWx0y?CtVo;?ZFXS1N|=CzI6CcY0N+E^e3&hbRF*$(XNnVaDz z;6M+l#VQ%p;6A$S$T>rg9;pdT39-9|z9;tYm^&X-pqt>}t#`%pMKbx~K`C(NM28^v z!@i(A(&U73%V!%Wo@#~8UfoCm#e(-IVa6Y%uS~bG=<bz!RXYkItL<A?51+}%&ruxm zRY*fTr_Vogh^M+RgOpGEgfQc!90Sk2c)+=K&Iu)B5iHs9W6Ab&+25p{;6fU<ET_#M zo&F3s1YC5mVbPMDIb^u5KWxZD3O{R^y_#t3twsPIh4mp|N=$GlD6Ak1J8LoSJ?_`6 zekE#fl@6u4SQ-DC&vC0!LnmK{>Lh;cZtaz;5}$~v9-x=Dh6VG)Ei&c~=MM%&FsXp9 z#DhpdWC0_2Hjua!6U4Xx1_c17%cf~YVbb_Y@EzXRE^ecEII@s<IMw(Att9cqYACT* zO|SMV<^lJ#vtq>j<0R>cA>zd>Iajz4E$Ce$o|~kiu~d&lnfH@AD)pMt;UNHkt#wdE zts(jbcH4C>zEf0)MpstFM6IeI`@*@T#HsrUJ~I1V=<+8>i_3q~2m=$Ee4L+jTwRL4 zTqp(y9BrG5&O$U|=3oETws6YiKF;p42^5uT`H<F~Yu1P}n|I)YElO_)y}eb@8@f({ zY`-ZT=-C+>fhqzV-a>XE8@3zk*`>Hr%1I}GzTMGP(icvsUcZW(oIEvkW!2zWR0EAE z{y5eI4*OR@I<d2>G=;k>wd~tJwGjBW+PrSB-fK}+s@ZPJn=CZWP1KL^6ONF*q1t-Z zd3~R$7ySQ#rvDvv|2rQ4LlsX*^+s6x0ZT=G;AP7H2{cu<u(7u`Rsa9i`2f@XXl(Rc zAoyG$e0~HxnNwX;DBM4~8~AAkF$j#4kE9=2k5BGYmrC!#R?$*H+)xo-URa#GkAsn% zhLIw97$Uj})%Y0A9}|UJ$(h+@`P#Wzd8y@DN-C;3dfM@+dBmA1+A&FZc^b(X3EGA~ zCVydO=xL?ooF~CDLy0R>lQmMt2Kxs3CdTqa));gmcoy&PA`K$2(6H0|_`re12*EPo zN!R^&ycu%+{Z*~FK@Y?T1H=9CB^vy}!Lc~}ND)PVK`B5nHMrR|&=LPvyX(L2<bU7R zfA~`5T?nW%KiP}*hc89?Ki`(EnYF3Y|C7L?Rc(}i2q`|cC>jYgb3#(p^kKzwqyomY z7*Zg`#cFjyS}2uK1X-q<!uE}s>(*MEzJCekYpZA03YfW!dmmk2sI%s8+g;Tq#^kO@ z+fQ~*ay(}o_5Mvy`ue=W_o1sOVGRhOK+}`};H7aQsFLbvFsZ3@MlB;e*^5?W!>h;l zQbJ;t=IZnIS_BHtI$HW}j{R@@D4RYzbSZJC3j`XJYB@u8pJ@Dp|7|PPHNlsvX*5Qw zRVL|Exfr;*BGN3<*UU-zmj7G&ME7@NbIsjZ+2WP<sN`Nz>#VnOS2bQGXKFah2=U&% zId{MhfcEX(K}lO<*%r%xvgzM$hI#MVg$q+Tmz!?!TFuXNo4y0bXru^7@4YNez6b_; zli76p(D>^V3qCT(!c!<nT!_4Ky1C682P|S8?JWLS_Ns4U%!^&6rrNWg1QLk8%g}3B zlFW5cv}f$EU3{)2lHwVFU@a<I6QzH_qj1Yxa@)L^#8MncTWIJkj+cR~@#z~=YhV5{ zoN2RiC&Olxi@$WO3I7bdZRQb4`^>D^O=aK0E<JPvY%^>5n)5DUkY}=C*jn=2c9Xe! z(^<3XM;q8lYIBMuDmKa>XQ8orOU?#1qQ9Mw!#59rv^z^1ED33dq1{Rr5BG}j<bqk7 ztB;QAd$^Tl)*ZF>%sF}qZZ16QnBOonhRWhf|MhgjsIvXM6)IQ@@3O7y5jJ71Qcpn~ zxY5$n(*BKo0%9@h(YDv*HON?v`b^JqpV3o*S_XseCbdyhU%CRKjC_?8+13W?g+4%1 zxK0Va<1u+-pB{UNM4+;wo05FTqRtp4a4=?x%31hJryp@H)feJcr928CqZj}KT{GiQ z0x9JNdP3QoXj&4&azn8{<e$k;oWd`{6Vj0O`Rkq}JiD5|qh7}6nDcD{C5u<Y7cY0V z`vthXcxWrqF?`o7cg_ex{WUAF*OUx3VwxoZk3MdhC9qwhnr0+^kn|4EjA8bd&hUH0 z8Q5za{LTosUq<wSZgPm|zix4Ylkk}Gm!g%T2(^E@glxmhQ2V~ddV?&zAI9x3m~VrJ zrmBbS40pAZ#kEdfoK1H$#<*?+rd=fd)H2hL2wD~>If_jSMAdvasVbmaZ^%rNr1o5s ze^2bGs#ck<#+2YDX}+RN_#_U;C#oA?aPgCI)#?LFV5XG&z7dMIq#;$MhC!IKKdu#R zUDG5(EqHf>bxPpcd;}oXV?3;+Eas^2@rY?}R9Fw|U+EeA@V|~@V`P43{qYU%xrYnn zCvx#B(_hCudda_YdDQ<;HvR7`@PFoqTH>pq?;o~^&rfy3`ak9eCqrW^6$e9OQ&DSE z8&g{+VLRKO2EqT!t4vl|S3*@p;$`0q0;~lzOjcke^!d>kp(w&>R{<dss`AN&NMmKm zD2)d#$luc6fKygC+$_`I5>z!@a$~2YK_#ec_iVRbpE-JX9FJbp?*dKzjgE4Wkw}9R zN@ff`BZLUVf-%x?lP8-RQ(&MrMz}}Gfi@EqL(Q2q7uFFH5=tP7W1$(;Gr0*Fb;b57 zANXZvK8=O3TXopj)l_II8xh0=uFLG&oIvEoe%go_#Wd(7Mt``x1=$>Tbnb71xg24W zcHUBbcI_&aF{3V%bCQz%TSL6d<X$P@_o*s{O}w22d43Rc=tg`=Mn<x7YeT3`E9$|j zkh6Wz{<M{7|H`;Sgsr(~MC&DBo3uua&eZa#A<q|I0#6|&>*Pt$&`x<WG39TM;oZ3! z8~rk~lTIhq*fHMQ7s+(hjh0R-v#^;>EguH`+p?lG3wAh-l1F1<loz|zWr~>2ip2(- zL&_g@DJLrBXSjz*+e+#623haUbKkp>78toZmwcs#*9syi_^)?KIT%84BB!_*9Ds;C zW;f=Kaj#H6@sFA}m@K3Rw}RR&Iw{B$oLa-wyw<8GfVC<z!UCN4)KuY`!wYVnyD1{S zmxzzbOFBg_53kjt0PA?bH+s+J;8HFhh|mV^-W9YBM{FE>q}n^9%f16JVIYjGx>ON! z%-d6|D#P8~tI0U7Z_W_>&6z4V*x*`u4e71A0C#KOee)e&H0sJIqhIL~mWwF^hg1DL zt~}1v@HIxYX13vW<G136dMQ9rEyW6~drE$Rda$qe1s(n+!1acoBQGI3ySE+|++}uS zGa}@}1kk5JLs}t#l{AAI0o9*>uq_x}J-CKe$ngsCJW-IF^NL6@cDY1D0uw_jYL5Kd z87@Gtcvk4kFLsNh2)FQnz<szvB`i3=d9ScSlZ_ZR!Z$=|<u@mG3nkoizu4{5!78*L z)<7+ODFQKQtZs>J6E&B^(XdWm)l8dsURUW65yMj;9)Ak06>E2@*+;wI-_|G=7Eo8u z|DOo^?>PG35%!;YMOEOr;YAz>NU-7mN0I#FPWWF9US4Q7mF4A=?dP2?cV;_sB11n0 z)F(0-lz~5MLVjRz0#NTU0x7@+>oNiR5uN)B6{=Q9$m$it5iKEqg_>=3zgsp|T2^c~ zR<=8w<^w)XwmeUcr%lNHs&l*ApJ`8Wu71A9KYlYGH<1)EKz$;{J;PtefrFQ{{BCQT zPHv-+IG(FU*ROrEJJ0oqYoSYT-1vMAYomHk(5(E$p5KDiz6*Q$d>VsaSEjl1*C%>U z1YGV(2&1P{m`)rqkoY%QHHwjn(xridkf@;xyiWZEHK_<K>d)@$$d+&29m2i9TwrG{ za2|w-9o}9Ha<c=V;u5n@XWox-#m|MzcJtMrXCc5#6ZyCh3q&%ZP}>>Op@K{JGSx&u z7n@7?QlW-USaPArPFRwmihSNpIpU#=OVJBNxd`AaVnoqwD+`gQQyjT`dbtAC;TWEY zJ{0qNEL>=dhD`V+8gD8DRdb_n4;F7uTuB;laBsBDkLhnTAl#V<reK{}ztV-b+nv(H ze`XRf<RYLuX$Z8^6sZ*#)8Cz|K5Q8gSTCo}jTiHIr}u0@)}B+J)}bH<xK^H?TP}pn zmUoVn)-JEUK0Lm0_4WwnN{2Fkyoq@y>hD&mFXoRdSbf_2>xn;)cD-SoTR)y}mg&o{ z<w{mJdU*uyNQ9E(6r|5IYiw9Oc(x34@N3a_NBeC4%-uM%M=-oY^!Tg8b$N4ka(03m z2kZ3~3~~_ZW#8??xZRc5ks1d@Up#0^`qg@N6Qkan74(L%Z4ZuLQ#7bLlvr8r43F<J zzo*5eBOZEjW)F(rBNSS@uqVc~b+~L-vRga9hhel^?bJ5C(EBgY?n0X8(}jRXF5+aB zyX(zXx;HSxGt7_stS+^~Rndx|`CrK(uTxtp!t?x|4;PO>>t*Q*`{@m#GXb$sujDr9 zlJ{Dzue5Ja2PA;+JXYy~k;`jyq4yv#_rh3GBX%)e&Jv$E`>Nq#ko2ZCOj_RUk;3~; z`EAjOV}G%?lK)^imu$vMJ}@exg41!;x<aeVXt8UUy7JgOPt_cW($3b>s@B$0Uv;~V zw}fEyo271oomQWz(~E9Lsix2ZyTD(w$71-B>3pq=+3XhPJPMs%eMXNjw?h=?Ws*I4 znohq=&StKUa#y7%Y6EzuCQICgpcnl%t+T43z>+R|W5_?5Ua!fV%^4P|Q`YfVO^s%w z$!qx1)T<Bn#d!a4tAf+%oVW-cQa7Y<Mt9!(#N*5Dqp9l|j#K1l|M$6^uoh{tX0n-D zuCnfu!gf=$xx1&8_u|SK&Z$JBx-SB*M6J579_Vh?F!ki`6Wjey%u@jIQe|(MfA#6p zIsIO8dt^$LMkJbgbyd}pUo!pu`R?fMguC7+<WQLD(i;(9X<DAY83G@lYmE9gG9aB} zZ`n7Bw6o0*k@7Bn2&|*~P5$N&=Ct1DHwR(SYUMW?L3Xc^;!#OO!;y5?+bqk?-M>rG zwRg^i5l?A#Iz7hK%3i!)_osy6$?iAmF^-+;AweJH>#Ue;{r$kKC0W>%Mao{G-%{t9 z=bO^;Htxo1$mP?{jA%-x-pW;$p2o6O&Z5q;!clHJI@;TH6&=kvZ+AuWJ=Hz3fr81+ z)6t^Zu4t^QLlG^_t*vM_cC~hd^HoFoNztmiY9R|;(t-9l(k@4v722tzGdsVmDxzfx z8WG|x!dPu=c0)RJVxgLwTP+y~w?D^bkFJ)R&1frZ<JUMGk|Jm)&&K0C%Z6FaMl3g9 z34h%4)5Ez)>4_cBH!CtW$treimH|~H?iZfIn*uWN@SGNQ4NdNNFP9+@(8!!jt@Xv9 zJTa_xl2za^cNx7Fp2C9>f7YobW;<0-i3xw@pl&L4cjxN{E;PkHdvTEo=w|~3Q`pBZ z5n_>a>5za~g>kGx_jVP+Fe1Yx7eVQb$q|rZ+i7fdG(d|B3|9)@O4N|%9$rdwthbIX zX2r5ih#1IOZfNb63HE|fjZlde&&mOI7TAct9`g2k<sZNpF`S1a3RJf@=w@eZgqmO$ z9Xg509HYhfZl~CQC1R10GN08}7n8z@z%}H!%9bq|&P+(N?0xWaooTDb+VFMIsax1s zTSq1;H<2*mYh`&%<G>iT_pU-t${HIpXD;A3^(Zn+ZQe0rs@3!G2h+`nTESA^#!@_W za(PC@A0tN3sO)SUl|7xkQQ5q0>d#j;Y*?_QczyJE=6+d`B#(AFEE-Rl<`upYd-p+} z{^sjnNhR3^xJ72-AQ=$uB$p7jv99RR$peBj-pQ~MrHZ?nH;tOj0CAePjN4xIq^9P- zb<sMnvEsrq-jyKqxOi94tg3C()CsKe*2B#(NTjYJjjlE`E-ET;Z(9^*6O9(EqgnUX zpRk%+k$?dF+5EgdJ*+EhUUJrKvaOt@HKFAi`{I>#1@73PmHlfwhw0~lMzyfzigmqR z1#yn!hqh`Nos1X&5`<%l3zZzCC=_j_X?6X1Ba#F^z(vx^+C^E{^hZ3n;{I4|!|^;# zyT2+1UYi7K^z@X1;SRdP+gXD^fa*FFomKmeFtebRALN$b55B1wc*iM1y$Z(u+l|d| zA_8{uDCwfKLz42@arXqm@2RS}2RvCvMok4A+H#Nz_8|$(#@fP0EOB-tQ&E)@!L}-3 zIm<uj0z=0}F%P60dOv|wSPumPl>XHc*JxSRVWpu3N2xR=<n0N4I(eGZ|KT{_Yw8W$ zWZIZ^xqA6(x>|ok#Sw{*(?C@D9eSkl#lcu5Zp<7G{>~GazQ&%uwxK6lhr-kSbEV|` z>8dD&S^jH0A!mR(dndC}SuftmzA?WiULnUBCbk%R9Ru$eL3lltmCJTZ?Q>ON!9dGr z!cV#0_R$xS4BqFAH}B5*Ldjsi+z!?HdG)^hcX!QtDF`|I?=yIBcTp*w1!=xzPzy2H z-k4HT8z~b!Q}&mI_9tK9C*P2}G_)S(VcShB4`WYJOA3u2N_qY;tc@$U$36F$xJ3#r zu3*75U-xm<&Ri8ov8qrd5oR@9>gvYvmF%e#%??wkJ2yn4=}GfwTczgUs-}FVj>#EZ z4MLktnAp1eEjX7S#n^b%^ZlI%LRyGrV^6uMXJ=j=O-pgQ7>~1Hl{7SWVNZ1fPIuS8 zWN~qu0b^-L?b>@{R*r`pt3P&oJL$2;n?ANtUV8G;Lz`6?>a+k5by-AyVd_c_(SMOa z3cD>{o>tTjzq&_*zqx%4bZezao|ky5>r*sXIqBSwEP@7D19sO(j5X~*>Fy>kW=s3b zf!*c0EYw<C)C!Xq;-CeAo3tr-XqTOnvv|w+yA1czxoRYV0n84@f{xyaP+T)xJ1U!c zyHVZw7R<i^&k3bSZO^7>p#ZR=+Kzl#H>U&EF|^MhhO(XIag5c(4{z=4<-bi$G&-xE zULiuZq$?%QAX~GesLWK&)x0Zf3kuVv#AkNK+DcV5DD3_oOepmo?he+6%)>}%(W<Ss z+dEiRmZN5+xdNjcv6!l@MI$33gw-dC4GJGz=(1Q}N$e`E&5A78QbCLXyP~n#!s}XD zfaqn~Bn@f2@X*KriMv76MC+60AygaAa=%oOLX*Zu)Y{v|l&^~7?+$kCA~#C1<)^17 zTIDgkmdBI;EMc*wD&*GU*56bM^bdK%gB4hocXlk4eEo~EkJF-eK0esK;7R^xwFgKd z5c+)L#Zs^(1zu7SxbjTO$EiQgr7mh(0#p`~;0*M3-s_SvymH$f3v<yO=TDaK<P?Xa z62}zMcDcV06V8kMT^7vUp=s+;%*X>99(G-3%>pFMCK;537u^yhLY4TouGC9|JQl_p zwI&#v*(-0l#Qe{vOJyTH5m};{Upow0R<puMOq<x1zZ#qKd#HYO9ITzNuCTC&+0yU0 zSst?wyNrPeQJ#&TZ@AP08P3uCyJ@<Or}<=^NM}ne+?X`9$w@}CDGZl~O!S#s!#-(o zh@=#<(}6lD2acq>shaJgkB62%i?!u3z1~NItP9HYOMpUpLf6JvZfyqin@L&fl=5t5 zsyS|W-u5a<gBz3HlAb8SJ{N#}o79MtQWvSrts_|!jJ%Pz$`4!_(9gJ^*N?j*`*p7+ z@MV><tqkEp<X9DcX6MYhbkg*&9rc+r;Mwukr=pHa@8vq{Kdq>>s;sUk=Wzu5<6-QR z?7lpDU{a8@i_LaZ@wBS))~w1v<@+b{&cU%fe6tVz`f|SFF>?m&KHeHmz1XYL(i4!f z`zMKrvlC$gQn&1g2RnvN+It%zoqTi>m2wQAn>+WO17@R<SnSjfD<J{UWwFw_FxHmf zuXG)nwK&=Dg@{ohdGo5LZ>{tXd^dluEU0E$39(!k7m}9nb<73arsx$0!+@}srCxl5 z@S&&#(9^b{z36Z|qj0P}(7C-y<mTLuWSsvN6{89IXW=O-fB8{!kJZl7YNVpHohMfm zp{G35sN;FqnAD1qpQTAp`~=saAnQyw=sNN}2Up6Z$SFzELB;n-mY2#wVaf#jNYfZR z&;gbKNuDb;*T1sHS+8apE!BU!)LEx}j*GKz5uoBAg*tb4VzdyjxfD;nmDd7ctP~)X z4Z(1+IW$0Q;DG<E%%ab%9+ICZ&nv8~NaRBDO1Jmo7Kj4r)tL5AS7lqy#l+G>v7~9} zgOMc;Y{wEUyGa%HHuE5J$zf{Iqq~z7nrM$$(W&KdaxVjcFn$gay&}JZtv~Jcs9nr< zly?1{iTU5so%ETRsupMN22hJc_DwU9aQe~<_6BImYkz@WLUcJkPCbF{yvk->x125N z>^2d1%wb*@{YZ<)vu1mzr&9T6&dNP$3)Mm4efn}FrjC!4fpe4^iZarqyFJhETN$qH z#)n<aH~ca1c(MZNM$he#iofk_c0U=iTf)lFdQNW}2~*Ebl@+~<IDpN<GttUY`eeu? z0)PyObZF#~eS>UpgjguABu!OV?_O$t4O(y`k{p@`th0`PX%K4{7okUQDv!>@7DeJz zAj)qFCKc(k*}hC`#3BYUsZ0_m+u2hMvRzYMf0$AB^1G3av3Dt=^&h1cF^c)25xbFr z@~%)Ztg_q$tpq+IyX@ahkmxpr9LeolG$dQQBz~uQ))8v*FrvxK*4CAg<K_DXI!$r5 zl)QqDVwTJy=#KIE5sL$Sn~JZF!f(Crz`}3E??i}CCC8<Caw}z;&)FEY{N6ot(+xCh z3uOgn&q}jJAiQcR?aMl)Pg!wo3Hj>6L5NRTIT_)=L7oj67@q?&NjJsFdBga^Z_)3{ z!f$wj<z1s*K$Ayx|NL&r3g?<pYP}==70i{CIJdqpBqG?0*12A_;>NE7Ao0z@__&Kr zyem2p;mjC?b&`$gpbr`G&S)FQ2iM1Eyesl647hQNx@XqYT=Ev8Aig|EKBtG?3j)p! zZ?H4Hpz>{5Ki`_~@p=B0UDqalLg-7gwPigDqo)IJ3A4yT-XeTLF0HU24C(KodH&_^ zz0>cZz$YkO?#!C(NXRGD6@TJ|Z_xm~zvi=6;xwPTF<<FloX&doO{L9dXE&(leA1z* zW$()H4V|n`Y)4xbn3D_Nf$EQiP8=aS>P+D=U%@_GOnr<jDc4w2a{&860ZaJBdA)fb ze;Q^UgwC0|xO=CznH!}@0&8*4)H(vQm$}9Bkm*p&n!Bf`VeN^r3!A}Yk`>~rtufOw z{m1J14kD09qJj#5g!g9L)A2D8{BpIn@nQ%PiVw&?4zWHcEwK<|6C7_ml1Q6ktMwrr z6)5@&h<oNyrZ+AcgCLs1+~V&I#y4EhIYMr+7{<8;edj0!6eE$SEik!qoqA(9CI@`A zJ{Z84?q96HGqEe;g-p;GMzHolvHG&&?-9ljoIyO}HpYM#R+Q$*=)yrTF0@g9ia&*? zO5w&)LRZGcRdHcBvY|ZE-_^!Zj0G|Ac4!)6MDR=-hLO?r2$?o$oYn}Lky>U^j#0M| z89+9udZa1p3CFaili|py_$@Hn)?|7HmFqa6)ysT<CgY;OT+1>eU()U>(@cC92z<-6 zKS3;Do;VIQ5Qt+7%x8Yet#%baoud}WKU3zVY!JAVF?Cp6F4th`q~_@3M@0SW@{DDK zrWxf9xQ6IPLC<+xYV6mNFD)%~59&PEx)C~4I#v~*xm4&}P&<bWTle}Y*~qysU5q0J zpBg&xj4K$YnM%0Dpcx;KpURA<7^KP{+XizC<O?C!X!l;1Z8q(vU82&B{*8|PnR1HK z3{em4r;w207_nxG^^d-QWk1Yibo>nIU@jn`DV$=Qh~`9i4`EzoI_4ZX3xVY1LJ01s z6l%TQ)yV2IzRg45>xF-z_xrZbr~~@NqSOHL(faE<+yA>{&w-_)yd?UGdrEOR`r!iG z`RVCT&ozGq4lme*d5op`3BUGPDDr4y2XwVSco_baK!A_c&;MOVn3b>521iX#c#SN` z(9uI$jyQEishS6enBH)jLr>BDKEWBvG2r@-f)s`$DiKEHP=&HOzQYeMui?xHlcQ&Q zi=I9@GB74-vhxOjSSqU`pmal@nbY;?(5XB$eCSYYAKclfBBIRc4qYxz%TtcE+$=oa z+C!O(B*j{jH+aO{UKDJIM3#p`HEeSnP7}GK(Jc&RtlB}=(bW!paOM)fh*CWyk>qkw zQW_^dtK2=6bEHBn;*rSpA*VUS_;|?l+X6;FWO>!PepSa|Ay28KBDBak&wc_b`!RJk zx7+%43q4bgUONmYST1x6ILd5b!FB+CT3cUDaeh*^GGU4G3PGn8XU|$Eb;P+E=}kdU znM~GaVo0(No!m~)F0cr!R|<)KkeB{^@6Dmc+gARdtK~_9WY=8mY>BNkFQ|ZuvPuFF zF?hGsGV=1v_3i2`ahw5B)-`es_2ex>3R>QUS??wGsviGJG}6e%W?9?#cG`u07waUX zQ9ei8Th!^ST0Nyxf8eN1ltQ|`x}zFKF!6iJ7bUtdBY`wp)rfyPa5|W=qBMs3Vgmi1 zE&u*kQY}@PC?QH{@*gWVX~)X7GW^V)o?@S+G1T|fM;iyrf`;UH8OY}z=t$Q!w0lV< zg?{9SQaZKCU0_OkS*F#LTv$|)A~ujl<*bpg7zRmb3U{lPla;4%<6YqJr>$;kbJXVT zpycNk>iNx}CesNYQD*wtgsY$|bx-D5L8z5Pnu+0zQC#3C<9U3{R~8R$3Oij<7*s{U z7P3d92Fe^N7F<z;IeAfi6xSYR)%Yo})lEqcXI*@JtBtmkx`Li=!ToK1*(zFgUbnf; zNu^9C34WqjU3q6S4o`yui4=<kHY^w)4mcoVLdY*DUl91OC|(FVgKycF$n$UXcVEZH z-GQ&onlJ7(-_>Pb#P{pYHv)riVfF9pwePXzZ>;y+wzpiPZ-SaH{`zlv_3z!a@2TZ) zy!UUwW3174TIDzRQ>^PV<JjyxOLY0g?m*AZ_A1<EW=#*|drIZ?aL?8Gd)>9`BmO0% z&P_Ri(_>>@?p_B!>btj&cSp|E`SY;P*yD%Z<+G#ib?hf_jSs>TWXHc=tan58Z<I@M zo#zuH-?&PCtao9Z&-^ul<8#E(FDP|i(kJoux5E0|lk-9!3q^H)f_Ly5AEKwxjyKU8 z;W^6nz)|Q2E^0l&e1B|SuuDasNf928m+?9_=-8MxL2g;<<LeQ*m6Ea0YvF)b?)rI5 zA}n6G4hSo0mp}`=IWv)g=RQC4Lk29kj=rJBH-GB1mhYF%5nwNolR-ET*jOt<&=nzq zH6Ty}lBghA2As`cg~`y^0DsEU4Hdq~2E#lyc<rd(2yR{K{#`x>37zFX2K1m)QH5(I zzU#Sx;aI7b%w!|DegI1d^La?9+0(|qXF$FW*f&o8&H~qB)dYOda{;4`$m42ILby4b z|Mtg#Y*N^8{SYmI8Ur|#()VT4O{@tc{9FS~FChoP^%!25Fx&j{LIRonU(GD)q^Vbr zCEVBvkAoC}2ku?$x2W%9r{<&`Nybh;wxAcI@IXWNQ)}kJ=RKGTYex^@4F;nbkZc1C z?U|$cT+nQf%pV4kAp&9x4R2BtPb}|Ag|H3Q^!-K`<itz9aFN%Gr}<TvE)i-#J*4p4 zU}N8rnmv(&fA)9epF^`<7MCR(83~ysx)RKKS$@pioKu6_7FncqDh*E_q!U_5HLZfB zQ;AC99<=3>JO%H5;AJG@f^cEZ@WFH3+KED8&Zz0W=xW`dE{>_c;p3<wU@Mp^c_K9? zF4a^0cV>eK%8r|4DEhQR2cbQK#n<-?_;^C%bO~OKmlw2Nes~(PH+0p<rvXW5AP%04 z(5Wz)aF=R8{t8Nibb`ilwv~l6@*5MlcY9Ed=#a|;li!FAs7X0+0}ABLBydV8Uf;R1 z-&{Fdolre{jW+<MsR<O$1;8~)#tiO)NwzF!)AQ=V2;OF^p@kMtE8@w85wh380J5oQ zGmy#%UMYv(9Hl1%j9{@R(830*m>FG`Ok~-J)ZDH=f>x#Gc;ZxkA?G#YBKYTdPEc!1 zfmy}|8liWJ3}KWE0iOldzvj$PKVY7tSJ{8tk8rl{gsr^~0=0j`&D}<-PED)s5$Z|C zt0telj&H*x-e6V;BMt@;RcZ~|`*&l*9XF9DJBOxs`TYD~$;&D96<&~IjTH)9Vq#xt z<zEk0=#M;tV5o}9x>VdHku(bTT*0nVi@(w5x=2zv;Q9dMgm@0vOHLyP8v!wxG|zZG z2R<<rnFGZKjso$2{#oWGLd7Y*{4WK_q-C=X{~SNA6j>J-Zits^3-jzCV_hKc3=wDA zxbu5kFt@|F6;}TpYrqNq)%2o6IoAuLY&9me+!71dM8L{1CapR^0@+?*BT5PTG}C!z zqkcR2?cM{nLu1B|vqg8BD)VJ*aVT+^3VT<HJ{GN%;tj22nnF?>+QoW@NG^HpUi1W> z`tT-omOgfbL&giarZ_eL_!C}lxvX(e^unV^UVN-Y#`64oPq9)&H=;BeP2M-*?hIZ_ zh9~-7_5`CCS<}oCau_EDf=tOe=sHNkcB~EZP1Nzg=MUuCR#g{j4=BWaB<Fmb;Zl1o z?x-S(!!;PUNuKHiS|afERnQk?;`BXBmKCY47Y>h1C=fGYV0zqe*Iev6L&$4hm}#F# z3N(5ZBF!HnjmfuujFds>Owu@YE3v|s;P-mqwJC445HYL57If_*+lywKHKsO>00Z|P z0bq*_AYN<ku_TYItJ`4plYmRqnDeX#?{aTowgIw7KA3R64NbI$;qCx9KJAO<5YpBj znaCYPJ=$+zFQAjOSgpfNf-omS^<rr3I08E-p&4KRo6m2G@utSxzs9I}^qFB@-0%=} zR7i%(h9H?WC3w*|;*By^Ln$NLvRcd)(Kn-TxdaCc18t&4Ji2#-5yyqP*lvW1qibh$ zbQ&;SWc`~>vm2;!@gQ>zdcao;TFq?3!uYwsX~aCN`aK$mkD#xSFfmEz!(wA&-H-#| zM8*Rw%o)Zg8%Eu13ZCByU3!htNG6$tiOYRZYOuzd_)&u{jGGl4>>%nDE<=G2HW33h z5iR(s;zZ{%41pV%2Dgv(y&43wid@YZ0azdSNHGzT<P@@8%a+c!Mt(SU0tJ?j2NljU zzO`C=q{}cA%;ppoD`aI_sRfq0F%{0}6)VeSTAd4JYM!+f&T=@*5u{c_)fOxTx)m$! z7AlpHdEVV18^u>Ib}G~hnU?qh%N|&&7laing=Jc?`Ih)1%N`#=70!A;FZU=_|87?^ z6&cixoBStTs5n~`j!I{5rQ$a_jQQJEMY5&9%0CLr$rophUkdb{STq3kX_yW(&}&Ml z|7_m!mdK8cLcf|Tu#@+y)uZlN-Jo7Qez-RT=^Y-<tT#A*ZN{uueLY$R%JD=<JTtfQ zD#=zXf1p93Q>3$LbC?SvJ!9pW`JcPK%X!;BwVG$`@fvndT!1$uz#9|bjR^22_|M_< zw0CrQg-+e)RCobK=CJ06OYv8$AoN+WR{WoYeJa^7qoR}Tm@(rz<Io!i7_t#t0Q4Dz zh!g6_>94WTC%0|2h^^gZ-V90rLV<8<9B)I6(OOl5cxPFK#QrC(SKJ>x&HbrG1oEk_ zc!y(vbh5F_j~)HZN!mdDU&kBPD+A(#$DS}BD5l3R1|b3<)Cat@kSk4(Ay&wD3-xi% z(-vdQ;+#O?VZ1J_^jvaINO9!ZKoh$o5lK^<P|{$WH*>TptRebc)@U&*8ZnF2xa5dZ z>42n`wc;x&X7SLH^uo8p#N5Kw-|0M*rc8zE>2QiGb+931kq5E7Ly9r`X@Q3`!hkG< z;5RQ0_|3(~U^>9Vo=76cA4(mwB2;maumi3mG<}j`M!C9PCVnf9H)*WUBeUo}h>mha zdCVxDv|Lsx7uoX;27C#V3oNa3Gl7^MWQdDQLit@d<3}7!f>DcA$1NJH!tFdAZvt>j z&eP+}q^1w43a_~^I;`x&%8O{|*SuOO{m&7VSVZ~Tmv$<GUdc|)U=|@+2N8y=;ar}x zxDzwZY=)9dxBTQ(l3R7ZLj5CR4smD_@%M}cDY#&KmCVd0Z4(Vc>1IvI7$_>)C00WA zta$G`k)odz_+Z3rQb30P3qE~|4juQEC@@o5pC}jsyt0--F;$QLGHAe-hk~#@Z#Rfz z2hRIJ+rZC<`tZE9pW)L5tNJ<w@P^N^_$<)wLqXH`g`)ccTpYH=l68A1gKd5;252;O z2s(JEUa}=qh6Po)3L^RiZ`{1e(6Y=qUD$VkB|Z=2NY<5Ikk+4scUIT5jgvE{lIIbc zKuFazrjah6ZuL0TH_<Fs@?)YAC5v%P!pp1%Wg*XF8%Tj{*KjMn4bXo10r(6pRwMt6 zC5{}w8=NLG*j^D~5eUk`{J2WXrTuu!hUZfTO7a>p|C+eqi2Fiwdm!P^?}at|#5TEX zWcX<>V!s7s)EZI_5Ps9^h^G9;pc~Hnmfv<9a72@8o<#-_lh!0NAIdb3yJW9`507WL ztrvT@fY?-??$agPZxIW^hxb6K@ts7H;ub!Kmsuy0wM%+@ak)M22FiaIS``sl77=am zvDVKAKQE-YQit!5Q!LZ;tc-xyW46-}kD@q@mpBR3h=6%2OM;bcERr&fTVs;n>FOZw z48A@CH+%{&UGx?Lzd@Cp=l;fn>{Gb<)x#=L=vvBbUTea$?{-bK$H5CcT97z!%fW?U zZiysRl0OJE=+_?ttqgxHdEl0-6u4P5%T(@}E!m(L38S*L2`qR{h#a=xA3$1YV<J3v z3cC)`K{5h_WpmgEMsgXUOir~fm!QRhgrEAZI6+fWA(*uuD3Wsw9DMLA{GdtCUM6Bq z-tUZZ$ce=WM^xrMe~!|RYD5FGWD)H@OW4DROUR%@-_RpeW=ED6+BSrnuoLK(4%uzR zxj!l=Oiom!l&F9iX<o_XOeW2G%7uta^=E~sfEwD%i-f|8^u~KUr9NeSikW7t6CeT+ zsO0@iVVUKzILksis*Jy5m3Z|i@&b)Gg-bKEc2ML~CSp}q<ZGZfG6p+Bq;gW9luQ>* zn!N;)PjO_(h`rL3JRavj?Ggihi7sL3B;9qQAN1iH1Lhpl2b9b+bq#bMUK9@iq2UJ5 zE>7X0j%IKB^BiDGIZg%8Q3`LvV}l2<4vWR4OT#*F^3UY!<On5(!i>C{L(>6`wqaqn zpuS<J4iFwNsU%MtRsqN=CRG*wTq;%4?-xmE<fAB3bHHMw@X33og$jP!kH27$UCkY% zIksdlWma(O=Q;N$yI8O-e1sWQQ6u}QOv|d3X)ln1^iZLnBM*12ni3oANix{!q1?;K z_jjT36dulQk2QM6n>`cF{u0Q!63_7lb$>#-yUZMG4Ate)E<@5Qb8At!wGP=|w}>zc z?!LLq+s8hNrtHAa_4ya(uB@ss_G#XUbTaMrY`rH9QXw|S5!HA^l|?H*sBi!k#n=NY zI@0)iU|0|h`5;;Gg8mO2oT%@)qBS%owSeOZRuHm2qxY}(1gubG<2PCV+gRj-T*484 z;V9o2tllWB-T<s`CisynDuyo?kEq^4wLShxnRlAjQ8ghe+ZQAin*Dq<h~vOQqQKgT z;`XkZLAtS{9ePnE-`^59dO--Ez;Fk#e;IfD{BFt5=kx*SU$}?Zc0|Z_gBEMKwq2zO zNA7Xc-Fo;A23XG?(f^vU=X1xrb>W>UD|lmi=n{Ks_BatVvAV4Aaa>)1V+t2BuU+3e zvNwpD)9H>48LWVhiZNUSkC^KS-MM^@GhzgXkMmZByCDKxIly_6o(hs~WJvINIJ<M_ zaxQ^uD{y-&Ox&<3`mUj`%F%Ane0cxD^8owETZ!L%iEv}AbQ%Dd^5!irvBYKG>3ZL> z5pFc0Z=BGOzCV0e@aB;Z6HMYt+f!JdwKmCkIkew@4GW^YIIj8fp|@1QrjQ5bI47*} z)ppN;8t{SWq`=u5a`|~Nq5<h20x8GaVNs3gf0B*)mP6inA$Ykn-E27Z6{E|8eR<Qh z5lH-%Ms6cwSS4wvVz2|OS1hG{$0gi!J(5_TIiwNX8~PB3wu6NdfhJ2E2HcZYX;cyf zBrjxyka+FsCm&{|VFp_K3(9jZx8kN#&yTBA7(;)!#ULuY#~?Bu(oM}9I{)TS<4@Mu zjwQ4>qm~+qFk378OQKIVc<Ytd=jhCyqdA0eUm1219d<I!u=bH*B}%K*hC!u?Mx_&p zRwD|c4tLAkoLi2*9C@6hz9O;YJEQ2UsTGv1L?yP^()7hrB{|{|FVG=Sde+8<ebjA` z=IU>=6R5I%p_Drhb2N`~gco$jd;}m?a_QPSLBGOeB0-Ixl-E^y3e`!u`875LZ%5a^ z3)gMJ|1!}2?4PcUl7AmR&3wa7;tG)ydvnj@e~E~R8=nxzNP@Rck)>Wv0c|_Ol~rKi z5@7lZWK?9f&kN-(Q(kb*3kMtkCYCnahjp(x#-1BWd=H*x-UF35{c{B$z*B6#P)En| z20gF7b#ot7G)%q_(o^aN#jmg$#yu5iwnQ)osSZSy%3bA)KEs$ymfaJ>>G0C8`z6w5 zV-7L<zyFOtaHu%lSzWOwD5sxd##v@1|9u|D?-@1FrKqa?&4bc|>BU5MyiR>6>0&sR z)dtDarg3k*{7y7zEx7sxBb!+Nm{|A6CjXZhVW<Hp#A;h!ZhTz{<^c}eG45C$d%U5Y zV8|<*$ds!=+AAH?xp$g@50LUSV!YtBaQZ8>N?NW^@vD6CJoudaQNxVV6o+)p`4Y;G z5g3M5@3Nk7@t7a{#`RK*8=G5}F;e|soGZ$6<&hHurK_on-?vLPsm?mA?Bwahh|+bF zz3MKns(d}Nb{A3t7o>S{Rab(klz7SccO#_C2he^;&;eKDPX35gH$+5MuJyA7%N%Co z0EcCcJ?`LvkWJ;N(Mc#?5<r(Chu$wR9%I7A1G%Y_3V@?7H!cLjW+3Rd<a=X97}Gwi z97h8ucx?%36||kXOvY8){zgMk|H{tN7jg0;ePDu?W<lCF3YSyEIfdQ_xlcurDT@Qc z-5M##lmsM4@X~IS>%EwB{kYIE9|J7n`Gd48x)HS@#yv}=8PyB#B;lnd^dL_q;khO} zDv#A)mRT;1znX~BJh%qwW+YX&)&Y+>mZ{;@svi}q<SlCN)cWxu{nmOQMF;1ss_&U% za-Se$^E<@o$6okQE&3Xb#yrI_-`tLh>^9Sr*!L}mPn8Qjv`9vBqiBbIy$oB>tndBO zz0JcAu-FMc!t=RURr%zEpWF%*Gl5?@u!eCb#8}tuSmd5A11ht{42zD~NqaQcdLWpT z8JJ~c_WnigNN5rnqta5tOR)aQ<Iw1)LXK$h*OX_ON^jZ=NZ}iEHWA4nMTu{^T^ymQ z#FX=)GRPxJ4jfbqH(TLwYmsnkp;GqjOnZ7*XYGhEyw4=Jh<#GCK4@Qobp3XUGHV53 zy`oHpMJQhRC_JjfF0g!%T><#N(B<Q|-YugVN$H+bi?$|vv$nwJL*gaq5#f1f3A<;B zyJv~2XAArE1^j!V7I}7Ep*wWuHEO_gYruGwpnp({)1JSQ7)`O(2c5S|fh&mZdt|uS z-pC)X^Z}|!vDn)Vv~e}DXyp`#hOUBohB4T8bLl8W<uz+Cnr>{B3_f%w@s^!z9U}n* z7T%zEvzbT_AMipst%R%hY!gqqNmrf>^Y?s7o_u~Vv!Rr`v7A?vNSzKWohovoM@JV+ zQjKz+@=_kzPkj0oLJX;)6I_P_a95yoXYuwKPeksDl%GO+IY)b0*kB!n_@OWxif3Wp zy(%B{H2a+vcRcl^2bS)OU{JoP{wv}eqbLfcTN}Cbm4XMj$410qcr(YIhwl5n`P9hU zt#x_au^C<06U<?1`bFemEz1ND+Moty=pj7R`*&+6)R)JVMKfOQGAH9sc3WnQmtVx& z+|qM5;YE8^Os|||;SkDyY41MvyyFrzywJ`xy@yu$sSyFc0y$2ETU3FFD#w~t+ND)+ ziYMgfH!Pkh^t9~WL+!!%m%oURyL6e{i*&pO<<lb{7Id64K)~BU)$anr<;S^ybAV|l zkQcDR!&z||slfPHk<X-S&LR4esHN{40Wq0ugQ3SM1%SF;<a$v(4hmf9Zxo~S0-dff zO6gv%@P!hNGU>s)lfy(EZ-Y9NlEzd4)SoZldu#`VaMR<d2h~?n;k!e0`lv&97JvhD zf~u{GJ5!tCy}R<W6=L~zh&b*$iSDT!GsJ=BNH~9Wqs~Okp~0sURsQ>h<yY#!v)0^^ zM`VJ{9Z~%`x*L^S<axsbpc+l=D*?x1@@s|)uMlFR6=b6g&TGcgYyt_<wj#8w4hF1n zrI}QRqF8}ewXpSLul(VdtnkNIqt)^6W!GR_Gq%~I$(}WP1eKaYln@i!6KcogLYSHV zs`d_n%LS_*6Tjn_^@F+MANzyIk}rfuwn=!EZR!q^LvK*<$9z=5W$aaO?Adri{5=$o zSDoyRcg9F%i({2!?|m%4K!vwLL6yg9g}}y*#Y9A_O{?~By`i<eF}sgK&(<<K+RIWj zYa?EMGhY6rAmG~1f5n}Hb2e0Q1zf@4O2kJOM7dge&*?+gM7PHJOGNX~$lmJ!PpjCw zpA&7s`Ks-3juK)Fp7)=+_OGVrjB6|#l*IERzv(8oCE(rE;?G60E8RH_Q#9N?>ZSuv zLy@slAl&e6#B}hko?HrpOf^igv$pRStKjUpER)4*ZNSD>h|^AtlM7*XXZ#Fz+zc<n zPzS1*wrBp_2ITMxZ_T51M}c`q5@!q6!N?fmLDOd1Ok^TVdcM&!&|PAgQOU}vU}!L3 zZ(>7NEm`^R*>fjci$7E(-n|S9Q<)`QwUBuPIY4pZ$r3xn?6)KF72tD*2@r9q5_cfu zmqSWpjff)m-1)5KDU)yLD4$kibw04(KZ0$!Z(!_q@ho#+7tIL(Od<dUmCLL$K!QF^ z#qMA{M0cum!o5S1)!xubn*4E)rD(wu2M6S?6sV{a<RKRo*eC|<0Uk^Q!q7;t3!?!D z^siCiXtxU3FR@+#2u=&$k1z~FQ9%s&CUgAALyx{@3M<zgAL|mn56ceeuAX;iQ#}2y z|1KHnj*#Ma6S+eRGAM-uSo%dY8htG=PM>~CzWlC4)oi?HWMQ#l{sI}(u2=8_SzD-E zIWHC10|MwGH(otHG|@F>nA^S1CC)U{J{4BV_*>Z>)i#V9QYcOEpiFq6esm-6xZ-Wj zalnPyI!aCMBUxKn2QUUoIYYIM$2T{b;KQ$wKueDph;gv_<I#2;ybye15FWUbdD;6i z=N^dJKJX@hGuAYxSTClkMey_BX~0W?Gb5dr6M&-p8(T9qjM#60uFYxw>mb_;a`=>u zd1rmBjLBpP&tyr*WXTKbpDxgS7p!4<D~g&sX8-HXuzkF1I1}@|0m{XwLtQf(%$k7g z)L3>zIk#q-Xxz(Qo&S-NUL<@14T?O%aY@8K9AeGf(Bn|GG;4=STDBxFiH)qfHHI^R zhWsW`BGf8t4ki~cT&iLgK@2tb!q|ROU3>S2u$A@*K-aAi9^3EXdtH0ch!bOr90J<h z+ElHDST+O&P8+aB0^@hOHYFj)<y&`c9hgP=^a~#v`Q-9Lph}_r*u@V_x~3OX<CnVm zqKsi8Bk>3t146wTH&w4cP6Ka;=>TA?9oYVZZD^lsGRlWZrPb*=o|N5ey!;1v?^9~l z$y&KT>+sMt2iG=AmYLDAsvP#FFhKaw!Jr^OfbOtfdy%{mNd^9tpMrkUI477j>B$pf zMd3XIVXW_o^@SgyIZ{rST243e`=I>dbm<Yx_~%*gJ1D3USQ|F9r;fM};%%(tG3&`c zgB7LJjVLttj%4E53k}*0X^`}6NcrFcTjD|BuelSbu;-1I;zkgdyfdoXRHfWh<;b`e z`F1@!F>&KKF_IglcO|t#?dt8u&nD$b+pO2mDpdOyCtv+V+C!AUIB}3|OdTJ>`65}k zN8<r$%PEfi4zYiFT<ei!se+(T?Gvr}+-z?3qUIfEh+N7Eg3LnIFP7)b1geKF{qHI& z^q<mVq8Ba6o92YSRtI31lZLy3Dr3a5DcYUlId>7CIv%DmY)%v^=s|GRNTxGL_z%lH zEka2n7>5*40jXQ=yFzkZ(OGVYoVUO;wTOzmUojVlkZp241yQF0r?cdZR9m>XH9QOB z)&)hz4S&%xPC@8o>WyZ=7KOnh?cvdBp2SJU$M=-7DgXdW5!(g#?3u#O>pds=M5kK6 zmq^F}+x`>WgoM@|`na5fzxCVgdvHUJT%*i`!*=*Aj6&fR35E?j!7g$N8Og64`L<_4 z+KCYL^U%%nLu>!w04e_$U*{B@Y1pjmiIXpy*tTsa6Wg|J+qONiZRd;aOl;enV9&qT z!CLEJ@2Y;Qo_deFy1KgizAtRj$r5&E5nkP^sZo91X_*;3vh!%ZIn!k3H8|C2F@~Q} zpXl#1gvA~di~r1L8OX>pKtY^;4e(@Mzbt0Tcc+Y*HELGGY}@MIK9LrgW0cgUA>)dT znzTB}luG^+xHK!ZQ4CT!0`DAd2t2A}-bs(BtddwbT!qA$e~VV=IhNhfM2$M){dt2e z>J3>zEFmeZ4B9!X1t4U4&kG@Do~I6Oo%UES@;0Aw^nlsHW!{00^6mFd!@Ou}#hv&8 znt1jQz61r;FmA$4wc=a_P>(h4qz7OBIS%<f=wdpCo{72ouTK{GAm309MfRFAz#aFA z=~8Tt@0o>&h%s|s)4fR3+SLYvj8(Ip?$-{FH-UgYWBqL801|q$9Ih=hPSys#x#8I~ z89U_lpwYLr0qLGI9qP7zAg;^a+Wxh9&D(<9X=@vteD1iF_J;DY$w&NdWe7TWCZBF* zP#o{Jbs*0kl@o8thS)KEXgCteKX=t6<omH5Z%=L6+pcBFuLf)q0O2I(pccMG)MF(U z-d-dcbjE$Z&9bQJvNHMg0z-|HY1#lG&U9)9`->)MG|_EmR#7(07Xe>SbpU<j2_6ZZ z-@)0PuB!ZIXHp-0FB0QXQ_4d!)<Yn$^QFJpXa7;RSTQsEIdFw?3sJ<0hp>v!B&u+8 znL7_~YnMpf;Te~{*{=7N8;%<2i>H-+0c`982>lg1wci0ByvjB#{$#_n-vL#=+EC!u z5AS%sQZRJyck<?_Zg>%d*V{4Mfrx$HqL$@H8*!jlww$5090?x;RrCQPG32jG(Vm;O zN%Scy%~GXGjwFh5#XXQ^$)h>a5#_hi92=Yke#8K3*Y;UG7k$TBp0z6;N^K%ziZQC* z+e?^}X2clXi_ki{P>wMo@=borw+HRpK(K0;@HClrI%8;0q&@W~S8wr+6Y5Ju=%qjY z`x=js6~blcV`(|>S*ww#ia>QT{_brSy{JKd^d1qLs$?9dt_qA+yfB-r*9p>pA+-5d z{L$Y?g~A@E0@;r0d*f6Zs))EYXcgWlS8Bh+Tup10Bo9!l%<=aL{u1tColxeLt7SCJ zmVQWnhmiDDde>QcwG3-dUP+l5(clPA`QBaz#eXhbqDgpBh^6Q&3z%8B4v2nNim3sP zNZNj5VJveHPJY22uKI@>K5H|M_~DSR-Uvs2;?p+ogquEx*Z=wAv1t_uGy99eIr<e& zQ{+;R^b#tyjUna90w?yC#+&l{K6wJ?{s=#hW^#-Z5Uf}PMud7=$(rS;pJevB3!c?* zp2B+Y#hSI}+<yQoSjqt1@yfHA{wDAzX4xjTG8O}8yac8Mhq_FlTU@SBekmfq(DuZ{ zUTjwYns&#)!AHa}#vW7VIo4r%UWu$pDRrO0wd8gF!L1N?w1dwC8NnS0HqJ~XWv==Q z3s1XB&rBA)S%Av&h(;F7A{P{O2f0JRF7nrby-?l&IkY>KFKquK-7k984o(zRW3e@_ z@l48%-<$_R>X|pbbMAS%XDkb$`ynq3QqH=TSDV+(ZbF<GCC{-Qg!}?j+_$!3)s;w9 zTF~$3gc}&afxUE$t8Hjv?=vp8G-xz3(Q9Iv<8)@(CN&QDvq~3tK}6AIr7+g5Z_<W% zdl~{6=ohd^7tud2awDF|BA!Yjo=hX2jv}5^DTX?;`m|E;FR(+OIFJCq%yphWa;zLW z=^K1pr0-Ne`|yx%1c&~`3*o*y@&4)J+jS7{4j=uHuDu}TP#N{mgEApL;gGJBQ4VVt zL6U~Fs$}4k`_GF}qzjP<R}3Rx%mzQu20!FA-@`t&B&`-lWn%Lx4(u7+1&AG)yq9aj z?W&Rcdw7y8(iSO)*)dEn@}6$AUX}_$y0$o*hukgAnau=4cAGdCU|{Gx;}>r?<J!bs zA^gt9?o$sK$d32i$_xMDD}R7cFJdAL0nlS-lyUea(z?W{Z{n`QWJHE)pw|(p&=!CA zd`YhtzH@~W@{>(2HtCoqDJu%x3ef)fY~pJ@4|6(zLm<?7dt!jt>9MeU168*Z7$5-c z`-wHTvjYYB)@0BwfOG%hTQIhRSo-&`NTz>4bT2?uKeVt;7~q{yXzu~)%OA4^uZ=80 z;FJ!I0HRoPnA(87SLO=4Er7b#5Nez1F8-?V@fk33$Ww%S&F*>f3osj52kuVz&MJw0 zlz$jSX{#0=0ZKsK>sQV|k8l|zo=iaR%4ahX?!I?w-mxuQbV{tRq>AO*ceE+reUu~5 zkh?=O5bS=RoTmEigDL~@>jPE+6OD01zXClzLZ@B=^=-dNi?b@sxlR1_{xcA-3?rNF z%H`4PwHC6!kLhDQ6r7zDC4%}%gE_Ej6MTZn=FeEx@4u7mE_9?dQ^~hiEy6$qpnH-M zwV#gVNBhF7wXUEDAOFg5mZr3Pi3jf5N+#_&B<hpE+S>iK|3rGSTBdxkc@4g9@1HUK zZHRC;ku=JlpUH>(ck`fM`|u3jk?J4EbJlFR3T>?^TTq(njCAU0^r_bZUn>#|>2M$E zK!xuk%H%48;%_U=t3F7Iar%tQKJ?@Fy5P633&YTFn%eym)oQlhmdW+@19s$*2RcPB zr1prGhjAtFqBS?Y1!k<=4rdj^TS3OKeV>Um2Ji=m^gg5@EkRyR_50m=mv@R&786gS zZYL4TtpJCQ*aY8QA?l9po}<Ee9BzLo#&5g&Pxs%p?I?{O-b9yuuxFc4iZ<~NJ5_K( z5`M-(m*3!`N8qi&T`X`TlGIHG&^+>M-*Aj^LHZ&Xs*CUUH-3!|%gndLwx;{`sssB+ zYnPRY@Y(S9p(bQw)$}PJdo5mZ1>q#FxpM?;grj36$KWa<6iMi8-z4SnP>KWu!8YG* z|Ja<4&7QfGGxU^?1a4~`)TSqus}P$r@Ij83!g5Ozn1l5Dg)|`r-OVEk_QhsIvKURd zNu^uN-MN@(JcIM;gg?)Av2+GG6BxV?IU9@PPk1w%&(8d@ko+N#zR4zz)qmc9V>^BH z3F-PwA8B;9axd%M{c?+3r+GHck>5!#_K!Fz`3B?7ml}D<k2vZ3IXn9=kY<Y_PMC%s zUeiY(m`lzhZ<=^>4_A45S)a5pBu2lO-8#UVWy3_cjEcwwaoAMc{0@J3fmXxzW*?67 zeD*uNix5zZiiZ8=fy9sy;15?XY-qQ=7!>ajj(fN6V4aHV`^M-1yObCsd|(Arzw!o7 zY=Pw^C}J1jqR4J~{6W^`lpjOo*|%>X9XyPItV@Q{oWVT3I2<G_`w_-%OmvPa)WCvJ zYUEwYqKH+B<aD2uH><`v^)Jv_Z~w5@p6I#Ax>r7RBRVk1HDRT?Pe%HbG>%6;Vb7An zRxryxx~9q?=#JN_o!JwSGW7ghgqS54S>I0zon%T$INhxKb;a^ofSpN%6*Zd#t+jvi z(gc>sH{|EuqnF!&Wjc5?fN(gOMaSYq=+5!zS|va&vlS@O9bou#f?6M=jihtu;xuhF zUk90Ha2YFyJw=1(HOHCoGzT_w=8due)}Yy$D8`XK3}!|y<4^}uIfv%=KnHdj&x+vG z8pKBZ)}c-vsV3D<-@%TM+CStLu0<m5Z)bLS5QNZSoAfHBooB0KMa<uC?@6?S!f7ki znlnj_E`@J*+%G3d!?&*Kf_R}JMc`hx+=2Z0aA&>A=%=oZfdl@xn#BIjje;bOA(Q5h z^aB_QA?-5PWFXk%pvCe|csu?d@aaE1K{6gN0k<2J{iBKjxs?6%|B}5Q`a}}*2p3rK z0w?317wmN6sd3i*!@9m_{*3;eE|kdXbF-Rq>pubBrU@-qo3Dqe9uZ9~9&zsF7Hl$v zXwuF|r+0(Xkz8d@k#c(@c~(-r8gU%WZHmu)iS&4;Wp{XeU>~ZJpS3^yKBEtG{0ckl zfhRh_JH6?K;+pyU(~<ud-zN_$CxKAn1I+n(8RMFx`9<knl<B)YHZtk6TWLd`Ly(gJ z<zMPHDkRJyJC&?csKxp2(fTsef+{bRu8y*qQ_RWkjKdnpm?iEaWYd4jbXF-?e>yZ7 z611u6<S<W^F3}$HS@(k9kZba5Ham7%tVmym97r8#z0k^l_{-49P!(C{;?<>!O>UEI zFcIgN1oHt_nk?f;sC|T4G<;V4K6xF-<b%ilpQkvO0ItA2Mp{PDQYf*3&3?-Aq31?H zl}J<WN5eMaFO^``B8y5z*5!ySX1}=d#RGkbbL-nA%oq~L$n)}zh4JGO6Mi|#!BMf{ z(W|6*eR+y(e8!Vp)~O9S+U&qG>g>SrMkFQ4^hQ9n;9B*swQ8}oYN54i(Y0!k|2%AX z3v95J$IQGL8XMNGsznxfRmCi^x-|+>dUqfM5?rh8-2PBp;zfH}H*H<U;qOBykAE57 zKb(+8ia^@i#6OaCH~v{Mb1x04C=2j>lN{WfybgMG-x<o&14+^n9-#}0c7HU$RCkn` zkY#b^=^tmhJNH@7F1z*iQ(DDqN8%04?uXfg1NPT25;|nlq|hjMpi=SzmPVfdtNgv4 zUIwVM0dsEV`fhE2Bjz(>J)tYgWjcn`jgOalZ?bC+seF@+*L^b}*wzh9$drT7OPjra z%3&%b{ttZv0i%xu*hRyM4*W2tnz1>!13UJElk0S{>%rHsD&TCQSLPjN*fxnF;_r)D z<Ugt7l64SMjK4gvI-s1K9}ezJF)sPx1k4;9sp6S-#>i6OS7JPHs|6`m1L?=$aKozm zQGO!u!ic_lYwcR9`*01Z#xW}(vu64R^F@H04p@x8(_)U}6aRTQ=Pwv>S>Yi10-9`n zfr`k<{>6oy?Cb%P*dDZkYW!Pc&DZyX?So=`{WW;WUbm`b-E3#SyJd}}BJi9l;OqV{ zurb)Gj`a(`0Xi)U@;F<ezjqCiqBVd+dK)h_`>N-IU<~7-;Rj#T-=g@-R6LKiOlpL# z)T5we6$K&l<sY`@&?PlwYHDg)_x6-k8gU20*Xa~~cJS7pTOrc3eHDkkwFrWU0gaQl zt94Zj0x$4o7e;$4Ris5$wo1fptf^zQ>-%-m1MSM8wSCrQD_x;>W(OJJ1F!5_JOS?& zyzHi|T=P3<FVJ7aZ<hs=;1xFt>^smhut))!6X9VlQab|0+IB7gUI>L9f^QDD*}!}b zRvp5&o$0iHC0J;c05#i58{8RHn?S8jgMSKZ$|D-H`XOyv{|O&qrE#=9I1e$s!G2L% z%Hpfl>f1;Kz6T_&@n)Bc!6u0M8g5O;8Y%#fwc40bf#ihOi0J`SPTp2WfWCgTq<@6O zM~i9QyEj(XCWOi>kzll_G`!CgPXLWMkGX7|4S^*6BZ0z)!z7fKGab+CiN^iNZ>(61 z^)S(1WX|dZ_G>*N^OhSN(LAWb00Jry<(EDwCn_XlIB<6t8WRf_#uGTNfQbu+5(L3W zrU7jVY*0X>4O#}?DTIHr1Sc<D5HA))%z7~!UqvlmRVzDn=Hewmw&l9sAtpSEe!nu= zQIrb8e6QwF?F2t^qZWDn^PgSs(T3$2(C5eX&)oX7vL!|7xL+(jL(R!GiyLWZAY*6u z4jLAKUZCWFb5{0Mg4DgcIjDZuRElHOfB^0qjUmvx!k>P90c#e*XH4Z23x}^<=5|E{ z=$7}w7sfj}ye*!9Llk=_)(`QxLFrZZ$)DNKZyd={HNsx{(6%o$aB9wmeMssh^sf+S zfF8q;PG)-S#$R};6r;3op06T(CUYQaK)>62lw60Aa~j%^J7q0%*skav&oirAxMFvb z1#S2aAT}k!pF*Xj{tpAVH1M|miCy-bm?s4SUKEOb_I7^CFOLDp`a92Xj7|*izV zFlz&3b?htv2Tko3ZC`f;9guA-^y(7&FTIl`Ov<>b7unRVzA@|aJ<+w7Sf|EG0EY$c z2?N2MJ@Y;2skvmnhm!BDBVc?peUnUzkA7F=(K$zNO2#o(u{Y26hNXDXY_{Q~L@Jj; z)e6-U3Z0_~YN-sniTGYS*77+&7^8ry1M>qYt<!n*PEG4AMEyWHGku+Y(+tv7KC>tK ztfT}Yl&44h9XGgJj~*-I@q^Y^;I)Aa`Go9)rr+Pm_amD}9eAN&SO=wl3yB%jR}`eL z3XR1aDfGZCf6c-8>q_)V??aH$!=xQ`*ld2s;kPWjm^Jqmo=^U#pj;r|0&#D`1o3{< z8;u?6e5w^y3EHXRBj9BqNaETom71``jZSkOdQD&rL0pC95J|p#*g`<%=sK`tZ*#hR zeHKY!f$uzM8!SpN(=687Qakh*F35X+Xgier*^ag0)CuAy*boS1AmbpAwPN4@xErj1 z<pVu^&QZYb@nZ&oAC4zzCrCOtzJD4RT+i`J$&2X&hXBzBFAv@awgc~0InZ;aFy%Kk zeO<Epp2*tIKuPB*l-Z4u0^%3=nejK#cTX`9D}<>&+!km$ox&xI0`CB=yIs=m^9gl~ zT`ntN_)XDrW(+QzMD2;Jr|S*v*F!0AXZqW4-}HA-;3JU%E0y~VRB{w)_92B1EHWl3 z>m^rC_3Ys9U06nZe+nplrRzCDO-3=3)cXAW37PNIF)Mrq?1WJy$AS;*{#}T0Y}?;V z%67l;!g1?2%N&mPP0WrR!RHP@4|3xUnwx0q?w<C|&mY#?CPTc17EW4{d#m_LNRD<) z4)Xpv%NjuHi<Z2?XD#jsQ@&zT58W7mw-x~f%GXlQ-t*i7-}9ac@0j9Wae$}R9tZwW zv7a9*4LRF5X#|961jK0sL}>&hY59a{`TyP|Y2WYn8dl1hA1GYThi2s8DC(W%-D0fC z{JOaX9VEKyM=g^6t5L#v>KdDD8VGj+o5X~WT|35HNpOE0O$Gh}>bsZ!&33_Pe}ni{ z1U<Z%=uT;M7-E#D^Y-dT#!QP3a+3%!NA_-tl?=Z<Hk1;(jE3#q*l$w2A3A;B-k~U~ zJ3R}CBWU>r`H!S;#z1Rebr_h#1saSno~AS5LYl<{6kw4M2^gcwjA6o)VR<U#F+rm5 zK9ONTSY5+~I9{r6u1ut~l>9o=!a{&DB=T1EmE{M=*Y3^oLWRhB;{p$n`po(i^VDtJ z6u4;9y~VB@`qriB-p++N_D7&7!sNvo-@!f!J%pys{!BYb)i>@-cKas64bjP`DAer3 z@TaEA=O~xke;Hawo(Qt@n`nzz7t^)8#;YgF+JJF4jjN(L9_|st%gp03Fyr@a3(0>$ zJq(+g9yx9xdQ51wrEfJ6Ffo1CLVuVEYgn>e?S2J3ynY?*bP10hfNiCoG@?3KjIGLw z0!LQ2c7YB(30b+fPz|5oe}|%Mzp&lJuuM!-L@15vCr(``$1)IyvCt^<Arw*@ezKdX z3}|9S@AC4tq15STHlW&#X+Y}FY9Jt*R0oLHe|n5iqqV6B@q6cHKgIqu>pPiIqM9=E z-%XTcQmGekLdk<NALH1y4@so{@(cQuEalHL@IS6SRX8=Uujf!?<`67+W>Br+gY(h6 z#5B=VD8UmssPlzvQUHkyjOWcsNKXl5@~X>g=xYSgS;yA-ZEx_&_xxWzr2o?`=zseN zX_G&gb^w0-5XJca_z0;g$^5sEP_DYAfsQKLmz|j>OY#b7E~~AGaP~qdV*wt!r6g5C zDGXKyJ5h3TF<nS{X1dw>_!J{79bp7cA#s!vdT0>g5(L@r(nL@QM^PaVj7^XiGzCRP z^uE8_lZVqLkaGkN*L)}2&NJ?5-q*R}dOa^7KSrb9_^XFx0ncv=q1kAgg}Vp*?G9BR zo5zC`4qZV!KDS1Fh-Lf9{IvaLhnI`@4_K1hXFzk`SKRBQp^%TwD<GfKM>mwd!mTJG z`O!NFVkz%yQqJ}TP>9MuKj^QoMojkM2?&*w#0>u9K9P^6orlJK@BX0r9UDV$oc-&o zr-pEkEbyPW=NGVzwAEhvPZ0oL`4*2Lj;+COC4BTQB!`dc^EGdCa8{(W^5*X?*oOj8 z8UI7#+<z{d;D7?)N6lErvWXP==nD4;hxi;G{`bABQ^Xwhb&#h8w%I^f`Wjly=^sFC zR4b4xx59+IjLbQ^<(J;et~qGSR)Ish>_Tup>{8DBy#CN%2v2P(4|&)rwzKWP?V0V{ z`lUl48mOzN&H4RqrqcBvg?y-4WOF2U>7mt6>A-j5ujA_oqFb7G?M{QNPuB{NT8~>C zqnu~5h2@p`9i}<y&ptBmNt@>z@J))*<hxBO(6~QE?690X%1pUJfYIdl(vR1OJghk} z<W4wy>Pj+p>&*6Ix>6Pn^jQEcKwS9%i02(tfyBp|Hdzw<ro)R=+#nPu6HJmX30-ZS zn@gOWyyWb};n~T)T|{OK!`Jj&UdUD<y5pQ9I0@%nl!hs5I`V|M()Il7$%Q^o%BhHu z)pSaQWbTohU4tkw2YstWQ5uIHi{kPH@J0ChSSdL3mpk>MNH};LC72(&FvsU%Rse^j zjux>WQet&Et)@=3c-mTf%cYz+H%XB|Qk1U5?>ifH=85JS4v7ZU{^aF<lnt335#}K& zIcqFiUK}dME%IQLtpwCtw0-ew%TyFJd59uoEpq8}p6P~ehNu?l-TH|nP<qIYd}xdo z^zcT?Mj|`j?g*p~#>~a%Rb@S8+SzB36Sq??WR`W90-n4%^OI>V?DQiY<?dL^V#p=~ z@U-;svFQR6ZhPAznL)TdcSxe_{EAxr6{AM#mGpA&!B;0!Uq2U>*;6Lv@W+4c$|-Yj z13w)HyK)H`VYKssj5EUx>NYOuvKd59>Iw@jzPk*^g`w;)vd18^o?<^w#?<lRnF@K? zXbj+}laE-QiMaGB4tyh+A!)+A(5o#Guxy22RZNez;fUbrwnBOnFLQOl5o}3BQ=)V# zPrV%{K=T?Mb#luquWNa;P!<}DEGU$k;wvPI%!KAYyrc5#=+ehT^#hOLUZxc)_!5u$ zE6~646+=(y&c2%z2PxG_mi{9giQj$Wd6&x;blTLLyoj;}AUHhP9(Ur-<B#eGQMVw* zxLUejWAI5!8T;|>!walbxWmpx4}um=b)X!m0ASE3E2UQs#A2Woln;<}N8MHwYL(k0 z)Hye|ucwX|Gt*UAu+A=6ukn>qXluC9!95`B39&GGiMyT8;|`J@mlujH-AmCpBZJ4) z;@&FQ`}1c;$6vIT_aWY>|H_T38q&$^a4#QVz^yFDs3bnFXjg-@T+6QDY$e`singn1 zYqRNkO>#z^ClqnfE$P-c8l#RSZ?;j(`|Z}su*Sj3?QVs|b;%A1Mdim3^|0=6HG`e< zH)y^ZsKCk875h)_RY@k~2MR1y$ihOisP=G%$x&(z>|X0iRreL?@Q(cG{G++G;&(5s zwt_IbPQ`O3+_ezcAY;|mtp?u{lT%B!;%tf$-QO$k)*0dFmq#^EqeF35O}46{=}@&v z!O*@v57<WP;>jjBOKv-vh>8+6C6WM2<Yi^k0NkX&dSmkBEEJo{sL+Y(3ksLMQK8$? z<SxcFU_PR*R;>W2)pExuk%1~J9^9k+H{&Ix);4<9nj&<j@qw-snc{|W=JMkH#nuKM z4!^xUViQTFKL@1JvFfTb_$!Z4IzWp$6n>fNLr2r#i9bva2LHA>J-^0;LxiTSctvPo zucPw}nL$0h{AmN5-pbw-r5yA9m~9|rU7{|itVvpsg4Lm5t=aH>0sp%mD?7dKq8eEH zRdCj7oh$j^nLxFtb=Qyl^{F-PpXEFku{a0PD=nc~ko*XVvnATOA(k)KIVu(|k#ATu zON!Szk0WW{INwwJ*XB{P_^+)?$YVe(K55UIm_3niYb-u-&$5`k2;PYg+pRY}mrz`{ z@*V&;pnYSNd8%&106*@5@J8Dhj5WsLapGbNxi?vdV)O_~k&P787HT(R)#GO^5w)|t zaAt_P(V~z?cpU$a9imD|pYqa(sKL3Rc|*)>c{T%+N-V5YBnu<(tg{YQ{M}kJ>}95j zE$W^%VCGVDjv)6BWA-pkqN~GhBvo_j)hBGLJ%t1XMmd16U$;+TG40`~Lg?cJ-cRN7 zJjy%ou4#LYg)l5CzAJYMcWLP5K&o<c$n{c2bFt7_4eTO$N0DhC=c*F18JT81{zT@c zUCvSkWq`RmQcgKUI3lgGR?h4g<>3`s&N@!UL}Wmp9kTNZ+s$B*VAJ1js#lIoW8W@k zf$lHQY|yJ2G4rhoWed)Evh^+aT3-tb7xwl;^fs=$NxHAMuh3)**3$5|Z1VX_0Ud-x z)~z4<Mb3ce^<1b1kJBGoYH~)BMaq7g%A7$5q-j#-Q>^(Q0)6Qy=iboYJ+wnKOo#*q zUUkAW{2}Z*v8wHmRSg(dKD{|n7al3K=0uxgF_*?4_GbNdz|i((=rK1dOEV28xQJlU zUBNsS&3JFvk_HS6MxXA4JG;vQ6SSJkW>U3=6q(3nxC2og*ZFI99htlh%F<8=PyG?% zJAjTD9hn{wiMC`Yv3aVEyk-0l&zx))r5$Rrw7#3w*L`i_q#;3fAb*h(wBk&u3U2=w zS#(Kcq>dq}Qu7vwDL_2zM#%cNEwcD@$RaNr6xPh&@<WiN-Jf6|2{p%A07Hv`4Tnru z;hge&FG?Ur(UIT;Gmk#_b%3-CI5|=V^rZ8KS&nwAl3LBg+!~$0#Er3zXAX^gy*$5W zJ#YBB`)+R7;6vn|E^dh_gz5xjXlA{)KUWp-Q4b#r#@Mjm3XdH8dp_=O!~G96JZ4nt zm_3(+@;zu?*%_9lM;nlU^fLWc7{kL`z@IFbfVWd79*~`xv}MD|H!UrAspL_qx_FjY zE|{|nV&mDw2VS%u1;%6c?w*BJed~v`kxtaKw)CS<p~+S5Do2mZ-GeoDIm(*UblbBB zt%<`anf&y!Lo4a!mQ4~6x|SsJfu*-J$sEjW#1pZ3H=dN%PleOva~Kg9dc^FNd(*^A zi~$iY2GoK98Y?FCS0?$T0->c1LE08UkF^E?n@tk4bXTf6rW;iN|G)#`-wU=|mx+pW z^K1AEPxy<sVy7ostq60NJ6h3L4ah!?yV8ryZ})1i-W&+SkWvG+)>Ai6wma(k{7Vx) zc&>F~HCfNhb**Z;AV*%q96`(~MVddq<#J5=E%x%bmsqw|FoKLhwWI_WfrgphnQu5z z6CXuzQIU2zQly<;XWyMvIYxVpaaos0+o0G*r$cAI7QphM(G*@|3Rx7FFcg+H1_rzU zXu&^UGZbw(zA*k{sQEwJ-T&PPo3gHb!~UZtO8%o8|359Q)eLPcO$=S^o&F2p+L8(5 zp}m|MFzcK2Y4YZooI7-vlmM|$mvI^0v@05k#^Bh43}uA+cNl#vDe<rxd;r1Jl8`Q; znX16lTAGJ&n$vF4QbX%EUIx}W^ITe5t@3&SU5Q{O7J%=hr|N{_?L6_eLce#@d)xOV z&-u%_?cwmo_cqoZq@UTX4P}6K7KSK|p$U{?H6t1yP(fK}6gFkXy+*4hgV<C-S)f-U zr#3Qirbu(Fz?2^4oO27q9$)-MN;f8KNyL{YJ?zP>eHdbtc4C00qOPQPWU!2&CbDk? z#gqTOtmGItmBwiZ(i#4ot~AM<N#{O5ytRkMtbG<j{b`t*Tw`V}p_M%Rr;$79PvX@R zsV$);i6lmnio6n-WGpFL;vu<Za<Z-2w2DW$ZFF)=y&8qJ@s)~=Ya_xl%=wC>D2D49 zc|~}!Uef#6t0<{$QLA54>*S>oar+QVO|^;{Pr0L@Svq${`cUqYb3!puk_xrk`~f2s z4$=6DNqWPi<h}BSFtu344y7bW5-6#w^1Sr07xj6CMe%^_uo!i#0#Y%OP|}D5Hi=~d zAT>%?<#F;7kQs_enI|X+&-UK4SC4H*Xz$k6#dD#JHD%W`)wQ9`gMasCEplGp+15IU z6Ios$i1%!DV`=T+?#48>zS+@IX8gOYH#u-?alT8ZPK|lYVq^V!JFKOvW;^(ud83ux zLu(5zCpOPczOT!-e{raP{^ktRVsky@Dh^WK+}&B3FRtOqWgi+U4QzUA3lA=;T^r0d z@A^1!#7w@c3pRY!+e<={T@_3>uN7gT&ZYT}dl!@o#{4z6em}-qfD{e2x1)rygM?|q z$~kQL)j<)@vO=4C8G*J=4N$1AZw2Rmp2fadT+9bE)maNFxTs~&+d7zMc|B3WL<Uj1 zZsi8&UMz?RPO_9?6A!zL2<<cVGookXqD(xj@e<bl{(bN@WfAQTL2vsQ@8CUks}rC~ zpshJyC%$z954YkbD%{)eu;r$__$N2LA~=zoIiW607^tA_(XNe$_fP~7&S1yH!+8kn zE`nC1R0wI>+vX{c6ZHZ9a2t>88r%{se|GH42gU#zQ0NmUXmQbEPQl;>KO01UpG-xF zhMAGet@Sp%Hm`MdjmOjPIP~LSAsR{_bY8bCs@jzI$C;byFJ_p}4ZS&7Z50_O`eI7N zW(i;h9?n+HMrcEyMa;4U!_Ghozi{pxGQE(A^cZbM*D^FdkF!oHnZTe)PwRBX(U}(? zz)7O`EI-w~wZA)-VNevUK!vrhD*>yhinw|mvfUY(ITs{H@q>ra7U46ru*JIz=wm9d zF;!X|OhX<Whby@EdLwz}j&mCqz0uvOMY2q$gD=c%D_3y9)#%Wd?xRv(f>dP=nR=4l zxNX$#CgzU|2CQNlHe$YHss84x@~UZ$4hHq|mVn_ScG%!N5fMKm91c^p7=|zo8r6>* z?P|XD9+UWDP%m{eNMC_--N=2uSL^6}&eNCP&+WmsRW>VN9*&p`Y$sg7zQn{D{#!v; zRS<ryFNN`G1$&o1F}84>3KvNWoJmFV%-c8O+_bNIX#@6|TwmS?e1UTbXV^;wcYiEk zAypnkf%%T^kAFuz;*kB#n=RU6S5D;H4VulNEH}@JCK=qNO11+GEgwaF{w@bV+0I7w zv9Is{_6TNs6;4bfV&G2F+?!8t_RT*ZPRA+&3YvhcH$VRo@|<VC3gwj&$BfO-V`@FC zn=<bj4`R5)+UVIt#r;&Y*Uwy)gDG*NC7D@T<0{AdgXgzsgEq25-n_q>_cJWAB4x_b z4sr?l{bUCXF1Au6!xGz50q^*hoMxRfCv6023Ulz-l1VEnhNNZ|1B)q3I%%dZBweC{ zq7Jg;D<Y45(bQmdC2!6z7<;X#GO(CO5vrOeIqlFVmZPYm;9vhF+rw*U%S?nVrp;ff zc(;71!Et(`+0jJ9iI1(qaVEVoRz6$i2-pPYpmD(Pi4t;kf~*}mp~(xY8iCvAL|5BI zcufI)0XjnPLybDZkarO`MSvm>DytZjiI=xW#!lL_f$9hQEA3X@nnD!*RNl?s(?@NE z>aFc3MW@VFGr)CQB$1LIP;ReFTIPuP`ytZ&ddWk-?JQ{My~a=dY#d?Dn9JR+U<kFE z+FoR(@C$F2@|Kl1{$lZ6+jtK-6wgGR>XumZvwTJx?G>2$s9oAGeVZ~>tF~+EA!-(m z>IQ%J88YA;P@JFS!X{al=t3shM|egk*++av{ZDFPRjaxS@0L4IYtBLG0PQw;DF*S? zZ<n+-4d@E>RWfXA+%R$L8n`y#l<W&#sSrf_D>0l+dPQ+Ym$GV@v|ZYYBk7gyfohC+ z@JDqu_mUpcx%#CA^k#lc$&i$LIS)FwXd>>aFORqR)xAt!Un#cfo}<wVPxCXO_(HN1 z1a@SsfrNA|;$;!wTt7=m8*EBlAMSNkA`H9NQjg=?6z4y1zSN`zi53(s{%9G5Qz=u9 zKYFS%(1j2_jfSxJbWU<sS}1~xNc+!3H;~AYoA>kiph|y|n^&z4FY)(w$caVhE&B9R z=*6es1aUi!wNhE2@b6c)UlhMFH3e#1Ozzb7B<;i*BXlo)wR!F`Xfd8`3Y&BmO{&Tt zEmo|m&hZxQrM*MlDrTe-MOZY_xXD`E^~%nyqxJs@EcmlnT|#?h!bE^~Oj?LRR6=YJ z%C>oe;AjP)qZu5iYIjV-%)$egt?wg&@1>=3?&=s>0C5M6X>mtVtyZ=!2B}r>yKEdh z`ykJsL5x38`)#=06tiTzWU5~7y$I@F9^QY{)g3+w>FEz&RC)SFtgPI=Yw78aUR-$k zg4NkColg_aAA!T!6%c4Om}!`+<bpqQ0+4->r78aWXzE88cA$}p+J><U-e{O9gpHyp z-vbmUiO0@oYDp(s7K8s|McE$ej*P|n6gM4Wjy;D1?MUF+lf&GSAt_cIem#gd=}1WN z!{-Yv7u!&DS`BvAn;;h#B{&0YHY%;<f<9fwQ~v1GOu8lP8RaD4Wj#AT8tU*!x)1VY z4GXtp#1+1itb3^a7*(i0puy4lsGf5QYdM;nZzQ0D;_p48oq+cE!7xO>#FwqgmqHxm zEsHcICY_%jWq>Zm7@ZVzwvI1TaHVB!+tv@$t{;scNQ$3YDLEz+A+>CbJ*A?8V61XI zRE{edHF2W+>j*Xsap@v@GrX9S?>Aj1)O>n)2><vW{;ha^Ul3ofU4lJjbW>a2^IYC@ zQ`D!zN(!JODxfm&$0(@@o-7l5d}e9E6f1nDLAK?h*%Ok8KiG~5*Vv^@%WSWuQbsao z-C9;J12Eka&R1h`eplFcO<ZW+$OAd$jOc?t?AAL0an^dm{JbdUXXh@B7IYcti4>g9 zS93pKRGg3MX~g0}B0&L(fS9<RY#B+0=>v4#FuGEvrYau{*Le8u1$j{>r*r4Lj0Y}R z6z%cp2$#`870S~g{$ivR9PtC!Jpw0VI&FXTTsJoXi&|N24ylo}W87{yNZaL6nr_xn z5&2|11-6-+Lp>a&LF0J+B;zGBTvs)mJZ4zezimxrmgLw)RpkhEpZz)dLM*xvc{T`_ zP3gErts(0QW7cGBmTfMpjjN+J7r8dXcq#htiqPNn&a$OWaLQa^6}W*^AKl0`(CQ0O z1}!i&`#9y|`bgn>DXql4FyB@=>ZNFk7J5j_lGZu4{gG=CD9ZWu#QPJl9rqPzi9UJ_ zODD^1tgVa0t%WA7f52NQ{?R(7!t%3qW|jP|xe6J<+;68$WP3_U#tUN04)-iyTMhos za+@`Lt`UyeK;N&`7GL?FAJ~20SP;%SB*54-7;iZNqS|sp)@qYrDCu$onAN!erleCs zhM>o->3#^zHWw3dB5TdPC%5#`NM#P^9`rzqAFx0l^somFaOzdNa-h8j$41$_%2_FV z7P<#|-Xf*e?T0UdZZ=}72Vf`oJ<b9tWjh>z^;IJSd;Gwgp>8Z26;&xUNp6Ubcw%J8 zX&*-G2HU<`Lk<-M_kW`ujMP`u*?@XTG?K_o7WNKSE8;shyghEVMMu?2<RvM6VyiSV z6<*%t8piPp>ZCh@;s=6C$cF#dQb(mV^UgDZNb;b8lgtJmf?N{ZZN9~esBuFbsT8)d zD*%0Wh#@D$Ihm^0OzSqPVYiP#=k`RC{*}T3C=dzzb>>3<N&sz$P9zih;~0Wy3Ne&1 zHI1>3XlfSeIQ=ZdQxaM^lyMm}gCm6Tn=GWFA>{3cA%BQZWC_Z#sYmGG684T$ay@6H z@PyoJ98dKYoMr~jXU0yvFL~5MnPNuL4@>khB_^d5QpL?=L84o(XusrazpoX*jK5{U z?T5cA<|Ax%5IvocdwOBl<RaE%ew1KZgdjV#kRLg?rWMRW5Md4ULY`d0$}hsnUxXVW zgaQ~rv~A#Pp@f6b`_dF+48I6zei0fHjWL80($EPZ5RI`xJLz%@`H_KYl7V*ULf=~x zjaf<m{9sJsk0u;lgt^B-8pB2!BN0ycMh~iP0nZdnNQS<DatZoC@7s4tX!C63;DvF; zkph@}f9_IJ`Ttn#6qmkw5mB@3E#ym?7t#FE`Hb};n4+AX?MA$pdT6>X(p#e-#L>^6 z(=*Qr*l+x}XAtI3qY$LZ3~?PjjrFBQ(uvH+CFBEhJJT%oM$lP!P@wPm;aq}IAob3_ zBq0DE|A^cy!5|X;2!N9k09Ex`PAP&PykU$6k$vZzH4oeKZ^oTQ2)>1s@=D5pnt8b! zF_rt^P|h1}h8`+&0_8C^=wSj}SW?FiNF|XQh*&>?+wcOSE3Z%-_DGlN>SmTg;g=C~ zH7pru@(uGt!o+3!1gA!^pw8lVQ@%n}><4VlW*POpU@J@d`T=LQ8VsMRMH+EtCn6PM zL_%ycn>TFn>bo9=^~Ta{A0S`liMEH%GbgTm%pa2NIoLI6$<qjpbYS<kPTc8>*@eFI zq^lUMpnJWqO+SZhVVI$Wj)}**U4pvFK-Wk?E6{^JM4=nkkWJWvs)Z6d|NW-}wL}kW z4<)>T7UE4K%!OVECFDB;_f!XO6a{A{1b?ggSv-t96i-+LjVwbk<_$SU>0W$_+H5Cc zzAh*1y)&4wR+$^`C6@=K{btFWj6kvBr(gp`H0$<bs}otLwF++K{_gvG;2TT7;EqKY z(y|Kfo1x(BC6wv3J_cBW8N4yKigy+R+=;=Y-AktG;y&m@%s9E%Thy5t(eWcZJZ(Jm z_{oJY94Edoepg_j=oXD`s?tn(Cj`D=4C90?lqZ-_wg4^c&vinGhg(bv=mB?vb1IxG z+X)}YU$s4E*hgL*m;~2Oe9q=e4#~jKH2MN((ife|FF{!(&#JR6eDl)f)ORD2=p!5B zfxf2?>Q0wSfJ++}dfw%k(3)UUT<a}CW=XwzG3eFS3?AqiEtAcBUXkZPXfV%UE_dRb zGMUbI@<1mmmD~}P6h0cB0ycU;9{tW=lX|jrZM69cy*lY@M6>GS)3^Cbr8{$X>w;~( z4Bc&<Wz1w?ox;FAhV6KJMeJgqm$yPF#q_`CtAQV!VgRHM8Hk~}4H*yu(ntDnLUWlc zq6Q4$*hLK~A*Bm{j~Ixex(yqsqJ|mQlLJVYG|(aR;r@v4HDc=EL-@mq75$75az_nf zI*lFBfO{`=5QS^~iLuzuE(DTR((dq2k9M*TJ`-%D@xysnM*})Kp#hn`AKZ?NHq2E4 z7T)8OZIIbw6ub^cO-P_RP`UttG)?4T(ut_>iWDafobE8%qermr8{t30mH#<H`S0P% z|K)`ZVtkYS;{kd8V}|`dX@}~jrq-lP|20|hRo0bXRKWC`VSi_WRrxRoAeI8khDJei zU?)Sc>u!c?a-a{!>bf_gNp-o<-N$#Up%};PLA^$IGxwH}%)m08dFH)v`3iW;`G35- zAsFCvY0?@=hK6ZVYqo{zq&bR5pn<qUY@*at_y4RXH`W!)12R^>*d4-IJ<mA=p%nR> zf$Q4A6<SyfC0=0R&BS9Vg`+_pbsTi`;`A6uoWMfCW%m3Y#WJg^oxQk|Ob@5)x|pBQ zVRNv#=||8lU|=t+8FP!PP$;Yr39CjMDj1xs^{9(d$`*gFkfoCDJ%AutxmodGh4x|w zVB_x=gkeotd4#~jXES1<hxVPV`R!Cgsa?WN(7$+<Fv1DL$A@mD1yF#tLhz#12g8Sv zWvyK1XR_8&9kUI0ms$+08qHDn&JOa;;>W&52<0zXy2Q7mFwyE@&l2XY>(TC~J%kRP zm&DDEEn2O-MB7*7es_)wtvdT|Nb~dMhN@V{3?8a=nUJNeQ(dhv*pxg~ZsBGtb!cMU zXb!7&NtX5sr<-QcBQ84cdjntrE;?j+Bu^-ojRCJTt8Xut=EeMx6rT{8G6!JHbtqJc zIav~!#jJ?{Nl#+cq={c<lIQ-O`bb`vUr5X<I-|U$34_#sB5xK!u7BPXM)>X{Z}$`1 z?cw3><A-4)l{v<)rzIWhD<KeyUO?8cO}UtC{<<Pi_y$Wc;D?zo4CEB?2b6Orl%!xY zxg2r)C*{chM`Hc&lr!HHN`Qj+@nZ_+#}9)47lP_PDfeFq7ptaikD~tb3tivM7TsZx z>`+YmJZz{VBV`U2hKdN>2pVSkSP8>xjWhaSw_4X6Pf3afe?45v_f(`rNih=RT}hED zgq=`<X2`hYD>^M-@hSTNqQjuD*2QdQDwD;$w?pIWAm6(Wj5A=C1bQIK2w9mM;XEVG zh`=nQn})&?>_&8aR%|ZJxzSsH6iPAURbfmV(q^v-k{R+CjuUbQXAC<deS?b#R+t`o z999!`A3%jEaY`Ar7!U7)eabxdZvtn~7l@BXh9`|Zm2$ydQqbMge5e4Yt!z9Bxrm)5 z#u7Sg;zp*K;hOZ2r!JG$qr=a2z=`p0;pWwCR4OkAuWf~qiN();d=opKSP?nF?&CwO zI<Fa=tc+rXqt*IgDju9x82tLUOZjh&z~6P3e2y%#x%j8I!PKFgQT%2@%(<3DO)tk) zD*4$a4_mhbQ=pD$jlI)=VPm}e$}BleeWGKn_ZdF-Pb@mKo8LP9(NOvg<LP>ITn^ts z%-!?JW)8>ig5DAB3YEXCb>0tLpivqf)z;oeNgg)J6k>nwN@*kk%`GglNOg>?^1RYZ zmloD_PX^YqGHh@h`lQ87Vt!(Jn?{~)#{-sKr^f3loD5uYwmETlGGPZZYh;Pa*9Qi% zUozX_)9o<DRn!57ZQZMVfh!>Iv09-{R0p`Tl9Wh_?$KZ<J<NPivL2My79O=IDB<-s z`?fl)ci0H^aPhTz{*QyMD5Fe9MiBWK?IDJ0M`uI0bSL-Da+23^*{`VSFnjav0$Hzc z6z!iE*JuSVy=s5!B))syWG#DBKhp)WC4LY7Dodaz+7eC@euh00g5nYFsVv01N1;T- zpRa%F^W6Wzk73*$PLeW?v1#sQ=;H<)_mDXNp6e+LZnZf&k7akaRjJiU;T<?$7|l#h zHOcS8(dOw!vedVOqo?=pBV%TtRL8g!u%<g-@h012M1zmBzv}m#r3W}->J=1nFAV0_ z`F>Ev;#wwvgB|Ab-`sn)%_j5j+&tj#t&+z67{V?Ir^Jcab?pX$w^v%1rq_3YU*~4$ z6EsLo3Tu-XJf{`=D{}g9<$WgKJl|=sPcMx4Q%BWaW#c6|3ylVMB!JsIQF3??8g%Ga z^e^!Tybu(+KH<Knp;5KGAc?^kUzWtEI$d6r_~3s>%;1VY#FuM`dR^cK{d^>yJh@U{ zA>OCUgfD6UbcbDwoLCeelYIP~e2V7PB=@Y1gQ_b}l@}zb7g{tmWDDWe5#)awI{s3i z(O*;Zbbt{XS+<jR9Cy$=`wqGu@J~JB*_>&N{^_(Oy@;q$yU;5ysH!U1&=YAZ3bQkZ z-=fzqgSih7-kvxQhB+6F;*{URl`D#H^a*r#Kts1P0w6LftCoe!pFbwJLq>cQpMw{< zdmj~zDq}t=`wiBujE_h)%BdVxiYzOCi3NNDo(WgQ`{%IF)mQ4Xs{*SMt0Jp1tB%%I zF)|)_%?HTBh<9k2)Z*DR%vP#@E|yeQ=8<-SMO8)cfThN>u!v2iMtqxGjJ<sNf-kyy zg93Rx&e+dWADtMBi?^iKaR4+GLXveMu4HV~RJAx#R!R$1V%0|L)kA+YIMtZ!BG391 zQ3#D_@JP*Q@QAHw@W}0GYEU{-*(0{3M$4@l>_obrOafk*9SnHFtthe-XB(^tL&#fg zU?-o6aS<*Kn79Xn0QrJlpmlcynKDgx4F9RA|Fd%bcTN2dbWCcphI|V5$Bz-w|Ie|I zhONzi9}Bhc!1$mpzwNxZC9m0#6WK^eaDwegxS<S?f$jl_0ww5)Ht}_nBsJD9!?xf_ zx6xE=mbGfsy3Z9$!nJ<k1gQY=wc_)hm)19mT3fBERIBd4dpVl^k!UoN)_3{@GJPM8 zdv5r5r1Rfi=SM*d^4dq?u{<Ji7>4C(JThTlsN3Ur=-q?C>UQT-={INl)Tv&vIQ-D- z+(aPs4o0l+ob9?11ZL}29>Q@v9w8v?T}1e|hZyt^=cjqOcSp2u)gbJh_padH5VqgR zAZ}dtbnP-C+#d?PJ?<xYJJo@IHx;6w-tN#wo>cR`vV!#8_da=j0#^9TcR5~<5?~3O z4h(%V^zrvbIhyvUaSbZtC^=8V-aJ%*;#>7U;_puE?@pOG_~S<39EE`tI=8j3eODtl zyY9NLd>s6d@=Q@TUALD1D0EmJe`06%5Hb4^Js(LhzB2Uv2FCm*;!oc0STMdeL;DPV z_DzMwzS8)8WMT9s!1LUS`hAE2(>>nXct3gYKlOkD?S?d8ia-I=LCsflKTl1ddPb!B zmIM8~bo|QZD~3-lf&WpB|KtG2?G5jHc#!@5r1r<X8~Yc^_i(&Bs!uw^mp#Oean!cE z2<G=#5u(m3f#2I)C_%@qF-D#X%x{=L-oN$4AvpAeivfVW-SA`rtY4L5Chva3b%4Ik z#yzpb;W|4%lLwI_@i<~9%L>fli~JK+&o!gwTa#!XrZ57CD9Wj@iy;m6fpAU0?1Ob8 zag=0&QI2#B1y?i-J<~iHdB>26AI;t<s;G?Un5D(G#^P%I`KGID)df3=2lnj4&9geh zXF+Y{Q-cKIlB#U9)nI|e6hV~jBa}B=$Y$8Fs_V4vNo{3S-P+u0SO7eN6GUJ_2kB41 zP#O{E!~_R1r}ZFSv!9AFVKLi_oBay0?bnr1?0m?^CouL)B48(0(%eRzFp9CFfp1fH zd08E8yH@ooV%V$F%Q(<r`S^Ml@}0~nCF1yIb#p0#u}Fr3<7aIpB6!RB{fI+xmDOzb zb0q?31NG+iMop+u^Y9v$0bIxUB+@U!5XSi&-L;Li3eo1cFa>%0nAMe!t*Ni~j6PrU z<Ua8QN&e~xB~cmWAs2A_HHE;E65_H^f{l4(BFhmA&;n+mUNqzN&$YlI>JZS4Y3S?D zUbh+wbi!Ps6f%Wsk_yYj$2k@fClF!1bMz1{QzvzO_j>B{8<wA8-XvFL30zj>u}a+J znlUug93-e^q0(O4+c?ltQBq_X{2jHU1d&#W<&l;pz2#YjrNm|mKEE8s*-RKiB3ctn zeu}ZU({0Qyt{XokI<$Rox<<T_mM^CxqiJ4%=@R)@a|kb`F<5Hzx=c5!F#huhhuM&6 zg~I_)Ed$SL)&;HQO{KTlP1Y;w0ctebQ}iO|Ak^R)R)4v69V3cXjdiJ6UK#4v{-sPM zoRSwe(=sA$!D^^a>1&(XmYcW&jVmINK}9QVqSeRN(6$Zi0G<C6fgb&oENLgIk!AKU zSM$7^@{DJrOFBEnmnaxB-88q<*K3uWQ&+lL6OkE3SyYm{C($Or-mRKp!EC(eh1Imc zWDOQhTzkHQ4-e&StVI)=^&O_^?J$E6Q)(d*!m3G2fhNsGNGl`uN9I`B){d1OPIQs* zF2tnp77oGyUK|n*S&ndth~%_UxxnTumTcb$dnnGqeyXy+nD6kT0lEW>2C<-H3ORJ@ zje2n1wy!2RFCC$6VKjO*pmg=xE;^oc7DX<UZ_7OR$H4NLeS9d%A=tByhQsm&jbxji z=qsvXL4;J&FP=!!QmEy^#%7^DLH#u39Hi3p)Of<MrW5;{VuOD=O7PUC^8SdB!G_M? zBRkojTRCT4&8wY5#aL{%`|+;p8gfE6WcMY{gb;&ab9VlWb3&e}<xI-%>_855<uqLt zGgz{ks>z^Irk|-<^ZTUetDpsFO#bOJsnJ^@FC~zpX2yBY{wM`c$w^H^Zad8M)W{zQ zcb&?>wv(~t-ry9C(LH#u!x<sErC~?%jReu`KjIdZ-_q<!U>0FRfpe@%lq4ZlZWg(I zPSi!{Gl~2ujG>JMNRreeVh@wz?W{d&X{CF%#i%BU&hwBJ(CKFP3I>{*D3Py!V~;|| zRlWV?yPfLlHxlA(&KJssL@fU5N60fI^Jd0A-WQWoAE;VN1+q8CByyFD7>_zRK@_iu zYK@iBSHcco6snII#Fm$vZ|oNnu8ejxN%;{sic#QNnD#aFu9srg7tqC`bhPy1Q(qOT zC@LS5-Z~m)-lqG2zLpL>VNTSMcmE&4zA?Jfe%UhY*tTukwr$(!*!;(~ZQD*dw(WGB zj?t6%&YE@3Ju~ah*XL{1vuoF{cI^tyL(D}IkmdX>0X9bb3sJ1kGOkariaQCkz&Gc2 zOPX&E6`2j_K`Ee~1KAiy9Md0K6;<-hwQ{U<zJ|E+8$4;nqgvmwa1)me={UF&*)Eui zHaixjj=APLx+Sh93^xatOv$I%^omQxMAe6Gt5Tyyr!HAa*v*pZM)%cYFb}ty$qk8d zrTfc?SmfnDAj^D(sp;`k0Z2h_1jF&Aete;rji%;@Eda_?Sy<4+zZsF2_WlYw9!>L> zdFrXcw~!B&O+y3^Nd)!ckJc0dq4;%a4Rq8^8Tdr-8rcg4hG8}Ov|`r_-|lec{_2F* zE6U*R@?v(@t$k$@Fm6j1VzO@9cyYyB(wpF=4AICZ5*bV;ZTi34Ur^;3HkmD{exhKx zz13|XLR%$l<O^UgD^o)TG0W8+-20WSID`!z)hR~+(rY4wLoyZQ8$yOuyLdp9=oQ!< zYDLy8?YzURsKn<ghSQu)N+yPgJTos=Hko>yG-6ODwP58!z4!UWk}Hj4)1w$!9wStu zPD`nGjLoSlJ1{jTT4Ct9yGT)EQ(k16`G3u*l+Q>#im6SZJV3>9%AvtvO68hi*w_Q8 z<uPC;>JCN}MWP}lk)l)^G*zn{1#s1dk=1C?CQ%!{&)tc}K+pCgq2Z&_ygq;?Loa5( zGCpbRy97y8sk$1a5}TJ7!pjfek>`OcA8!02rZ4zaS<HfbO&|Gdr|X;M4kl2+mg=Kb zjbMjVL|(xS<gXkftcZ3NE7Q)AGiST^$k5C`I7ks{7rH$UzsZoc|3H%%GEj92)2teF zxm96S|JG{iZ<Yhd=cgJimG;43=!7G$)?I7-NQWy)($?nG4Lagi{|cei9LO5qsX}Z} zcY`~qK&Rq)KtZ(>57oCMYI4p5(Zh))R~X~bys~*Hg|6<ysa2P03@(H*j?~tr?JO=N zE6)C4=I;vaT&wz%gz&i*kmjJe5Bh=-$4)g^1(-IDqHYD)K_*@1pN&!2wD<vlWBuqV zA@itbkS$1(4f?YgY7gL=K2!~_=FFvN06$DH&d0b?zOEe|C`%(UDmf*xs{jfO8+zCn zTcluxqAzL<cxV@|8Hw&_?{_|Gu7>D??b=$A6fkp)#8aYTXqjiKPGx7xBk)3Ur^9v@ zkJGt&QgNYw9C#2m&hx~BxpG7q%MW-PRM3RxYXI?(Rh*!cYV#!S6~x35eLh*5#enoP zH75{x)e(Cp0sDuE7$g}NgboX9Q4O)YGmVkggCHVyD^|S9c17J{K-35spgmda)=Et` zEJ{r`kPWa_1@P6ZJCLU5A6r9vtZdK5pdB1hZLU0kb|T~Ra9fv@u_*Nw01seosRoeI z=2Z<_j3b!8ba_{*-Dx?onLT6OWB%eQlELSmU0cRkf%wXGRHg3>^C}LhUwJ9wp-iu8 zhv&FEq(yUaN~W$2eOHCu^Q?Tq#rbkOc%XJS#_-;ZD%OL&xA_VEez#Wx_`Qy3k7%Gc z98=jY<&$t9Lv4@lqUI#XN?|oQB~#fRD$-x`!AEi4MQxALMl!_#yJ@{dDnY^^TEz(m z9=y+&Vw%cy!9mT_{FG09jc8D4JaK^9op4yuq4Yb-Dj{A#bG<~#zQn+o2oc87kIz^1 zozhc@NQ@yhXELmS9d%{4>w{^*T8;7Yrkr)(ZJ7HzF6}aCKcl)3&Ee#dm{T9XH7xS0 zI1b{p<ieQ?TVTpsX&x0j2E2OACeZD8i1+#4q=u4>R9uwJbsby{O)lZjs5&+XY)Gas z*RiMukBrcj4W<2UvrZ1V4|_{(i_IdC=)+zZf+&pY;fB-m)Ln{xk%_A6FDRFA0kj`7 zi*<sT%vzUSGUVEtr@v^)SP+-pvL*U$K222v-Tmj%0U`>zL-NgX@gGVG6+Xxbrno6j z96zn<9LF|^Eg^BRy7(|-k<CJ(%3FAc$SKwv6!yUMcJt6;UP&6{fK#`@s^Z(}HS4Y} zN>EGHRvYWfN^dq$4k)Ev7-W-=5PD{hLG(5x3Ynyyu(RZeVm6WmUCE}eNCQjEf;%Yd z4}+d8?kc*RqIh}uLXv+oKcspNQqiMu{9?&^L9?%n$qW~iI;cC32~9$q02}q~E~iaF zeDIqfW1urTGF&W@u9=|}KB~B?csoe$8Y<8*x6<x4-Nv@@Y~^Iia^)J?Z4}wa{qb6c zg)7@FH5OOay-Cz-X``G?jpxTfV4|E+l{AkH^=ygMtCqt>94Yyp7-K3!F_}NWKH3gC zf8sdBIC!DpbBK;1&#O<Y8hr#pO@tq3)|8>?{AW?W=_dohQ=9-Y-wW*K5KC5)GXF%3 z2|H5^os2g$?z~sfmwOF4Chk+fld1#>7jF6Csq}ooPoGqmeWui|x|C15yUB|Ezo?@i z!FUbx?T-blOM)dtT0U(?nC!+zZ`#LpVolxD_$DHGPUh2X5+`CgO|m;J<~SDXZ-ER( zx(W*Z5)#t1QDed+blP~a7db{r-we*F^_ZF%j#!?)wPREEitL;o4SDo}*n|!Fi*&Q( zu5XvPhkBZ>>SAS8sqgFv=~?44*{`>M*V=;rocP|~o7ccJFUz#0-(OkDgfa?Y=CP?x zG*h7Ek=#CxB6&IY!bLseFEj}zr-2M+h<#Tq{ufI?C_8pz*KYlO?C<PUKGjkR;#e8{ zgqqVnR4hGnKAn<^i(-A@S|{)+kQzoS&u+)Vp;Ejr%cgD|x3D7x@&dg{32S=n;lJDp zamttAomFdprz4j=J?O@ep|2k^@7m-;*}GaBTkkEGPr?+v>)S-C)(=lxW|&_~(t8zW z&k)>}ociYb<W1`Gw@^c=6oIimID!;m4T5-p_vv3(WN*HQ>L>4MM(i;+q3>s&@#d9h zX<km_xA?$5lJu|8d@RRDwlCCtYQDfeaJ}+<T0X*NwtiTsjte*HH$V|O`Dd7%tsdDk zV}vGA!KKWr1i;6faJqL6S|WWNtN36RB<x-gLUw=Pgym8AoN3_M9u$t93N46eL($^l zTIRrhLuH95b4Hm1rJ{h-7=l!XD8Kb0sxNM^SenBv36e~+E|!Nr<xp`^ky?t<@j~wA z?`mVhgzpg@95eQyiHwHaRiSxc$`4v1Lh}~(a{!}Z#?uloY4Rrt)^kGlc*^`RS^{=N z+V>1UWAZ}e4VS%l4*YBUfV<&MAM=SWgg!`k4ne96VOR_1pWM&<0?s=k6DRbAt~`-0 zM9G<4m|_pZh=w0(^5>oI?X(yxJmg6e+cK1W?kzE&4}L6MkjJRLH_kR71DgZV1jo0y zvrt5?dKr3_6Qbe~GFm{MCZ~B!ZeeL;FX5>nEjMlP60Nw2hO8I)Ef=n659+0LX@c_w z-bcfjF63q)DNLR>fWiug>W~V&clMV@X1;(4b<xnC19znVAn-WX50o|!a=gHaF{?t; znj<g7Qc}z|WH-Ky8MxvL9H?Wt?^$iQMa>(Q9A;iH!CX8OJu_o0vtgC8n2JiMR~z^a zrSTOGdV%>6!tn)xRKI{cs3wIM<Q_y4(C?5^kgrIv4;9ecoNtw){D?TITS_CItW70m zz<CT>FykR%d)8~)efv%PQf{~_2F8-A<NO2Wzz4doC$952H*ay1@PaneXDXtNlij_w zUU<+>UU;6AWzyd1Eleg?wfC+RJ8Z?Y0rf4-xn73I*<ZH#zaZU~XCAHljv4x6gj2F9 zV{vr%;~~5KGR(p~Kz(fP3`D=ydUf>`USEW6ORxXNkkPkCfAYTJedPAC6boR+>l6Pz z1=8Vy>@{~NiMy1W$e$BaRl^Sn8j*JoH7>JI-@>4V$d|^j;wOsW8Ris*y~W7<q?!Jk z)B6Dj*n^`C_Lo#XK}jSYPl_F|u40X>3=#O%K0`vTF!${Ig7T3;NRV31t&k|kiRPgd zs3F;0*H~`#LEV#Uilx)bInAIcp+6%2l^HXh!%pnKtA136r0{m#AugT}=!9rqb}12V z);GzxPwSC$RB&TpUoLz1=7@Mg>YSKWMx}3lKpC}ysv-y-c`sklvMQC&U5_CtS=}Or z#w^_4BVj}@ob;9YeZY9o+yK175x=6DI9OHcVww-~!k7X9kTXU=OnNBEqt@Ty9Q)Bi zN=W+yd`yU5J^&;eQcM%%(2-hpK$&vrTrrR(AK-^^AS>0Vap9UEbx+&~q*oSI?2ff+ zx^ON4n-dFRVZS1Eur!zRaU*xmL4WW-=drox!UJqR7dmFh@BLymW;lSpi^SPueDK|N zrtIqyyXS`H3%^i&$RMjqj_)!pB+Dbl?UaBF65V}zWBNqd-qDfxOfK$u$H7wL^&;#E zaP#AeXq%2%;f0Ju<&4Y#m+NOU-N9q(WbbQTXt4uLTGa<RuFl0bcijV-F3Q@4ejGf) z^;5eqz@8UlK~WrE<^e}lSV!=j=`zdpx5Nj^<r}jc8Nr~M(8vzC?F~ILB5?E@Z^6nq zk<gCG%?0U@TG)(#sWJl)_DO=;w;YXHd(;6@1TywIRP?#YTdkQ}t=L=U{o409@EFxE zR(l_irBsxtu1C3~N~V-&s*ECU4A2?S6IQPWBXi@XP-)!(jSoOe4XXtszc;KJV49*w zeqvYnyb&(dkqPMaL_*gCYc6^q-p6F`AYvp;!K@D}^iq*zU@$_;Uy|1ojgR6ds-WIG zVMGr=CL2#p!I(_Z-jKFAl4#hin|>c;%bWEK#D}iDqZI&Xu`K#jAt6yN=FXozBp}qG zsWP!auN}#VVrV(-lZh^s><vuP5*fpuj8h(xlCM2bir$)q1N*ihUER-l6L38UjT3{( zK}LEBrR}w(wx?Kl+!|rIi>l`Yd4jn%V}Z>^l)2ofm`a6r=b9@_0yUQ|g?q3l$v8ne zw3NF2(fl1J8<eH+RHxy({bv%8b(Dl8OQt+)8f{;9Ls^Y7cSLq*kSAF5zUzyc4zJDp zNJ`r;Y(<ykSPd&ECMt>q&Vpn?RhN61DLc-YE151hFK2Njr%kHI6x(<pHD199y>+)U zJ#}$t77IQDayr~q&|TQ?iOLRHNy0%tLpkG-cwjxMv=$<GKSMji**qHwq40%_BI+G! z+ds577+!!#Ky(0M$c$eQ!3|lquT(xHVFcI1acGiQVJ13jW$Kd@Q31<51D!2PKN48F zY}&kRxFp8oCQdPg3s`x^Oh~=I4_B1rJ(L)x^Mh28Dj^7X2_Q7zM+Ka7KLd*ZgX=H! zf7@=Bxh4_iwrR?Vr@cQ*RVwHl=^G}h7{(__UC@sRi(FGjAP}V?s>u6^73P@d$4LK; zEV8R5ZAJ@eT|mE@g}P#(-FK(d#+OS2rj!pDN)5nDZWDEu3(z0xujcxEUda^vg#o)s zm8AH~jj}!QmXft^gu>4BoN2AoY!GQ}<x(?VE1qlLzWff&RN6%AvY65zbw<3<S=>ii zJDy`AU@K(=3)FF@)HlOabc_Z;ibDZ&epiyuA>O7>is^$6AmcDZ`$3_4*tZAk6RvwI z2l5bz)mJsK1zn7kqD(Z(1&C@>TgYBJYRg|mJVKu!UC4D?hyV)>`SHgHoU?ubF_fQW z67kBKe)e97XumOqN^=A_b727FcXm+Ix!8<F>D0r;a|Ekit&3!>3svOrjgD#Bdn&KI z$<Lv(*nqx@p!=PtBkDYqTte>A40e`CHezNWNQ@%@?KlQ?G#VFUtY2A#u1#RvgBit8 z(V}UfLJ2>8|6&dJ7iTRu!9EB920Ybm(~Gr_<)Ae|Kx}dd+33Q7wXQL(zVvtPwP^UX zF@>N)r<A6<<A+K61^LVE_$O(OR(muwBHj`-NmjZ3uF)B8NG(b|37U2ac&4?miku}) z{V2S)pfC>&n)V~(oVsxhuw6f;h6UW9=X5Ux;a{L5H7{QZ!aR^Ec?#S@3~X>KR0qyj z!LxQ)coV97Hx<G>Vt=~rFilW-ryr(KEsCU>hLx6qR)x!#?4=1syn$84pHs{gS!Rl3 zE^e9(Odd{bwGH9`VsIR6RNi0@O&kT^HNq&YfUGzn4;VBwJ_$pOA`_~(RJnW~$A+JS zK%$&nK6=IrKu2#C{be*jEN8pCZyZTqcA(cbnxDAG6Olf-XF$X3cp)A93U&O{51#J7 zi=_Bx@qJlGPtO-6><xg?qCT^ppa2No69h8~qLW@1UqZGJYRyTe+=h*F`EsrU><yqZ zNT-41?t}32a7IW$5odvZ4KVbmN^3O6j-hLCt8=|LqJ2~o6Nm@oS)?g2Y2Pe9*S#Xa zOp;hteuv8JCtItc6qbO;uQ$wlG~T498R)5lzrH{jH<QCnvD7okO}IBq?S_*`?T(1_ z(rnE=QWjiZHYMRv>`*o$UYZzXgPr71srq%l>)E9>vtTtburn&+H~H+V>8(nuU8#gi zW&^CbT#+CMMYcffooJ3CH<P%7EZ~M{LQX3>Pbz(yX&Ybu-qswT%PX0iE^FA8B*@RR zOU-MECuZ1@X4IT@AvD6l<5VcWvHtYCI|#Xl!#X@iGw-D;HGggdW$aj^T8xf!nbHUQ zD!}zdec}?FWmb4c))HqAJfIm~)*zDDLNFNyWz@$dhVX_oj~uEO<b{<PAyK8k3z|NN z$goOP23eU*(K=GMn3QFSd;@rtu3NiH>cDwM2YMAbVk!8Bvr<LzwqoBK24}*}WG5y2 zqGrg>?86!tXL_!55K$fLCLWZ{Ih?hOU^_7ogwQBo7~P2~4{yth{)&*v`Jsl1zVM<G zZpDk;^V2vjuy}S{2fy-?N(XK*Wg0ETRPvoh8SYdIU^JVs{}B&+DuF(9m!8hYZGP_S zG~@)wgsXte#uJeVlxrcni(WKJm6{W9Na&HRUj(L<?X%?K4}kQuyGt+@F$q7`kWin2 zhQH#ekXZ=4;rK8ueTHfWC=ko{t9jMkVX@2P*;;4z9P#9p^p-NG{1p%h^uQtqXc%^S zED!#bT~sv3ZqWn2ntRQIw3o4y5c8!^abs9CrEtgTZA|08$J+I~kE&Y#RVTDZ{7I=B z<p@;B`-ZE$@3ws~WqhAJyJ$gy&T|tAr++>8J*#{|TIWDq?>>TQ79B7?)=$@|<^|@! z4<L3hYj6g!C+!)<P-f9Tr&A{l$ZF3>N}{Oq8vj!b9xr0s2U>EVSC05MtmD8}Q~cPY z=LMlTB5vG5Agqb1(wz&D7#^ad3`B!lw=}#(u?n#ewN&w-e5@W-gzBXs{B23LJiu<L z=t~yh*yoAcWT5U(DPgNFj18aF-rJ<{cH(Cx>@}eRGZUAg2>vrK1m5wE2@b>V^ft*R ze;fL`0C-#{RQ7@8j9~pU#3;(QINgtTmoW_@LU#u1;afWO=S^~f!yA6Ce;`=rAXq0R zFb%)$?$Et)f&7Mu&tV9+eW;#@N){rrU&t)Q1f)DRa?eRN5M)dh^CtaA67Hf=rU`j6 z&o9H&AqW@TW5!h_Bd_-0$^e+?8Kd6$VI1}rnE{xLk0??U43+0uJIFydN0RGbQ*Q$Q z%trrx0{XAn=syxCN|63eg>Svd{<oO|)Bi(nV&Y)$ZszQ2=FA{u?BeQdWa29Ff4=;0 z1xkv#js}Vb>KA+lqY<W<pc0Z>cQS}nM4K`=pp-HNeLgdSSf3j!%+!@Rn1v$0<w@XW zq2*F!7vL*v5U-|T^S+U{w7l$|mjNY?yxED)mFD}jbLzAEI)m@`_jj2AQ1<XD^g(-m zK7tA}ztmn~w3X4D>VQSMk|R_Tv~fFasfMW!{aaPxL}Yq*v<>qKa(k^I1pQ=tfgwJJ zSX2HUy8UE(ks-%5U;=}<t~MV?WV8@AslaW^nU;S55eGBdB%XX*tkHc+GnPw-3PYBm z4#T$5b-F#we)c?<>?A?yfNau2au(B`OT{PM3C6s1_|<vTF$Zn&urzG~-RJuJM_#qo zD5lrW)T3ob>dkN$DfaB?7&&DY?ki(9etJh)-5Hk7Pe8_GsCVhW7&cvS4EYc7uIFVs z-5Sm<>MRU=>=WiT-EduPzQwvVUB!7)As?|enq*Nu)-+e=ESNIr)t<r$aPhF2&VDJK zXJ0_nx5emqY6^C{9ak;RGsF2Lun2Q%kayPiu@cKkEis8xv^eEw_CR^6AK!cLNFs~y z^CxHQBK|1PrQMhICzzyaMa7;RV?BRoB;`|8P$R(b+=^WhVA%`I6pC8JCra)<ED!Zj z<ZAt@(y6x^S>WE3ob5+grl@2n>&t}9hluL{pq%9gv@=Y&9zFB6BdvAqsrhayRIs7o z^5gb4olWI*OOt`JxfN)-`U|*#rBq#o%`FKXkB=jFX&p8;k)Nz%#~Z$5dduoE+^eGe zF<siC9qtiEW9seH08R-IC8Z#;!(707{Yb|oHEz484<eGIpqFw(Gz2wobOk2({M@_y z9Sg2s52xLxxl&t`euFYQp8hGT5C3o_xB^jsk(M7&XqxP_vrjEgSVf1-zy=Pcu;=)# znqxaPb$Wb5p|M(acb7aAnci0Hd4)%W#Ndt0JmTIMb?+cb*bz@MV&|0qDr8R%9kr=s zylYW`?2uNEZ09=Hoa&{o+~VRr+eJljJjgHZl;ozzItjz63<PTO1h&>&fxP9~K=CTd zGr+Ne#IS=?rCFC0hS96mF2-^QU@G}E6+AyogNm0-<oR{ea?&gJi&B(aMVyJGvmFON z-00g)5XxRO{5T3qjXk)tJZRykm2$REBh_WwRvxEAdJ_pXD_ajUu3b>|05M*ngAJ~$ z`I~rD?v6kU_H^SCixHj|@DmA~F{h}Vjp5~hk@fN%u!Ljs+w)HSAC=i#{vUJ13k^4f zDzvxLbKKhIT3&Dxn$~a-`o!$JWKseo`~*cMD{kW*aHRVAS1FFt#pCRgi8c{sm9&q1 z8;hn&x%;l%Sby~NuFl=ccMIh(Th-RfSw(}diWXePi-;}jntyOT;@<TrKa#mm{d5}* z-d67Lq{6#iegw>D2Y}<?#e-z4oE5th7@d=B`oSVGVF^0};`4}nOhRsn_p`<buZgAR ztpEbzSYZ|LX62W-V<>NJ61S{E<9G)~@r}b1E(EV-mITHm2lCMirX~ZH>Ed)pugUkg zBs<_uB1Z(`_`A`Uam3*h>JI`!UlbGEu*V9p6P(K{l}{gX7$|9Xfzb(jH>fR!%>2<U zW>zl{uX&{gFf)>glu53!j{Nf8zM`iHWOtxi+T{dL*THH@eFg7W$P)(hdUE!LWta|z zX_(KvL+*_?`eV6pmo*D9f7Gd%k6H=rmQK!wJ(WjrTMxNAoj`krPlUFLA9X^`<oop$ z+7HPUNRSljmf4Y+oR}5MNZZ<eCg$`S72G@WBRdO^+kn1T>NM+CE;<(qO-53Bk4vQb z?Vp**{`h?L2l@xC{~eS6J6iuriV|D-7NgRBs{`r&N3<3;GqV3rq*k+2*%U|g17n8< z^hb(7H5Vg7M%p1IhlP<dkrA<4ZEXbp2ygxKSdAN7PU1<L5tb+HCmKG(I=qOG^JL?% zTINl$Zb%D_7kA_SeC?iR@%;4XS)lJPupvAe9Kl{G<_T-|SokOF)<XPfcRatclg<bp z+|Pv7`hYk#+JoG%cTMCWP`Jq#(IF9D<e@TZ{3=SyvpUBU+ST+M8cu^P<ISmRrZQ`3 zmE4up%gUjkurV}P0zCuDw1=qX^XlW3pXwKZSKLSDjg}n@(-$<0HI5Hrh)dJrhO1M@ z!F;a84g>C&hDrm9r8L&=dP2tQzVbvWVw?L4*bFpVG)>YmwC9C34IA7KwgnQSqPK&k z<LkBKslRPq81`~s1#fMwJcUY!X61X1ZJwItwJ#;QFhgj9MtwNClA1{1PvV@sIu|P- zod<}r;j5_Hz1DW6&7yRK_&4p8<G0LP!lqoN4*IqGtMjC*@sBTzvo!{#c&d0QSrnp^ zwZSo%*V8xI7VPZI9`A%-?b{wk{!-2;k09`xgX@7WtZao@+)1={3*fP3qamsKlpeaE zx+UL=j!~An>h{OStGntBL(YG%#MVagZQrdiS4S<?cwM)CW_wesyZHoSp((gk7gQf) z#Jc%Z9MB+L+2G;4h>x^!_o6&J555G)5)7c~@*Jb78h*t2P^NR9KPj4M<68ieT}YR9 z<rrgo&YcPsT(sl+pLx=cq|ex9Ul=-wZ!Nh<$W-sa>SdmZb)x>3DBi<@0$X_sMg9x0 zRV2V=T2L{2Z=_<+7$FObIV@DnsYtGKN8O6ZZku{Fd1;Z4z+iGL!7R**6~b86zdQE) z#bMKo&+Iq0FMxq7U>G|BlT}rFv)PC;7B`J*wvFD>X5z&*>U{r>+;>cfiX;_*5L7M= zE2mppr<U1k$@iy-9W)_vgYmOsT~a>Y4)rGS3*Sno_<1gS21|}I()Uldn8S=m@Nk{! z)d*%xFl#XH?{v}|m3Gk$M-S*56Wn-ZOuIspD`#)J_83#;(LBHbhb8)sN=KXIul9}% zjx!#}T=IYbp+nd=r=0#NX&{vS2KE3|FhR*6%UL4I3if1Gh-8{0H*5_O%D#AshAz_& z@JF^VOYR43&{6)ktT}fkhRZI@$<H6Z7T5KPV+0D=3&O(!`9vV)U>BBFMXd==pOX19 z?wFv+qz>hR*u!b<_t~%KijoDAr<Jp0p;qG~8!Kd#OCp3*zoh=eMwgMmb7`|vau9`+ zEet;u2Q;qA8|Sg^q%{cpPf)IihKq?pZtIu%Q%(;iKg9S0{{tBR4h#PsFl4*8P^Z5Y z?9Ja4kNJND3=vDCf7qRw^M9g-s*cK{BI1|4&i8SbWEo&^v~EEMWW*cQWb`>};4yXc zBf6LdFySDpUoRRjp!^#6)Q7=E{BK3L&&35J+J=@E?z8LL4$qr>n_piKS3Ch+)d0vt zb4cJVWTr?eV5J0lCi(*qWMVK<v8_?p2zk^+7_DJgbFr-f+`b(&M}>ahFhgk$H;cdl zf*3nSFy<BSm;#QntPO3mw(@oG63h4!0gDPiL%|w%pZ91$Q%M?DsY_)GO&b4%x>8ab zu7!d+or^&e-gGL94xpyo^%ri|302SOY^Ey*S}+m%v>nYmz?RZnN}s{rrjmt#$LRaK zr|W62v1)U-iHrI)BJ-Jf<Og2uUxTu=!~&ih%8QxG#?ux?Px<{HjLEAqr3b3EAaptN zx5f>Zj+HTfDt4Qi`N_sRm1~u)g)YQHe-*4VLCO9U7z~2)qTWglnjn7L9*RRz@g~#< zl)?JS`ENAB$}y4g4iyG8hrp(i(wd0%yFf9-qunYG(j1XS?;(ra6Dv%_xAzlT8bIIZ zGobV&p)e&oXJ|vW#b)nx6m!*PVaJYc7z$G}ZIlbJ*Eoa;Ip+C&f(}Wtx@>$&j=afc zj?0DJt%y^{+T$wR(B)ut;#MVuVXX1C1aO1|9n+tC(yVB1HMHW6>(wz_9J5VIp_qpo zv2G~y*7;UjmR3$b*bmmMpNG$cw@8}6i8eLBlAkFM!hYQa-=UFk336nxl58XWg?<YC zHc?E3?Hpw!CN1#-3S*Sz?tdNy{aa`$a6U-n6N&wiH=pzpC<uoq0jZ86K!n?lUJy1z z5>gqCm}N9J%9+uro+J?uPe}I3=IX*&)v3yr#wnT@OiJ<xZxHh?ofy4om?TuGcp`BG zt$Uz-@@KZA)q!7z5C6=J$&7*t>X_s56(iy~PIO2b<sw^M9v0v<g79=nh0g?Ah@mX5 z(uphZcWv+8e|c&A`!Dg|e-@vS^7#^AAfU+a3d{Ka{aIYh{;yUjaaRGA3305ihoEbx z6C@}g2t-<Vk8x>OB0eOWh^V7~2>52Zq=QDQvvjrR#bQ4So8SZVr6^*tOFx7x;Cg7v zmHX56WV5I9>k+44qFNl1k)R+p4N2c<KrD(#Kip#o@shIUl3v8k_b|C&<<~6fkg1N9 zr=~9H0&Wy((UdEXf|xsXw6jfK^?L3FOSePWEBKAyu_v+T>;?nx^rIj)4V=Sc$hpiW zHbpDc^-l!WnwD|Q)|JguV?qyd*E9mMQ|6XUoT6lPE(M8brYOY6z;S?)#?Kk1>TQKC zy|uIQTJ%;%QEm^zu%2Rv7|Flz4KDr;UBfZlo<_<Yb=l%gX5g(`>zG8j!<vK65h<7s zcl4uR<XD-1>B)vp{QpcLzHc9Pn@k@vD<v%GVOx~=$QY@yU!Q~+hs{kYdP&E5>`__W zbARSsR|Rn?jk8;hOt9QPo*>japsFG!z=chmdPuY5qs9A+_n!QD2p3Rt3-u}Lc*RS} zE7wm2Y7*(+Djx^cWfikzf6P!^#D5$p0tv57;o`u7;w=lxDDV|(;}m#?_y;flJ<$J3 zfq$gJdtBgbOy77}4F&{6|39aIt&xk%e`2M|rZS2UB3}}1Mm;SN7}D*a7_f^Fx`RS- zd1IlvR?D79{PRR38hYyXl6m66gad%V@^ug5Mag>BG={tY=-J5p&Gk8Bal1*t&+i?6 z4_rTE+;|#nj07dF!QL1&3s(VE`H0df8H-s>;LkC>NT(*ZF{AZ-!x-b?OTo`ME(eeA z-7>Hc)a-GzfrJQOGm3m7g%5U-b*CbiE>9x~xLN*$Mzb!ZwMXOg5qCPoEBC9o4w<FM z8(&FxN|3OaLKo`JL3q)%W&u`tK8@?tuRvCCGkI6Bxq0Q$L9E6Nt+c!PJRkwvME_3u zQ14a-ZSBt5-oXa3E5r2a_i4p(dD)|p&4`NB=LqMAu(`n24Yp6uZOci`cIUam3$?V0 z-&0;ok$N{db=(3RTdQ^{CPv7mp=E0)^>mkeSYs|x_=7TlzcO!6gOA^bsDxoWr<6z9 z@bE>B1uhK7<64a&FBHNCq&eY9_`0()xiQb~%Tr_j1os}qxf+kN@m0uCAdgAUDm&T6 z`(iXq8=U8tA<YSqkle7&GkwW7i1%rrU&sVkB+PM(rONRX`4)bFU$WpS*IQ0oI-)N& zYkvYAF^Y5*oQNn<zoJ})0cbSn6E^+={;ZHi?*RW+k`7CBNlsk}0mtK1I0Gq&5_L03 zs!KG`TcXe?137VhLcLb>f&S@+|1L&k6$>6K7E8t$>n&RFhkv|}NDd(>$Q@Fu0y?== z_9hd+JW)~+Vu3~DW$+32Pcr^{%Ka-D|9P9akqZhc_{Jm0Z#?>+-)2PIoSn_=O+5cI z9}{(CaD-6D{w7V9YH64(V%KOh&?T2Q>)g)6NQxo`@r(N8>4i^+xV6ff2m4h$mC*T~ zL7atC=Sqpsi_&d}yJWfeWlw&+zW?S3u<L%_H`<ZFg5lpWoY$5?qt&=g9oS5f&h!m4 zb~(&0So%c|CQ?I}!a2b}QZVb0tX#Y^W1O4oLRWJWM7EgX8y0uP*#(<a#TX^J#&#lu zX<<#+jKpnwtPO)^&}L7<Bl>f84B#`O5@z1CeF%zQs!O(SwS>~JzK$8{OtQ!Wjg|(% zI~@)ur^@K#k@>*bu#pgXK>p3H_!hr}mN+uUPHI25$2vDC3U?=*@uEnqFc#A>-;?NI z6bGV!Xf$gK>H4{Mz|)0djD8ECzt}#B_Q3{v^G$M#|MeD2CRGy#U8aCAOP2=Asc~or zjI6Ee?iX1UDNX)C*{FjwZxd{k)|bpopm+EJdKVW5=9hB7tTqCeGD;Kj$#t4yoB*CF zy97HsJ09^u^C<oBK)bQOt({0A>Q`v>gQoG3E3Xyv@P0LwFL0jvk>nntM%W+QOu@Mw z{`e>U{~qQ49{<S5$d{Gx_;-EB|9|fG#O&Sd{xkO9tB6a2sC<i`<u!CP`NV#~(C-Or z5C@CMiEs(SrX&bm`@Y&^$_qJ(>*wNsQ^=u5A^Zab03Kya;B<F~$L=#d7Bkr$JrAFk zzd3+()?DX@^&sH3T&T8w-T@)l@iyM24<Iq;U6%TAn`z?W-(evr(;wzbK4N8VM#}zy zADVVA+2ArPzcF_J6R}B`yyMOb5svXpS2njw7vtsIqh@NCU3oMThHwj0Vuw2TDTEH# zQ~Z5M`0GfPl1}w@;pH`QT(F9^CozOf0gIiUXB{C<wD>*88c@J=Xr-^&QFt~c9M{2o z_sNuyx|u^$dlQ|g>6}Aj4Ewd`g(%;0kdVu>TbtV<;&n|qsYd#gSSZ%F_1Lk#H!zS1 zfwRh6eHa;2hM#K`Z1h0DGdlN<kOte*`WmG_fn`Bb^R;6{OvYULn^yNI8s<lr<?EMD z7{;<^1+^|Z8;Ec9d<eUhEf(z}xc0K;Rey;`&K&+R-CO6jO1=FJOLbfbtp_Sb1Wa{) zEKjou8h^p&scmITfU%jX6|xg(RLM!e6ISZ(Cs@@ckI)s&1;I(9Tw&nORA{z9+CxK# zS>@t;e~mIdCF2~UbKhh&2J;SAL2`rS$}rl!U2m1Ze?1TUds_S}Vg9LJb061T{ohRA z2JZg{7}BOToT5gqX8)Nq8k;IOYM6iNpw{I&<Ll`ZjcY8c1cf6vv>U{l;ly;1y`W0K zs@<eg>&e#TIB+hfSGr<ndzXIho?8w$mBxNA=j|SG`dK{Juj^|62KAotJLTEEdDi3j zc$}^41Lg$Ok$51b4PlNFd+Q=Kpcb&r;!j>S4B`_=wo@O7AgvOgjYuGsYoaL`+Asw{ zvO?J)!4?iDuacc1>5hekG)4fxM1rUasQ1IbWQ65{rt2?=*~NTl^Xt^>)a54S)0VaE z^lL2HfW0-CSC{43)YM~?sV#ImmAI)0jjPn9nlS9u*g8)Z9cvSXIm^;umuq!gd+Q#3 zsF~!b3)mJb%Ugj;P=qa|Ib6Ln?c-WA2y{>pWwXQ@@utth*bVBctyh9NwO7*Fn(|XI z)MPAfbTOM(-JDM(za8R~OR}h3)MRQl-PzO_W8|hA*=XEq+nKnEHnhDogh_v7+9kAY z?HJ-vouC{(O7m>HKc^pPN}%Mp4Wa(l!msfyGRZkWt7TJtli<mUbat4<KFTdf)mh6m z=&41!OftD52HwuH?x<xu{l#-Rv2JZdQl;+c`c_q`wrEb*l&G&!lkHwqiv^w-$I)@g za}m9+QS3^4hBo~e#i^pD%IdvM3mx%pueqU}QCr+NgSEZ&mlXHl!f7&HT&mwlfP(yD zip&xP0k}cktPV}HOEF2w@64<;$HQfVx65dg*JjCfIluX_KKA}`d8d@7D~D}?KF7Lk z3R^alI@uEiTwLo*fv@C4p=QNahHg#&Rbar9)MBM3h`p*w6rq`I8mx<yBru8@{?H7o z2oq&)6PFE(g_Gov+<qc`l!tl7C{}uE0#?l`>L=JDR~ECqiT*Gi*3Ubr<I<G6XzzB0 zLlxXIZR2nh+DH`M9cKQaQ)XsPk<fKcx9|l~ogWlaEif~qh<BmU40kC3!FJ+Ozh#$c zt1TX#wHykMT8ZRhNAWD$FF}+#d9s^j^z`yl%ogVWa5V2Y6sM~z)-l?}$hLgWBMo6M zLFVV?N~1EIq=c^m=Eo{6o6<4?QwkWefJy&2B8Oj6OSs*XVLHISTlMAjoFxX#Ho8n$ zCQnC3EHWl(uJSU=Vz9J0*r(xQO7m(k%6r7~s=M!_UDS_?LdfydI<#wBWFNM>CRKg$ zK=<a{w-Gx2fMuWE@@e|9i~lJyP5%l28my+ZTphv2NoKVW5cXd>Y~B@V1WWwGFYh4J z>^_ezbtx!GN>K2-z~mT`&)W)oM-(y1^pQ?>ZZn`N22~$CJ16QM`^rpPZz3Z6y))Q7 zxyWwrm#sKo^Y9A^7<N2#AaL24XC~pIsL^O3o_n2Vy%PMS`&11*L7*i{ph>eg=-BxL zWU-|g_jY6+(wZ|WrtLVAIWFa@Bu6;%_+KeM&&)CE;dGwj?M);JuZ(NjH)GWM@i1J# zAE!dh+`ZP?1QA)9+z-$Jh<KEVU8F6cXLaI)EpbbT19chvR3c+=Cf!G)VZLZid1HWW z-_;hfv8yaeR`913s-|ul*vV5Ir}Tc>iPdgNNEZP~A_Aqi^Xp!M-FSz=ToN9Ikpq9c zDKoNYo9^;nZDkS45%=X*5jF*>V7O?Xg*W9k38l&l?9_m(B|#D4qvBnUj47z=hC~Pd zReR%6N26$MapWtmRcF~&h1A9ZMkJ40@ah60Nn4Dj`Z>;S*gep`s569jTgVTZwn}@H zDxMIJG(V5s2esw+aNZEDZiy4J1+U!->M&ZN7o1??nFStSV6G1|eO3q$+4mG*U=GsD zoWg}0i@nlYoW@7Gkux5H0=&Jmtuf9(Q(l5au)!b{wI3ic9?xy)*U!C)x6cv3V*+ST zJVD=n_f;)VA>du?+7&*Cet^(BtGmc^p7#}`|G^AaMS8DLOfJyv)rma4CpzxX)mMc- zx=+0Kp(lW$f;gw5_U*{K9TX`m!Hy3fZ-;S$;<C_t`LF)=-;2P%%ELc=a*gl^ed^mV zU4$11i0uE-+*rFf*t;-Dt0>3|IXfG9{_pu-4mOk_>hfdH`t*!B3ltFrkq}4-ZWol& zaKt_{SYZPZFme!Z1?@x_t*!gwHrzg?c7-wmfbSBirm!_rJFajU?ArwpeRHF$<!4oo zPSxYtap1!9*GJCO^$d9hvH#b{>)-8DgWk_;4FZUOhZI>f1~*{iCK!gH=ez0=@OQ@; zKn=a4p$m6S^Id&vU(G~-pKcm3u<on~Po10T-jB;8BfLKQqkU)mPRt|nT)UHfXus`5 z;P(cVk>{>_$kkg%vN~J00*tmhn>LsyLxh_f*8&7@&$XF4U;00X@P6A9b--xvdWr*# zPloXt!o0Az8xWYLYv5_dAr?ybD;1pMI1!@{ju>^YclBA}eDqsU@0ec@YA<at&xdN= zTLVMOygm`(Ho6`_0#m|B1hvQe-1zYKw@CQ48h1Y^cFGUr=q(3Drj{f;`Ql^4@65&j zGWmUSBINDuC-H6#4wYekmU&KEsD4xfhUm{sPq^>Y^}Ay_&QI1)Rl9Qvb_))WFm@t; zHfY|s@1NemMBm`!U%Tx?`pt(v@29=!vVz`>L8$t~zxqgyFmxG0;H%vkp%FM8Xkcy> zQS+Y+D&e{e0P+7CVxqu5J=O5!92i>7esM!1uppMNd<g+4RK6qw$`Bh#dh2&_&i;gw zd?`ALJWzuXLo?%u3`j2FM7w)|2KP2Mw%z!ATE70^xiV<!tS}Oh8B2+Qv%$g6;_0;X zZ;H8`56utj5uy8%Om=U%yuH3(ffxS_)YjJuir=~3#s4D?F~lFz7&0sK_#D8|-qUKg z32*Szb;6nZ;0zwz`*RcNq}4V2&8F?97S8Tr`AMt@w1tOQ)ZohO%C08H7~w|$0^zM_ z63I42EeG;xR1u*dbL9ZxO&j99?R5}u#|~I~!V1a_Wk}yRYv;I-Z{swMa4G{xNrdxq zTg2lsWg6BW+k|9-%?qM?`|Aup<TWKJX@X*sCabKqp?-lh?WCMxsu{q5Y0RG(B0dZr z^6^j&PmDU;)N4UF+KX0*Dm`Hv=hgMI_6|Ox2sLONc>*7aSLMebE~;9lZ9Wq!<QxUF z;9X7s8%ogTeJ~k3TAp}$gLq<M`F$ko8q&r&%-dk+$4`=}tU-OS)r;-zUf@yb6E$0O zC6hdkt?T#xe1^3enq?#?xUeoM92Vs(;qf}zQoU@rNUn()<00~G{Wb^@Bj->-!53Dh z2B>}Es4Eo~d5k)CX^83Qm%^%UB?A@8ts63Gdd6V8xUf$lZdUMJ=ReXwTob1g?LR|4 zgbK)D_R!y{Xhpn+IriYZiwYRQ!vf-BX%g&A{iNPC;NL*`ikYPyn_apXehu2!Haa)5 z`qz(1pzr1DHAgrqWuHS7^<IIE3oEJjJJZDyTk`el-xvxa^d%=pAPKiR&uTj~J2*pO z_UrX-gBlrxh<FFp9#b`yfOjWILNkH|N9+d#GV+~A?>8KNd&hE%He2d$C^_ugspN}> zD~gfa@iSW9>NDMGB`FkNEnIDhm!ZfmD2^YIYe~$%@!>5M68YIB#ddfVt`+8GKwh-p zf%km!1IT{G&J9N@<>nj146L8V{5gk8Xf$CF!h(E%Kc6nJNhL=$=?;_xK#C*`q8rO7 zz=*y397)RyKzQt{fv2dIQf|_&a%t=MNhYXg%W~c@0n5r7Jf;$)%F~028^*mnBM(&y zG<Nz2EV4lbtvM^lAU(cuaaYa9&w)<nTQ{W;sH$tz>Nu1r!#mUUt#QC)(aY^)eY8mL z8b3V!K_u0a`z+97orp--M1+)$7mZ}PWG~b;esgK!l~z6ye;Xge3(?uT)pU5!ta1{9 zE>GRWnw?7b*1C&#cq3IMv6-N*dPFr7q!G4*#;vH3UOlD*6Ld*!PcL(W@X?<kMVdiC zTPYY2KCNWf`~3_q=GV%-I1x4>RZ_zd3XwQ#uBaK!KIU$vd(MWV&&e{gt}VM8qOR;K zyB{+me$oV@k@aQ+?O|=|n6-m-q{dExcLKSK1OLeJ+bZQlafX_Xy{w;6ptd=aFvW9S ze>m)gSxbR?kc~RY5UQ>o<TN78wfCfC*uk7dWFs(Fsw^INx`I&&k$Hr>h=>oa(UI<V zzRzNzQf#7)4>}Qzy9b>XmxNeGi!maKG$Cm5=n8f;yJuJEBUJ)X5#(+7QEQBmJaUMI z=7>Z54eTAyakaEb-j-5IyPz{#){r=b)t7oISbsh8L#vNTMTcFs4M<Ird=F=awt{7m zyqeb>N3nlC^caDaJZ&nK1MBM$61RJ%Fz2)12O{Z-R+&KBj+V+w0pBqSX@$E9K@N4Z zbcQ{==`0~_YvoEAdZ2x7K!A+oV=w1w3|iqNh4qhA*%1~w?-lQ0zJjl?Yx}%%EWNA3 zZL511&`dK`A($7S!AmIs85}=!TltF|Twmz!N!skKV|rq(nDyKqiDS<XjsYULFA)Fb zTP+W<q3?xwHV@D*$(q6+3_~#3^ug~Q9`Qnah5OI9@4Vj8tFhLMVFHAo#b-FIA4Ff0 z!78`S0D+ZTikIv#Gfsn{yg?Z1ujq*nF5giD%UfC>i4g<q7n+ZjFsv6GVvweC!u0Cs z`P;Ua?l1;KOU~&4KS1B&o+tUo^9uyr7mz>cX*w)44w_S_|I!`-DYyrk<r8*y?Li*v z2g{Hr+}}cCsB?#x!XFL;i@bBWZTryx|5FtUR%!-YY;MognP3=r7Mf;$1~$JTsEQ%B zKkc5oUvwn{ip|X&teBTtg7A5kqOzAV*uAh4Y9HZYb$eCAT=Al1My+9sp5p_$`1fqI z!&um<2R7L11w7`kcY$%ZE7bB<FWg@$LoQAUVNp&>m$p7HhT31Dj5G;SJ@xtOzMyiH zqKLTdVnbdYVk7=GF9eAMEBpRzKA^j*cXV*O;>agF*u7B}6HRR3sKr3m+fOzCkUGNb zq=@D$;$-_n<ub=)?9-!LB%SE0OeA$|Zpsu5t&&0`>X<*FKS23PHhoHV79!#mtte$z zuxPSg<V@$mLsS}wrZWBzi>h5_CYExtim7Fr7Q>Ysju-WA&o6upNG8X74$UtR`8U@! z8@q&-7SqtnO%N_BvwqNn|5@&WhyXD_m{(KM8!%P1t;l!GL2Vls*vo+8lSc4VWiQzg z7NX+s9YIY-oiavGQPdyJFpx0dWG#l_r{PzVJ8QZs#bpNOY4FCB__=m^?5eKLrNm;j zl~K8b(VF-{l?FaS(i_CsC;`9RB}L`rcU($ERPipr5IpMO+5-yOYdHJDw=>Ma-++Vr zt97M+oqJHoAt0f?h}aZ5>V^@z+<8(4B<gMKJWb=UB4|MR`|yx~X0`y?(;+-vMmDkt z8w!{%@)5m(X1Zorcg^9?5H#~WBLfB;Te{U^^yOi4nQAnZD$({jB;u3U62jh8+`h{L zZ&qa3!4j3O&5U1ckx7QXs0BD?N=-D>LsQhvvf8QS)?~RN14G{+goTRS9Wp<-Ev(_B zlr;$;iZ;uADKGIP<ENJ#tZNiYB@Iy9U87Ubt?N5q&W_v%FpMO=IdPsKxnUS61k++? zK}o3aI#}|9II;7xH-@9G$;4`Da8D1vOB^l+>kE!uwvqWp#7fXav9>DVTuHvn)PCIA z$1&M6`9Y&@GYhk!Zf-M$R_nCNYb0gIX+<l)s}y1LG!CQl1U8_Gc+0HuFoSt&gz9im zlpkZYPjeG}XpW36M)6)p#N$2RkEGENq?n37!p1ieb-z23mP}3cULv}SKk8PNN17I^ z0B(WC%0d8&_mP2H-HIfq$<`!bu)E#gwzwa69VOc9XB~Wahho>+U)hwC-j&|z%^sCP z#MB=yKt=>>d%^VtwIDoGAyxY#&F*kOl#W1vJ?-`x4*^K7E%NzyxPwpeHyJ#X>EBi{ zUNqParEM^lc;^+JO?oEzytM58(f+`t6#c@E{jax9nO1M?FJL~2xv&T5P=$dJ2R-N4 z2PTF%px(ssC3_)eAd-Q-N+A2|Wnj~=*NezoBgolFl=qr~HpImAOhPW$bJ;;6cpDa^ z%{8P{UqW5|d_SzNQTEQL@j)M%g7iNzi{pl73VeZVtaKsP>+$ak^!6y16>vDANk@21 zYytgGT3*bpJm(XRCn)S`r<|sQ)fN2kOHyzm^m5Ed+S_bJ@hwhAmr>DM^zj&i*fAP& zo9L8b&q<YaA<V>l;(|<8Mws?!#Zw%T83=6yr;wjlVeTHs@R@i8p8S*+M4-0RTNQ(P z)LU>%FVpcWx1K_e7^KV3(v^Jn#Gcq7>%el2e+f1|i?i`WpXJK~fZ7Xo^L=9@-Q$G1 z!YO+wV%_ySR%PE^rQRh$t_)C{cPXqK3Mq5~qsXqwy)*c07ij}sF_5@LQ(HGpS?Gfi zF?^t|DIyRc!^)8n=LlrM`6!Uy*jz7wg#J20pCJsSCFK*O%xOr<Xl&!ZfA<*JZxm9_ zZR!1$KQz(s$s@^wd_{xolF0MUpW+2lqlI@ck0?O;!iW9pCI(sH_A-z;XL~{77Op*5 z<D^)xT;(N_t}4j|%<fQ00T#)YcqFQ0<YH{p*%Q&$(emf=Ta?T3`+lekd_{`w^S-Qs zd1aCiWwL|67~@U*on9&<pegoj5}y`DA+xTiLC$#LSrEVVyoI$)>Fd^2O{beO*I@vk zcf5Fgku?Cv%5AI9yA!2SM5$J{YYm>n%vaFXK5pqSIc0_n66Bt@==?KP?nnIAlf>|S zTmf!waMYPE_=l`wdxYa@Qj$*&G1U7ub?}PXZF~N*n9>`muNvfxum?ykDXfHRK`+c} z`JhVrG`<n~DwT&ez$R2mcg9%gvArEvc&AUEsM2BFQ5LTaj9t)M)5eT6a=lFmU0|z7 z(F>z|nIwLi(qp3En8oNdN9woPk5uNtd%3$F*j}+W4KN$|`r|ci)faYOPxM}r28N{S z;v}kBqGlHqtXCI6_q|@lgM}19=M0C8_jI{C%D}_rSUzpSPG8m;n~WI5Xw%IQ0_2v* z(m@Kr0sueLPt-;rEKhPnhg3K%zsC#pgo1m&O7zTzJo}^{Y3Q8zutTjlBQNoFSh<*3 zr8xZ1DUqdH?ju_&fjAEZe{9Z=9^56Pc=4Q`oOlwYpa2Co-M(-E_6mm?i<>OPJop3r zL)ke0j1abG-UYi9WujyVRqou0rg(oIMNueLqhqwy2i?CDXQtw5iu;FJ(VqKn1?}1$ zkD3_V>(C3QlpK))a7F}YMuPi#L}|w#$tFm&1s0&_FhScPPq^t6ywl_$Qqh0JU(lw@ z8H+<6ZC+wn2Wjh1_juxK2OaL{?k!k&W`|&uKf+67rY3TGmU?Nu-K7Y;2Uzkq#09_2 zyWs{`%*YThhXMB>QhuD_9=R}0PPtNrE~HxQ#7{qk3#~-gZp45L8_k{gr%+xIrG9#( z_K5lKXNez88cS_bN$C`Ax-b;46WsEGTD3w*uE9tGV6OKuW>ErcTmdcCUfE&78$wCe zLS8k(nZ<TbP8Yu^`9al@kJa)E!+&L3Q$wIDZdHe7c;GuV#f$p$JM}<XH^8g!g%$@z z$>L^$|D`YrY?^rgD{I3Yj$K?~wShHGQd_#X+ShMTaz%^0@{3AS@h3g`D6_78rGm-- zV(cA*bc?cO(XwsZwr$(CZQHhO+qPY`%eBkgW!Emf>OTG6>2u=UjvF!8|24;#YvlYQ z$IQelc|Y8>xDvg$!d1dm9P(~KcF;qYG}*_<$%puZgiJ#Vw<_K8+++v@sWQ9Z+=!_Z z4XQek{<w;OMk=gf4!N%?{L9fW52_71g#;m&a_FN02B?1U&+5?%X|!iEDQEp4f2jw3 z`q7btf))c5`j4Z&{DA1Azfgu~ePk6*a23ug`UiI%$x-Sz2JVc%<#X7ePjXGJ6Uc)O zI!^H4!v+#fuwKfBUP{y3v_$s$1RNCfT`=aT9U=_VX`C*VK*R=PB5H2gfoRyhQ6{=3 z)9L~g-J0^&cBLviO{NXt<ce$CsN1f+HBtcWI$-8x&J3V+Zb(s%`W|bE51LRchJ|g^ zKS&h0wHRoDCP`$2b>Z@4#$<><9qC2md=lfI3Q_8cBOO>(x58p66s5fWO=l=bktL{z zkB=RO()_@1R){fRfT(2Hwn>-hka+uHZ5J3D+aPMwV&b;7Xfi8X(U(cFnmojO7t2;r zOC^S}L!%=L4?}2Hal*l{W17nk3$7!Zf<{+f6eHLMgufxs4`ml3!egTB2~E-I+&iyr znAfeDl`OIiR04%GVA=`OZ`-lCtdVKP`${LR9IzO_;f|^+9{A<&>yf_aQdS$8Hn{k{ z@@k2BNwdaGSn~bmEp*0QM-N^ZTA>IF%Z9cjAltP=slG&&g*3^zOLPhstcbm8+DJuv zyJaM4)(E)P7PRQhrtU9cXOi~t$)oo^aYyrmG06)msZWvK*Y=m_v>8*GuZ$Obl)%!F znkJ`_EIjgKfn+1s9YC74;{~FxW$T?lJIxM<!xW|~JwSTWgO(sr_I(+^`#~P={3^!5 z4N3VxtSK~F57lKJ-7)^TB>u)j#9fJ&a$1s9S!U!CDYcS`S2acwqkdOp18Hb8HPp)j z(SSSGLI<}_V*Z&_2?bP*g`wO%8$Nt5b(Q=?%FAoeUkXG+SP-J(JFK=+L_kZ&34fX# zd#aJ-%mP#`CQ?(63u6|Atr(_1afv2H@{1<f9Mt_f80mS;iPQ@R+z4#0@MnC-s@>xR z18<HDR;p5<WoRKc@*o5a>y*SeQ3^*HW{77<+4r%8*KNF>v&9aLE2cGR^!ahfvrCv5 zVFmii9q183d^QE9ELHVDo*w<u*e%~;V5`&+w4j2Fotx+^*mdOErYe?H7|JH2j$|~d zdVkBuli(O`8C&%J4S80QW_pNqKQY~{mG7jEj{K=x+)#P4vgqYKTS@dT$;A|V5rDL* zCxk^8*dZq%30!^<U>PN4+q`T7`T!$2SIm`NI{-PV5zD$HIyp9n#K4XIO+|;`8Y-pQ zk-6twNwfy3CuQ9v-@+IQSwo$<%1cC7qJ@WSK$pY-FF|<J$xGTiX28riLs&P#2c|6- z<R^YvqBK>)N1EO-3!I*0Pa=%|>4{8_04kan$SH4hk}0miH-91WK$hxVDb+j5VG8yA z2QHT>21y4h(qTQh*At~KN42SSZqCpZrERrz;}4D)uwp%0CDTUxeN1w1^Mof%&u~Iw zJ{t_&1<M2OaDrX6bBsV2c{Yl#=_D?X^WsdhJwMnMkLX;IPd8qBH>Ci-$tFW|zq$SX zdB<)Ixtw4oJX|RbQwr3CGF72MWl`6TtmX!A_0R0Sj3$6}s&k<-Cq5fx^v`W;@ZPCV z1XZ-*1SR<Q6jF!SCKx!X>HUNzp$TW+$#)<qBOUHL&=o`Byl_}gJhmfGjVWeeJ{epr zeSzaay_#@wNv}|b5NV4Oge5xQCz@T$J6ak#(Jy(O(Y(M;6Zg87NA^O3odr<T`49M? zR6RIEu+^(t3EPTK!)u5*!FjBjK5(;RgI15HSfLvR6V->>2e&yd!ujL{aca8@h4(Q6 zbC9;P+7N$?vfKb%-8{zi4KAS5r9Obls5a0uSGeA1cwx5Q=V)qot!WfXb`G$@WLBkL z%R8(>zr477EkD4zA<L5W=z>{}eM_>{CX_Y}>YCuJQl1(l&I3@V#4Ob4!eOP*bqZ~Q z@JyL6Rq6tErr!4hno#YOdKhXRA#`=5R{Qh1K8`2SyY-COEN0*o0xRYvxWdZpLc>LZ zrh|k%7}+Mc$@=;h3Ts&k{<TuR6anPMF)7p=9liY2t}*+@3%VKz=JeABgPH!?B`p%- z^S&tHy8?lAQ7rfyzzp4^?OYB4BFXb-+DxD@-NW8L9P_>)Iz}x~A9l)*2V*i#;ggt( zHL>FZrjwI%K?ReKzNZnFyeO`d>Q&u@2>BVRmrjX4I%A6y@VAN06Z$5$@6tOA10ntb zs1mIKT^I7Vc3F47Xlu7Vx;({yKDsn3IgB~?!VhvWWjCSrE|k~+Z%+ACsM7(pJGQD& zuPfBM0BE6D6B6Kr2%Zu*NOuChRJ9BFoFeRy;)GeF%x8c+Dj-Y<zBdO&lK?9*w<cXS zFXtXe+yN+eOkH%Ih8ALb<vl|2Mz&`^)lgw*bTVLNi##R$uT0f{7XkiT9{7iPJQ%!U zxAvnR+rR?=Q2s}G;D4#cx$0Z`$l@qpVIXK}povhTqOn@G5(665wWv{|bXdnlV2TZG zbcT_Gq|)rzR9fEs`uSJhTk3y{+P<{5*1jY^pVpqUcVuBCBhH5BX7YGXxz{+E-`D#4 zzu@*neaee4%~5ld6@wp~Bq}mSKv9)DD)y41EN55_nDo+*sG)u<+>zC-3ac|z6Gd{O zf}N<c5RsbJRayvZjRMtCGaUC+5EKt6HIOK*rO%b*`UMJfSW6LbSj=JqWs5Ci8uPSs zSg$Alt&x=aQ<1tdOSvOA?VgX}Qdimx^e&dXYDD8oY&MJ4XdTy#qCKINX>;jfWaP6j zMT6aDyxt2GWemIC)<?vER7Z4h{}@MiHtjXD!d$stP-))Wt1FrkxdBRij?g3+^;Xc0 zA5B?s;j|9~Wka`2xX`ycpIX{euPv4NPV~7HAi|Zpn42S;_L}TXDoDkpcB)Z)UPH|A z_*gi_X~|5c7_nxNF;<l5SR%eOt;9`6?p@05?3+A3HGA$4HLf$DBz$j$RobDC1vEY^ zy41#KuVgNRwW)14B{OPa=`6NtFg5ciJB(IgcCCO&P6}GQs5@r2ErBI1w>dT9Lmd79 zqA46_R}RCUg!?CxPNBOdo74S|N<&AYsqw~GgRM4;#!SM&pq!`BB5c>5s-g1GV)EMf zBWb$^YR{<Jz?gtGbXfCm@m1+-WRZNxBQd!XWp*q&^C}}w=%Oic_V@>{xf$@nW~_D~ zuxks_Pt%krR^{Dvme1en_Slqa<-JOkF53sREsYO+<bZQ_15d3(zP~;aJynp^=H!0T zu-cF7&hx=bm|(XWa>deyNFH<;-PzGXNc`1?5e}emU=@#0XskW3*+JTB?W2QGVc8v} z2f4BA4s|1M^8`!|w?qctvG@|K++Z#;6~>%|`eF;U+lAv$oiq$|pjuME6bHkx_=d)z z_!e&|50=8`S$yK?OE8C_`c`gH`_R_A1C_;x*<aNNTKKBVRSedQxpD^PE+$RYYkT5B zo_YQvu*(vcW&^uXk#9K?8t@nl9sA~xJDIcA0*OzRuGW4ZJQU1iieKvyV8a)<xbc`f zEvgwtyEf{(s*7=0YBhIdPOwuvmz27YjZ%YpZ!Kie`5NtvDc4G;Jl=d_ADVd6auI>R zsc{ogy+o6rC!+#VnKSLL>kYKJJcEGNjh{*$^i@vKK6zd~#gzNUN2)=Zyup^&Ea)1{ zOTl+d-VEJ&)&mWVzOux<UH0k>TB=!JCE1zxzN$e;{rat+HaQiWo>_8wC$qZ9ENK-L zGVQo#y8$cBY0i-DS|b`bB6gqIFK?>=?DkN%0~1)=Gew=VQOD_aPdldRP#3!${F)h! zb-AZ;iqvjEE<S5KKo_#zzOyb&N68Zjpf2zLydoohLx_Orj;KRQsu0q&D{A?|(TF|| zcx{E>55c3qKtO3&*QG;ElmIT=UT>MwoKhbxc3s@2GF(Um>k10%dPccOKnV_oWmJMU z0xePm#u(`J7b0Wvy`no<s}buHc?#D>!SJ)=><w_1cagu~BPa~3Ch892ZRIY1!G~u3 zyvZJx4~3V%sQkg(<u3aK3BSOxtF`i(okbqJDDs?OknPS=a(nnBoVU8pmA9n`QE)AP z+2YtEND@l~SZpCES!RcljArgECeb_S1D(P#O)q~~nj^k=Mwp)N9;GXU`2!Gp81+k5 z*VTAQK7T91DZ<|YFb<X@hImDkpYpv4n>-n!zT=M3F-C%Qg(-$_2`F^k6Qe$9Nq$O? z0(R>=II1A%5K0f(XTWd|p91GwZ1zNs3y|ud?{=7Xf)!qhzwn-xU^=SMN|&~hd$^VN zi1F2xT-}q~8Z$FFWultn7ZU+JGT)=&l%ymp(v{iJ^+Bf6$3d5x?*|atpFI~t?->M1 zr_gKT=}d|0rA;^VEA*c%suOhF-v^6xmhROR!5Z3&BR#Fi*65A*SiwI0!(M40dOvyT z*K^4K#TNh03IEL&{}7WQz99Xxe@u1jg#iG_{v%t+8(EneyZo1$T*?LMq4Mk3>9*$Y znWIn|5&;4UjpP{_80!Fp)ewOM5R+&EiewWBupyZonRS%f)hf~2)@a+7I$E)6)rKUH zO6^vyRITb?n_8&W+SXTJ)uJUw{HJ~F^!8--LVv$~^nZ8X{C1w_e7Ssqq0jTYgapVS z6oO*&0%(lH7lgMPHuGz_B_46!;$4X3e*IB$xKUxe31Eq#+B^wxiS2?qMFuOtnLL|z zfHyWxW`c1$q7^Ss#_@jlri;J7I#TjOT$y(04^A%|(C7^^>)-CBdZ5PlRqXxhIhMxj z0jpQN<${+P!?k=h<w*!zJB0n{P#mmhxJ2!7Lyqse7|g!2=K0$N-XFMYGSYr~sQvNE z#?Qs;LH&CSUh<Bcrz@9oXMd3UjxMh|TeE*Wcz5*XE-o1A_n#p;(3^(=p`LugzWE3E zlKo&0fkFHdK~}zz_;AmwgrIQV1|av2TSUL_h0yr>cZi$o=K;|5VuO0@)jdUc-k;d- z4D8jzc%DZOok4Pp14+>Q`vEeaEPQ^oTTFPHLG!meWYGMF0X3gIe16w`=$VsfI-f|+ zu5A4AAFE!!o|*W3Zv)1@p<;ao_j;<=Ebt)`@4v64^|<?sf1vsXKR%^?V#Z&sKVaqg z2An*mf%Sq4J9qC-xA1(xcc1nkedGssJ@=e^c7yxJ`6*t<SvrvH_cP&ner#bB2KmeP z#b43kzfix+_I5E3`B6T|`@c)~zHi@+;r)X0z4id0PXNBQLdoAgGoj`0-hakX-S+); zJi-RwQ2?U^LS~)~SWql>5MtWGiT0mZRUtZn2z!~3?BYR(8es!h;|dNRuIg7om-M$q zZ&jtM(d+d)uMeh1tI^e0YqlhAS=sIbWI*Iu8oWIVdP~_B!V(&tybaU~T8PoCXiFnK zA+B2sPaFtV5n+jDq;zT*__TrdPnKF6Ehx5m=2@Dn480o|+3W%L9oWQ%wuELOkk#14 z+|t-?C}UYbq_vG2+m^1bMx4&0TB|RpNMVH4Lxu|1fk3ns@4!I3O-m>zazcj&yW(<T z2hX|$gsEpu>SI`vV1P&<|E`i>HKr-N?}fOGL9|&QBP$49RTs$)QcRj42NhR{&2?b` z+Xjv)*w8bIC_Bl)wyv>+6E7N=7UWvU(s8{zdTgZ>WfcOJ)yINjxhI$$8&a@P3Mmv6 zHUuSTvnaInjBntbN3cmb!f1$N7&c1dkrI=@E3GYVQpJKAmY`A$ChZc>v}xdMW=7Gt z>2WMLl#~qz=1PJus!P&#v(VWlhFv|5CXl4;qh+9Q$T=nskqh-@x|vE7bg_9ziZg6u zte7xR{i5O=UE+-$Y{TG0S9D|tH%{#Wm8YV@i-Ik02RBv?)M(&B+QEz<OhMJe@uXn8 z*e)}ch!*uQbY#IINY2qVaT=YHu%;G7ZVo<3(cU1dX(x)f0t~qm9!l8r^xiu7ecCEw zi%5<(Q=C!;kxg_7(YhMmxXqRV%w?QNIw+vQRUtWC8~E(DX}?bzH?}&^=L?|;JOFF? zG_P8tO&+}266Jb~wr>X@3EP*E2jL7R2IFagwx6}vW}uRlPa1!1;gcKVK%s#EHf2Si z@xh{6DaWjWvI+Qka)>-$BL!*eOW_@phJ?##h&&Y2EX|o1V^U0V{Fh9cZ>hzig9R&A z0W0H8e`&h}v9&$?8Ps&ODpAt(e2#4n?@`v0G*-!g1_7!)AALKUC<8gg7QDV}-0*3_ zrucPObHphAmthV_UsUlCPILjY2#%GqgLXkNYnk%^qQm6xUx6CZNcdtD%>(<8*Ot*> zTb)9ZKjNw<<_ITmNHB*cIc@3vWtC*$woU1E8{8pBs4y~8DKz$#kOrSfAsk^Fb%;Z% ziv@Z7rqQN>qct_DptH=8R1BvB$Z#VCW`uF&vzqnLzJUr}e6yk5L7F5|)Y+a~$eWrq zYG0uFon}P3!;Bo&XINiz&)IiJs{AD+3!B^JrA4WV)KKIEDHh1)X3##Fk_p8&2JAIS z;{pjRQFjni7C7+Hn4D8t>m{eA=qMSQg%w_TSPAE}jj)8tj^Ge(Y6Bsm{a<AoRSoD7 z(pC!2YUx4Iq^vMCbLnkbl}T&R=3-i`1E;CVH+a~J9>|s@MVv$p==AP74H4n+1Z5ST z1PD#Jg$All0~OI0Hkv+fR~C#zfpRNUDI8Nf#aL1~RunrTNEL7_V;mdD_C#Z0MBFMq ztSHdpoDBDeh^aRsU?F{Kxx9i0NduuwP6yj101#GIG>YxPSHM{3Wv5xHht6EAZx=%n zc)O?-YaFGXdN|Rojm?8}5M|pdIB@s130sJVFMKMskl^dB6xmH8+a=1Q(%DK=`YC~0 z!jpfD+>y>Y*jYu3K`gaq>8TDri&ah6GIOKL!7xz5Rg$Ant}mitHn3q>N3t+Rf@wN) zW+0`XNXn>qZ1AC%I;0TZ4<R`$^=4Px;U*pgyCIg1NMFiglAP7C?nOlNNTYi6#^?!R zB;Riq?3{oRHq$i`W0*aV2y6#4I6^dlNd6s|Dha{uH-)7&)aQmMG*$9V1GG!fm2~4e zn(i~N?MYAze-%nt%)gy8wFn7nCKW@y4#&SggxK*@-4D{Q8lvT?k|+k3eYrn;r*avV zM1>octa_%Y4Zk^K-G4Ud;6;JHf~tcFbqC2lBWTgBNO=iwk__@k?-Oq~Zf0dBD>hB~ z)n7DUxd8e?Nu-N9yocia&cdIkC>rJ#lwZ*Sm!}|72K9}msd7UKp%wZ)fQhOqqb$-! z6&8(yy382MGerbfecLsmIs!4qf@HX@Nhj{Iqclp9D9%o=8bbyc#YmJ7B-Ui5`WVqj z)dTOZJi=LpK@RnLs2_z<9|dVt1eHHfE|SE0i-~{7lA|<2qLh|VQzRh7CyG+l0U<|K zB!M~#68z>uwSVmVuCk9#DgsPT1}`~#zw~90qx)-d70aq5LR~<!*I=mhot&h>HY1KB z{jRK%19F_Qh=s0IL|uJUC9yur@-cvq19`1Z5<r?usJ4l;<Qdy+FqA3|ZJCnUh7zI` zJ%qS1NFb0<tLTp~zcYg{D)T7KR3#Fn?r&|W^pGs;p+*B|hN>tgMr~B*k!_QJDg$E+ z^MX{sDNF;s?G_U4v1h2)6es)dp(%(;=^1qBjEf<VLKRW2Gqt)XQ6olrIzsnL{TjPi z5TmLJ6xE)#6uDNune^8njgo<is<VkAEgE42?K2<a$*Wr&obm&YoPq<CCcs9Wl?sX{ zZq)M8_>`0h)tpdgRh<Cm!wU(SDw-Bl2;*Abq=OqTEQJeV9wF66p`3AIqz5U*>Ig2? z8l-Ae$3Ci60?pBs!eb=W8q_}&*%d~;>j>!;iM1+<@qVH@1yQj<*QURlL2JJrg)l`> z(W7Rg){CN|K{Q_>{+I{}0<aUs@LLBN49G%8{n{*`qBFJMtcnV-P!KIH2=cf;07@Pl z3-UGs<>uZr28A6wQRpymr&v`|@USeT3Npg()Ppjhs&!rX1lg3)LZ`(c6Qkc*7E2f; zYkD8L9|{^^Q=*GKE@fToIishE5IJ@`D_&vKSkOnSr&S7u>Ei#LF@3FW080onalkZQ zwHZOZMe$M5A+NfoaLkdC6{NkrSkP1Aa7y1O*<&ezD~x`%ytUv~mBX%q(bN`AEXaam zalCVhVPf#t)K_35)ArUVi)Va^-vnlP5mnbh(Z!}|A!xf(3^}8XJy&Y<LZP8mlH4sV z%B<me(0_}Gl_ZlWF5!z6??LHF?mVI{!H}C6>DtUO`@ouer}1J!v%`>9KQf*C5TKa` zo6X!_Uyj3jIyQqq(3&=J5ppGY(>&NjJ!!4(hpqgv<}Y?3pq1IWYW$=dxH?<GI6$m< z(=mmWY=_8(tgKI|o%a{4j$qM76GSQiEz<U2TAPh;f3dF5_0}mQe+-%jL_bQ)ZdvT& z9xvH<qSBjxtBy#Sh@ufSIt{}@9v9gV-9E{<q3W_MeAXS&$aaNLnd>PDFFhv55N+XC zw>5H;=$t-zh5Ql<&2kKtuX6L?To6%w+$Q?-bfB`8bbCI!*b|s>Ks{Q?)*)nA9J?Vk zs?<}dr6R*Rep`fkqU^{xdbLNU$@wI#))-PXlb~fgx|VCJBk>fh=FC&U7Ca>tosF69 zBElh@QyXaIBBhbv)H&{xMR?FJ8^dI*wT2XXc>*OzMQ3g>Ed0D|5-)Q490bS!3|nVL z!LJKvQ&JKKkOf@oD6C08iBP8fDaUMq$xZ<YODS#Nx*EOr?AkLo(GHU?hCYl5byL(- z{f*wH(ytA-$s2Dz$n_RnwyPC1twjtQs8$?NuqByolj8`-nvNC?_9kl@0Sn*0NG6!U zrtwWAN--;+sPq)GpHMr{{4HXr(Z<TBwK_~acqQ|fk+KoqICN!pqoYaHt#AU7dU9&> zCCoUG_wPKH^Y?Vn(Dq|9I|!Eh8A-{@fCrT|x8Oi61KK46mR<18!ps!_i#xdQE~q>9 z?u!7MJL1`U!AD>ESJxgNR{G-h=dG_7A3?tj3y^~+GqWu(0i5(1`1yGu`+$pr0oX@? zSQQvJ{NV7T8BVwhPBcXLf@4hM0Asv^iUbZZ3kNQEJlrsG0MZt`s}1#;4O^sb3~fKS z&E$F-Qkzv|tw1odp|^?@L7ciokGM;ZHbi~yZ_VF~y$16)VB_m{4$lEeG6t+BLvKj| z>RSc~6HE{$g6$*&#AK$)C0;Zj2h9ZyiE#~-p#mC`Spr_JHux7nnpanV>HXN-xeSxi z_VVN~++dd2l1EnPCAh&ZcyQc6n7Ryo_yo!3%_IVB@Zrb-YyKck8PwTFRxBLn8v-s^ zgs@oy@LLkFv<*-~WP<f<9XhrXhOI~H1BzJmVCMKaz-*v+!k}@0ym)_#ld+J4z@R=R z8ppi$9cA_9&&KtNpcfCH-n<Cg!No|T9oah!<0WJ8f(7AuAmz`Ee6+^ZtD_lb|4hH| z!e;U^Fk$YuKK9MI9IyZzX2m6l^RvnPq^dnNcUhu(MJjV=qasT5qw+jT{Q(*M4eExC ziG#UQfj997{R6^b;bAL5-cMJ+k2i5ld7}P3wtm5&@MkHQ2a0FiHNK(;)xwJf?Nkml zOYBGNl5F#7;c<YE<>=-whdd#Fidb8sOB3YMtjnWak}~7%(AOC{-4QPB52K*NWs0QP z-Ddx+I_$|*kv+~>06oca=fzDwrVGX|y@?x;cCio>wl?IGztdNq&*W1$ZA|8M%xjMD zGE>c`T;=K1edPu=c}^&Ehzh5(%2Hj1I-kGfE-$>Rq08R>Naay9Z%yHJ#_7ECGW3zG zG4^hs&pQ9T&*@cIfIa-vJ)l^pb5#I)gF|MPwTBcj2%<{}O%R+XkL=7(Cd)6JxTkr4 zduoW%1F*a&ngLI*2;c>Hv1hvZ26g2d>-G)gw)kRt8-_9hbYEtfAl&UI1(YQ}<P`{F zNc?KUIo{W{i?HlBR26B-zt30qt_0liH=;q73#{_g9N?q&(SI4=GTsatxnKm-VX~Bu zsmjlRvlJou@%4>zAlbyD=0-gN?~ixtHO~1`(1WSLjI>)ka><_;rHjAlU3IM!?^M|s zvot0BYkTQknyFIxAPye*p*g}}UgbF-&6KkoF)R;UlB!!ek_$py47Sg%!y{fdg(PtN zWf8ZLltdZ0uj(XTWnW|;Ssmsf`A9I-#aVMamB=_AXBaZS*MXI-e8me90%>n4P#l+X zM~aO|WId;GfAfg5zg{#P5p;Z-_<#Ma>tp{6KZ?vuryK#z7a|1hTm;iR3s7<q!i4n4 z>oQ>UDu7xh$!9*VDD5)jpuirF4eem^s3#kKg(aK`(!53cNbB(1LO`kS6)rALs@w4e zV?yyruQ>$K4im;2@Ma;N-2)jghwNIk3f^6O^?mKNgQ9k2<nARoOcEBWNs<~uBs=GV zh0DDKe<iMcc^GBJ$M`j#PZA0bYrIU+kvY_fCNh>C(E&?j*OU;C6mdJF4@2aiD)Lo^ zoLOED52cIZC7m1t`$>irB`6fwKg<sk@|^<lT}rG|6)rM*I(rjZISFx^fn!V{g!dWm z0t5Rr&hi3@Szxxo?Am^tU}}yNYDsaI)i}@o7B+qx>pv`M4YLexq+t}f&&*M3tYL9q z2h;S8X#@~uO3CxbnRhKuF4E>iz=T?vz*|uK8J{B=2ov<nWIx{@ZSF6I1W`01%;_)0 z&xwh|8_-dC&P|gDro25ciD55gHax>UJi!iss!&cKP8x`!G&14Nv{+Sya>DQ)JH$`G zdwLZv@Q1@yc}4TIcI>Gn_~wnxzl(LC3_`~XviCweB+DO{lFe6LnpwJ(2D)=+6COt- z^Q_`1d2a-E6)24ex@W7N`jyC!62B`)e(d~+9k3ZUZHg?bCSkJhDov;gU(K06Dd5jZ zRY3n<mp(c~82hl#=n9kydXk$ci5A>ro+|#ulXXT_^7RY52z?Vb41{g5DaiE&T0>ix zBjgoR^k6sH!^4PuHz3jz3-skrIYcF^Rm0#>!_cZ-@SF)i(zLbIa#gJ3g*B#t%DTt? zwyVlN;HtAa=l%79lk%D$eBft(5wdOE;9&er^nTdjQ9Rq;2A;-q{*(wqJ)1Kfg-{QU z{u`jvgV@m<IVYMu`zH~7&#h|kN+oxzIEh;EOlFUMXV1R6uAk<>9^>v5b0UD|>ekI@ z4-RQdmu%?7TOr3GEs_D#Lkwug@DX>dPFBi`ZL%mT`Il0NmOoGX-=`HV-BVglsA-e5 z(m^MXliKQ=wQ#~bt!7MEybwnZ`k4Vbsmd2joVZ||nUVdZwGFWPW=3(n;N4YUso<$! z1q|UTm8A15ZW^ghN0bz+w*Dl!hAD*I^RCdf=_lfC8p`VTJTe53e6Y#fgwpl65_vdM zB^uoW>O|<wQh7m>ewvg66!r4p$4i0a$t(q!H^m0y#78VU3^3jWAl`;#c%h;mFsp}$ zWQVova$5ElrFv^o;8u+D5R%7xXTg&O>8yj(O#~il{a(E^_8^eZY=_gCxyc2qi(wLa zi=s`Of+WPTz+>=hpbspZM;^Y8k`@oh8{~0=P(gh3-lps;NJ*QQTwX52Rd^boM*y8Y z0#2TZNB2mR#~d;P`H5FOGH{<zHbd&NP8&88rp<)uvtc@`8Ak_zTb3CD;JBQ0`#HuH z_bI0(0tYG2PC|K&tKU2(UcM-{^J{Q-M4AIxa#ECh-^vXqh#Fh4e_B$7TblU#n!XU% z7hs<@r)XQ81j(_1YjqZ2v9GjYecml>m3?fL*>%n!ABW6ruZXm^ko32fV9`xko`*&^ zH<7fqu=KY!VF6nU(Xm=uDa{1gn+m)OBTaEzQe0U*+4i>fM%*P<Z-yjz08jV4RkA+d zPWIj%@V@d)UcoKK_=Pa|1LzO(_W=AL+z;~i^*$o%lKn&7Z*R)Z9ETRhA$9TPsI1<L z#lbq{h9#DS^nPRfWhWFweWQ#Hv;~e1j0dL&d;LZ^n>Zm+lbwZ_Jila?GB2;8BL9+y z?D`q{)1&1GC}u{(XhBdG$QU~Wv6d+W%m|?+EsG4XRHDkO0yA<d9bw62kY%)5u3w;A z-F=;LM16kCJiOP&IDRNt@1h`;zT84=o16DvV8FvH5#?GRVQ`3m!60Xn4P($FHzN+F zO0gvYKQcy)Wf8`JE{eCCZ{i%exJcGi_k-Y6v`NXFKkHHT>a=L!Kl8@JX#=k;+Z6Qc zIwbIal{jt18n4RNn;(=2DhSkX`aQLy0@VECtS{!SfzUbf2B9!QA%X0fKsPo(kqBQr z%IT8j$RLU$5Qza_YD7eXl5EhJVZ>!vYUq;s_t+0dMu>hEvX{+;0!}q8Jl=FM(8mRP z5w2yi19LIg^t3S5L!uv+I~Fc<X5NU4V-&{7zRd6slw>)`{I45PEMRd~TlMAK{D~AK z%vr9osV`LhI~1~H6U=CtG{pXc%v?t*x#hc>wQjKCc)<)H>5|ny_`)&muEV5~?9Poy zIz_7_#rt6~VTUf3pmbF{=6f?EzX9ilm~u5h)!7DQRr6ybNt%1dx(cJ36L)wJPjzrl zRawSyIi{rFjJ*lGDz@hwndW~3H<CYDXG3oyi}(ZPnh<-8kR5(q7b0lJJ(z4xGE$tL zrFgRFYO%*tS(rpqn{^7Icl*tOeEXB~9{0$3?6f#-r+ZqmUpA$0JVkZPFtYhuXC}w^ zw9^z%q1uH_3SEHVS*EIVQqPl0Q&Q#IUvUrOPalhummG6(4Q~8;QL5`j-fm;^M%NW( zqQt+M>JJvj!+LYd?QIw@KP+&n!G50dX`D~jv=cyMD2e0ZU#mntOjjCQH5+0{Lo~fU zHS`ZJ0TfFl5jGjw8l-g-XtM}SG$NltG^{{JTqh}VXtW3~SO?`E(Tj-iT_AiOE<JGS zkkkR(MbQtCb41;ytP2w#N#Bd;fQyTwA5K2-@=)6bppU{Xbz4n%J{jQCM00At>nO}U z40DUa-sG&a9*3RZ6RLW<LYc%H7G-f7kl+Z4w)|zeox;*14MA`1%*1|4=5TYx2uhv! zJ?S@XnNe$yI=)Z$1>>|6*0d$LA$?eD=Mx;k<jwB9ei1s|Wyr5Sz8&Or#OZQ%eUP|v zeSAE}W6rKaNMBbn=`QWV)}`Vyj6NlqS?5$*edCd*+s$#VM$Gy<+1wwi?lL6N^SOLa zYSy7n2r8h(O*?PL9f7GQ<~7>Wt@gGr47;S+5R#^}*fOh{cpmhQHY%!Ju(2bTXb;z= zyC2#tI=De(8(w;}w?SqboO%SfLGvS^<&}XYS{MN>+%VoFgk>FAJ*wEDm;+27l|M;q zQwHhOjvpP^O#_Urrc9tr0AtA!ldfEmk;M=;Pkf0!6rgTID@adJG^#Ba#Qf~ZtR@+e z9ky;zRmA|J_;#(KmdwTpc7Cn+PHc7C!C}n1^rmq+e{b$$<O}S=8>(*K5_An{MTzH% zxC^pcD_FMfG=>vYlbkc<!N2R5YfqTQiGnk^zQa{GtE|3m^jC0#wCh$n*SXM1Y0wE4 zw#%TY7P1fIOV_)-j4NpuB}y8GpWTa-xf0jkRvsogS^I_Khz1>TkKT}zF1%MKbeW<| z;J-70cpZJvO_nEMZE$hbybi|Ss@9MuNoD#)JRUh8kEaYWJwk6csu?tT!2KS$YLV;{ z{Qja}Z)75)_6GeP&~<42q~AW-J`cPd!aepWht&okq~-fc>h4%wUCQ5~1{jvMymkz( zge<RKKgP$gAngw<ImLUR<%H_L7e0unr)|yO4#ap}>DHEo%U&>W)+K&jseA2_aTzIz zlJf<@+@UL1O|Yy_u4J#rxF*-NqW&FyvRhhHXQuB(=IOi4?%ubSzkm7gA(N>CL_+?? zhTR@7CmK)xbOkf!^$-5)lca2v+e+4?Yup~1{*7d7tHWE*Td+@&TnZ78|3wDq&eY0& zm`nP$?w@WZxO;Z7<-VT&Nh@Z$LZ21>m3?p_If0TdOt)iQ9>vU%?J(B}S<$djFm)1y zm5r^o!P78UHl(Iarelr`$G+vXXWfSA5N%81vU$I!wuP~rdSNH5;(i#~ktvb_&Ax}$ z6A`Bms%@fKf84geH^(EJ?m|A=-{=yZbK)j+Vsthf9qU*6Tf#{CNNlM+*&jB8qk(T$ zXXe|V8#Qc-(4YWUE4CXI_<ko~V*s?ez<>#@ImfO8M?PV7=NtMTUL5}}YW`2TbBpE_ zg7U{0sOrZUi01!7?v(s-Qu}{X!DEwm?Uxi##{1I&adq2Wv5CHLm~sYOc5)&kwIybX zCecjbGk9Os)?sy&w3hYKJ{9>am{|WB_&mom<#|_j1VWaa+s>bJ<~z^5{Qmm;`3WAt z%QH<7oCJvs&rD(D3<&K}lGYR$<)tPIwa#?AK7b6o1!K8^s%RN**!&yruiWVnq}KMi z)Z6cK(Lj98@!8}t$?EZ~dx?98d?vUMdXv~fr99eFr>O)Um^qGNC*9W`#<O;h*Hv53 zBh6ZH+cj=i;lj)HOchy14e_7EZsGY@BDoWrW2x?y;zieDu>J%X=i@1Epud|Gsnp7t zRznFd!OnHbl`k}=PutFGcRKxtF-1(Wi+8%55R|tbOa^C|68oH0wCZ5{gO3NSK-sef z2yJiHg+GTlzMZzBq`3NzHgu7po1Xn9>>Nx7noEPVpioh0=?>$4%4eD*hh-r=cTA{d zEA5WjrTY%ia6`6I%*(q@OL1~=@?&#ArkQ9(vFrMaH3<@VrL%?0@4g~|@hy<z<T)Gd zNWp&5sB2Q1<h8PPEF>2|GuJ=N8c)<n`4dtGp{p#T0Gc&RS=eHRu<QVzWfn1XODtx* zYitb~y&&Bq+w3Hmd@=j?Smv<6#yHAM;|b`DBY1*JF#L&M9AlmCp~mqXE#{2o{zaI< z`@1$}dF2uTv6Eq!=@$tj1ms|)Rr(D4zeS&=oTz?GPkSpX-Zj?df$%Ks6QxXDE&pn_ zM7#q31A_k!wEqdgphmmwz8^c7r5`&Os{cy}{wpP1Nmm|O@W%^gl}=YpfC98%wAzx; zQP`symY#$p0SwOy%Qt6LGSh5>v|G9OTM9oWlI#P(KV^T$h80M5Th{D4m-{8p`8xOW z>3y6ufVbySakLogdap5@oNvnGVm~vS7JeQysF*|TT#%$$#uNzER)y-vz350BQ!X}c zh*+#daw$%rwtl>kWmyHX<)p;rL4)Mb(Ss|eBJupPxn}cMBilO=_Cplc6`&`45<H0R z^|?l_%zQYNFLgK~adoc=NpYY|EAM;|s&g6Tv#NbcPWYj`A(P5}CL{VjiSz*t&vky@ z(PLUL5Z0O?pZ*8nCgpZ0YG;8trie}JY5dvjcJ#G>YL_7HuGts)!2m@!LB_6p*|`L+ z)z;bOQ)W+F1>p68XaJT^T+;+ec6VC|<pNC-ZG%%YHs9%$8^{#xk7Gymx^o-&`oX+T zXuvq=7QhuzFA@-)V4`%(bWBe%?c(39UBWi^zQV`UawfG7`o+!Op&2aV7Z0nW4UJK( zy&jxiIerHlHl&YZ?eevOu^8L<2)RZ1l-=aU`%zNOrmF4=?j!>;Zt}@MHq9*Wm%D+D za195Sp~)k6(0`!f-+%l6iHaC(^{}cRG>HEo<NwdJ?!Pbf|JNLbvZ<4$p^c@NsndU9 zgZs&TjSmbA%oxnh4Ghi=OwJ9AP7G{rZ|1RQBx$KgMJ!Ayn}IsNW~52vGiRj7#rM0U zX5|RUnp=i2|L8;K^AYOvqeSI1CMgN%v*zHV$H=$dz`uWQrD$d(XQpa}2%D#>;3OnO zb4!z%$pQ2<9gVcS%k%^QmoPFxJfjrc35YltjSv};3j-5mA$NA7Kq#hr0|OHSGb11) z6A&Z=Lt}u18W=mn4E&$oH~+rd|5*nD0a>>0pE~gV)ZssW9slPF;Qj2~4b1Lm`v?De ze-$w>Vc7rkKKXyV_WpNaW*G{;{#8Aq0zbLf1cW~c3=JLKvJt7Me1}6d46rT3C`KlG zP;>OOQgW`-Gk{uzFiY4l&Q6JV61>F0P<Gx3R+vB4kTo|pF)%SO0ss_469Y2?LnFvX zoiH{s05*b%&J6^XaR&NlN&bD~|Fa}&LRr4iKYY~(4gf&?9~*|Ui<6kWlkJZo(7#X- zt12sl{WH>u*XDjT%f&H(G$k(~0l0;clQdEqs4&0?xdIjhNkVGbyl%~avGpXMR5eAb zWZ(OkB4Mjgx*D#xM1Z&=b=9ckby0fJs5+nObshLPYXrntha&CA{9yL`=4JNsA@{}~ z!~ty$b!ERNCLjnaNBx!!EW|^65EKTAk%Wzo%K>H>D%yS2NhCtC5L<aqXd&(=?1^d2 zREKQ6h`D$Wp^&bpYIpIIlDGFV9?fa;@t$Ci4^``xfroMQ9fd?fc+#bbL8hUD_W{J3 z0ht}5b>Cz&gQ|`mvy;=8(iB2JGb1l+%~`UMj=DB9)g*5LH_mkRbNb~YlXSRWiNfTw z`b~!GCO<|_-f{a*#!i<WgA<O9bcVBV+Lwb}zSV_t@*5J4RHrF8Cy~BvU2wT@*mzWA z2*#*Cd%1b=C&yy}E(ZyVw=Fw7YbN}jk=I&e#_8PmIfrR!IutdpWVWl5*m`Un#Jr_o ze3i&+^~XjYHB1W3oP>1Qk$AS!;ySXbax2`Z(#bj1qAVjC^H6fJH7u&{5mFm<d{M-r zMh`Vyb$_rV>ILECjEX2ji7^%vRh_X~NVqtP*+ZJ9nCiqqR+JY@WyUx#+dauYWK}97 zD%3=3q;rh8@Zl$<q~qB+M^B5@C{$gg+Y<Sr+U2)NriE?{Yq5>_@hT(aF}GKhg$y}{ zn)|{7e}?3kxF~Nb`X`*a8N(SO#KlHUVjQxTo~x1|{I0d4eZFkyjGiRybrlCQd2<+n zYkfD-6GgdAiSd{LYtSBw{w|jvuvGy>jYk;-j%P~{2(CuoAT@vdNb&4D%ww+Q!i*AA zDwLK+RX6xT6dN8cN8q#WVb-oeAa21Wd`0ISOd5kI&G2tp4PZ6t0W(O6w1Aq)tS4$H zZ&pv}wt%CHg_3avot><fK)-umVAbR{LQyFTJ8y_?(~b~hKIK->H$oef^F<FUeG0@* zJE-dAqj#+FEj+=tG=o-{o2$e5dznjaeJlS(k~O06qy1!9okbJt4`~;V(Fx2>IvasM zo>1W&+r=Agg*N*WLK|N8hk>!rFH#-jeRfw}J^g`+pUU)bo_h@Koq!OL0qvp!yT&k= znkfs@d_LF~^$;EmSxUdX36w3(o6VswkjDm%4jyqnX|gdw&5&tR6|0PMSi~wL9WMqX zJv8C=Sm=t756^~3wtYHzHALX;3eg=O4KpJXPPp^T{a@aO?*LA3DS=*N`VsSuA>!Bn zLdP6vgWMt0?VE?(Qqvu}%k07Xv406+_!~og8=!G#5JNs3?X4B!u~%S5yMVD<A~0eJ z=a3mJsFGM9PCo*wO$u<=8txoz(x@*9G3Pu{P6TP@bQ9F)s&xdhXSzd?cEr)0R7yFz zIMbr7G~&Z+YZNxB)6d&{{MJ4Fi<LRa*Y;BQ1q$9UeU`dNJ}iF#-okYyC;kaRxuj@* z3VEs!{z$(?b<j$!pWqiq@@nr7W&Xex$5+`w><+(;*o~<j^GQ#y(cTG+Q(3(evRrC2 zL|BKJNjH*?=HN7;wVK1KoBs~~5BmG}PWC^0oCDw`QRq)^tNeNX^BCe!kF&Hh|KFtd zLw9aJye9^hm*n$L;z}x->2VPQLxh$6x7Hp}!AcCQ?%-#s=v1X`CPzgK%r6v-CqYXb zEac=@=jRpb=ciQVCnhNw=%?oBr`O2WGzbKt{F&UOlq|jePd3942uKV~49pA!9WgQh zO_G7J`DgR~_t*dLjs0U9Ux@3O_w$F#<bE1B`G0QSt_}|NPX8LP3{~2)TNXgcnVpSe z>@8_Qkt!%e&jGQrz>D@MKvGg%Ap%9cI|HG1P4Oc34&JNZ8%-5B0Dh$y;cRoZL~5n) zKCLl7nVI{0)35Ijz~W%B2iL}`0%LNUl8syE28*$NXqBICzO98-g=K|x0TjBHcT>p@ zq*?7nm%yE-uM>D&cG_J&Jl%%v<Fe_?MagP9exA=AIPU9}p^UCa(Xf0uA>I8xn`XP# zr(k99B6J@9{Jy$jY0ZH#A%F{c1TKewWVvJYoKqjS<Ni^%qZD}R9`DgISW<H8=!|h+ zMIsG#sr3t6EU(quE}T3I(yzobUISVsJ>>(TL&_I_--T4XbTMhT;IQxEwT)W&h0}l# z*}ajZ!8aRqjF<fm2%OBOhovzRoNQ{H=?<aZV*{yTJByGrV_iPQ9*3`Mq;+7~fy1Hq zPt{=`@)C5NZZsL6%)Q?quD*dh)|XbU`pINDG?5snSND>a0{m71?ozQoOs;HKLC-!{ zPzU6wm^CE?2$rd8%zy<UtefYkjd@A(38Xv?f3Y*?pQuf&5uFh4^T~w7fC{=$qHRlj ziN=0`U613PNh)oCP2NusO()e~#$)PdEB8ei>pw<R4j6h-=6;|MSu}s#qv+#5;K#nf z3XN~h{Mh9E+)aRnO&JGDRv|_)pL`0f<cm|3|N7_uhkwV-e<SK26T5q9ZN7R?006B> z|LIfFkd;xfw>Gu=|4srL-YzPmnBTK~*E_SLA)%l`Kw;vN5FxJvD#-yPgcMoef5<=- zs@b!rPr_!eo4kqPtI<SjgKFtp_JS?&8>MVxST*un;kEToA6tGsKbpRWmzT#Mp8MBA z+4(!aTn`B?keT;oazD(@ynOcU`Y=ys=l9)01w7oj1sF*TwgKowfIHxYl}c1dOmUHR zw@W9c5fO)yj!FQm8HVF?H%ebz!R>kZXtvoU6thn)W|zE1Me#PBn(>d@K^9<nt8P~v zuyH=QQT9=d;wo)Zj`E?te|A9YE8n@Ix>t9I)8(cS74PYF4*61Dr&oa=jRRBRrQq)> zI4X=1qQXzshokZo?I{B0CpO4frw_!$5q@&@`i(FhKBZq|4$ATVBH4@2XbiE7ErAU@ zS!T_t>&T1vC0^5#8Nr&nvdmUd{#0T5bL+{OQolKqq4pP0Vb-!a?GDABr8JyF_7WVk zp-U{x3-&o)FaKPgfjCpuIQxaAvLAOYp7p{E1kGgxS@<7g?mx+&VxI-3r5E8$lOkn) z%I4zoPT7fjCqP8R=$y97UFi&NTDI2OURoe#t2DV%q9U4`8Zv25Ky@<x0&kXCwZvvV z1HWywMwW`VAmVH(GKDKZfv&iV#ip1nvxA0#NT25>LqtF1ce=a%CnB_Ts0dOwa{)rF zHp^7*{|r+S=Pn`xk8l`c4~s3~(YbA978$4v8Ut17^e#8JaJB6W4vobKXWE)s1?M%+ zA=J{23`#lSH6nZ<2s=&JYBPhGzaEGYnZY(8vMwuPQm>`jLRsW(;>2>3IIK-1fD=t7 zx~yoJOVutRGinpIuQ(9WA!Yc2RUA9W3?IIhh1u_K0hvFM72TPPVN^5`SM76SEZ>6k zRTtvRTX{f<v-rTvTfg#Yp~hHyfFVQW{kjF_DK|u7Br5(fB4f1?(2(=h8-`~r+z0KU zP}s0EW7_Vo>Z<ITl2KXQuG&7gtkEKB)n95rLbve1tVci!Bcm{fxuDEqk;$p1$p!1D zVt-FWsh7Mnrt}Ls^#Jmo40~*td>Di5l%RU849nkl4Lm1bWjYvZkj=KdlpcMec(2N? zhE%QQQ$U@~=dvu;OI-+$yn0-Ys|&fY91FZ$ymhu5p}z%-PtB7uW9gxUbsFsmr<U8_ z;7e*@=^^#5=DQhyq{+}aZjx|U7c^hYbcGTZEx26SLw9xMCV7##*vvT)bj7|WX^_=R zGjSuO@iq76$~{U$mlZu`K8h#eHhErBru5#QIxzOQI6v+CL;8Rjf@Y~X>t&go4_-XX ziP{vsqF!tAyBJfsL<Vqn<`Fh4Em4wjz)36nvEn1<j9CSjm#1Et%wX=uTrJ6x*%l6Z z<yTG~I^T4y67#a5hE64S?`lluW6g+^8;Lu{IUDbx#+uty6KDuOaBYSRhBV)JhESEW zt`K-{VqDrp>4ycp^X_U|o%A~TwQc<4k)@ryl`Pp|m>iU+SKXN{{kA=Myd<y|7rR24 zn8jGAa>kuM)`{iD0<IzI_0{zt(C?$uhr0oTNuPnPKz%wNM5?VB%aqtl%~?KlYyGRH zVubm1F4+{oZg;*O4(wT**(pmyRPzD5pL48^Z~<s7PO^0`JUdSfdoRS=NwI_bFS(&* znSI^}0ow(3$m3sKQIZwDuF1FWU}~y-DZc%6PDp`G)#A-JtEygguABBNs$N&m7mJtE zO2r|}Esk|pZME7!{HC<NnsJsD!!k7jpmT+5r$u3T?u#!FpLT7nHrY7S<@-)8hO}38 zg?`+ti*Biz&qz8`t!v7~ICb(HprGldh#}&G$3lJ%6~Uv!mAN#!XKveH0mwTw^({NK z9(c=err*kr5PFPyimN<Ora<Pg+zBpCrwk}@X-eHLoV{5hm``ajMK+$agPDAh2D=y^ z)3ybdq~lHY=sfl#nkm+p>24M+eKBd^mM=J18j`^1%MGY3S3G}LBB(KnA!e^iFPj%D zrZO)I_D99QV@FNGMg~lc5l8^W8FXLc1q=UtB^9(!c>b2*JRK#fJ3XGb?g?Hx`1O!C z9wU4^Pp!=&MgGRB%*7lw`Y@FxwvRphp(W0bku^dygwT?xpocr%M<#flHDD9wBUfC$ z{lK;2G>>t@#Y{qnlZ8rCPGK|(m7*YK**(Z%KdLh_ks|0cBEs9Y*l$>rLck??PiT7B zm?e`ZCQkx|l(_>Mc0=Zcgo$bio@qxz9A{n84hg*|tisEtWiHGMmdYVHA+-|ExaEq| zjB2B@KrW5wl6~KUNZ)XhCPaBKtNeW8-uRmM9@#)+fN7*Tkz`iscHx!ghju=NmZnOh zZQC9|->5T_Q~^7ex*&xmR}fU1WQsTKlh!;=t#%B<K>}}?x>8etGwa6@2zm%Q4JU<0 zkI`Pc<&$J<INsJ^ti9eyd%2G0W&_RL7K*zy6lZJb33W7Oya5j7xIJV8ye*)&BN4Y7 zV%->?*b|D_lbYC#i@6<$yFSj(c71TRgVT%NzR$NE`R)jhw|5iF5fbi*5r6ykM3FZ_ zvGGv?ps)YN+z@{1!+iKB32-7GY~M*PIK~Q8it`WFzVjCUIDyFdxPmmlpax~sS(=ZC z?!FEXin=V~;%QmLSwrw<#6MP+qm+m&IO~p}t+%a1VT`h^gCbpnGH5FWBs%ySpFmc! z>xG<2?xlC<BTt$yIe+)H2-eiyK&BOUYjEkvUFGf_<;l;`sgD#V-zZMLQk*>FczMR5 z@{F8x=U*$$t#=8pBdo#E&c}vcf#jW@yaD$*^m>6li~3`2wlQ^^Ap2h|`pIkiuopd| zNWH;7w_h$t?HllK5{ddp0YBnE-gxnb@g)-Z_aVM!#GmzF5x%hVbN$EZ@8El){SV?_ z(Z8bLN3}k*YsUS5R175by^gC%sq3C}z9Wm4d~};@B*PErkPBysCo)Q}gDA}@=;<=G zIPLL$a&UU;Cvg5CuN-$+ely=7zxWGkqRrHfDM?&SI+973ft@{Vwn%yw3c_Pj`{E0` z+YlbYW5=1<QbRqVYvN<83FdnDdhr-jeuy`$o;+31R<1ZtbvkHIvc@9@l^3eAjb1&( z`>>R8goIxL!E1SM)l<Q@UU4Y&e-4}Y5bqVa-$QD^uzZX+#Gw(T9;AXOLbX#CN6#rx zn-%F!4EiX>g&5JJMM<qT+~YJNQhTJZL|9iNuv{Wb*9oi;5vLm!SN5$MgZw*HjU{SC zgmeN@EJh+MhUgY!{)j?9N2pz*+OCgtux?>82-tx@OMVIvR^k)1udc@zT4&(bCw>zf za!s6rW*Qv@4-8LSm@IRRt<83v+q^-%_&NFD8Y@qkAddpjgJDWT`@PBBK4cEW(Bta_ z4IV+x8F>||=d5TmmDXk5r25L)duFa>mr}nWD*iu=y#sTl>$(NnVaK*@+qP}nwv&!+ z+v(W0ZQDu5c5<`U-shgRZ|zfcYgWxa@IB+<c*j6v4@05ojAD;z)oyC;c}11)Y?a~; zPdBB{U^TZp1x9N%_O9#n0(5?PgeZ>oYR`TW?DC!ho=UQQ!9j8%JD#_{Zp@o4XTNu) zH@W^`O0WwNJ5yi42=wAi|JNI{fA*#S+p+#N1D%8c`Luq|Kz{#+0J@{26|Io5iN3Ry zlahn8qm#70jlSvsG_F|+<2H!&NS#xbYcrx^dH4LdRB{M`7KPy;Nd9sX#Dz072+B!q z4w)I~A!VeuZu$4sYsd(YJbp0(TC&AOi4sEE&t2z^Uek@=)U8jTA1?a!Q0{6EdXvAL zVY3;?Iu$impP+6ZhUk9@F#f^+HJCi-mYV52>m<ZlDA9;44vzy_pp}gb$s$MpOGHw{ zbOZOUG=i(fWn`c2;B5s}+>DbX>;g3}D8?kl&8q>oXdrKJ>zGYu29CdSi_IE(K<paL z*dUSn7$NGAv|6{*Tp{;W0wMy21}ITCBTs-^e+cJS^F!H80%P6`kF91wL-#Qfsxe-o z$+g!QjERuJuc;ThtWn-bsIi<OnXGW9^WGulVQVJB^h4$0LzhIfu%Bbn_J`5p7i>rD zWCCHujE7F>N}u<R3)s00P%PT!6U=K!NB8ehWt(}g!F!g>*H8}kt|zmngvcX`wnp4z zZ0;gm&wH3Pk`NAbf=!7i<#duRHV!|=uKl<Qym)}RCwkaj>>*pdfYRDUXnF{YVP5=I zwia!4TeAV1Ni)!Agpu7+FXsz-5b$w~C2;07K6x*exXp43u_(L$b~O6um;c|G_-l$e z1;1yP{Ei9H?_=D5b2R!ZCjJfvej9f&TSq4weQRTt@13`a`Tqn)l03I05I>xEMs);z zI@<ovfP8I&cxo!bd@uuhGkg4?&COO4Od3yz_P7JyRW)#wZ#}(4wq|xXLUOC4i-~j3 zJCmoovk#yiau>>xf>XWm-lkvJ!E<R!bD4|>nio8RyA(cfP|T_n_MGTH2~J=5g_43X zLwpvV5Yvv-YxRN^7@aogaPE2&hy8a14YOO8;ID`gt!Wm|NtQ%j3};cpyb=jc=Vp%Y zxeRxxT@QHQxNaByJW1j#W*U>oRr}P?ryaTT8Y7jPy{F}HOdQIJc(p)9r)e3_sZk9| z-EN4$2OFi9S9DDp6DXAAg~E0ZcsUssd^<Kl2;nh;e{K7qu(Jt7^MvRm`A~?88Ip4( z+6#!NarppwHeN6c##1lV3e<9R`$4FHqaRwLzXZ_bI6%-sP81vCOtqska#t3Zys^)1 z)u>>wtiS*5U+~Wl@}Hk-3#?fe?0feNjP&0H1)Pi>ooM-;oy??-ZJdQ|oXnm6tvMW( z{N{=%j5K_e+_YMVsR4n+KT80Zr_?7%R!!h7Q7dklfJaNc?(*&NP-wy`27-i)yq#P6 z@1LAb_-nbZ-|=$>j_-`)JO3A8%+uurNyh2GeD-|WTUMIqm8t2`<xz=m^)|5I;kDrp z0lSHxwxGGd(J%S{9m13A3s@ybz|2>2cQnkTW$rQQPh~HD>52=P#Ych`Jh#1RKa~3E zk$H+g5s`V6cPk){m7XI(c~o~hAaqNwiy(B%?D&HsD7-5BSShsfU&fK?Kvl^WlySB0 zdYwUjQxO{e8J!dvVwf)z5-kTDBLNAZK20<}BloP&p1?5f`9uPdm;eCz&FOmPd2gp6 z3mt6eG9(3EC7hy9_$|6y#OR`g%Yq~)?m3Zs|0DfVdsV4Bs*EbKu`_LYP*l`zO4NiP z;oukc$7v!U07LsjB#+h2O(=cl5TE*Z=xSTm;I2bN-QJE8teWT;3uqKnd>Ns~kk~4= z*yR;2Ljq7%vGIOE{h<1~RIoX)>Z{?A9)zJuY%zbT&hlyw4h-xibje%fb*yzvpml#; zzqGn1S%8u?`Fexsa@8;yKyr)-aw;o6tJkxbCe!Tt>~BCE{vtvH%yy5x&e>wI42TP` zV<?8!*(7T1O0t`Q_lqzy$&La_48^?ptSH-yp;a;)e?mm=EDERg1Z-+;d1McyQadA8 zMOj7Qto=)`Lh8AqJ`=BOp^8dY6x(o8I}gbGAuO8AjbO{!YHAGE5!W603P#1^P91;o zyr2_}F`3S~c`5YSbGw|lurqJ*UsZB#xYb$FDX`4ARE;50TvK)Y{p=Oyc|mm%Dkinx zr1_ir#CnKL!XQ_8+g3KEUR8TzWHO%NolW*)rcBG}?cKQ<fwsYPWjYO%wJj+!8$6fp zO+G1*=S;_4pk&b&or)h?w8a5lQ<b5)%B9-6DnwPZih<c9s?hYFg}A1M9nr<8=U!d$ z?<zjh(qeT3-Y1t@gYW`6WiIJiNa?RVe2~fofO#{4;opz208NUJCx{I^02E{^RsvM= zNH3%$KPTlbc)Ff8Ydkh~2DZT(7PFrf1r6Lh8q)jXdnEhD4We4S^25k2@RFxYUZY$R z2&AdC>QehGuIcXglz4;{NeW^VaG;m^J29w&Yd|GS)g>kwERy@VF)HvZiJ74nD)LR3 znJr7zA<vl10&4&n2RN*!_H@wDscr;vy&oEn_zFN-cQmQiUe^L-B?xs$Sd>ajY2?ix z8e4565ck?QAl4+c;PoIZsjj4ygD6Ij%Jbi;7NH@t-qv#OmzV2cVKh&CwB^WuGO+;% z!`fI}bHC^EGd7UXxdN61#bj(3R&{NP@NOkIcpD9f>HBX`doD&{?zOk6s7>d8T)mD4 zJwa}7sb%(IE<x8rAML<~!hK?;Lf7lzFZcsS$R+V{f9`ABpA&cJj=dRo414b1Q?}@g zzJYF4?|oQoRqt}^kd)XSV9=5rZSJf{KgVE3JxZAkx~G&tJGYB&hj<i-y5?>j%sv%d z-k*T|DHV0iyL>$PDfi^&1m(O@fLO}vdH<`l+3j9sVV%o^^A9%82i#?Yz+%{i43;`< z!VF;P?{+|mO=z-J4-gXV;JJt?3vA8TN^m-8iMUQ!>Zr;PA5&K(v>(5Q^Qo9rRb0Wx zXbu1qIe*#5II2&%qe30=Nn{EgI!Dk5rltBozFIjGEYv7-0jfv1@8Oe+wSv_NLKuwk zj|s<SofMz~sP`dWB?mkU#R8Cz5IVr+fH4H}n83#taoH<C<cH&llaJJ32_f@~%pA`W z;ElWOAr%ti`M?h(2Sn<*frsh>uSW0`2=kpF^M^6cVS|U_y%pgldx-)PjPT#P{{|a@ z$X-bfPzuEhDa2D}7YhP&K=ali1FVZD-68~;6^czM!iyQ@XM#Tfd&Qy#oa;fnN(ulL zjx|(>m1h@|17?rrAr1Gd*bBo=36MhJmyzIq9OWm8z$=+Kc7l&x<ht=87b^mD5P@*u zgHa$4$P~_T6y{sH9+2%xK!~M)Kj=U@z*`CcE|dUn_2WT}@S90VN8qL2j3Xx)AtoPT zyv0r<2+$JFu@vURaNiSTkIk`<y1Qo0#pupbEH8=bb$b0_psL+}?oek+w=VifJ)tt1 zJ!<uZHu1YFX%zsYJ8Bi#XxgMn<ndwxCf@sJJ!yjW__@UQh}|A;ur+#4&cuV7LEj>| zQLW4M=FHQqJKg8_j;{IQV~$qhG|QYC(#<)b{f11j!#Z7M-m3jAy4zs3470y(_I@*o zYVVVRvmL>n8L*#08}RPW<BP)HWdd`H&^0YF<ewOh=PS;~!e*({TdTUuj8nJ{dGPL( zegN=_>HS3xIN;-eGisa{M`Gt2h$DRFJnXUmw{`bFi|Bur*N6&~rS0!7X#HEW=fBxQ z{as%FGI^2s*7aA>w{kX?bFeiuc67A;_mQ_qN%JpS$Y(LNHrb&DA24lcXpx+XP{)t_ zK*><^xRu}m(mHBLs)qK-%fueo8`kIFVG{XaH><csKAw3>YPgZoE}W)QFEoxOCcf|Q zx6nOM*`zbk6#-?y1aj+e!`>kC5I7A6B)unj0jt0`yR`wN5ZMs-l_%{QodnIQ$>HVe z8Ips0f6k!&w>JD;3d@iuHxwb~SSC8%{iBV?oeE9Hs4EqgK@d387nZ5ozaKRN;Nm|R zmQ^twg?$UQ7vrOXyw0bH4>toFj4#2gwmAfs*)Eh5Z_-#4g<q!EjA<B4)<d(xkbr!X z)bbbi>vR%=jTI<Jo}fkXGAK2bov+jyCED6(jiaitwihLb8MvP^nv|EYhwH#CU6*Ui z#LL!6RMlfOUg)Y9x%iu8da*poW)$z}C7UX<fT`82bmq(F{B@G=*cDTL*O%kSNjih9 zHfjH|?9`%|aX3JH2qs4S3Ej}Mv+V{Blljuqvt}aJ{xxrPFUJcn2gvMS8@m_+hzL?{ zlk&jazuCKc9hK@}FMc2JAb4zArl(|y{P8Z-id;t2HcJ=_!43+D_*L_Ez_v@9F>UJV zBC@o6{CkmoSlj>$-CriAizX^OM5QKnfbp8hRaYy&$ITJf()2zWgJjj)UUy}+!4vVd zuL{m~#)b|J`gODBUbOia_Yn2goeLPz3wTR7jFZF0V6`AH1TIVTKHBk$XxAHBr!m&y z*Tn?6&=DnpEr|^LN8k$Q{Xu7o>J2Fm96X^Y1hvpTBBKzqUShprCa&ob4*R@QT<;G? z!iuwk2uid<4(1bcuxpY2>}E@>61bPcE+j2gJ0OAHNtj|0v3*S~{FO$u=^2ePPh0jX zuS|Em^;iefDd4@tmi@zhCbtwY9QCz3bXK%suAx!5A@dmeeN`s<V(xL%jW|%(L_?f( zzc&y<)|3e^A*(&kH6B8HdHp3twCghrh|wO#m|9id7tFs7hyTRLf1<}sxs6%>8$B7{ z_qG3~cJ()U{_?^g`s+_uNnK9(-()I9U)wo7IG-&AGA9rcJPsD$OH?{-)@F9-aX`XU zEBt;rBK*%<q>2hja?r6oR{Ei5Y%IylS+mDx+%Y#>QM&<ivxN37&uQ)_EzggavoqKq zmTm}sp^1@9$wULhT#4{~46MI#_0!@hL@S=*4}BJ6(4Jz5D(Iyy&5J&MNnE(^<~G!; zj;Nvm_7j2{FE>TWY|XW67mU;CS~X}|+*PhsVgAY6?~unXI4kYYvr$XZ2m8{WOd4-p z8xhabqDew8Y_+I*&d;T%>cC1^a;?zht|Cm6iqa%JTCaxsqswG%*uDH4Gb>!D`9#QJ zRH7O^n<PT?wYEy5ZBvQ4#Bgm=%0lW@tafvz^7j@!`<b6c!$Wefqwnk-lxDFt$2!yv zW!q)(Z>0;YbS6VS#*C)Rdyatv@!LS(a((D<R@z0Ba~(@ds@C-d-KDionSM7DhrG)Y zog*cPs=LiFO0{pJr(vjiLpqAoq2hq{mJ+<k&;T-4dLcA{0zmW*=yGetX*C9Caj!BT zBPOgl=7(t)D9jYyr1r?P@~#!LVJVlOCN81w(A2EGKR<3~{bTHT({>acfdO0mGw{%n zHc6*xTVWs3``Ed1$PC0{A8s<Qqp#;v(RY^dTaX=uq<sCKun2}B37<9ZE3|U$FkLse zI$7#6^^tMf0LVL;96`57eaDF7Md#?x432h&xmF?ZL81GqH&{a(Ll4-0eIWs`#tO5h z+5ruof%0#=hI4sqG^Vc%2ddmX!Y|15$^_quuoYe7@b3a4^odf%qfO_&0HSE;3^2RW zXlQfw7_r>^9k>6C&i{<tg0O=8obP>z`1fG---xKrPUcp${05Frf4TYomHh?u9nB5@ z9lA=|wuq{5+{^7#Yf~gGL-r>jb3XvAhHK=^6zN)Gfm7su3Sdit{~l<p4`<yxZ+moB ze#i;Lo#{HrOA3wCD6`OgTiTv6{RH^U;p*Bcy`-}Eb33N>`(T`z_JHgA^-k$m?v^Y7 z(;T15Crpzwa@Z8iiIJ?R*8AJ5_^?V#MJ{RicZUkIS9%|k4Y8f<r6u@A%9|<qLQQrL zkh^=SzF<EgbPi*or^)i3OaJ*J)v|j>(^$_Xqf}*!jI5m~Q_CjnzU=4g-Gk)e8!D7W z2&BFXcCeInif=!31}CS8wiC5!$wVyNQg-Vh2Z`X4?-k@Y3kwh>K8aQHpf%(D)0Snn zbk|k`mZTEe*vstoK43H`ITP9fvTFvJ%mUT0*UYwM`lj^Oy*P1cZ<$HkPZ8yYN*uwi zC5NZTEL-Sia|~;I4xbgy$?TKcWVORStt0MoVe?`asakp@f(+Wo1cP|Gj6951e6ru7 z@p_GX@#pk2-TA4yPp#7EQ&`A{`i{$1VGjBc{Pr2`!<YzM3<KJ;EbR+3Z9A3KOYXzv zX+xnNi$|SJw2ASw6{AP3K95Rzn-{K{CX4arhayBRL}^Y`xmAWRS7)ii=Gdlo$@=;g zp~_o#9js&>u`iilz8aP*3-%zmW^NVxhFYenQ4*aS&F9wW4A}VY#RdMPOw+{f&jS65 z*qUT<yOP+f2l&{?k@_}PI{G{dgww+gQEgAVYTGZ2LJ%y`AXpS>(JYCtqnz0Dt0paM zCL^Mz<YYBiy|8azxX%+O1G7RiJ(ZQeOHOf#L(oj@At<(b*Y6G8Qa-&6++fvLRX9wI zO*^yFCEG<-Kr#sr+}l<Il@Bd%kk#yO;A#y{;UsSM@E3AA#8Ay9@nz1a@MZDEx#kC) z;!|&ps9!(HX27?^Z|h>&Q5-0Zw1vp^Sj<wscN@e8yunI{+4ftIm2ZA{Okp9ChM7sF zcdfNkpfoY|Dg{%6wNp&p{&zfi$ZM1l-GrZj_J?{mtWp)@1QPd{eCxyNX~>(200?iX zaZFB%KgBKu6@C4FW61#z8cw?1Y8N+Y;hR^-H!OER9eF3qEkSf@7hn~Gzu~VMJcm{! z$i>?pG&eeFE(ztR#vXA?=p@sr-p5N6m4xf?By9OB%&t$bPs0)n>hdbQYpK0Q)tF|^ z+*+TaN^yG!olb-S%<%|v+$H-KucYm!fys`QP*DR-2sKt=<!M5kj^X?{`n%oxC%peZ zz+WHJ-uPa8?S2<6vj0K|`4{jN1;xd`nJ$9*hGxe90)0^Yq|LX1chK~J_y&>9e6cvd z-Et1q8jS^ba#<`z`Ap~xje>DMpiQK>7FN52Ek&|7D2~5$GZG3Ok=qZQAXYvwHWvX& zc!UVfee`MW?bhYb+x>mhAFlGW1Th&THpsEP7X%J!OtnS^>U!3Vn<jVSmYz?&pV55j z0p_gH(GB5FqCte)xqV@H$2P5;>j5vrl|arFnR3G1C6yuk3zlHF8T?2mo`8nVm4qX0 zH;lS+HXw1`oET0YyIp^R&y_T4OZuWQK*hPuO`Lhz5Ee9bxa>S=vs%tLy(?j};$Q?w zA4FrzJGx{S5~GLJ_^lVU-%>DdTC{KqE0dn~;y9%Ex#(SOJ$45yYO!O2vweBRqO|+0 zi1Ja2=?T?7yD1@w)lgLA5GOt_jukAcJ$F1c^l(U3+n=x`-|^hH>_Azhr1<5;$_XsP zZ&&qVM9{`7uuSx)D!W56iwf!^UmDndv5Q!8`9U0|L6+vTtiH$2kGB8j4oO%h>kQK0 zW)Cv=<$IJ4Z=2D07c374(bDf4GbT`Uk=80uecM>Xa|T~1djoHErHdR&m6t{f^I4zb z@m^&6czHO-YT!%2E9NUe7N}yZu6e`MBDe;e(0$^RxQ&9|HFLPd?EafVRPc|u_|J&x z$X9@C`EG9@z6Cw;|F4MoE)T{mO#iMA$&;Fx%1A@on0SK0<dtT<D5ZSJh`G>!a~fvE z{sM6gW<aI6OX6sHW@2<{GfUMfDOK9-E~mqNTr_RVjbDDA%QW6xrY2$|hcE!y#}jE2 z?!L$0a%`Q9zMoHTjz9LFRfdT-mg9yXGL%^?t+q_>05V`#E9zJE?%*?GoV@~ma_|I= zHlwqsvt(FNv1r0u8H$EPX|uqt9;}?#Qce2-ZeP~FL`usGivJ>n%Wk@Ba+J&^$IwJH z%ci!{05nx}*=keW8dn=cW=ts1<xmK!NYiADVA+1-W#Qy>5zl2!qCOvN#vO)4r|jBi zd%LMKJl+$pH<Ff-l82$pajw;HB5cK37gJ!VS3?4;Ek7hvU0XwiI|DTBSXnfnv9^gb zqDx<6hMjPmny?+7mzkZil^u-!5)zjPa-ctpR=T-w19X(AN#3N7AdawLMg$vO4{E_h z$$6-<SQ*@L^OvEBQ9!;!Ot7Hu)^$1YH@+-m3_S1XaX0Sh;e%$fJ*HyLb00q%w62Cl z4xPJ}QLmr1I4Pr?AM4y@7R}IZ)0|>wVa?+kpiyq`U1@0H6l;ie7mNAbyeLW;<nDT3 z;BQGh*~!vvH)O4bF;=YXz$NvDzet(aGa|lmSf^P2$Z=ItERcp#qKJ*3yI!=am1jil zsI)RZ=$%W(h)UwoMsqZ?^FpZ_NUU$e>vG@Fp40)+;J*G$VF}$4zyoaz^vi9t2P}hM zOaBVOv*0|cj&*1Y%@grl+Ki3v8Z3sHYxnH<-6%Xqs+M(fi^-Ff*-L*%GSc#Sj4uEl z+=LXZJuuO~`evbr(W}4Nb#=qAo@&Os51+`cN+s%WqAID#12z+{<sw^P5buwHeiF@s zUqf`pC~35C$xe`;^ceDmvO-G_PKn@F3e_LQ@OR=nC+m7wgs1stRU9g!6q)Rq%tKi* zU!?}@aa>1T=N!<>a1>UZTvCjgqXj0*6H(gEjpr)_U{~-}pSFm3<(Wp~6V}k2QE+`f ztCf#h#FSACogX@bmQGQ2mM?plNZ5NPd6y6ZyyAa+R5wqB@xoIxcp~wk=I_8<OTy=g z97QnfN_%6Zivvv18P!?S%8{U4;VA4QsIuk5%>}VDdhI~;)jO3~fn+DQFl`iY0^<ut zGaEs%*1m0U$|vZ7*!Mr(5;H?5MwxeJcJs-qXbfQr_lDk+<ipmDZWxQ);A~&_=yf+F z3<Tre+X-J)EaEMFZhw5#zHd`L{A#J1$&o+!%9Hs*QQjEG&E-x05-rMxv0a2{8vmnP zgv_;}**K--Fg2EW49#{AA#Xo5n#l{u9+Fjd(1GXpY0;C1nl{}UMe_QyA@4F9g2QNL zo2GOcvJ8g@!=^O^*3&itmEb_?fe5|8({|LSHv+kXi1DjTv#!6ND32>_YJAT(iBw*| zJHSc80v{t25By;&<-17-<>U=h&vBeT7BXYd4)jnLamMBsraLYmXrN=&THr$QQX12x z@NNmwN7gFstZ`b301z5DB%~}>b?3O$o25>Vc6~=Km_`;JY(D^qUQqU$s%G=vD5Y?g zSJAbUvw!7Lux~S#spB6!MU<pZ!$D8@oiS0kJ`H%)CV%zuH%0WH$?kvC;9plnuwH0S zfp6YhH`<RMg#Tw6G}gCK{%)QBl?W?U!L_sou|G|!o8R30V*OUJfG35M$qW`K3d=&l z6~M#d&3-jK0?4Y>pYN>`OIvZTtyyq~n^LXyuMN2kpi~kMER<S*t5;U4Ha>YTZ@E_9 zXSl~0qvBxxseXw|b7%b8f6HNfTR4No2CmT%a#GqA<dEr6=BOHC=BOGBafaIEVAsMO zg62rx83MEEo8$=5#;}={4~!X!(I0g!4_<dl<PhNby=%xZc4Pl?15W<t(z-^h&Z8da zu^}HQyF2f&Qn@RG4Ot@!<7(cbNzozN-x+Ud3xC;f%H-7qHcpqn>jMpY@{EPEaN{2N zXC;Il`|Tzc3+Ch*5GVNr_KzEIj6{zo@wOpG7ujhy(P=l8IBrUz?(B7--)y>+hKpmL zR7qt6pP4il`g8^I^>PK5B;HKspITsv^*!-&@0#xMI@Szr@XN&JqPEEa^<wOl?MoB9 zdDN1~LF>)3&$caW=Q5h|D%u3}Qp||~MCTGU69-7ts09Ssaa#XYW^2^c^~tutwDU?u zJPcJA2;g?aBVknVL}^as(uw5`M?HbJjj{nt150t-)6gf9$%$O)`2Lcz1SSQ;!f7d2 zwX{fMMD6aRQ^^OgiRrwi$~#0A*J7Jr90gjFdHJ1?Q{+Ob8*%jQ&DL~3k))tyE!ebk zOP9yQP%|xx+Cicp?D{8U61kADF2`<BuUiOA>L9SLtl#k;gbK4K$u;n5h*XD$svynC ziA$*mzfFpO+m!6aOXeXOa5VbTvBIMxv1K1wWRBzVw2$!1>m50=>)bpXEhOuP>kudQ zO&BMY;GjIn83~OUYY`_(2Jl>EbD{>+_c^Bo*O2UV><H24O+3g#Qe-%}KcNF!&tvsW z$p1vW8O~F^?`B1xdF-VnUc_1SUdZeS$dG|hI4D)D&sswp?UfZyi~?{9`v$YxJA@Y( z+a1wn<r3BVW;8PL=4f-4wJcv?z|XPKfuJBa1e6k|Hk=zLJTjFa)Y-F{ok4<MUpL=h zj%N2QO)QNyo+G%HV;+@v&@yoiYKrzRyM1etBA~r=7fpXztzk+x?=>W;<2EC3+t}wY z6@UjBk49YA+!f`z)NikuHP<Da>p{kpu%@P6^0baxr6*m>xGy7(KbB(D^kYPqaPEBo z-NH~_PKJ2xRTNg;TQqoxTFhKFEe$7agpEI$iJR{TWg6vzkXpK}^)Nd4%=Oeia{$@w zV7g89+`0L?%fe!~!PA;Q7yGB&g!@OW47}5%Dk{7;LwR9t)7OA7JztML-{99y{$Zb# zdZLfNedgNI0m*@sJS*zBl32q5+U|dXe*eMCbWQl4DsHhu`dsFpvwI9UZklom>f?_J z^^VYOpjN^$)l+?g>CcWMJ<wx&Ls8z}bM@`ora}q@`sv3zx9C1fA@^-@$5F5=3;G$^ zZT4L5-@SW<@u|O)^PCdwi|GbkJr?t2_FXTDTNZlQa4`hX`bgh{!NfWpJAZG$@xv4N z&m6$9TmyL3$fXt<y0=QX!(Njs=CZ8*AXRRzJ5IB3+>)}z^{0?Emq-H2Wy`jaUHvfW zQ?4GjwB1v0EHyFi4N*o9V@+d`3{^Yeq@&(WaOXm_6^Sa8sf_C>k2o{mYE8Rey^+GL zj>U*UFvP%Br|V9iyyQ`zsJy_=$XLr*2B)Il@IV$Uc*0D@E-}-iI}U2`;F!h7vHA0& zGf!SZH|fgFMLPWn{v{S5J(a{%ZE`4;qQI67?O}|wD8wKpdxyPgb1_ni3wN)MSH^R@ znSCKYB-HL0fVgWK;h9A<v7d_aF2~i%-Dn+L>=P{t`=o$dM}x(LcuEeRvlDwlZNh^& zK4H7$<?l0e9xL4*>ld_zoFHM-Y$X9>qEIP5MF|5CDx^|Pyf4pUtvE!VW`BhWTIO8L zgKv11XbxZPALTON<Ck=v_KqEAZ5~w_lye_$QfxD0w0<Nb8igWTPJ5L*RY9~Jw3ux% z<%BRIZzQ$wE5Su)>-^pdacg(CmQWS9Fyj2do^ukda;$uXXZ}*JNqy9&d{(g`ClxIn zU|vR(VklcXwD))AP1UrDtgYMXk#HEH9pG=gFJ%6aCxBs4pGA9=%wM(Ma8HiAf`r4d zYgB_6(ZPa#tcKLbU|RtR;>2kgbrXiy7l(a0{am~;t>7hgHdE{DNp~DY4%~xHMuR-# z>_mf#6~1UuwerAg7OWK<Ela)vxdb&QFbfsG!LZihB0)vrxzJj$4;_#xmPO!kMCfXs zZv9pmKf`qeAjrg&XV_@=TQYyB<YF+pAsRUKL##PA1ZYS<FNW?hH6UdBFS=36sOn`D z_u4w_Hs5?1JP*^O@<U@XHQdR@8l18jgV`Lejw~lx?jI^0B}m}%1wNiy=Re9!aQo#~ zLIuu}xLS(JYjMUi=fwl|js$_Xr7}>oY7XXB$eT(eLo!CXvjLeRoDl8&!RpZuU6w1# z>lbcH8)@31LRIIE6NjNbdWy+2GLn#KI0#hkUv<-5>Zz2FDxoZns`<#2H25jk=8OxY zSz`xftXPzl_P|B1ZSLR<Go^e??8d3equS4z7<{J%ogy#d=O}y*4m>DU;W7)5Xsg`< z>o`Q`I%i8P@yz*R9G@pj9?2f59)!%rn$!nTv{s^`(8xO+68}4*oF(a$;2{5xN~s5y zQWpjevc2z!Fmre~y;Ahvbub@O4ep(q%dVLlZ$4oE3W@3+2+m+Yuox3Vc#xEZOaz7i z0mfR?e12Z)m%dVzf&H(hpSz&m)6e^mA@Vf&Yc>P<7=yU>l+kPy7#lH!-ih^v_+<IL zn`C8Cpap9_R1f>--22OnF~Gaoy=toMKI$<H(J9ww3a^LWWW&gjA4wB6<?0B_u^yrK ztg-tXM?()#S5aa+B<BN@2P;A4c9d0v)?+z9OfOL1wLb@=?1K%rb7oZW>T=O>GX(PF zH{xl9bs|z>vdew_icux3u_1k8)L<;8SE~epaM@u?Y8wsF(UH{}RI9vw={c2hx)Osz zGauyWYoyuEnO7`xt9F08(&Ocip)k>D&e<Bpe&JiC{&r*VZqv;84zq>ie1R7>6zN$y za#4$$(a+fG?a}OrQ-n_>yY-u2fwWN;G2Fq%k&fr`ROQ--!SK)<+B}gGmo(Mb{o(Q~ zee@Lv;>?=HR%ng}3G0m;CWyNhiyx~?UPKYNEfJ-cCi5*JxmSbqE8{wDxRjoO7k~US z!>y)4i?SAz<z#GB0UpSg>pm$8lK3^Qbx2|j`O{5(l#?o+3R25C@Uc680yNdPmAMWO zvX42G-+WZnK|GE+Y8&6}t_$TvOTv#Od5JwICb%N}@P%vraY@iQk%j`l9#vyiUI&%L zDVfOmw2y{+AoD>d(W)rxHyo}15V|i&c;to4N`N{XV}wszg0W*>{J<F7oqxQ;&a!jt zUf$7j?-LhxkC1Ub&JNv5Y^e}&*3FXS%CDW6loEdckp!qZ_aTK}HHK`D2B{`%FZB5@ zHGzLLp8wmD{zYPnqfZx-`d;Gpf&TYLyMOO;1dN?rjg4*o=V2z1l(CEPzx&f9C2`yD zozAD$aBW6<Q>ubl9wZzdI8utYIT^XN1dt72OC^%M!!K}=XrM4fHaz@5H5)3_0e?&c z0W30oWUzs>FZpNGQ1@zp##q7q{*0IRBk#M(j>ETVSzUnhK_x~as9JoSK6$8duyL`# z8XQ6^wyIpoUbE1nVKq4g{+Iy!qingEa=n07au9C_8HT6C03Q%gM^fWLkWfQHb%1#N z>D8(q%!lqS<_nEu#_d#kC2^D}_wUS|Y?f!J-d}Y(H`uDYHgBrd>zK635XrVFeO@=Q zemz1auN8hfMikuKNkqd^(I#_-fC35R{m(#v*~&E_W<$i5Q*+wm<7dUX4jo+dBfDwv zh8*S)Xl%=Bmphq<Dyb&i2-bGydJS&bz>Vn9rX`d?>g`O%lWq5+N117mfCzD4iz1lg z`RIe0hf`|AA#uwL!28k1&;5V|&IpBn4l?muKZQg7Sg~Yvn7$+-%vMyA#t0mCT$H#s za}vyYe88x;W@^)f{QUXTJq}t)DW&=p<A&@eQ<G9Mk`BFJQXoO62+o#hnl8Z{g|aA< z`?4n6`5m!2BCdQTaFU{_<_umXuGbvh6nH=-TTB?qRQVhjo5y~474itC^rTN@tvKlA zjTfg|b+$jY#qKIPT<7xB>r+e^H|FK$53%S6R3lAws*Tzdwa1sWkjZ0w)?HcOwL~Dq zO1D$N3p4g_SGsR+n%60hVM>mK73r%U4-c~gA=GjtymiI;PUdyh`j3hHFlG$1E0azV zEFs1w1598m(uOpuHvwg)&X8wle|G_=4)^cp?=m;?0~R-Lp)nuO<_hP80o!<!cUY49 zt}~@HBGgC4?rRtr=>5P#z-mHP!$YvKhCo+%9iQW~67@Ymdmf=ETzgtsOv7ldHy)|O zYQiU8i+ILsQQXYl9O}vH;hjO()eWSQh2jxT7Z9DRZz^@quXTfOttcQr?P{8y$v=#@ zlcr<q(g`dkap63Ep};KqHHG)9z^oHhX7w*(S@2s!hhSq>B{j;xER*YkMJP9<uJR#Q znyCCXXiS4vnbkKrq*zL`ow<L#3U*FV+5ug&OMvO8ws^4~utzNsd(Uyf?$fu4(F5AX z<2Ydpz7$%v{p(ElPdxr7Qjx>!_bb15XkK9d{Y>~Tq{>Q*+t@ifeJ@^(^{xNs)*@;9 zy-WM7;vSXK;*?2Xk<JJNUYi?`IcqA0eHBwIp=oi(vBsGx<RW<_N?Sk|y+H#63`2%2 zv{`}2N2<*gFqoAf;s<U-K)@s#2!O6w=}G7PfxO+BEfsH|OmzE@=GgU?<=Evo#LM&f zi0?<FGjG4jM*)oef#0wrfnC`UUCyBck%vM%ejLeFB|hPdt&R<ZFGNR{C5XUC6@z)( zVy-vPQ|eC-v_E$f9<2%j*hDy!oyEA#fapR`uSGK{lh(?KZkl%<-4c<^?yJ*NBZ)rj zQrY2`3RgO<Id9Us^EjOzK|GFZR<S{wIwcj5Vr3efa=&4+A_fiJK_8zccIP32H>c|) zQFYp~Z<1#PvRY0e=h<r#tmB_d)17)D>=XlO_A%H&3^%zJ&8(K4Q->ltSr$Nihw5me zzoFG|Sbw~*q25kp$Cg1kMQW0aFi1{Gf7S*WR%eNdKxJ+k<5^ye9I9M>+>JdB;X18$ znM69UI=`qboeh`AL!w80QL0DQnOKja)qVnpj&9E$2jIxhJVXw;Z~!rg;0fh2T7i!{ z>BF3yq6#ljDK1ZLvwG8^IOuMYA!Uyc9SzyRsX#@0R8iiPSYcj5F>J&Qn57JIZ-HAd z=`kcyjl+#OgnvJ>uY^`<hG^zJrU8!ij{7Uls=03^21vhQKaEajfP6_^n9M($^rd1F z&7O5U+HzWxM+-qVa2B6kHx?wPSKVF8LED&dG@-1))`WEuu|!eRgavzuePc^!>hbYW zRW~y-bLA+$JP9pJo2rXiv|L5(DqYH$!NDz?IokAvrTLn<Y&S%L?^9m)L0W#nHRP4Y zPbMEEy8yd~e+%*aj&Az+^i(ibrzdm}6X*<#N3N8ROK{9L^BM6Ze^IM950ie-hR!yV zD!y{qFvF1h_Ru<_QZNEURUUDj@1nA$3&s%Hxi(ulu!(`G{7=Hnh_2{hhJ849rphV@ zC6`YV3vEV&kuSiSsQtuvhMcop)XFm0<`d!q#WA}uTGbCOfnLgtl<fy1v*W{b<MXge z{bg>UI?T|G@alq3_>b8);Iow=4+Ie87l1jS&ilvN?dcI?p}0Mzxh@^~N9W8}aONb5 zKMC(AU{HU=mgswg3FVgT#hF2b4Ay@CDYSux*0flp6t1cbI;+5MuPh54_R{#Ynj`Gg z(vErbLSEa{<)%N<pWAYyC?e6VhbVeZlEonOl^Eplf8_g`8j(11qx-ajjzZn<Jz#(t zX3oaGNjK`>M?Q~OCIO-}3uR`hBv>mx_Pp9P+&keE$_;FQZ;LbmOd+<3iOC?W+O0-* zlGqu7&>%V{6h?{7)c}`}jFl*K4|^O_i;8qsMQC&jL$iD|j7!zRcv)HhM9=>n)%57~ zhVe)~cmPa+m~#XJh?u!W)coZfeoIoqJqSG|pUL&qV_<|qVnR3m1*^9&*oEk7|1&4w zZ<;=ac6SF8=>`t+8G!g57?sx$yn6@xJ^JbT=a#Br%j9J1NXPN>CFp3ox%Yvl?(@=9 z*I=C6FUWmXnNL8`<vuJ_bZ9!+`j7<972y8opQcXt;e;U?nqMMWp_giTk`|(`pMOh? z{4>-2Zw~xxfktTuS;hF>t-O49EC1)^Nx=P^F`;1WXzT1?`0vY8RHC=+yd2U{PCN9N zg*^n27r^#lExxd@Fkc)roRhziA;|!*7%Pojopa$Cln*8IUL=vv58lL^jde+KN0IvT z$H(lu_o-9&wvYFRZ_y)Bw}O2x5@(`oJel?o1NTCG2~kuWOSk;pvXRuK*<Yp{OcN)m zgIZYAHv;_~!6_IhXl-M-Tw8jf9pelGSmi_LueWbYp5ql7Q&sBsTI;J>#wXeJ*z2DB z;S25OE1D8hi_PThan0CWOBG42?fOaO3Odzli_OWF5uVOycaK&S->P9{%M+V|^*TpK z*~i$a($iJx>a#-rtbe4N`^r|}7N6_E<(1bDx6;oU(lE|eNQo0SDEfmETKc)`l|~e) zWauRhRHPH-^xJK!IDSea%c+CdSUaZZQxu^kDzDaWfYv&EIzKAqSYMvorP#hv2$)f% z?2c_eB#Iz6m(lbObf0B<OL?Ex^ucnqUotVpIv)f7KKN#aYH4j4dz%`T(eGC3B=&1J z6$zVy^58#%g3?hXXZlB+FwVpf_1j&C5~<l~p9z|&5O~Jw*W96v<R$oRH~L!b;3x>R zk|h&EkAv#y3-|x_Uq&--dAMQ?oZ!YD^>EKoHJc;Eb}os(d1T{F%WZAbG2_VA-tUz| z&nLfWgD&Lg4*n?X@iJ~>!@gVr9F=e)HWGAWMDJMtvVM$;)*`-H?QBg760kQnEN`go zV2;YTpO^JJ3Iy{Wk$s&G1(Q6*C~;(nUczt75KScTOP;DhSs_hx3scd?*%oFMu}^dP z<%3bRLxJZCI8J1x*2_XpDzPlo79_^u7-;744pysZhHKCuGh?BEo3L;Q1m3+n4(KM( zJ1FCXo%aD&RmM<E1?g1OjrU0J=Q`d$j9~T*4l!bvCGosxPaIw2awsK+4xae!7)G8W zmq1{GRbZJQA*y*|V>%InCeqUq#Ti~J;BF8-YG{@*e6lKK+C{Jxu+`V<vSeU(IjYAb zeru$}1N0F~Mp8OmG-*_MLU9Kz!fC-A82+=gMIdUHM`W4Fn~}*F_f<{?`$XJVgqC@A zN(++PBE}$Ce7~hyOusw-BGuq$cV8-an(gP`g!+HN?LUF|Wt*SW|9$=)|7QF#{$HDH z!S92fxQ(N+jib4fxr?!sxs9c<k+i<uzuJ<d#7&uR&foCYd^L3um9;z^8DKz7Lr-`q zp0%8!Vx^Kauw~?y)Ho<g%BG2{<Uq(Zf5+X>Yuxh>o|xq!#`U5GXd*jC$H$4Z?Ux)z z#<%0`>FpmXaS1hOg1pHBusDEy8YsWkVl>s@m#o3d>4kzgqd5^Szr`|Q?U*!=MTG0I zHyLzOa2RV$p@2ZfowRJ)kZqV6u03AwbWh(<)9~Y$r8hT?z$hS*gXMbH7STY*+sZo4 zuvC~mLsX$}3&&KVYBG23FE|A+yDsTU57V7XFTIs2e-~f2+h|+2wB@0+6eLNBGGcEo z#xM!^%(&#-c|_~CWVmSY;#X<IByF#bT_`zZ1VWJ$%lG7xg<#0-IP1)B8d7u%{Ykn7 z;N7E6jl~mK%_D1ApQc;87&RpqUYee5uDnXyuwE%-s?5YB+YywwiA<#L-)k4vaiq?; zMMWp^==Y%0FH%CfYkyx7p`6({%6_f$$X(pfI)vIj3gTGVY+q?wtg+OPM-`>B*Qrkt zrU@Qpd};U`I(ld`8IJ2~K|`XSkWh;-#D3ae>2VH@`_?wwDcM*pnIuR~PN8vrhq^<h zO4i|1%{c91dnKK0e{|v{cnE$Qp`(+&qL7)6(T4(xHODEe{(%6Nkktnlr8;sK=oM)~ zo*>2q|14nwr;5L2?l*)lL}ry*;YJBX*dlUgmSQ>~DKvSTR~?G)BFea5riYlPW0CG6 z?Y6M1k|~R<lCGlmlXtDRTV^)kt7}pgq+UAE^My5x*A>PWL6PUn$-1JGMcR_JLuAqo z-Si_8=H?d@DPsgLoPKKFZ-$6%ysYBn&L7Bo&B;CCDL%g&%d&XH=Z-q+;<ID<LSl_H z#pVzZu7f5#1(3QMl{t8O6B)bVyg7N+g>(^Xw?M6C(vCThMyx^Vw)OPEsr{o>#=8O% zCLl-L93TItN&FKD|A~=Mm)ULO?_%}W!xQTNpBVXn(GiuX>4+fyjSgrc!SAyVJgxYG z8>D`|n>sCJY6Mw0z6LS;IE8L{EhTyox=Zm*9j?Ll$B(Y_gf8IC%DORC-k9m+k`VA_ zq9WQ&?h@Ir&o4(0ldg~FD@ea_wdHG3V0$fa>gpdB&dSis`7P1Bi+_THwSe`Jv-x!T zC&7}x=`|24%o}rZdZ|u9hPNKdY*pr(F_O*bE8f930oJYYnssAm)btMCM>$t(CBFMm z1@7|<hX{gnopQ!t$mhoa`uSEGd;I0{h*O}|i{$ZC>!AAVy{D_N!3W8w3{;8G?Qxr4 z35}Kn?Zn26>+vSsnmbiw>Qyybis{t@9JWVj3coU&C$X0Xw}TE?mmDw`HxPOSPU9K4 z^CWWfAv;E)6}yV!B@fuNeR_3oU_`>om6qfNp@-0;p+s&u#80}0)CM;iTCCU)>`6Lp z^8;|jP@iHW7py-!Mxf0(3w4cBv1Ks(A`2yjnPbqYRo9}J`9ZQClFl~PCU`13;escq z&tYbnyOd5xJDY|m<1uN)r>~y(-`Aox-50qHB;PhBqq}=G!<5dG4MX$GgkUbZdhWuf z?Yv}3E_m(T>d7<FVD?fmoR}vpTd@1FkqlcR*n@?te?7Id3lA%ySQmO+LTYZ5g?4N7 zF$4yC(kI&K_G>^H&ydo8Wn5wQZ_t*P9Kmdmb*5LnG+%d7cp!^rP`7GS&o8rYXav_Z zP|nd;N(YxYeI>c%xB3fmrpcS9TrBs=+t7>p27|x)(_sw~Auy4ilKTOn6+Q45nsEum zwIdlaS*DGSvH;?mqYvnp@=E&+5hnU1ir_7Y7nGQ%n}QP5XTxnq!g>oqIdf#D$$+kd zK`YA6l_}ydFOJ@oSvX^nhR*GWygfT6Rz6R+y&K8d8XBcmBl_Coeu^txUVD1hZ+6Z% zxDHt^sLR@KsXB$>7P7~wzemakD=I0Q*kfwQa$FK?@gu30?Jsk^AZ7__zW~pvU5`n8 zt9N^gAZQbUPmA@i#@|Gq_*hz^-K5@3e1Y+1@oWyMVaDx(R_I}sd&BH$|FrM!wJ7QU ze$~K!!VWBTKlbVbH6}9%KfQ`u=q7lDk@v=|wT?`AfYouSer1STq7Mr3o|JWNRAh@e z?>Q{?8idUDWm%+tC7^M?JIwiO;Ql8{{}aFCZ;6OE-}p`b9=QLTpwHg}x1gE6gQKz2 z{~m0MlzkPyr)}<-K&uriGU*7kT)##OF#pi-fEkT=z@m2r0lA(rDt&)zK?K$e4c;(C zUcXPt5=QC*#=knweRo?{{CScU^e^|Tt@fua$1QhOTHmj`Vcj1*gRmS``Xa+Asf+X> z>kh4mL#p~4Nk<*Qk<oN@4y`4I01*!AbM_!l?JeIPq;Miy>68xYi!~&0lUq646Vz50 z$IU2DB_OY=xM{KzPNOs>kfg<mjT=r&>!u(aABCwYN=%Z&r<rFfMf>WjWm>=6Ohz|Z zBA6xdY7*7qLl@pCX;q$*9WmeL=M@>>5&-kq+l|^?)#A`LQNT>bL#VpzEK({S)=vEo zt<ru9OXep-n%J*9S)IQ1=6V{ag4k4{jFp`3mz>`EC-K;CO0*rV4RSniSu-rWBZ5m2 zZE^LU7?Z|4=Q-ac=FVnXqTp1gAqxxixA}ElH|QyAWnh@C#Ht<6A&%oO*+5o2%3X9v zHX(2;Q7>l#lAkJ<#8%?cI+!VM1~;D~>P-u`n|<J3dqDp2F_L^~*Nyr4yQ=>>&)H}x z92E-`F=gy6w^AfURKo%xn-b|GY|c?4TX?Xs#2kafD9fLJW9GWi-?nB{lj)iAZGsP` zS#1;?I|Y%0=XCPpxxt_MVD-pZ3~2pX<?&UfKiXgW9Q_#w7Mh6OWQW58MC8+w1Ny#T zxyMh+25^PV%?O!nyZxd8QLOWZT=(}9MN-|qMu?A!A&Waab=oyvJjn1;l}YHknqKaU zgi%iBgW)6va>eSb_7Qdx_Ej^S!3xza>B_p+4!mmFuHpFP`?-b`x`Y;kz9+i>?tsow zJW>}7tHx~#>Nz%_E7jdhJF0(cbM|}kFQk{zTJ7?!ijT-H=Qj_6t^GI8sA><=JqJFs z!5f&@o{Zv6f4C2~gl)m<?P*N8_95F$ohrfmxs9On6fck)tt2Q%=&~K<NIT{ZV1ey} zt)M6S2=zL*RoZCc>De17?PIWam?)X+$XPzc5+TJBG#)(u9YNt@!t}*!ctk%u-WUYG z`K$W3pxPf#<n)i2Z3bEA9TW<4P_tSIHQfXZ$sXVr=rMMWq<x&DwJ9eOodG_*`k`z) zyxOETgaPeH#@YFsgfSojwB$B~IB*K#84W|^DRN7|l`w;>fqFt$DB(tHq^<p9cu!^y z=U8zMH%5Q3hSUWmvN)fA1jefJiPNIv8Y%z?WAe%4k_olt#ESUQd8vA(@+S!<mDZip zq#t;ff=R!mQC2`LfP;(%6VE~l=#1LWmlZ@QN-}suGk8~k?cWX6Ogtm)NqnN7L_d^% z{BBD_4du4I{-Y9AUGEj^0L%CqL_qgJ`&SbAXR7$$B=XmO{T!4V7w|iQB*Fc6G01-< z5i5O1M=4u<BV&huBofsNO-)nuFKjU}u%9C2)IohqHWknz{FzxzfQCir7355K04f@) z9$-J&tR3RBGv!W-%hxk62T#4u>>O2&H7;}tD?wSD%0G6hUV5i}?#4eMs<r=Iv4e;F z(63Cvz0ExC%6a>^aKCN#^?io-^KLox-xZ`p;Ax4y->HB-r1KW*y~U40uO%8>Wv`t` zc1XM11;~8b5vR?*-OYGTR?9{i2f^)%G7W4o?R1mT>)Ic@)A3TZ>LvwF6?lil=^*n< z;c{CI0rk=a^AetU@A-xMTBE5}k69glC~ELh3ya`G0Omsh^{kFg0|BIS$KTuWlNa?J z99Aa<&lMWRB`R7t*waH`m`Ld%OT~17Pl~x15Pp0is>}uaus1NSPN^S5-q2jSuSw3W z)RS&wku}*E2kpEm?X2%ZA26>VFK<TdsjZ(HNV|8dYPfBfU=v9Dm$u-?FN8updc!pf zNhnv?Xppxyf;eSB`xUZ04)Z_un{%cOd98&gD*J2l%;dXO6=mj<F(9G2Sw-;PV{(-Z z;+Rj>+!re+syHNQii%}0MfIHt3SRO6Ad4qVgB$Cp(gQ$>_5K4bD5*^qMk)qEF{Fm+ z(t^>1&BU*`3n@+~!8XnkWRI*-Vs;>ii0O7JtPOS?JXL9ef83-H(<FozS3)iR08Zg+ zFEwPx*Ob)oH)VGPa^$7;2bNVBNYvlfAXt1zpFxk~#I;bR%c|FtYr7996quqpt&_oS z>G=d@2kM*GTP`LIwbarxt##9j4YR5VzR>(4=41At7!W(Pkm9YDu1Sq%blt3%r#3&W zPz9HEC6XJ^?&}9JW3{izl}^%-im((}YOk@*$&4}hK;5Ajk269KZ%~)FI~(Z(FDH#- zA;Fp+IW{4g%1Np5wuY|Zba0l_9+8B>n}P@b`Gu=nzq@9T<`_U^gqEJ>SR>%-r}d+y z5l31L-%!AfB#7%7<V>Z|ORuQFvEvDqu1qdfQi?h$S{>otwJ)}DaUDMDP-6^Lyl}E~ zsbHO6V;QD0KvTebSEtDe1O4YL@je-hq*+G-PQncuOg)HE2YFX_qCI$bJp52iB)QbM z8(J2FPgL{D-dTkyf2Laie!>lA2lYNf)yOlo&vCCZ`qhp$`qi#C|2*mblUv43QS}@+ ze?8tl#<wVtbGt%3eY8Hf=dx#hB^+=dtoy-Fd%+>xYf*G`DhJSt>E65soPuM9<ZFL5 zp2XTn-qB}9p7@*E6>n&3oDHMq>gZ#$zR+Un1aCMnj`e;Ei*!Pv(sxMi)=fX-pH*vf zygnKcbz)7(RDYNY)$7%vu;k)e6N?5}3$W5zn3D{Pzl{zcv^q@;Oll{D=s~J7%+>3c z63t--2^J&67WUhirOP3cSWGp=r5KBW0ceBaL`^BUv&YoCH*q1Dk=t7D5R5Dm=>I@C zr4@4w&l;K?3p`fhEG~VU!8OV0bE?unfornrAn!dEip@J{ky|C3GU%I_3gxwWdL`&9 ziEYAst?iIbg#oP4*i7virK7XS;Q_g(CNR)<pYJa6j%tQ<(VY`pFpO%6o3%~?Ys|wX zs$9YP%+@YTur;30qA}&rU_8UcnG&6UXLs|(NHf!U3`g^n@CYvZ<Ui@8a!Wz*T`<~S zwtzSb_<poEdCz!x1WIt94metZZn`*H($Dx_gZ|wTZoW8Pest{_cJ0uvJ*34MK)iso zPnkJdu<(dGs(Z_oRQV_A(g+6{285C~WUB0vem3_jY*TYs^&%GbD(!)LI){i#%B>7` zPZDFsZpm_U<y6--D=2EBaXmU77bPIl_lmtLO!M6;qG6EhaDDIso$s?#)AIZLxXL)r zN?V4Mfw5PkJ(Ngd?*9*8=M<z_x2)^#vTd7R*|u%lt}eT}Y<JnVZJS-TZ5yZ7+UK18 zuZz7S=Ec055o65AG2SOL-$c72|Aq0POclEJLW49A-rxvX2z|EBWoWgTMcVr#-&$&D ziDBdp;)&J=+aV6SP6Xae1f7x_8PB^2(2H*S0)o1vP-IN7CG6gEP;K7~pin`@TxWq7 zp*$2Q{7ps9xIBAU=FGA*m&NK@+3p6Zf@uw_*IO>B;taNSSSwe$nq`ENBH4TX3N&OS zsS-80Y;H%zv|I~mQa*2OR@5X{YNxx)7eu|ha;OMm;;nAk8hLBN9J$zr_Umc5FEa_| zGM5iJQZTrASmwN7iO2`cb-VFE^p8TSzKX0Nc=ar2#*lYtt>9h-XFy?m51V~bY#8Pz zNBa+GI!9N;BRA0LU8+MjKi;r2w{WbiqUfX210dTSOs{aW8&~cS-)#{tIf*|Cm#UHU za<r09JHK%9L4WOv+N?(gv>$KNa<pho-2ciTh}Lkd`$*OK72k>MPDgaWXK}}H_yTE& zDz+q%HNoC4HAO4s8-Jf?S-$;&vw#=b3Jjjs;bom!wjwV<<?epqNFIJar%l>Oomh!^ zeroN83{PwHbWC)q5{{kn2y<C(Jwe|NTctEX(+hKnj@jhcGIN+D><@$k`j(pX?$SPD z=o4j-espri?H!Q66OTI)V(#+WRQQ4*OjZL@yd63AQJbH;AWOg647Wn)uP?>eMK6h` zQv5S$veK7>XyjP@b~)A2CiQzb*c$Oet;*xXp6%k@rmn(#;%2kFJFd?GFf%H{)q(dU zv`dL9PmAQHE5(%#T;vlwU{j1(Po><Zo!rb7@rE;jY()aOpCp1~G?PghD>W%2syK{e z52n|fqRG2jBbZUM)e3QvZCh^$ctT(t_K%KZaOAXVTL6@0SlCM5?$^Ir_&@It|9P`u zzyf-y{Kjt}u>VW@mC(O#7V-v8=KsmVGgY<JkkwE=Wocm|g@_<1LP-@PT7OuSSE8dZ zY&Rm7B5Da+hZsZTOOTNvhnI9VTV7Rv{ysIj&=jdVwLEk5RleXg3nn4yrz)pAs+;ce z^1QmrNbUZ5`H=eoew`5M-9liXIAql_!lp#S+(B(bM>{IM&A25y-s1mc+!2Ebsn%+o z1i#esiL=x;)r>##j6k(DH7-uHAV@3G1WU<lj)ayLmsCSxMDB!l6&#q(=n-cjnl#P9 z8#`kzng!fKnoE#7vOQXUNF?O>9^6(S%4A84E0Y4slZ<DuoHS7~Xt*w~r0Hj17B%Mf z@cX`_pt-JZMzvbNj0Tb?Q)yCB!05Pyj}HxxG_lCYLzYbplQSTSLQoB2uO*Ji(N}xg zBBAiSL$#%1%8WUBRlF>f+EU=iQ|p)k-B}WVA&0eM?!jR>Vf9yJZbD3|D64i?R$(f+ zAy0vdgawHH7{N8cm?OiFrUZJhD(c$yXo)bmY1?lpn2V#!**==U<r-{wK95y*ZDKL7 zl*~?7{thUPAVA_hLEaGK?F(^9K+0k=18LwCA~>VufIKMSPJ~#AkwxmSSUfC3JDa+# zamD~9lg<czO8~cSy@h%eWqpRiNExR0;N#gmjhMKD;Pp<!6xaMhPlADMo<4>c28uz} z+{E#HA$u|nC40yn6j+U3ub6t0y;d(&@_Mfiq${fQ_MbpcDBdA*VW;5^6c9v31X1B$ ziwuQpN?xUFj;`42LjUUPM*lZ<IU2?5AMmJN0U<C#4}hhl1kKI)C~c=%^<f`NogoDE zWYEZ<AH|~jk5iqk{8RM6t981}PmI>pdF|}JLQ-km{dTAsB9Xd&uVaIf9-_bThcKz~ z+!$N7@}au=pI|zpmtw7pEll+lK>4=CPUjY@s7<y@#EnbJtgFE#0?Vm6I#pR2&RI1( z79tpCTSsf!lUVm6ED3Wrs4O@<=mga;AK4AJ=WFYB-?NqL-&w}OP7){U>jAGgs1>hT zSe2AE0yHKQj?f8(Fc<JkL=7lnSfsh4h#M@OEjPCuT^)al+Xt>v?2K|*&nPoB#9vgh zX5#P7ivdp`4}~smzBGvuQhIo|@-}8)hiWb1rBTvI%@IXOl~`c7FlM-x!kKo8ckVRF zdC-l8Pkp95gDOy(i|VsQP^<o36ZEx|cB}_VM%=IbSNSpQ+rbgtlno9y!vYicyuZ6N z40%9O7yCnJpE)Ilwh1X`aH8p(z#hwIJOV^DM&1Yrf3sOEn4J9e9TVWMaKj<%=rr-< zlG|KQY8D{3BfLdJ+XPC|4PfiqZPDqwT4Q$n?wa*k$+=k4*?ao&!t<Q%<BqG%E^Jju zgh>>plG;zSi^#Prb-P!{fo4j#tr@_DqY-daLcV^X5tKZ{n1&}{C^s{)G)rZG4ahHq zc>!&z6oiDY%wy>Q!yi6HRDYu+qL<vmcxMlj9f0Ts5#bHmyZ@a%fEm{>K<)6|f)~BY zF>t=huPzFapWWaVoR!vLNJPgbYVHkDm5j1Xy^|8Sha^gxkpqeWsT;4-?>COLEP^S7 z-5b7g5f$zdaQg+jS)91Z3c2&A$CmJVb$N|mmm#Yu%CqGc=BJo4!)0*rg-Ju=-_M3w zmF(kPmD5XriCgE8W6XuS@G&D_P!4<{FmEBA-s;cn2wzs4J-tw&ckAdl=d<Z!n7dRV zuVCErV>f>SK817SLCzBt@~)ahW%P>{#bKj!kLXOMi*|0`9M7RiIb^HjmvTw%2pA45 zSV=0mH!YCTP-F_k0@A#92iWb_w1)KUlanM*37;m#b&g*KzklLwykRgh*gYXT@rhkc zU_CZ;-@<sKZFiYLC_~#M9@@$j_@#*>X@6P>Kz-ILw(imP^6Ld^qQx{kCEr+bD^@lw zw7)6ufp2%?EHwA488lSix^xhq?|uROOJM#p*#Gx2@UN68mo&VF*|)gVCH?V(<bR~h z|2hW#AuZJ*y>QH&edXHAS9GGBHJeN%y5KEHrMh<6<12)3<3{3)hZWD4$%Z{x;um!< zsM_m!9ry(^K*ZUBKw>2!0?BN#n^}tD*aDYl(BhF4CG9jRNN0%og>nl?=fhsQ?L^C0 zHsTn%Pm8ynI$sVa+pF!mA0N@DkpF^x+Q*I^+xgFn`(hVp9bbXGdTMl$j`NM&#?*On ziF@DUMtzRTZNVzWesYL!<uAS8dq?>YOn(tge^HHhLuUFWA2@6HP>jbgzt(1d3Ym8x z7QEa((A*~we2{-Ii}U4wA;EoB{+$k*{TjLX8oPz=^<Wb3{!<wDNhgkeLc`(7C7ztZ zd`N&^YV^nt`v|r&Jjkz4GvWicO$;|?B=IB019Eyt(H#J7&!GlVs|?m6nM0L@y>01N z=C1qu2%0$?9i&Ax2TK=YThq_7mA2;rXyGpJ2OXL@1Dzj6hjNk$LQ*nx3~F5k%q^8J z?mn0;j6-NTv+d&@mirvizN#+u3}>8!cP!hrD4!lE@GTji9!<zN%jSggI%1UAq%4`7 z(4H>Y)#5;Guks>x6!ynSt&pe#y%$Ar!q}!T3C<d}tmwfC?|oYSUzEA{@99Dn&iigw zyRm;cEz|ZYEts&ZHn5<J71@9-&C-x%9?0X3c2YQv)7EA@*}a(8v7m>=00WOhz|vjf z0Iww-X;e_V)WZWw`|o+P;jJ$txVf?h9Qwh;Vy}IBteW}+oJjELCnVc1pyvnJaXIW* zd}-`Je^|-Key2tbiLJupIAvULIxUB$Tto$l<=`Wxee5t8>CNL@Fird&h~*B$g)U)C z6jlQMZ5W&y%ET~m9h^W+uapQaRHSdojmF}+D>U>=|B1g5z}11{Xn%H!VNG2y<6c+> z3+Jy@4gL7l&pepqB@K;hmoQ`xQ>{fK^)rIds}b1X?b}AmRuuVHhnB`R7dq-%To;yJ zz-{iYbkV&LpCUhM)?qutoN&bcb<-YD38Ru})yty3XIc{X8hUVAvxM0jdn8?!xC96v zVKEcJpX!y{Gm;_ti-D9;HyzU~pjG_hiIm9+j=Fw4Bp8HOjL8MfvdWzp^d!7hzvL#h zJE8?SM27hRh<J6>6O!oFtZmC@ZPd|W{?%ODJ_hY$G}-HJxloTetD^n2$2vnZc7L+! z8R12hbV3wO8F3gCnhiW4qpSACJtji;j0Y=Nr{e%l9OXwLvtxp3JhsB#3gyBl23k0X zQ5Jqu*CW^k*5FDB<s?D(Gz#w}8K%pTqA91?rtp%b=K{;3-jum5ZM`&^8@Hng>`v^> z)@D+eVhp4t^T^_sh!HKK@L@dFp<RW-sM;72&V`DzIWy%hB*;cDM4G!T$}lHsWEIU* zn@jlvV_BMPu-nEmgfs>hS!>|RLZ@)Wd5Gf%iGSxWjh$fpJm;5_VPayiC5jvp5BhhU zCf2c|3!$Sd$B$Nf!(&#n1J^+vzsdkHg;peOteL@j*qa*j9F+a%;leO(LQ$~kwCJkI zG)r?gixGJwXyq0Z5Qb-{u@4se8wQTbL-|8}Sie^{?Ry@$5oBy)#OPadi;m+g7}>5) zf>6+W*6Fow05=)3L(H3o8je<QwlB;}nAQr0F>#Uw35Y^Ffb>rKDX#;$)ok<ilbOjh z2~{?fv<)2^iOb{V7Pp@&wnsCF?G4kl4z_GV?bi^xsvNvc@P#x-`jB=})u4qxNmrsv zVreF)N@xTHi$9$BkIq`8ienVjk8JrnRFZ7!tdmVb084kUGbFy}EJa$@<*^g2+Ve%W z5U$1&F4AjB^k$rUiZus#k(8WQ``C!{JiiLWoXo*^Ttl@Tt}i|9bf8=h(iM*HPuGV( z>dt2=CB>Xye|XCm%gvcNdHj}Tq{(_I<70@8UJk_Vo4Sw#NbC$ESt(j6y*q7AvYp&h zdMNJk<V*l#!Jm3DT`jodZvm0Fz*rH@_+-M*NMyp#<`az@VRZ`~X}z#U*@eWtz-8hU z%bCNh@lAywB)VhzW5Q|s4I$#qF3-59h&gcz8AORWN6!vB@xrM6JsQvx!>Hvca?C*H zl=;gMHSFA#K*ULoSs=YKhlQW`kuo%F!k2raQ@2%l!&A3ae#2$rn>_S1>eD@SmGs*! z3xDPW^fgbGZWc7NOHfY)>%=R5%IZC53jU@at6S{o>Gmz<RGUs1!a59^Z1#lILt{_O z$>)#m;tA?&+tk$&JORJ+CqbqdB|1~X@jIap%z`3bbTd6o+dB_*rE`<VA7mO;e})Cl z=tyx+OcpuzKK(4uWKmwO`pi=IN5Jt)BRMWxzEN<1wTM7fnadpVur?P?G{z}e8LeT7 zg~h!9>;^+BO!f~W{u?*J*G~C(t+}uk4$G29y<Ky~Q{qGidB)=VnBWB9p-c;6JO<_b zau;f|7VzYrqD5G%C3;&USe_^zcbx$f?kwB8XWm%JarvSN?&{oPvm}R0A6;&MnhA{E z(iGKOb*qhu1kJCg6rLo$$`nld(&752M(WPP){wHjq%#3E{Z;Mdp6WkB66@@X$a1MW zEg&+s!xKa__OtjnGGx)CzfD>pfTYRAEYO;&si;k-naj<zni3WllQF{K#G;HPMQHns zb0co7aj5?wxIR?flXe68u-A*=SV*2)U~x}ju@0SzML1}2SWO?oCFvsQZcX2oTigZn z7AFzGP4jm!&?Dx4r6MUf#8$ft*(@+v`Aig9W)mcF*t)XEQUZ>COhuFInzCcbZJ1|_ zjBAFN7cv!hLQ3#lZGUd8<tAdWktUR5xo}<(sb6rgNSw}uvRmrfI;<XDaNt_%GsiKL zK7u*K%gL@ea^~&R(wYmp3iK}y=_a#XaO}Ef)0@;-9J}m}8F<Q)ZY7DA6E?OPq$B_3 zoJw>CzZ{ZW#FdqHPP6j66ecnaEd04IoBrtDt`dTaT!-#9LJr$&CR2U60YBLnUaNTa z^b=E!=KUnq!Q;16rST;uu~CKy3xZlV-LBz<51}h*n^V%QIebUBeV7qQlWp8emr7=W zF;jkVO5Z07+ykXWk@4^J!WEpHLMQ0NxOW<oBuJDq0q#b_;R^n)8IIlQpA>nn`ZTH` zcgL#n9D;;1HcniRKQ;sm^hbx~43k}PaXivkLyAhw;}?S%_frcHvN{qPaMJDKPis)+ z6j@kp;w5We$R+Nwh^mj6yPl}B#z$fre|BJ7zy+DpvMA87?0Lb;YMRpoX2ul<z$t*d z$xns(d8<ok&AZ^vg({l=*^HoksG+&HD)0mSO8^2ZJ(Gb>(b8SFk8^@9cradUE^GFI zi~^I`ysY2op?B&XH}>c$2z*rXE;ypZCxU9TDc|`NO<87rx8P>w)i{Y+#tGbpS129o zug=wbrdgI_tI4lb8r}5QVO5~~#G@_PMG<`?v{8<7!D3WcjH0N6S=<Ok%@S78e~9o6 zh{BDWRG>Sei~^LKt_v<6a-{grV?yyRk&1m|rK{$N_xx=7noTF{F;DZP)}D=KLhdQd zq}AQ8s4Gm(YoN(3z1AMZ1`7fqmLv0>AS}ILOY#yB3jS&?B{l&Q7G3yQMrGgdca}{` zP2+B>yRb@2uOstOP<oo+o;M2y8-e3dTX%O<qR=0x#935`3eX60R@<%R+mkfcTRsrJ z2(-xg>p$YC4JwSBaH#MC>&TC3`Q-&Mf1{9q>4S!ihNF;>-TfZEppxuZp{SL;92%_& zXW7zf5Y6{wZfmZvP8YrE0D;LCz3St$a>Ca|e0;MB=)wjY`~dqy8r!$bv)m|;?A7fw z^rU)QkO(COK;cpcO+!=52R|W1z*P)WH8#RzT@1LVpW4ii59nP)+V-a3B)%`f9o1P` zpPZ@ldVD(AxAm!dwpK-3c?tm7+Ow`Sx~QUubYN=wkX4g$@8)P(d-mqt5{eu!q)TEy z5{VSD3Q^yddTA@v&eKl4)}`=P_;2PtA<n#+H!WJ%CqCr6RZPs3&AGqw9>k98<y7;D zZ7In6Wbm3QT~3{zjn15Uaq*_-+wpGf;<VwbIq@0HdH-l<?-m8j%nVP;DQVm#m;Um9 zpVZ46V)7!>dZnsG<^gvoA$N*CoV$xYE*%w>gO$kv630;cOY)I~%acUG5`B9_-X(s= z@>)Q%jEn%&Y}tNT?V5s=JLkkX&EcD2Bq_lw2(s&9NBu}6PJPQ7G}SF0)tNQ*I`dL& zu2ACRt*6Ap#wYYSR;N_JBByZIBLSb?cCR@XSq80w=mC0Gt}N*b=iKd=_e@3g&W5^% za7|_KyZE?X|43}_)kfvMCpt@1H6oV!1hW8+t4>oE4~)5jX!?!yg@seZE39m^{Pr0o zKD`v;2OJMa2p)%UQ8y%KQmYU6;j7LoPrLo2QF0m+j8<hTL8pWb@0G=ghmWmCuvgYx z?w!n0HcC(ZsMZClr!}04rvU=sdpbG|GP7^g>e$UZR1NCRHpfPXY51b-SO|G%&AilR zs?V~_fqFMAwKw>Tt3m5kZjcxL;_J_QZ`_URkcK#)K-F8L`4KjA_z#fD-Qwp*vy#f{ zeoj6$v<-+8Hlp%u5d_qq?P0ROw>huQ6l)$TGw-|rNvPL=3Y$Un#bnV(DWMm^Yy7EQ zIV~U1mvP{8U#(dzQ`>k&56O@GzRdu8sCS?`b=FUz<!5Qub|V+KMTZf_;xq*Rn&-AK ze}P=(F#9mCXTd!pv4%x767x!8YUUR2=wSvlkbQ7mE&nxZNGfZ{soB?=yN2A*+vi)H zYZ}lk2k@<Mpe|InF1!;$ru-3&*N(|M1_U$}G%2FQ2al$CiEU-pg`m?#GxNQkQKG;B z?CAYea=#IA!m2{Ws{EJbGk1k1)n~-3T}8_B2$gv8w)q)+!e7gT8-|IrNlu)oounrY z_+LoG$)tyl^phy3v80FTO%{2(iICwLh2{Fhz63()Q{Qi(q6h0R&sf;D!0WdCxWAj1 z?a8;TKxrpuoPW22(2mNpZCA2Rv6>mIhiUS!135Me?ldY7o|zL?7Y}y$soscM?v|VL z*yWYKSf1`rHY75r|H8iLYpGA>Iwr8o6<U`dUcazcYv|EY2x<4<ucoT~w06{&7Z&*R z*WrD$aa5N0OztIHBUg}Q0Kb5kWQM0!^^iE?4V<S1zoTl;Ta8orxk@*KZnNqP1-fc> z>_IrhWRiOI<1oT$bEu-3!JB>s_N62Q^%NBQLH4{X#<--|bq54Ay~vy#iWzDp%DY6g z^TjZI|A2Y&AfH3#Sn7CkH`(%)Q4_@09b$-2A=N76uL#xLv0SsE3(#BjjGE13gtbHj z^&3+Iwch-j-y2e=b;#<3Gl@|9T`<_E_>}manWcG3R%{m-WA)6EP15lBqE=~q>U599 zr1zwGKik2BwhvG>U(od{Gxq~#NLymr&p3Zw6`?TO=C9PO^0kX@bFy*ZWAi!G0}ZWE zH2bYNt0%}5pPcGe2m5f_tb($`u}&xmAd@YrStT43TSTa&^-(XcB>#7Jh-Vx@NSgF% z1tu==Ks2r_@8i6!obKP|sG%`-R9h1RZV|*o<0Fo7PEnt?L<{2;=`?cEzJ)p6pQ!%= z7yrZ){|zqwl^K5r8$ks6?q@;xHbkKPAHjv4wY7<nlZBnFke#iIiNim}0_rHOiK6gW zK|=?IBBMk6f{-{)j+4pwVWC7oI{*t?NoYgBY>^$PfKw=FYMd(ZC4VPrmezBhJ2x!r ztGwo^R(FmOW-wI0+Ufb2QSW+H_4V=;!}oJyj~o>h7X7*~7`4LT$}bpDCN%#Ro*sgu zrF6prjAx-f%(m_|zLORXi<(Y_2d!PghC5vL<}$bOdC-HDQqsu?KUrtg7FB1~x!uY* z4S<Bvif*)P_4zRYSgX2F1DOp<#r;{hx}I;|WZJ%H>gl_5+cc>YLe#2RZ_CM5WOm06 zL-i@uPO3kDI{D$S=iJ(Am8kdnDbRYcCfkbTUdFm1G=4`DvtNxCUs3yMer3JDphbh( z<wQkA|Jg-s2%!`87?2zVwG+~G9&Gh$6GM<JH%cFzc!+$FX`)pL&V{0WqVwhUgxcGe z=*^*#76uOu!N|VSe_L?z`q=ew?YzMWK?odDG?!HDASuniRj-?3GrR>!zbC<oIc<q3 zy)6kK8d)7lvRm}sq=z?l;38GajYpXwlA=M~f~?4Ny<%K33pMR`s%lqesydMm8<Zy} zlRw)8qn%REoO1$jd)lV<9Cr@j4%2t|N@6omBUdT7xhEk<)u7sxuRNYErcJ8p6CGY| z>@GNQ?TR}^8Y&Jxac1d9fX}T*p0osJM8mhVMofd;j;fRzVautUA3y(`cH$n6;p80< z0}8t1g#$u=QzD{wc98`sYPVVpt25v%*Ug`V*EW{f)&xN7Z57Yw`dg{r@|*)uQ>1)~ z;<Fb8^5Uw)_;0k&xa>4K_@)%L>6D%TbHxFfVea_ISIw=>&8IV`W<hQvsg2l2t=T`= zPJAh#IoS(h_Y8Bp8*!GPy;Z`MU=_Gz^V<Uva9A96F-o^e()&y-Szi71G5uxa<>2*O z{JFhTcP+(leprMpL>k_JoETAj0F*HLoJSe)2!zlsYdHvC$Sk5?nv7m%dAzcb^a$gw zuxe#QqB$HgJ=hA0(-kc^ojx;&EM85cj9@SZn@2DTo8{Xd9py_pWiD{zGx95@q*kzd z>%>{HZ38?rOr|Jx7zJx5wwUp9>~yWM23;}My?~t+C~?D9^m3Cn`BQm_yr2Rw$WTS7 zjwo+>c*1EF-+3ni1|Z`DdU0@Qp}zu6`G&}6jd*Y4i|<hilDSRw5y(WS!{?>O8$c-c zS{0eq@>(_A<;Q$U3QJlF^D1^(KM0i9CE%;<U8Cuteocp*Xy+jE@bC1l4D`8UGWm!d zf~-OYvq_3zm5|TGyiQ#so>V-MI09CC)LZ-v1bt}PW;iAZ`XnItyIWc$Ep%ZH&;{Mg z(r5J$uIL?5aE-|-f^11$EsNR<;m(i>Q@fwO!2cCp{ux95GrF{Xj%+7>yG=2ESMCx2 zZ_(wSR213`Wy$$7=8<96GH@Uq6cX|$TvLG#<O;X3m_DZ8&+(se1R5CoKoJ-PgR@n2 z?YldRVaQ4Wzs}oa)`d$i*yo#0$!z{Kh#(jOg{2Q&QoAU!$!M|J%#wMN%VfkS1%A4k zJ~EVR{M38!PHT0%Y(4sDdt066^Tq3tTtVTd)TJ9X?8x0Y`{}fYjrEy_W49ai;}dCX z{#xzyqw>cmmTx|uZ@K-}?6vE`_4XRpr*1zVh<wl$$hFRUey}f84%XJ(wKwb+PEYr? z-gqtEmTKS^&5vx&53bLA9MosIhiAXn_uSww#bV!ro#CH=!852E8|P>*pFCdOrR%Mq z%w<o7KhhT7ihl~vzxe_^>uJN~pz=X)AGPE`GROT;6^Bd>ANCyPBp}eeDGjirraIiC zX*?@t%qvx~;2$H&!8<Spw0S6(=;$PHoaQTz-h4YZQ$owbXHTe*2c#)OzgrpIsJAI? zTUcJAyRnfxV*8KL)VBO(;%%E2e-wF&LO@!N$B2x+7fWDxumSEo*-@9QaU0h+Y_K^N z*D}oh%bFn@(->83L~MhNL`?i-UmKh@sE92#JSzs;D5C`@3NPY_F{IC#6k2VuNeTgD z+6{WQaWfw*6rXQ|X<?}&R{`sKD=%Wl$?5jBc$^ZYwTO)!E;hF(QFXQ<q6nU-?6J<i zo+vFEV;fdD>mM4$gA@hd=v*9CK-5yi5hIM2>Lq2w8mynS)><(ScfH!x#Ugp?T6u9c zvbNcDMIfRzcS7dpJfIQ@)2QE-#T-<cX~xW1^nS69sLVxZ)n9~p#Mb&-W@%87C#>PZ z$k*xXvnmd;w^Jm8N2!=we3m`udi9SPE)++eel&w&B-YLS<A6aBMM}DuVZS(YB2m1W z2A`FCLa0Tx6Va&7R_^gg3+5`*0OFsudzxLA!F?lhc(UD)ND|`wQgy79H&KUn24Opr zn5thx{*)D{h0d3L=C3h{QVH(<#PvggXMew{TbX{M*kYwfl&SB($(+@3D!1e0S%HZw z&*%zcH*#6gFWKV96dUD>`T|gmo?Qp`!km;LrJ|v4DIP`PF)C31?#DufE*dTrhazcJ zZ!OnLUf?oVjmXHfR~bsAcNeHYO4MR)*_|JeGgSi8%0*O|<lLm|gP~Z@5#nQm^UtCE zQAJSJRLq~fPCf!8h|^3tnb{`AoASb_L{)K+z4zh-i~tD(t^U=0F&BSy<ZE6|P3Y2@ z>&2{pH@;PwTed98zqmJEH!`?akxbHSI!D!7;E!Khca=FhdL6HAf>;52Yn8s*132pl zIni(<OBty)oXjL8bT2$wic(;3I6=y*7y3bWlk2hy^BEGw;;d-5%0K~ho1)b_JwwmW zC1n%!CPqC3@j(ePx0oR-(;KdgP><R?#bz04Jf-kthA8HlXZo@D_5FX1t8X@c5%Z>0 zHmF8Pk{jI+E;yOL1?>Iu1S+F+QKh%<4Cr+ZtEJsSTM2g8A*pB$8O|`$2v#3*sz2Lt z*ngcE-Cs#M$HHdXm9ANMQJxGv?JB}Lj~INy7F#~P2;;9gIaNH`&G&5b=QJ*8-xX6a zbDnPSvt{#}fXfNCBu%lbB?ShcZYrPuT-5ZP6_1K3$mAj5i$Ft*F@e?FCY7{*dT8!U zjW_*s4}*EK+gQ-<PDY&6g>hx~&Diy#FHP%zej~;=Q-jqD%Oz#bvP1S5OxjK5RgCsk zh)dc&>C+XT`E(39IIMKTQ^D_&B?20?5zfn@cBc-pLr0>_)FDp1KJaBoZLi`{AQ?-i z(!?MfNGOwqLfKOmjRL6vz@kYQVBr8vBg0^KgaKFS7EUzUiWCLlm}z$>kAizjIL_Rv zkerT^9Nfng5LRF?n$>H&-`U4g2^z63X1PnzZ!udSRUhbl-e({?+$LNglB}9qJ?>yJ z$3VvBxa{JXSa(ko&0{s92&N)fsgFNe|G*1(`M38zxC8oh9h2sdOlhpP3pso{odre^ zy@_xivqtGSl}4ph`+C`^O<RW&C!?-ww4DEt;2K71C#y*Yph(dyD!Q0HcT`iyHdz)I ztm%w>@OO`AjZOlW(>v>TS~2_YO<l#@O{CK=UPsZ|Xf@+bTI_vU5r_O}wVUs*nw8o~ zgQrznkyHZv<uxov9vMsR68m-Th#M8hg2Cka1)iI?y|DfcwF5TMqo9yLDUF;7_quI| zD;FjQZ8~ab{zH})t|>;tA={GC!tPi-6~IEGWa$=u%2IlKm_l&wIDaMWQHOZBlxw{d zpK@Zy@sEY8c(>L(gB7uS3{~P^sDDUKbtGy!H9^J{jfiWV^ccVMIP79(o7;*O;}$m= znSJwDX?9bq_RI@LI0njYdxuuK30B}IfYZ@DnJo$Zt}`1y*&9}8^ycalu5s=}WkrT_ zNw_F2$Nsv!B{DJfm%Xr-+Kb<9WK$lKbyi?<fM1Cw?S+k`G8}e-90^;j2@W@05p%RG zFJf=O31R(<@cJLA4&T16QAHt>_{r?-FKNpN?GdCE;bv08MI5zQ>ESUZvJ!$am;C`r zvc|yeD-XjVd3=J8MwD#|P!H(4GJj}Nr)l0T1KLu7x~`e`>$U&rQ)l}iw_xyiouUCX z?QD1@mySsSoZWhOwQ)b8?yoieK#=9QlkYrurRm$@l^${{E*y*CZ#}USe0W{a-|(Pj zIs1Fc7`Vjm&@$Fx*ydtDb&u_NV`gP$*<WG0(e<#2q>#s~*|@Kl+2i~4_R0vj+}ZqE zHY#gaI<&{%f-=hr)T4L4MPE9Z;-<Yr7~};<2gRH?VJ0u0^KoFV!vVkLP}RWU(+xD5 zW^ugFB{|l2`yqrT)G8d$+t*!+ktDe<!s%Of0Mh{Z2UMzAHZKg{glF~@2uqW=7%`>i zJ*W7Ad5kYQ+<qT$k8}<pCqkQN2y_q!U2>c{K+ng6T(Vny1US6r<P78OqasJ(4k^nF zRFgHL&CQHsf{@L*#VK<YEn<ktfj|^OhCrlL7CD5T${Q*`C`gxb^&oO`ys!YAa|E=( z*?o__qAs2fw(6vLS0`bQ0+Xs3rQU*-Gl^=#hL%nS!}!68t0M!vFe?n(FhZqiOk*<} zhG;!NakB?A2Es5zANjOPAMb{*$R5V*gBo(3&K^F!lT054{>zWcZWp+SX-HnyL&}Y8 z2%#hW3;Y*fc6)uflZ!KVy9aH19{#zLd^w^d(IJ(rhUCZ%8Ma*-CAVm6M^XQg<MeLY z#H{#ARka@;g7-?sseH{L<Dt2@Ua(rfTL3O>$aP5?wYzN4mMGWz7`MTb_N%<^MB)y_ zWGucT)Ga@2vQHdX-4u`c<wahuHlypWn~9GUVn^sR;l#?K!HW;&z-Dl*xa`}?o6e}4 zMq{8?L3pDO=^`}QoL!ux%Zwq|gqi8y=5MPntgB_L6APZL%ZG+H!LHaR6iZE^E>zsl zB+V}kfDr}m-ROSeRpWkMX)nnaclLx5z09>%WL9!b>Q&|QA4<2BmQ3aMfctzs$bgVv z6ZaRab54CqQO_paf;WkpQWOnAzUxD3hZFjl1dDJ9_0?s&w6HO{gk^fn8S~c|*@EfX zf|)ka@TeGHzqk#|-Z5HBDBLBQ0t46><H+g7Rt&J%Y*Gir`g(_8D&lI$`tYE@)0t{a z`}zW-0t4b;0D|h!22a5Om1vQF>)&BkA=;U6?on@BIB>Mn{8F<BDtN8kj}M{MC#J(I zk7^9f#+g-p7#KxJv-DBDz?zqbwx&+O4&5P<b8*a4f4~rD6!&(ACQ6UUY8Mc933t%d z=XLe%e^MbIt6<%+v~9;oTsY6Zfl+q(ncX<IUCGQDjQyORRqysEmq;fwtQ(egoP~(w z9W6?4OrE$bY-#R4*D*<E(Ce>ON%!T!;?*|w+$V;aDZV~)`CZk_G+E7Pqhhe_OHOzF z@oX-TMk!7^$$NO+u*+a@6AQ6bHi@rn(zzJ!HRqcEvAmfXp5aT<!ugrvYNxV**|60$ z<KpnaY?~?E+P8b#lqDY0yy)4rab)on@=mx#2`G68ey8SaSk$~=-fZ1V$$q){Sk(4e z*LV2*iTn`~Ig0<6g|BGJZVs2vAm1as@ie}4kIE2+K0-OVB$88nSe?URW<EWEX>o_` znwdpsTG}lb?$)?|kkfsg_eFt83s50vuf|b;sQEw^Mf%97)o)5$MQ_NQ$nx$>o6ZVt zW8_muU?W>Quf<}OVt4QadapJNa#*(6TvV{kPC#1ZqFMqNS-b~zk(qvR5ZJ8gXT=?B zIystbC1BEiSm{>*ZLOwZL<r47XF+8eGYLvia_?1s@Yk}b0%)ce4k@JT8KbdV-9-Qb zQxUwwaNHiI9BKe3@b&Cly5h|Y)Al}|no8wzd#*UacU*@}TPz%2Ls3Fzgdq!Xa7xxC zgY42f^%`*5#35V#S8F&~4H3ujoKxnm5PJoT+Di^-XBf^C>Glx|thYlk1Y5BW5F=m{ z$x-I9lPhWYS@5;6J=z~X19T=9EWo5BbSD+m$*n8qU_8qS-4y!5jU+fGf$W1(|582Z z5nnL&W#`4}_^(|cts{4ZJ|F`o(QCT;u}`iSUZ<MhcrG->p<m>3TNlx1lbVx*C9_2} zN*a9ZJT0i}JMRIke_}5(xuPwkAKA!%fsfjvw8Xa5LWH5N>}`#eqo&g*_dPPuTnQB3 z&vA3H&u>I5)FI>6L7(mO-e0%Nxfq3<_u{QY5F-r+)WO4#`*2TP!H>sUOkGrPm2)gn z5+~(l^>;H?Bxf=k_dnJgdSxXJmct}WP88e2>E*1ju!ba0S}Kh?9<9hbEDYtj5P2%X z;-f8swy&Q1xdf3G|AFQ27g0^2OYMBgqhd_v7}7NexISb(silU20e_VM_b5c(c)U$M zSx~zUX-eLjY{o)|6Hl3ImtL8w^2E~A`Pgi9e#mCdEt)R>GwrE)Caovy&KcG&;a;<7 zHT{>Z1U2LsZY!_tXeWDMUBr31SMMyH^H9MyA!E&>1cpRrch6}9aq2}3@elZM*Hf<S zrW_Ui0HZs`qytRz2(dcl@W~MJaiZ8?I&ubr7=vc+=n`(fkK2NiE?LW2X>!V9cWJmX zhUeu4yI!?pv_xv~I$19LqcNP-K?ltt6|^X14XoiwsVTpXUN^$YDL?i11-|d`K#n(p zu)YO4L`5bC)w5&O4u&<1pCpZ{(RL%<o3m9^#cn#A+G^d$FqdN*X3_B~St3DR{sP`q zTnJ@9FA23i!KR2*tJt>Xq+b?J<z#pqolAN%=we47!lgGpnJzzDTVGed{yl>4pIZJu zRlX|eljG92x;OuJBmbX^pZ=2^+Q{`<3Nj#MET}0pE@biCe|NM@_DYqC#46^>UvIzp zVI<v4NRvz=cYjYx;^&i$L<QWp)|{W8)3?9Xf4zdy3#x64ZYL2mxN5=0U9-FCl~%^9 zau6Slqn@!>G4@l5n0H<>+Zpa`6!VA7Xrm03s)Lc;(=H#rxTVC?yG>=6?TrrNLhFG| z*7uRkO^u&e!oiDC?&!WXGIO0I1NaQrM;Osmzs*kCzrKM1{(~tEwn=gCA1jxeci8~` zk{ygch^Hfpu8D1c8`#i5%NAL8L74_0tG9m}aQ|~T{(GVRRVC)?HPdbNy+|eBJ^S4M zGY<K`h*i<V%)-&h!JS0O!q&{%#L3Q9+|K&DIqAO|_cIlAq<{oac=nFkY%NqD4}@X^ zUuU2MKqTk{Q9=cRXZBj)IP0c{E-4<W>+k~ozZa3J%?inYZkBt!n&aDryA?mX`szot zf;eF`4Kk!Pd94u<*6RkzBL++<&}1Sph9vAT_G%~i+8IQ9^+PAm>}=y%78bM~^q1(p zan8puQ?RfMRp~TlUZF!eq3ToHJi%P7B(qq5^tGM)aG_+?4#&EUqh9b!2gaN?CPEvj z$~5Y#QgYTBDsO;u;h*a>T6iFV-*co7DCk&mya`;<5dMaZnkFTG#>VYT=W$%S(pPRp zyNGFxDLB8ty_mO+YzZOz1)<3LcN~N;WIvnHg;;Sc+O;3f&!+g<vEH1PK{it6gC!}# ziIB!}CDRzwxry<sr4du*5&T408K_xn1Q%by^ii$&7y04N932cEfd{gBvrL729AT~B zBRO)qcBHxqJ=jFfL9Off&5?{9$p~TqFR@tUjhHEV|6*MK+`9kV)a1LZ9h`5*B}D$e zRe=A$zyJSj>i_i>)_~O4R&(ZYMdLZKsxWURwR14!S{>S3j<%t3v9@W#(NJwzjzdY0 z6xEwm&&PB(H6E7T1;ANAkT#Hlp+FTfhY9%+)rq@+#q$%)%oH^6LlriV+E_?I*bo$w zIx{?d@V(xdC8Ah*es=h7dOvMkY<O-xAL#MD;ry<23h{^E6@!AhY4Z=cmb<-~hWZ5M zQ@yT!X5+ZIx_uyb*oA$0wxDI*lL6)H_l0;b_BU~p;@w1fc4ze=yl(QBcu)5CdRN@; zJ{bRkc$e&T=pe@bqPExA{z9qvb45*BEb*?%TLt0o4>ellzk<jhjwYZAicQk;)9z3o ze?^_F4th*cT%J`*nBz8g|C*Q${a_!VLAq;S;+aa|1*&QH0f#wGM&8f=!c8h3^)M&V znq!#`|Kj!+KQG*vSTYF>l5&MUye_&jQTG;-GL?C24yykcNFuZ*rFmk`g8w3fCUuFR zKyiUC`LQJ^+vpC9|04BqVn3`uD-}CY$P!eUGCe_vihmg@PGUcnKqHiGqEK;;3>3G6 zRC3Owe-(0r$c(DM8VXMG^@D#C^lEMo-H9tynUcLA+!-hf1;n^PevS^5?C6fI02>86 zafm0#g^GPK4lAUks(mv~6NIITy)4`s$c2)9H}gtBgI=x+C&95OD104qNdTN=y$cj4 zNlApgO3V`9sZ#&Xug~9h>aa*S7e3us){m`1ge<}o_tHUqeqo2dzY4Hm%6kJYC3F{l zt$WX2q(OOl(}H0^aPVv@baQc|DnsJl)JMIRPha3WgDxOupF*~K$jOz#;%4;(THUj% z>5Dr@1@$MqLKzhgoo>Lkr#k<w;oQx-4cZeK!By$M_>^D1c)CtnNK}EgKT{R!%(cH} zW@=yo4^}A+T&i}Fm4PYk)qRSMiK`H;-ooCLsZmwMHC^BW!fU>&;W|#7Q^3-4n;17O z)qZ#B%MS>w8fz#D-3bYfX3796l?*Om@5rbj!Zq^$C|F}Fl(bO<xC+~Nsuxp6Eu~-z zH#R*!GB(b7q>E+3cmn%0^?VL(z8WXBC+85|Rm?tb-fOLx5EL3DxeHBd?l-vy5H|6^ z){y)ADRriGLP<+C$RD9<2(SzkZL2>{c*e=s{?5iO_>1JmQm4ph&jvu*R%kQfF=#f+ z$k$|QngDZ4cO=OD`05`3Zi~9hlYEda!>e8sv!@G=vQ2lz%@oP{Eq8kmY7xCMpJ<HU zzipjS0Lmy$zMen^wp74+E`S_2zl;mhCYPS1Vz%sRhhr0vglD(wKV%YVf4=e7i-Ld& z_d6gVRbnQ%Ap;yu(sAPa8mUkx_Q)#(O_Fl2{AVsN&6Y^$YO}BcI<*C&)M~su3xpI0 zJ7s_CLo;toTl*a{b=m|6qdeyZGGuBSInF*1%^W*&28R%ZEEFwmf`41;;J)%aPhi#{ z{v|2O6!%_-xfCQ<d|;`Du>xP`bALU1l9c>+PGb{V_#BB<A|Zdb0Bv4Keyfr>z8?uh z(E~_HAZGP2@u7n`%rF6^PoVR;1Q@>`pYxiA<CTP$xMW%&<RmmF9d}+17!IpIYk#i< zc$#RpXXyr(tiZ^Bb1z40RHlX1JIh9KqjqA7>o3C5fv|&f*JO&?z%duZL8c#6fWV+Q zfjS{qPI&Ly755l8^-T}Qh)}-+_F^mhV&YI)WPoVFz!a$p$*8^ZDfiGISJe_}g;otS z#|U+$TgFgpl(x0VZU)-iBz;JLSG*LMXY*?@nKYN&_8r{qxGn`B!!QICyLr4U`!!?N zNe}hy4fu0xfd2rwx6C2C<95IF*v{>6U=%|{4Ng|6zWhT7sfAO^7B1GDv`V_}c~y>U zANFIGvP@mbiF(Ge$C+%2<g_R`17<BjQ^y9rs#xO#<$<#!-h+p>XCqwzD_v6;@ix9p zvGuxP=1fD~iIci6pEMi>^vIbXq{SWR`VPB|7LbxAd6n2rAQ$(c<!yA6Jrf&Yd#l@W z>=Fv|q|s&0TD}Hhzz%HLyr>lvh?keYQijGH;*y0l44Q#Kz|A2Hd7rd}p&nMXag2wd z<brJwCXrB#J2G;}&_H#tj`zmJ`O>|VJMUy$H0Yvp$|7o7UEEsnYsd!7qOra7pOFC~ zx}m&58X+nnyjYN;!g3`%Gl}`LM4Hg71wrydj^WLRm%bL)t{}N<cU?@iVQn$xC%0zK zJTPZ7V+hWGF%koy`m7%D<$(&*olr&vI}M5=MM!<lsK2)4LUoH2ik@m%<^<bnOdhUT z-=E?e5^PU2i#E#~Xz&WcOWyoF-fu=UaI;e3YsTHKkVYayl8tzYqpg!+0HIb4gU^vn z*2e<wE^8KjO`&iKadl>8H;S<nPvHD+zI3K5Yh_t3m$}WqLv1bz8V@0}U>4p6n&~t{ z*+!F(1|B@@I)uwAP>kyoZ0ows@=hS)FTPQO*hCj??>!6eR``p2*qpo-1E#1=Jw;OZ zN}b+b@~c<umnXL+MT5`X;p9nOkn!p;uwWD0{1N^WxNPmp+}1|RiF$f`+-BKHMO{bk z6eT{qB$d*7R*FbdN8ssEZAl%~32T4XsJ*9j(PpY)y2vJ&l9mW-OE8s;rUZ4Bbe9us zK`=Zr2zAL8aKzp{6OO7zY9w4yY^wW#r;w)*;mbIHtC5DnE*KMM0Q#|jMNDvu+b&)> zg?Jb{{DYQS{m06%C0{9=Icpp)W$)tJ*2378cKHVH<H6YckW<L~#afEB`h$7*N>b5G zr)5ppO3c_q6NAc3!EI*Z)!6!SU=bO4>w{%hw`Z}P6KT-pB9853a6V!SVIn(aUIh{9 zobARd=bCo62bF1a=4fr)*x)F_;tnASP|dZT?UsO>x+m9kHvDiWS8PDcc7CKZQ(buX z0sflE42&-_-i}#PFy0~g7G(aPsCOELLJv5!PxTltfjx?oJN*MQK5Gp9%YbM0ZVo3) zFCgE7n*%8zB?(!)<y54R(yCJDRa1imY%Lk=7z>y(=R68vj#rdV;q>X=e7DHvr2Jub z<3Ug(p)l^=k>Wzd$bB)?FD044>0_dqe1s8GueL*?^EvsE7xwc;rbhHQ7T9)2(UAJg zdIVhVsj6nB)Q?{%ad!;tB${^J1nA03e^#tA9Y;#1^Xe*wV^xv{)gh@1=f}TnJz&Pi zge&im94b>N>-7SSu!0Z)XLR+`gw;tLIxNTnKE4Ki7g7}G%}Fa}3iC`MyGJZHg%WKF z6Vpl+o0v^^xD>sa>e1~rV6J;u>k(8L0nkqd*qaeLZa>(zf!TZh&IG~dh4A=7W9x^0 zTpA7bPu$>O-|u1RP5uaWFNVF7#Xii8PE(8KjhL<#R!JGi-nl#P1!fP#%$nTAb=iS- zi<j}}wO@0ZhvocG0{cJ)`<Rpdf>BB$<f7wxVjKf8Jz)$7IixiT>KU9R!PniLt`EId zdc8)T(53guvRrXzR#I2wikP+dBU01RZ3;(ydST*XmU;pDXClwKsAfGym$Fz5bMByC zorl=FR`iZ1p)zwQ9D?fA>ZpcRk~N~-?6ls^w)3zT*1<MESdUBTjfBcffh9`&2)d*z zG!2tiDo~3fw)32LBPNq#_h`;K%uM}Us$#yL!pwwq*Zpw|x}-n(Z+P_%fv%xc=S1;U z`os?E;WgFJ4KB!y&U(Pr&c`#a=R-&^{5S_=S129B7AGFh@cMZNZ8C>Xs+cuifBz9I zeD;!;`Cri(Q64YdyGEHi0}Cfvk13=~PyeHW?kbTc^?I@+C@xy5ZE7I8y1iwK)$VG4 zkgi9#k^+L$`ee8M>OJhXY5MUkM(&LHR!gk$aw}7XHA?s`OAaR&UH)3$SoLV$iwuUT zK2hGy9=ViJY#cE@6YnkIpFTsZZqTUD-@eW0CB1YqC;b-YSIiBrmbCyTlPI+2+WTB$ zIi}mlBuPNB!c-hPzOU~T30=LGlMWaQ8b5~$UzALY&<yDQxWOc83&8qo64E`YB2B;T z*EnqNSib)#4JaTQZj+&HN00tp@)Wi@!p2Q!74~jxGB|tx_Z+e_cDj79C@Z;T+F%kU z@y^+~n#DP_6IOtClfm)1IgteSu<vNL-DEOB`+M@BgI-y*zSS2_6HmZdfvVi@D@4=N z-4c$AcAqSD^s#*=+!AR|BByrhkEJtvZ=m&@eppERd^k3;o^~fUHJ}cy5ZB?}AU5He zkcVX}|1=WiW#$l5<mEg+nj8Icu%@8^8?0qC_{+H-@0)EO*mZpPCM$hUZa02l_<;a6 z%k8Ke{SYvhfdFvgV`EbI)SM~^Tf>qykO$$JartaWPMluEU|Uv!g;9B55MUVCv>YuW z_OTfT<ohfLTaytR|6ro)dvv%-gJqC1tdgMsVk~wf_-M;*b8hw`Kckx*HvhekpiPd* zbpC9x*WKPQh<AWV4~UGYy?<^FB$Nn(sreX4X5==CP;+X|9AbvSu?w=37>FyQ(;~<Q zYVQWjhLQhe)HaULQ)<qWs6C%hcfOF^u3tdo^hJ|xbK<h9FH~Y9X%kJ|qt3t^X9Edx zZ$O=GmmYcdv?zL&*A<X8?t=EWAwi{_hFO&66IGLg$8xB4S>J+k6la+L`hww~40fsX z7UTA7jnznW3u@hb8@GU}qeBO-#2L7<qD&{?1qHf=gk-E^0LyHMIXX|TdEnzrc|)>~ zu*^Lxixx<u#+XI+paeL;^H@|0-&s9+PGDST-oiZvPJ>rwBk8DQ_}1pM@jWG4-A9B? z3wPd5M+$h6hS}VvP^*G%PT`Clw?2zB=D`4~iC3`f!I9f1ykk)Vt8wb@vsYR@?}W%z z_4QJX7XHrP=GNeNY3;xB=#@l&Td#zf&N-K>)bW33T9KNqT_IJs^bLmXbEUOtjvYR; zyvs0;w&!y+|8}fO^z4gx){#B0f95x|<+G6N0u{Zbp^vxw`2<xrG^}Y9=9P`e1Nl|i zbOE2Y)-~W|+$@hyV~Sn=#?_64do+l2M|Ko}-qP5}p$Dkvsa|MXHRqqCCkCf(&q}Qj zD}1a3@5fpx{L3>^<hhgMNKy1wlXNKt%kvxeo;Lx@Ir!g?W*BQZVO+P7FxC^5I-L<s zGad~PpH~P?{@LTx`wO_ueay4>h!(^zws!;{_%XYGqm+MY>;F{URQCzGIp4NW%ip$c z-@^Nck(~{lnH!y*p$VP2laoE&e>u81J386fNSV0*e?zxK6&<y2U#JZ>J>b+_6e@!7 zBK3-w99SqSR>Z*ul{EhH+}=Dop$yQu;M9uIg7SCBtq;(ugIfW7z;3{}nQs7JKY6m$ z#*=IciIev6c&pjehU=B%GzZh&nI7K<j6P;|F++4CGwn9dNhjU+y$xRe?=R$Lr}d$b zS+4>Ep<#+kaizp(XUIy6<@p*?`&uLSrWH$d-C>u^H*7Z00bIY@@G~c`xf^WLaw}4` zqpo+Ix0`fmpwhaF<<GPp<EF<MFKe{+t_>>Nv<t;5!q}1)J$0ZxmbKcZwh+&xW}C}K zjMR!&nX;7mT}Qf<Yxwi%o<z+#9>66ZWt*q!P0!QXPqV_cn~nZ5XOhv>h1`AIB$O1q zLmta)2lOd&8ap+qwWwJv3)A2*a2L_D$1bB+otO+d<1bLMYP_vxFTZjg@o}fe2-hb( zO_}aLo~**p#Ao73q=r^x;Q^f7^OuT7EQVivWn}o{F7ctMQq&R;*7i~SL?U4isuA+z zH#|it9jFyU!F%eug(fbXXz8ph+Tox<yD!qp9ojj<xoUq`m_%^azkfT^JH-652&_w} ziA)*~e7f-}Hl1NMn_{KJhm3Hl4chi)?u&N*PVLScKp7&URzwydS?ylxMbiQ7ghbn= zOJ|YuT2en71H0)GX|*4vG<J(0D6m?=C{gkMq3j#OEA6%|E3DYIZQHhuif!9g#kOtR zsMvNY#!f0$=R4>0J>PkrzPG!7?4SF`T4Sua<~!$DWA5by!~r5gI|6Jrk6mC{>Wp@k zc@WxA6eU19-GA&dTc`nI``+4>r&F?=pkod6EeBh97Thp#u;<Y+6hRbImHFbQU|B-) z=Mi)a#4dhXctZGA^f9jotgSWVAmGkSu#w{2-{`P8x+{ARs(cqeDZ5rO%-Lyl@P&W2 z-6tYzle?u1m6n(@8$X?4X!ylC!kSEvBkV0tAA4-EK*beBGBY!u38&!giKwuRqeryx zOV}&j{+j9Wck({<pVifzZQfgHXRcg&9?=U7z_pNUI_B8wigcK#MOS1cFR$?4Ja4za z5$gyCCogJhv_p+&UW0q|kY+j<sS~Gv2$QG0n5Ty)Bk8KRiI57R2rUvSi9<~Nxq*e> zZaL^m@&IH4Fu4SzHC>JX@)OjZvlysv|B2eiI^;ZXQ%9dN2Dkp_d#1IBkO_A=hoj20 zQAEYBMeZq{!4Wh-=!7k4*WiSJ)l1nCLNcTxwMcilE#fP3XlU!lZgNm%*A#7!cvHMC z_UnTTXX=Ok3KHb=2z9JLZE%Cu&X)pem>$`0O}c!}?;nT$???OJhyE|IDuWNFGwGMv z!s(Y-^}qFk`^Svie~wD{XOXQ~&B_T`6~kAqG1F$AR^$XMSSSG4VjfA9h9XtZLRM0{ zcveZpI5CS%dmc1__C;`%`oPQ#$ISli5S^c~5C&At><!5G@!EfeQ!_<_uKIw)iO%b5 z%IeH(*EMISAMeYT-Gbe2Xb6A;luX5mEfP*fj4{NGD62%3xw_=IVC)B3q~@fiJ9{Ks zS82vwMS7h5W#GE6A|{Q<4IA3hpM(%nAZBW4TTOx#O$S@9a@HBzVlo{092AIgM?He9 zN~vi{!k%s8_b&d#%Bm8m+#)K?bSls7`%){T`B#kzCdC+lRF1hev#sWIO|_}XePALj zV7x_!^f(DEtD^Gv$6zBiS9cd>ZHYGa)H3LhiJ0>QZRa*-00_2tlfZ!9+|l%Vro%!j zWJj=d?qk+wGv;weYyxGAfSy`QfUrIQox4-wiu|>7+$x4Rpc^}Fp5dB~p4s`T-UppI zxk3F<>a9VjVRPL>GZEBkX^G(~36v`%?GDJQzZ{8XGC<GnE<dG6nbbW4(i%Kh+m<G{ zvY|!oRwG5^k?Kxwi58v4yD!Q3P*#$FTbJ(FnfrM85{V0*hu}reSYq-Sm2l<5=@t#= zRKsBsbUAp7lxuka&yD_142QRN^SS2<Emm@JUDdey5^sFP5#Vm@rH~lC3uW0{OFrWo z8=Zb}Hm*67LTy&{J&iB9Y&oBua3JKygEg=<ibB(#;qVA62b+|{dU)Z^2-QhhpaHhs z9!msYj4@p&k(10-ieG9$$T@Jt6!j1^VNK+UbIP;Kk5}gA?b^sTf^O)mipAxs>YP-y z(ytjg%(mr4v8&S7oIl<Vy)i-Ic+cOS@3E-LI@tD4ebvk*(AzQPOH~Q9eJW0Gk%4KM z?|8C)ab47thdHqDz4uZxaV1V0|DK7RnUcFnScSoQ07PExa_5EcqebGmobwIrz+D`^ zRAyxd^rI5Id>>LGdj3Y+Yq_CoJ=g?fWy`)%6Pg@XECwZOUWJEG4U0_pU;|sV1&^Qw z&sNs&iERp`kqKWS=2e%<9Zcnk@0x*<>|;g5`2*pu^&4}AWVZisfluT{<U2>6gLd=x zeDN(V(2$MegOADfe!d*{Z-vKft|Z^j80?5sFxukmi9GO^>CM%BG<fTic78r|hT#P` zT;&MBB>rI%MV$Y`9W&^yPem62?%GF+XCLvZvnU~oJs=p%J$su*5E>$k26soVQW4CR z&9_5JL^XLe#H-;l;Q(*o>e$4tDQ<i}&83MZVN)-ea^)|@K28dWWrP7D6OnKPp#;lb zkSa&i^z~RJtcv$2_WdGHF^o4a<LxJ-c|}AyxoIh4V^sF<rTm*3{CF&uCPm!Kppq7a zLar8tE!x|*B@@w}PssS`y7*p~QfBXSIf8S=RqI9>wb)IPB@MC#qFBHPR{&}>V1D9e zTI<lp1<d5oL3q?HhZ}89t{mLOFjBBcv`Z|&<Bx}EkK7yDzTUpuoTBGNKPOS|xH&Qp zm@rOy7XF|^>;M<3%!(0LeHxO%9_Xh~87P$2v*n)Ml{#OkUIm&7=PHRbLFk$Z+Ymz& zhFBs-m@^U|>HUnvi_`pjAo;#D*%fudJ60(Gmik7Uwht2t?-q;!HC@2JT)=-%!2clN z8zgR3eo!+ZUO7D^E}7d6>uwl_khZFV>poq}GNLr!5cT=Yy_;-mFs^&+xHSfB6C(a) z86CSz#<ig~?#2r7dtSWt=OWurEryB>#;o}x+9$*pKDpS7w}0q({~lidGw|jSv&n#c zHLh5`8dqNq2mj}6>#xA8@Rtwge|4yM<p&v1y3`ZEmGZ#Q$TScNpz$yYp~_LnNT^(l zoMKRQLO7&!l6IB@@cZI~R%3_67vUII<*%LHe2*VL>ODd1Lkc0@A%Y;j2iNVIkV2ZF zKSF;@XpY<^P05tsvS6~!&X+~Yw#7pd_Ed+^M9+Jm?)_xYBDO*x{*ro5dsk2&p`5>s z_|1L(+_{nYE#D;*8W)^1bHku7VE}QQndn}&x7J$w$@pp)=3bIo{L_u9k$=@KzN@Uu zS!bYpmY$|MJxBV%S_Y8am5&H+qdYJ!HkYO@g%GPv>}yjbP2ha7)}RdsBIG~os=EQ! zB8Iot5>v_DGjh_5!RTruzS`*a{q-N_rhnhPfA8yG4Z#^(Rk8Q4EcOTF|K&paG7tKC zbYc6?3oRyPLk&wEXQWpVgcuW5JZ6-Pgi$o{gk`Eck})45U`UWE$mX&ihC!4j3<W%M zcF<)fkG=a6q{y{;UGEU+1#im8`M%ff_mDyL#IUz_@23I&s`b<BPOlzFTMRyk#!w4> zMY!`f?lBmnZ}<_bCK;&tj8hS-Mlbc@@@c+QhPkI^M0{p1A>s7tc;W6ND(LZMS_q0L z2B0^nQiB{K=`r?0MEX%>4Aqfk5oOFDS<iNF<`5Y2*B2GvwH0Z7e@0kpd9%|BZ1c^> zxfB<yNJ%YQCs`GT`^Rf^FSFcdw3n)Dh5F}dr{%dR%Jwy13UyZ`=~3Kw<>O@hb}BYW zp_US|%h2wyAUTVvuob&tY)(4EWIkc)+zMm{9<`*(zMFRJv0J6fIg92}P0Zeu%RRMB zaiK2p5^|k0rb(9?Z3NU@W}fu9-nx^uZe(LRYno}TY`0Bn<|wZ<cgbDR)FQjl)RG@Y z$1gU?^fGd_H)6}T<UEY${PmaTEHo!4;K?<@9kF&bHg+%=I@)VUjL4;^uN1%K7c22r z#qXHVl4ELc?&AAEy|o2wli#!)#&{{2z%_sPBQ8)(oflZJSh+&?#qtedQOB0GV*=wT z8u0|>*Qs8~B%Tl$f$~4kC4KbftwdGTBSrZ$kYt)jXbjT9rO8$*m+r~>u_wQ8O(MWc zY8ZGIWZof#gp|Ant2M4w1#8prOb>j%J$F|0JRg-B0;XnqrJPUe@-+oiqeLOy(jQ3^ zm#EG?bK4cUEf-iz)1{v&5Yf`&Mi1D9SwK`(g=xmqrOIUS*Njx}4m1W@-S<YNA#J=z zUH7~o;Wh4oRqv!`kc2K>Gu;wyejZJ>{erPF;HK`vFL`j5)9Az}5qT!-cwChG7^6r7 zuF2VhDmYMQnndZHhWZmwOM9>9{>!ZEm$BZskyg9q#fsI)#zT$v*+x$*ogsa=vTsMZ zCqb%<t+Bj+0{qLL%axYahpH&$8IFOqmp!KUGn#q%JseX9*lQtyw9Rke;|r<5+cWze zVXtF5bx*SJ=;O5--b;fZhp17#$9qW6+Gu_|gW}^mEl;@c@Cm(E053ec#9li9Jdbz6 zTgLDT?;G%Q_%J(<cjy~Pl%403=q)_$$Jn6oVPO_LLSbikj`ksnQox_hdwznh{XGs| zADmc1LHSb~U_4?;DxxEl-Vz(LS|g7e6k&1>^4GQ(llb#GoLx`7l(yKhLY>h=f)xkN z-&}<9j@b$H_Sq?Bhil4{@1f7iG+Dd2&qT+mhd;g3pD1gxcBwL}`^>!HiT`93v`@{A z=od_B7J<<(1ZWh)1K@1_VA+h2P4S1qOnqX`|9K>nUXp)`%>DRBp#FQ<_;*10D?@(j zKU&223e;_1f%<>UkQE#)Z2#*S7x%s03LiK)xDhy_E4ZL5IH4=Jff#s8(_6vj5Rw?U zA}qaZZq-nO$a~gMm-G8>LcwI0vy~V)Dr~s9g`{b0kF=p=1*@6~*4RWAvXj!C5>iwh z_0r0X5Rxkm#kX?V2|-p2$+Y+YW)5av`ud_K3e*!kY;tPq3#dz$E}^U{)_}D5ez?Ik zl68yd89e94y=5)~Sa76jHu8DPwrBhE_P{&os08ILCMSPF(r=Dh-xy}4m7@L#bYNhj zB-}aOFHrxvOH{gNmXd-((DSbVITKnv&rM3sfRVv+<Z$66MKdF7WMpDsVgO=fW^k#m zXJD#hsAFRAw_u}~f-C0quiyx%NW*CB^S0&4{XTgda`)^{<I5oZ?H^wwf8Wvn+-nTn z4<?bXeYXGlBKdD+FMnN%N(Q!O{~Cc(oVa1TAb=41DVx>CNJblig0(O&VD4loo99M% zL{v<q1d3!q9nVd!SzLotdJ6;q=0Q*wBmjKlK`~rziB4jpRHD7Sy6}AX{GIpyemqM5 zt@cJKAUYu}hsr&)A^I4K#F|=TAT~NOnks1B73ZqOdg1PC)&g%G&M$srb5$<%-)742 z-oKXPWOA|9AA-g;@O|dUeQI)FKaP6!N6}it#O|X7EoDQq4BCx2-+UOZoF0cRHk=#Q z(_v&@C!J~Q<KRg@Hw!RYepCCgWFxX;Fy+{F@C{B_E5KM>!AMf&v7kwb3Nqnram~4= zl^@?pgD;zM^mH56lC#{Uthj=^G8}GE=q?wAl7`ud7PQx}I?C|dm;2V%uE0jQGUR#~ z#<V*~6f1Nj_TehP6kt9VZF>=UqCzbXHPIE86vTq7x;f-d$nN!0m!QLBMrC70-UXSh zrg^<4!BBnvlnMQvJg;symYJ{f90&f(eE#4>DX#t3Yy=}4SgGHM{!M_LjuR7qzGIQG zh!5S?NjOsXK4~~TtR>3TY}Nb~3a010K#iK+g_LrgU6bS<-4s-{KzxnGSfXkaPJMK; z0!5gY1}Ub&7CAMl7Q8|@q7`F-{0U5Tg#Zdk1Vy>#1RGcrveE<bPH+Jk3Tu8Dqo@Wv zAbcOG>ptx<*`29ctNH`?6g(#PCm*6mqzs|*m|T4J@U?P=ozPq7iDlplQdi1uGidFw zy8)_&vCuhV49)uv1ZAc>QjN9>PB0WwfnA(brJ0l8Kg3vn=iYy^(tP+&;x_WPZ#}I4 z!;`DOSgB%R^Dj~+YeRagEG_YyZOd#={`wUgK!SiI0-G4@9|=tWtV!}y@@MesZlLfj zl2}4I1GB+g$8t(dnTv@-b$AP1cmino{(6OObG6s``nu1vT5qkI*R+q@cGqN=WFUXH z)3w**+x6$R)0HOP)2*3257@WT-CWhG*>Cj;nVOq8GgH>E&O8BL<d*J8Y7Ta>;FYtr z{YX`6^`W_ow~6h1XG_oac+<z*<C|Fp`{h_Dd%!s^SnQ=%?%+A&-63mjV;8i`H#9l} z{$^HfD5(y1oV{hoB>`bEn^ybVoL$RMsF~euN<ql>0dc|VfO9lk;LRq>)zHdzH#&AJ z7VA;CoL03#Ii5H#{oRtNOqb29nJF-yXQ3EZdqnsZCnrXBL0dNag=$0iPb{8h^+CSP zlR*T%f<3Z}V>6J=;B@ogOhGYZ?TtxUm0=9|n@Wro0)Hn}ocX*MzgBa5I@=>tZ1xS- zE)@EM-%(V0SHsjS95Xy4)a~t3!<F6cu(_A1?%vh#bba(r*VKBO{Xw;!0IRoG7ueo_ zoyifqJvqLY?6(W9E8W_CSej28SR(gAbUP)0DXd+;_Opte(UH!~6dm4`*jOCqoI+ji zLimVK{LT7ra8R9ypUU`<qx=2#UCgWe#_nH}PM&7ab3RY5A<p^~c-r!J@+{5~9KD3+ zG`a}ex~m^~23La>mgjLX%g#5{(ARz}+C-0jKM&o{|KRd%hv>(Khs8K2GDygoca*f3 zp7q`!%$<i(FG4r)O};b{X0WBnIDq+et&s-0bsvuxIAsMH60@8i04vrsSfsg%bXxKb zW|7L00>8yeBAF?#8^*Sc2k&YJ1^WGH63mtEzTcO46FFKgFs@a58n;sw8Yo|p=<)lY zkIN;%oMN+;;(dIGy1WZLV@g{VS$ym)M&x^-11KrZTBL#|E2H7^z5)k|z7UbB6W3|o zKDIDpa60mYY_+2jl`u-NRZ>n)(gRE4n~E7NLwiN?TVcHkn9%$Cq_ftNlo^3z=;3+- zw7mVFVC`%N)6G>h^rFn6=g2j!I94$V*PJl>3}n-hMqS+Kc~sefOe3YkV4|Wi2|K$< z0=i$7Of$AnnD4w%8RQ1@jvfP*X%MlS!pv*%y1*R^ybg}F5PXTUm4c=xm(2TyWCH+X z$4p^`96hI&&WiM~?KINswE?<FhYa$1$Yjv=U#2!6*6dFS3FXMvYLgHnL<U@E;6@CV z&WSkH3Js<dlZo8I^$46HCVTcIc+rWS(VALl9WoQMLK%=t7<gEDor$N*%~6t*R(A;5 zG}LU`4>IGCG6}~SjS`E@2#}-fL@43<xB7GL$}CK?Beu)rIq3>V>3P6BVU%{H>|4tl zq;Mn~IG{4tOx>5ueJhF1PhSU_lScnoBX06bE}*3@2KG2IrjW$i8LRpeIWpV(49Zh! z2mf@tXdiEWLV$v2=p$os0T(h+tO=;&EFyp#MH>wPONSi1(qb2S7-I_|QMewBn8Vyw zI!gSEc1A~L6353Wd21*9+W_O3gQZ%pyN!o_Cq&@R8Y!1>J3VT?Lw(_75#;lJd@^q) zmWV$!PNN{^e!~HxSn&-XgE@E5s;LtzU~|Y~XVY#UWtChK!zBoj96SG)<5~UC`B4c9 zP*&E}2eVXlv44{}94Xlq;aLoJ^pFawU1`*up*7<e(CO4(o!|pX^e{|EL%fmh%5(E( z_~~-YiFLh(5T%ikeG6s~X?BKDKQh`D4w@~KQymL@_T)}${|R)6Y;n0UqNzNxJSWfm zL-!vIS09`;<T&B_BX9r<P9dw{F*#Y2DE7E$eY6yNtvW|F&zf{kAvT6YQRE@?!SWBZ ztvkpq=YVi{Bd1@18ZV8*n1NyTw8->{w1olbiF9N3n&dFi&dR|Rlq;2vEdJ#Yn6P4Y z_GLRQrc3T{hBOksG%O6Ob|g-a!KW=ag}g`A9wFFB<M}gP_XU0h!r=RDhZYAzzn56T zKz<hPRz(~oOf%9ZI|`{B#0$vOJ;FHp2G!Z$wrh4Et9%b~Fcd_GhCJiIRyt_0HTqe| z%^8oa(nTy>!e=m$(qp=uH@S6Nw8nZT7|bc2A!>0E>{`;StZ`9N6ke++w?C|-7gli5 zHqW*Bt<~NMo88U+&Ib2-sI$$jG1Bea9o{$WyO(oUs;4`>w*Y{6i_K%Ydh=p_PpM62 z*oSNTd+Pa(sBMiuHKG(VHYw!3Z%U8yDA8Axf9K*8pfOjd*mrYrN8T<-t37!9p)&d% zK!}RJ3_#?`J1CsA<eHw{GjLZK4O;9Ibk`Xjy&=Sf>!+JISDxvUI8nk0F4mj~;TpSB zo$XDUPz9wnR@6pZvyYg=tu0#wIJD)Wdy0e|heP6oDx$)l+M~jq-_Y=LPRNTrK_c?P zJXSt|!pELG`5+CGw|hip7H;xP+0)l=sy;=>&fGR0w|V4bqPIN*ZSw!_LnhQ6#c#NQ zsC_Jev)h%X>Zv-21CUdFB)NP!lQ*}vd&rOGW=?Hzb=;uxrD&H);af#SsE&YoGnFv{ z<uJ`e2yvX>s^apE=%1v8^r`^Vxq3ot&!511<jAwSn5u=}-z$mtmp4=t1{6>M5VgYS zg9z(+>E17P``Xc`*m1*WLtu34a-WOfz|Fk8sMKmSI2aljQKu)NnV1CvqpbkktD`wE zsp&<)$`f4sRZ*Ya4KC_V@!;U2ino4P_ESJCeuFiluSg|_I|Qy@6qQk>bI@>iEyriW zFZ!xgtVp{m2BV(mzHl+(IVs0I$)9WnmQ)|H>Mv<Cw~t&O0lQ_7;#@rdD<afSkq@U^ zkD;_;<bJ6_0%{N?OFHXU5+n3YyeRCXIdo@u(Lyner#g{2*;DpnGfVw~E~;^i)Nw@c zbuH`^m-rnQC=r!YIS0oBl$zIzJ<s2ubgNZN+*4-?kPr6NW2}Z|WQxk9R^`&nov*`0 zMnc7$1~T3Wabu;Aq~0AaL_Rv6)CJ$%+*s+fgA~~05XYMJN`RNCkW1s#p>J2RWguD{ z<KcRZz&uVTn+edX(*2Q!3w-sA4l3?#WY4Fvk4Qq1bjjb>L)RR~8YQ}0=3ag;4;9@; zM@>jEdWmkVv(ivRk4_P@mHb|A#*JCDu&W~PEU*apos#l<XsnT@E=PJ`5@>#r!%s7h zrIn<4Izv}p`Gsii(pY}nR!w;$qptz(V?SN7uY;#06~g7T*+j`uZoN~qWR3kxFR~Rn z-sq%sFF<~bnpjqzVw&a*gDPixt4S~hUZgNJ{b+L}r6-69VOxlz;`tIAZWJRp{F$W2 zr8;jbZY1uM=isv+EpPvO1?5nyFXj5T_I^s)vpLK<An}_p#{#2x4o;jyU`qNM(WGlx zdNx#8{dXkuR#!%DCpfzqPRh$x;Nr$R0?j+%EF1Bv9gOG}?94EjhIY~8xN8vFmJdL0 zrK@$cSc_whiSHCiWlNbVrvz8Elw%{gQKbSTMCG?W*kT4yZS$sNF}hW;PsMerm!$eg zeJQO|H`J$Hs<sSMJ>kNoJO%h&j!$O)&c1U$teZZ>KDtkcHn>@6upSW`x_4le04OJc zFw3?Su?|WI{m|OkYq&3m=YS8@2;WGNM@f+*e}aK<&HZ6u>;(88aDDV%^?r7eKBV=u zC|_0}1zzAQm0%O#{M9V5onSkl@NK!Xc+EZ+`|hC%1gCFZ(X7CDVnW#SQkLa9KO5x> z*WMP-@k6Q*74Vyvmq6vXvqi&Vy3uWeGeL<^v5<_?jjxGe=;I%Y19b!p(bw5_6A3nr zZ1Vj(MF&_VIKF0x!erznhnfqp{aHtFfmTG1WJ0t{4yO$si(CRVi~-RLPJ@B!f^sSe zDV5~8VpLBR=#eF2pSMn#F*vlYfc}FxCJDA9R@AaF_FH3@a{x`Ip_Am$G3r7FnLg%X zN#r4e@!=;)r?w8<$ObW>hLnZ<UG8xPCqSq772)t1Ug(36qHo=&=y6?G;i=38L~2~h z|6(4*B$y2ZYHT@jd}Ly5AYqhwOUt1{C*I4OC$f$3**`ZiykJ1D6{=O*t9`H|8ZRK> zyp|7GRJSOOlGtA7jLvQD^rEFY-KsjB`T}1x?s7+EJiDcmZq7<9zs(e*gzMx`PiTjo z@I}|YRiszEpf>*G8Q4c_%78-9zRwTzcGn-4e`jE(_2zDmdngF-*zbenM?dv2YZv2( zA*F3KUNKPupLm5A)}@>G@|dU@Jpgm72famlwQfLxAMj-dqe{W@jzWk-`Y_W+LuH#j zSWZ?loDcpm_#P+>TmAmc;igaWMz=vU#F*s?Z^{W;_H6eBMM}lJF2Y$730_mCHc5tB zIgM-HY3<}aX~<XXk6u9eO+}1ev1sjlfx5+9Cf%uQ^9dpPpM*(GmQiQHNh6Fex3c<= zyDgZjV}FhCd_38p0v|*b6RJggW+7gJJUA`!CLye-8*Xo|My0KnPvaZT?}s0(?lKp- ziukEzZWBSZOz=4lagX%QjS&}QrJS)I;lE;>Gs=E8-U`r}_B)gbalTl4mNmGmjPp8N zGnR)Pg#1#H@GE9x9tVFzPfAQrQ*#`<HRZj9kdlR-HYI2A;y=U*K<<E&#|cP`CG&}6 zfS&|Iy(55!J~2gIi|tq}P=y*CIKCM`p}O_%Q@2;Cac@AKgA-a}n3Pn+PvI1693-h7 z`(ZoL`0;Mp`?|04?KAC%EieyZIBvXC4?RI{QB;|P6a^)$@IA$1kp>W*ecoZP`{H_0 zwy{kL$oN;<hnPc_>u-_tJ61@Ss@Mrf{#0{RIp^4Zq7wHgxAE{;+9R3$r<`B5tWNV# zZWubw$x7_No65^p?61$h_>Xb8KkVESpR<Y|DBqu{agOwzllYeeeZvahq+@TPaSm(U zlKj>bKUls$>&D*l2jX*QeV!KDi=93198i2B-@cc4w>me3d^G6pazmJ1g;fRBDKIHo zOTe$|2;?6DLs16mkm>fR*jE#^-f;@g(?_a><Sv}6<FI#)84M1_2J5>d>0c1|Eh>JX z$KIN8j`f~Ud`dqhC)p*CiUkOLGehpv&Fgp!(w5|{Rks!ZLkgE47mjtLq`qu+mU#qC zvy%;e?g;V7SFvWq9@+P9zL2}=_%$COni7n!MDa3KvTF!=m2aYlly4Sxqd!slGcHo& z4AzRW6P6A)#H3vOg?*IR2YEZ;7P?5P!Q%0kc)l+NmeSM{GPXzy?7oe}qK)ZG?K5Q; zs?tw88A1DYro+?gzFM$%_C0natMZ|O2J(J#SlJnc+b-&;GWI>*h?dOX_6@A?R#zZX zpfEq~`Nn>CHCynP{c)1Bq6N@lgrW}4>PU~aHL#It+RK8)Sz(>jC{eg2_v5TMr=4dI zYCOq$M-B6g2YPjJqbDt}vL?3R3V}t|tSCncIBkc)6Daz1ghcy-s<|Krp;ag<x%ni> zLU$C0!0#10NBa+%%MPa<hXb^qbh*SbhcvPy9ZHBtMsK`+VO3Fm=qL`?N{W`v{D6%} zxHozNiKf+bqNSlSUdNZ}x0+JuCy`p#ky864nS3*P$`rXGF@D4_o<QbSO0Q`=b>}g@ zddK}B<Qezt^P6BD%Uq}iD?9M?;$&Qrd%VfdsX?nu9?ntJ@LIs5NO+&lw3T;)Cqi|; zPXOEtwpbCPw9z33r-a`&O%thn|0IQ6>i1KQV^-leS<;3e$2J}OREo=%<n$KeRmC7` z&zYe(w(kt#f98MklU)CaZV#@uGYWa;p&O!)5l~Z@)m6KZDW>R6?Km8<k8s%Dvd+Ri zSimlvvjXQ(Bc<1(ahsc{&GfD^Nm^S%TANQ=%Nt6{pS_vjW~|{zPV0e7>oLek^ISVl z+fF{1;AKAE-E@dMT6busW?hz8-#=&~F7?Bn*Sd2Q?;Ou>8crV~m)0oljQ${wbi9%< zFePfjYDE#7ddaXj(k{M<sUVqhEghw3y8%5rEe|@Gg={G-k055;YUuDDM&`+ig4sbi z`}mt$8u$ZWfX`1L8Q-D<eyos1;9%k%hOFF<=3XvTf|KTN36OIX#++k*`zYPd@bSfO zu9_Ot`+00Jy~L<`9Kg!Jti~$n&*Mi``~nW|`vwqX!di?gtx&2nk=VB=@G^=Gc`5)c zIhMEzL)gaQ2Q$r$T+&v0{`V9l*sb-EpG}ukhfb^CO#;Wk4d<0?awbKse+SC6f}{iA zP=zRzp&-UnD&(VRV^I{{W{syExiOs*L7|EengK)c#-hM{hhmNp0#hs_focpNxENO& zE70P7rj@8yq%eV662gT9FA*zyxpc{6NTpa*wB?4EN_u8c<{Va%3@F+Stj8ytyxvZj zlo2G8Ptc^f+|<70hw-74sHZui$&B}+m7u>E^0qhxL$b&hnW!k)ZDvG0#=(|L2}u-P zyh7s$fot(a5OREVEmHfgz4AoADDhl+0_8}+7v!PiNTBczgK`<Tc~+Wlj`5=XxS$qh zkf-Xc4C$2<ERnizckQ^+5;yQ;3c{L?3Recrx`Etn;`wK>&bJCj#6zm{(~}^D8fR_& zz(~RVgOfDW$eiMa(gAOpk#fTsGYvl&htMYl%ZfsTBr?=eAE=N5mr4zy2PLXUM_2<0 zWrIr*Np7G-*A&st7lt8(^-dnvOJW4}_DW~E%nN`ZCQ0HN3?HdwdL+E5)@B8bt*Qq2 zqgH(2XKs<j?tZVkv4`k_vns%ZYKfXEHL<acC`g^9SE#)%%VZ4Vld9!9kpDpM>DN3G z%pTd>+<bx`$X~D5{$3RPce(Jd4&>t{p=ilhNB8aPNBG}$c14XXobCSA)wPM~h6@xx z2sT4}Zmw%(pLGw(#^A1&p*aMD>)J&;gyD>yG2H`sQWz2Da!4G%vL@T<+KwalCnci; zMknk?BQJ-%GuOYxHbbq2b{&(7KPSQKf%s5FV_mT!hR{nYk+c>GUp}?O*m)xc6<=a& zUmc$y7^p5+pDOr;XxiRUw?C~ywyJqfZPi?*flnyoX8;%QBOki~l6Z9_E~ar8<31Jo zy7L|WuSNfTY5!jIUtJPi@YzkRugbmlSLL4Szg@Jgi;an+!C$U-lK<5yiAmJ9L;7o6 za-&X4rj05TT2)izQAt%RxwN}t221{>uod!a%PgcdNT+eS%?<Z+UPOr^vd^P1=8Rrm zoxs50)nwMM>$e%5kB`@9>^`fm2*N-i6sAarB!w0~RLmJeh<t*B_UH;2(Gh6y5zP51 z>U%9!n*95uP}}?Va;T}<N6dm!Ephb_6Q#w$Va4Xg5#MZ~K~~unk!(U`oj~erX3!nX z)FCZ9OD_JF7h2n#@@hQIE7q8nb#8UpDLt=|yc0{|&~DR>6YA`E!=|=*R6~YQK9o%o zSO;G#Ly0LOe%O)K38^jzqju8wHs4Ol_DZ<8X9)(-$YSV(YVIiG`a{zPmF~i<rW$u` z1bP)3MKYVT@z)Vnw*&~JxnNi}86-YAXDK{SSE+G2=jaf<MJ&5x=;dQsX-wt(*dSLc zn7C}Ll(paAGr9vLchpobyFi!g69sS}G3k-rL#zX9_SuB@QeFh{wSoc+pnN@;Zob7R zX2NeG|EhJQgTelYJ$adIWnr6c8mw!-VK|kVC&a@fv-{(odmdP$yU8bJ7oqDZgD4SB z1WvSJGw&XjlNrqFsRr5yK6RZ?ELtdHROJn#R^uJ^Cs_?>0(cnwq&I|sX=q}fuUg5L zC1DjbOLOAOTiP3*tfyJ>h&IC{d?2giI}20k6}tpK!jC7Oa%@)~&QiUBnA@{rGa6S^ z&-2v>PXJ>OjK25eo0N?DHF3jH-NC7kJQ_FIEp&byJH#g-URwEZ42P3Ru`_BkXT76T zjp|iZtyE(kM><3CIhfBaWmMU0^YtH${W~xJld<YRgV9c3HjNEmLIIZlj<I3}PR>Fe z&L)D6js_m`F3$EY&dSb?CI&YDlno@S{7d_q&hQh4G%3(KS&5pIL}1pk*_%@E=MR4^ z3b6V!5*P-XgmEZjX`cu9Cv@-AD0o*|S)GQIo>%D?bno&jZssBjuFHY2FXyy$p9jvz zET7}+W4|}ZUGPYQKL(`HzD254p@>6L*u1&Y)WoT*?Nz@_gy~w3ZbOE4;+IRBT2wYw z>v6?U9*dmBhii)7nWE_~LI9{&zb;oCUt=QeR8N3u*CzS{6wxro537W3Z%8amVh-bN zQWH=&CdpIpjkxbu*_7a{LxCDi=bDbe0_*E-fK2Ar*+IFOOy@LeQ5wWNq-TDgwx`uQ zdirY9XF6VUqP~vtprv^_)r2@|`gJMROQU)%&|!N9SR`w#OS)P6%HzeOLGV&#ve~e< zq)Kt)i>eXSr5ai+_XDkTDLPLi?doiEk#Tf6CooI3SfFZ(m09Cpvti<t&`Rggr+DP~ zm6FR+KP&l;;~AHx4IT;?TyZgUD;{UXms1;G07?y{8r$r$Ae!vfJ+JmM^c=AU`yoZF zD}CKPwi!JV)HV#OG<i_kP_Uge?>qqvr=H{Pybl#C=osU;rzSaWy7U|efB+d!9Z|Ha z{KTlMja=n>1>pDEIO7%eYAH@LnoK1S;ac3gqM})Q%<C}|iQRQhl5&G@L0AoA<0krp z5M(Se1`>m`7ML8f43WaH;*Q*rX#%M;7oa1VjhJRT;hoBq>!$r>gC-#*q2JSx!`a-# z25Eki>?;fl!{!pz8sJ6EEB{FS%zfhY;AaGoofRi2ZlX)HvF~P~bD&9QqhrnMGKRW8 z7hws@kkkr6U#BwPZ;JtJaFeUWm8Pd%6m5Pb-qzVM$>X|N^djWMg}<Y^gd}$fR&KOS z@ayvXRjYKMK+wjpsSe*mxv?YWfi;bAqb?HU%)|Xi`|{{u&@y>brH|$4im`&jKRR`& z5_G7`24DdLltJCTTPpYppMb4_eS`^Oh3qLJNetkzj}a#=L)0WHNjP{eaz`r|-#*ns zkb={z&pFn%4=IX-f9Yb;wape8#B%McK-)oLS>>otj5)dch<eBD5YtU|N2wOo6Qb{U z=M-Fva!3Y9Y}dLR@b<i>^<0yKRhvF^%&Z*VlzVWq4^@EWya(0_9dK-St3w6$z{s8{ zHeGJgEio>nNt;;l%~OK1?`RKnQ?640(OrZ+>bkKvIyWWr)i58ydZ#C972#FnWEHc% z3PXv0xuivIKd1Ae>}vN1key|yOT(`oC|R99?vviC(@cNEP5)R;*GxM{>ZVo^$RN@! z_6wn%LTD8{#Nr#_>fLm$$TlMfU;Tp}4Rg!u{}`bf4tW5Qqeb<jnJ-J#J3KBci}FE^ z>PN;lMbdG29sg&ZpZ2g!(e@w({zv26s5>CF#Ny)V!7iscYl`5c;u=M_6F^0`G`ltF z&>J9Zwfi)5kapL!h9>_On?tp2NycHWV50rLYooCnA0pg*qDbrh*z{hNB?8+$<*Wvx z>y=%T&3{cAX1mt!_kjP`HT?I`^`AklSm%Zi@@p#V5Zt$Kl>fJ&Cgfsj`oEQBF>2b@ zIO>=m)6<i&ZoIBIqvxKDofgs(9eAT_%Z%Xr(B)f2tgCVnvWDc8fK~1mc7R?}>hdWv zl1B)Ys04*5f(#*2WMq5-mu1W=DALg_1eFp{MCK4O!B6u{=p9aG%+3^inqS9RoT;DQ zpO1c@eh*u(cGVypf!-*z?%N_nfxJ%z)^g*fJdu#zlCg5X<}f)klBQHp%pBxmr!(CN zBf)v-*}XX@(xDsDQ(}w^M~15WIh8XroqnMLU2e7u0{!~LqgsYi1!AO`<<X{2-4b$9 zsD?prxJnQh93=x2y0vfPU{`nWkf}Y?a|JuQYaf^us<yWnqP1_PS07XT?ylVN&hiL@ z+PK+hMWSv$YWa-W%Ck2~<5=QR#BolO<2u3ld?|mn6oMm&hmlVEoB2*UeLp%=vrJ7o zU5m9fjdM?>A}F=8CaffNV`1<%HZ<_ubaXQnuK)&pGZiJpd~c5=CgTl5-9M(PQ^RGE z({C-)4x^T<F;y%(A&%@KNy?UxdN!Vqor7nyM_GlmRK^viRL7Mr@%#L+t0M4xQoF?3 z6t{6X1O2Sr0yk@x+_ih<DP4z$`fv&&w&eB6s$5JIPIeNMl3<DJq|T9hk4kq{&&>RN z7CC+pAU=|Dq6R5ila}u?zMym|P>qU-Y41;6t9+qiM(K|jDb@J0DeC+=xYS`7awtu# z*jRL{Bh5z<xloIlQ6RjYldcmDca%8I@cbnq92>NU{3(&;z$i{=N>1iDFlev%x}Ql_ zoY3eF;{(Lz$gA`=#%S3C-eM*L<68HJn*@oZ+MGQs=P4EKhW!HtO*f!$S{%{Q)}HQ; z-%+4gY*zU>o#wKO<6^Lt3*}q_a=4gLXIz-7j&S4T@0(Abo{prJrj(VXY#N7=#+w(2 zwJ#sx?3jxa#El;I9nik)0Ev(Z$1%kTC4<ineB~=ta{u%ySJ<UYHrNIJOltJW(nr=o zzj$1)L~vDJkVou*oiZ)l=ycf(1t6OoAX{r2)J+MH2ZC$ajU;y6QC=KZ9clKHJNS2Z z?dACmg5|)~%Ue4M@52pj=r|ZJpl-3eP`Zd#nvL`d#TFUSxG*(rn-C4$8Pp^rJ<z7D z`L>AN!kvL%lxxr4TX<MlR$s9ZwYXv{(w)DpEcb@FE}cvBddiRw6^6bo?}wKBzRuf@ z#YTFhy{DHK9Vu3n#%eD5o^hKO))wFkZtkywPyA9EVf_;#t`M4hHp=Yz9!JgqBk>8? zgfEatEIABhXj{5={*Ux=jat)dbP{l_bY1ewB#5&;%Kq0I_o4VuIZ_x0_{2a?isq|@ zTUxC0gMBR~)~!NvePN?BRuLo5(U<cwKWtd#N^@^=7ue8lB98+y;w9u1z7L$4p~WBB zvMgTTJ3S|3)9|3pj*7CP(n-kCV$(Hq(v*-F613oCSy_zsu78ZhVpf{3M^s<NtWpCF zm#Tov%$HKePAicemmj0Ixdt4{B!*&6kVy~dUS%9y@KBEcTebzKD)y->jHs&Ia8*1p zn(YiE6nyd!@!XMou1g%KCS1piX$yQ}-RCH1=^JruB$2F8Xh`-3sBTjWn;od4k_Bn# z<$G^ntjZ;Ojp#N(EVP9w3wZ~dsU&&6$($ZbTF@K1nd6?@89qw=L^p6bQfEIBB=JW9 z5K1cNKFD?paX6~?q7UjO=nTKPu&go-y|5Glem)EZ@9V%*th6%psFN<OXn6I=dFYu8 zbWce43fB8NAs2moQ{v|fnn8;Elg@V;L18cMW52>tT7P}Dt19KJ<(FXOgGtNgMZ0!S zmNBCP8G#M|K}b%7l}Q1~*$BD7hnjxf&@Bg*5^?#OrA-!!&%ng5(uQ}i?YUg0$FH;n zG+_J3;gB#|C~7kV0l#8M3b8wkxljVkn3BQHHexuAEt!{?!VBan%g=q5fAa@5x$HZ* z^QEc(HuLQW88K{6yqpPxil0mle+w;!4|Up-O+QI1FV2?d)1?hO|8U0<?$teX8>N+g zfmJ1iUyCG=X<x16iOtz^|88|U%r=(ngf!}pdl-mbJZ)_FfYLU7gxSvM8TxwYUc;Kt zjQY2!mg}jX6Qmx$^xef$CLyckm3r0KsW72+!yL>-u_e}|%)S@Vm)G3mZDE^-Au(n* zhg~}FpvDY%T^kgqS|za6;H@j{7@R>p(awFuo_WD{0=%ehd@7FNY3}`sdOn6=+;bhD zn9rB=QGeU+bB*bWtHgW_a{W`$L8xyq6Nm7Kr`{#{#4^?d_v|9v8O9qJ*HgOSdIW&% z?ci?0-m57-^dC9vQFB|A&=cmctup5|h|rA+>3kY$20gIeNoMeQ%cL4zW&(c;DKy>G zkvCRuU|AWS650IWQImL|jjJE4Qbotz=SJiWa-U&#fUAdG=a``f^ht8&hq%y-+5VY_ z_({tBY4nFL4~g%v@E(!3bH?)Kn=s5i#!f{e5vaI%8Zy_{q;HQ7Efg1uJHgrrbA{}% zvO}}+$OuNJ2b}bT+I6M84pP1f8!1fbNE6CUbk+CdrS^ihrHG2WHr8;;O2b{%V~*(8 zRa%}5VImLsZk$N?!_3GTW`dl)?L5V7pVXI_dKhNFWsJB=B5Ep_HO*Z6bn*01d}fu= z+t|aF`^}?&SrF5Y0<e^D0Ixe}HBoHRYScSX0J#WM%W7D(y9%f6T?>jIWDG(BinRK! zZECJ@wamTZQH^sUVuy)T_NHiJxst7n<oV%0eX0JQMf_)e@t!z`JM|@obox?QQ~yu- z#lMy7B#i%(SS!iOV>2T7Opnr8vy*y1bj|{Yd^>BYs8Ev%RtX^zg=$hla5H1XE;Nbh zl3T)GlBOrPSGeEAS9Q6#$R|<R-%STRbswkK`+YtGko&N^Aa?g0{F!o|+_CZ^P4KDt za-Q9%cbkpLrs#w{8XYDTEGm)v85WY$IdF0wL-_XJlbD=zQSbhwSy?=aHW-34nL%)C zk~wo9dC-}6&c!TwBzecE=!<|D(G}#!TQto$HIBwSO}fziSwANWlJA4Ak+d*s^cv~C zp*Ye+x{prLoX?tM;c_;kl8dP}+fT}`Fkxaavdn!kBVwBxk5<jR8Yek0HMcT<k2{>O z>r`r2>|ph{r_;szv#2m?sJ}iwsek=YY%;6CZ|YFtXov&BtU%7ECM;vXHH5W{d3Ml2 zc$Q|O(YwS`3lP6&rrBKlHh4yhV!<(dheH`UjEz?|*H8T-hj&7HTA6I2$lL@?5jn<u zyHrhGca4%{A69joV279hEB<YfK{#j46#5n~zdEb6(I;ZQmGQxAR1cF7swL((!}T;T zje<&rAHndj5CAuywx^}}9r_4YE43^d`cqr28lmRLc>dL1&mH{DtO<U6w=^|@^Aak< zJ^Ei+=-;{UpDY2k4Oc1rV#(!KLFoULB~1Ut66pg46kht6OPMOxmIJr<Z^;(o45IxZ zkr2KD`H>2gZQimum)HwMB(;N2@H)@Ln{5sUQVx6YH{ucO7Kkp%eFr^GSKZ{t+lTj; z&tQGvXs{<~Yz!gkFs95DOhs-*<V$oxdKD?yC=Wj34AIL)<Z_<bB@ol@3#4TFcQ#jS z?gYd<1TIS{gu*Rn9z?5d9vD!8y;dzd^;(~_y_8igO1hP$MOL@~1zdYlIS+)$A09rL z1}8#LD+WJQ9p?eK9uC6_bfl*{H7SK9wlElKNcRds*7mL9%i?E|8>ypR+!(`UuibrU z;!MCHwLVsU&-`-IoPVrW;EPwd&?+vuF(=I!gPqZ!8ODVQ$}yJ{7w_Hl)qxagwWO}N z>yrdRO7>f52kbo>l?1^kU*6^l=LmOxjLq6a*$)+cPVxov4n5-|mhd!Ly%oKR^a6u7 z)C*w|kBNFj58#|+Da%F{XtHE$!_=bX=4}bmZzHF^6uBc)(>+-6qsT@R;!|f({A>x; zua~B69W8U_X<-eJjO2Rn>to1%+f62T4$lq(!2N~&-x2;#?CrWE*3G`Kul@hPp7~$c z$Ir+O2q28~h6te|qM&^C^^3sl_G7h200^Xn0!Kgxee$8JD0Sy;V|o(N<;n28zu`}C z&<=^n+caEGv){dQHNM`z10eGvq`)OF(pFjPM}PMGtXWKj5$oQ-m@Tcg?*Dl$slEx; zn16%!G)q`Kt4w?a(?&k%PKo77<r8YX;u5mr+I9^MWz`*@p_ynV4I9F`<Y^10#ibVZ z`jTPgFvF|wzGNCj$eJ=xkExN$l}@Q0tB-+o&+(zwikR_RvCkgmmoPZzuAD%%*$dT; zSOM`MXQbb`9Nsf>sc@Tvc<gO4cRQ+Qg*EaK4NTFAT|KxlN0f3a$M2p8iHzB|_Rj$W z7$~{;JTKT>P}(yj7MjaxO1R`d4$rt3v=f;IG9DzA8u>mJiUF!sqQNW;8t`{xguRD4 zw9jJ0b^4!*mWW3`;y;TqR{Kmv7!?TgPUyv^X|2UABepTMLQLWa<PsKrjD7zh!Tvi+ z|B2uFOcPtu7k(H2ANaBS3qM6&dXO*wyoDM%)u@*eKBQpJx<GOf64Ci05v6kVg{?Wb zjV)6*syD1Sy)O3z_ZyHm3J0?dh#c3%PPgfFr<u+6yXX54pda6(G%?Z`8LbSbMFI$& z2z<)nFr)7s>&41Z+5!#Qh<qHjEtW*x$ItN?pQU!~Ye$639pYG2l*M4$8?K}34gnNM zpes~zvklnrt_tX`%H=Ivit~-~9!0V3Na#G#B5e(wGqY~QA;(O0OfK_KIv#gp3OZj& zjXvF3f$P_aMP5<}sB)+ku7+1db-S8&?{rJHW<3dx<w(Ygey`r>I(p0sb=>FHLy+us zAX8zsm!&zJ4TFIdhwdOxX(RVeJx@WB4KU!2sCh+GMMYZ5Bh>tiIQr7x2xV;R`%yw! z;=+(sKR{T0Dd-=;AF!?;tz=#$HZbz;jnxBa9P5R_h3o$Cg)+|HwG+u^G^k=Q<}xTS z)Z`jq&<_>)J==`>O6wlQ<%TF88u3FLp-@JT@|HM?M;9SGC?}>BSpUfQ2ts+@4j}NF znkIgQ{p+y)9n${<+ZuoHPUNdx5b!l;m+SxWI{!=LtYv3w@>K`@l02Jv{1f|P4GU*& zanujfCLUV(7DH`Gy+#%mODg(EWYRV<Ib|erIgxIX`bJLLtHw9OU-6{ko>Dj~w$QA> zxD#qRDJcpJ3Ms)P4Z5w8r(&5x(6q%0d2hQodDgt|qo+WV+2nQ&hj<G)Mlq)CkJE0~ z?^ly!>L0JOq~9`cB0-MArA{3DiA}>`9p?T>aa{SMGD1pXJI~2Va_k8JljGVK%mgT( zpikMb!En?82f=N|a+7SH3NZ2!nDU(r>0&tU3qRGJWV`MYKb4vDk?kD}?2`w#%dg*1 ze!qOO$iKy8^l1e-ztLoT%QEMqr|}jXK)*D8!mEEEox?_Z-J;(61#^`m5x0yLXEEg| zwA4JU4C6?Fwt&>E$eO;G0JEI(p>ScIWiZ~;vEFhfkXKE*Sl3wHT<$<FtmxC~DO4R@ zQ9mu!fDqxb%+O|eP+wFt@(09{rFiW|6@0WNG^M44mo~pd47*26tPoI#wPXrY^hctp zVLOc&Bw>4}>>+##`k02jth>q7F4lQOg*TbtNV`$J^)Rp;e$<PK`<3e8Qp+T@=F!yn ze6gq}sB5c`EJ164n;&#LdX!b$f*WtWzfXuviUZ;yMS`Zl&gACF(IFM@2gAw;HwzFq z(gK$9mwj!4sLjk1WiVV>L^y`LY(}gFiX9puZ#Vy<VCU&O45^chyf85d8{#}1tDqr! z7jf$ttPfT3gRfRDlnWr<yS+(P8X{U3F`?2^J2OgwYy&eXOSYwyXbz5+@CWGur0)6H zv}a?<LV{>t-jsCgp=dh`cSosbDRCFuh7w+AI7w%Q3#)fDhOxQgnpE4DW?<kQ=|Q@z zG$ZlGr9vLk3?oZYwzfDp%9w%W1r0eagOj7g#mccC0!q^h7B<uh-6Tyzq{gh#)bu;l zCZuAJivJWqg{W#tR754R(WVMLgQ;a7i0W38x^u}GeOQFXTY2QZECpbz!bqb{5QNk- zT=#tWGpPUkZVN*)8ISUD$I)rjCiDCEldd!@>naEs@KbIE3M0^+>A=;5Sr)0v=<D51 z;N!19k{`T21w`ZT(}aXhj&X$HE4~<Kje><{xG8WMMny5rV~|>oVGOnfhZ)Q48eqol zBGn6znD9^?jJik1E<ZaUJ>jPUKy!);=#v2`zC;HWJj4f3ImrO!H<=M9cfFCB;Tv@K zfY_MLq6v3IZR0m2`tc`J*Kv2uUenbkjMj&;jv7+KMg#iE^!k}1e~M&!$OYdi&gU}! zh6)<!2WN^#GU2B3iqQzBUIPkk6)+EWtR;in2-iy@l(K}yZ9OQ=pq<px#qE6p$FjY; z6dBLjow@*n_F89Ki(#)aJ}}n=W$$No&>_^3$eR1pWME}op1H!asZ!7N14XXUtn3Ut zCc1G3QB$LyjiL`)nAvSGV}r<o;A|PX`{dvJI9uz0BrMrbE+as&S|wTY+Br2fK{cjE zBjg<|PRn!Zf}?)Vvl=2qDPC<{ZqfIU`n!%0-6=5}C2p?YKsJ`w%L5%i&TxAt;Y6p~ zD04Mjan5+}o0J{LM9N7lz?!+zssNf(rNo#d_@EHb0UTy<(w;6f^%qO@!FtR7`i@Nr zdFc<oNtY1h3`HO@O=tvYC~P;`HfdRFV*JS-1q)hH!8o(v-(IYVXb#U)OvakqP0+t; zf|oHPMzK_QH%aMihgYyBn$e*!s}>Gk%auwo49`%=$2z<tX3$N&#Fgy0JXt7{WW=lh z@tOd%b9ROaW4l~WN3jugtb$G#MRK_1*@KQOJzq4P5Gm_C^j$G52T=1ai)nY}$e}HX zcOnPH`8TiVXM*viAHSkEVgCT>eyQFjy)5=k(iA1&f6X(oL8-9;`MRT&L@}f$>woF> z)Uc#rQAHnEaK4l8^6-Frpwx`qGNKeIVz5yE&J(TIsc6WkAc;Gy&*=|01V{wr$=0U> z3w9dPJC@cPV=N<Psa+URKyi^NcxyPMi76sEQ%&bt*Eo9UL|)Egn&Yhm?dM0`gKG)! zc&TH2fS6$NHqIuB6F{mC|8@Y&8E_eK^T5ja5ui_rF{%`6KttL2tx+j&>_EeGpq~&O zI~@lvp^Wzsf7B5i$Oi|Ccx|b`4Rx?k1F=c1?fbk&xyESS+3wh3C8}s;$g2seg^o|G ze_DOa`i29m0S`2EFS@NS9Nzz;?3;ot(Y9r~tGaC4wr$(CZM&+=wr$(CyKLLG_3G?% z?|plJocrQM)QYIjH6vz@nQLT@9NyUF&p@tj=!u??3!a#7&%dB=f@daie1~WV{@@7U z_+SFQgJm4b?Ed^@oV+!$&Eg4{`^2QaJF*Mx{+;|B{!B31A<V3OR85QWMWyh3wJiSW z(UjEv$MYR#SsFEHJFi@Wk4i50hf59y2k8nmX5YrLn1iz*T?qTRAD|a&)CTCxRrk;P zZLj(GT9~J8;`#m|O-6HEsB&CD^clnVO;RS&!J4qqW&h5EIPnfK^@)TO^A2C+^I}s> zT)ET&dJ7P<3)l(B9yT#sOL%Ar(?narz6p5iT%MudU%HV2PZFl-gwH@PhV*0b)`>Z@ zI47<Uk_YjEfk2X<5J^4)anql~9SuIHSZHze3;T(<(=l5KL+CCqUbaT=pKm*vyDhq< z{W95%n?$1KRkGt|nhbuO-u0y;R&_<S&ZyXN*Tz&JzlPuERYN@YT9Od_!^~DLl*dtQ zwa~l3U2>0;isXdz9e_)l(GXqWeLe%=KTQ;`yK#GT`kg;j)(5_VI^VBMcfNR8zDVTX zoz@4pXm2|);K@fYV&xc&tlO5P_z=;UFfvm9U_UTo7NUk|le9(nq4NjSWsJrk9mX-0 zFU@&2%UKU^7hhS7ghhI<smN+bW<S7weXDB}#vomK%Z>kb82p`){FAF7&a|&LeUnnY zZ-)W*|C6iydlr*W(Z$Hx(M{OK$zJsPBWz}5Y4~rxk{PcdgYYlc!JJl`W4mTRSQxGn zpG0c~D0vtjovA@QfH3HkbaF1GwM+U1^38_Kj>+}lfW&n#%=W>A2-9oPRxj$*IP)MW zv2NN*7MsW9*ZX0{3JZ@;CopYfIkEgm;dImtqvSqRMCvphH4efogW0y9FBu>T+G?2# zMwTvZGWtRt=w77Ky%!v{Ylk+9Q&4Ffg5t%WD6E9QPBbB=cDU9ot?h?n;^=|Q=?4Nh z=qs{uI>PGqE{q9=@qOq_uC}2ZnqOyvvr6_}aNX($Mx%=g;Fy<{H`9r4MGDc(S^yVX zUbyeadU&P*&1OiNJCzKY9H>3qt&Y%KidZLz4<nWGj$+S=rty4Zk;rJPZk5FE4-3Eb z@KsiK*VZ3fbZTu#n+?;$JIi(fo(fnLK_rtfFfi~9kJos<zmYMgfH4me`X=)ey5KNq zp#jnE<cE;9Mbkh><6emRKCt&j52L^r&vO|3kY+9cN8a|I@o}8Y)C4!=Hd+I`NNI>+ zJHNwgme@dv7R#M5&wGP`9?Jgnug9!hk7$?H4x)^ZUhaLRJc?Yw^&V>KX7s!wk>W*i zKgI`5xv1HK3H&X)@<{UjYra!liELHy1o3i_rXX&fOl6d|QHOvE0Qh^r@pp-u_hkpd ztXXQlnH*E7=}rEnO}xTR5t^6RT~osmzq%+nOeodIj#9S#NBKK6`1WbktOmyT+sH>g zGc`L!g>dR0(((z4u7Zg~Ce9rk9{^T&{?U4545eG?$z=xq?X--d%2Fqfxsl`1`|kk_ zk7#HY5J3&qWzyV>=5!`>zxk9n!WB^S(tvAC?9v)02O@Z4^jOQ=ggTWi38b2c!e$9O zcTr94296kvd>U*9uC*2>hiWTVmCKt7$%(zo<9gT%9k8+Pw*->FFqCHt$W~dw@BV7L z{2d4XL<rnUtJwNCLS+Ac5Taylt7m9vWGL-qrEl~PgeZO^L=N_I^2F$*j;e6|SDBxp zRdWyWjUS>7pO|PFET5-SJ6DhX3iCzMHH;_nmgfKn{2(fV(0wn?b~OFuiWRt=XvoU> z<@ouyOV`U`#>d0ku*{G6mTG)I3b=-yvM@$^ay563I#eaPAiEb@#C=3b(v~6E&5U}X z)`6bG(bQV3wazhE$te@%V<rtUu%IZvix85?iM$f3^g((d_`oouB$e?rst;q@<Ek~M zpehsT1<FLh(Q4B^i@PWS^LnFtZIlE?ts3(5q17fiGH`<pr*h%`#<8IcH5Z(;D%FaW zC<^mZgq&N*TqPU^;?t^5u@j)3iq<noU&o*}Q-*S-orEL`NQ0BUpjIPvqd7GOY*)Qe zrYn(7B9n=_h{fBw9oyR4Hga>wPLd_KmW6SXV{WiOKCcF=&@u~^j5fbBNWfy-YeZ<P z)B|8M6fJwHvjc<r)p>cXGDh>Hl={NCk7UX{co_ji7RCkv1zUxFDoL~B;Tpd+^rBc5 z+WZ~pAg1*}uAtJd#B@CG0q@)vJj&!=R)n<Z+lHM7hxL<N*o!c_?&;Y-7}#KO&ngP9 z4aAy03bU^5GV<}lM>3hYJY4B)R_>+sup~`IMxpLpiDL&*8DJ-nS<I4Y#6ia;LcB<h zB>RTPyuc?>_`<Q!b%#AC0E!<NDcsLU?+k93cJ4#4xOYr`o*;0az?q0=5A|S`AlDVz z{Du8t+!+@7QSRJ{<Zo0JH4)d%*g=OrR{AmAsJJr9)bQ=UHPxn~PIY=<U|D&uLt@EQ zj@m<RU9e|kvN!Y*`f=m1-64<ceCuf3u^9fGC#2W5PEwS`C%V&DUE;?|4LQ&_cM%NS zc*1y%x|*R}tnB0Ud4w3o_X?243H0pI@^=327D@5ph1nX${R)Bm1VfX*42j>|Eof#v zX%Xynh={@B&mlo)7mg-4Xmmr{xR;Ju5at=8Hdp(^CFwu?OGN)WTK<Wn)^SZ{r*9ky zeB<apPW%g-SsJO>>)G1=kAfa=B{L`c{h~BeBqa9P_Id7_J<mIdCW0`<>W=8r8O9D+ zq3Xn1murZbC08*F$q<p7d+vZ-fBV=vFLe84H`hHpF4?~BIKG;?y}zEpbb(|P3GGNi z;nokvxR9Q5%SU=e@uP*XJ#uu#d`EG+oix++IvjO7>m`R-!tdWB_)42AatwkYS@J2O zFLzVaLY&1VtgKL2$_xK^?+hN6-#Q2Cxo+HK*!tsDe^t8GN?J#=f_wY3$`cLO>o~($ zILp?WXHaV0o+Y)L073gi`P(nsvqM4@w)vPcZ>4)rFl*>7Gq>mNg*jIPmTxoxa*NGD zhwG1kak*HJOJCW)Kw4kYuacXgxC=`??Sp6(I=|Yp-1{usrA{LFS~0btacVkqPydSV z{H!`)ny^P@)sCkZSv<3T7l&tWR;PN~$gv*Ix*w&!F^3{EWGX>j$kCJR6@ZGasn8Yb zr&LC&FmsKdgW5wiNcqAccVabKt;AY(O4B}bN#jOadQ8)kxW1qr*DO&h1nf`fVz8Y) zXA>FAJz%QHf#Z<S8JBI8U-t>4`~VPpRe_IrDR7K?scG2Sc9^O9%`GfB?H-u5$(yH% zYvc*Ya623mF=#*-MM{V#Ws&xa_j4qLV8;!9beCM{FrQvh9~_osGb$9phIEF_-@*<f z-r1YQ(9`$+M$l9B7ZhHJ5Lhj4zY~5`Shhmbz$ii2oV`+jN{OkGs9|0M0x^+so(@(s za17yOTm=ka>d-iD+yGmg6*;*!Zy(oArpf5AsHK$auLygYF8<G`+<MM-FV6hhWl**3 zNTS05s8OH3YZFotfTspdfiu6Dj*q{hEB=06|9O#tVvKb1zp2vM_XqDkQYJIY|M6lP zMR5Jgi5j?t>-Re_G7+U`i0ph`RXtUe*QnW&8I%v#kS=SY573o#4<J*L-i_zwmV0Xn zqX*dmr7QgRHYk}=CD_<?MtJZxe*&3KoTgZ(jt-c1LSf;wRX!x<keyCYuq(?@^j_Gu zh|-#<(;sjKSk#%a6-P`xqH>O6nJV}}mP!k2C*|wku*hEq|FWTS)PW%^6U#`|ZKvR5 zgsW9={$=X>`?>z_iT~xjCD7oW?*4|Z&$qFU;Xj_(#@<TLQ9#eY)QC{Z$<ooxR?pt? zJJRys%rG%-?EBqA9O^bRVK0OX;hm9>4a>P`pyh;@41k3K1FKyC3IejuSOmi&rIIcd zP9pw9qKu4&!a(R9_G_6P$ZVT4B{bK369=W+bqNj|V5FlqzU<uMI$Gay<9vHD#p;0# z;s@O|#WHjZ*NP6?!yAZ&4Wmvd2ut|owy91oVcHs##Za9h+)Fu$epKh6Jc$(xJDz^< z?s^hO#Fv%;i`p38#6g@(rQOd-H(|;#^fv1}!>*w=qCV-yppi41L47dZ*Ko4DtBGX9 zVsmFjr9js5n0L}*QbB}G5-v1`Mw4<-H>g37NkN5LuM#Q0NPk<^ZmOu+t}B`FozaQK z;^0>9QO#2dxOfnzmSe%H?Qbva*PW1wAj(9qEN;DNPsk|QYHZDIK<!>qfz`PSw%Ef% zgX$$MEhNfsTBc}czZgI@Yqr`yPoi&O%3B@89>93tD?3Az`_x@0N0*Ze<&S=v8>$16 z{erP3U~uDKpLCWOc@aVKXm}JVN&Q&e>;v+2KNn>XHX}N3?p*mfg*&tYZvX0Oimc|r z;pgzMhaNryIteU;Fz=-)@aiS%ZjaQ}o@Isb71;ok#V`vo<Qn?H*?6JKV2*n2jL#k% z#{yDDXEQ783Vl4fCcB@wuR!{V<OTIf*sZY};|a-@zvWLec=a>E2=5OCc9yI9Q;ZH@ zuSJQgz<qOocd-95FUMv+0?u@JH0||hf7k_QOE?qn7^oe4X@kNYo_Hg6U70D*blEN} z%}PJ{jR5+umMnaET{M#Sd_Ssqb(}kxF}>D3V0HyPx9b9UxvU(z)q+EUKj`z}`AbG8 zlaE2zT0*=npJF*<<)0>fK6-&&@Yfjb*H|CxFa`(&%d0@qGkdglNb1n=Y6M7XWuu_i zp!-%0{CLd;_{2BdZD2;>l{Y&fOEuJ+{T6`{2Bv(+e^JE0qu`(T_~HH$Z}zR-YJ6wB z{zql*JK9xQ&(g_A*51b1?0>f7Br2}i&nY8niP+;)hO;LVulG@r5jG)cf+q0Gqnsuo zi<+5e($95}9nQnC%EuVVy!`ycW8h3q=Inu7at<=nd6R;4%p@R+j98ro$sFVMsP24J zdpn+D>FxrcjV8kIxTy`Cb7N&S=<o6TX<|1yM8aybr=Tgj_HFX9WT!0KVSr$Q$ku2f z)U9gA02nM>v!1GSCaBi>Slm#B9bxH6x)R=y1&=6_K^Z$h=K@CI+6p)4%sL6zCZmGb zKkcO|jp5SSJg%z#a}DCsC^a@BKkc|SW_?`hr9UoYp)I28UW!(sqQRr$ucW3Go)?KV zZPdJxxE0Jd)lMW}+$=@|YP4}dt6l*bQLJ}mWhroFC1`yIjd!n|?5(D|B`GYI_RK3& z2wy^kZM9^hgdunQQW>a~B>Op^G*MDUPnF<|<=O0>?kvxEHR4gW?jq~j&K?YowEQKL zbF%y^sSOM<%@?ONYpb=2KEeo=s`7p%-qxtvX!%P;Z;5`F!AT;t>6uz$LD-q#I7rHE zP(eNNfx=6CkQH?h#WHFfvkb8673;*MW8_Q>fR$8Vba1}3!Jp<PF^~efYlsE8ioGT1 z3|hPd6!PIaPNmL&F9nhHMmsYFAoPk~_qLnH-zwFd$9XKmyesyzxgf$=0{+1;DMRg6 z(y+)RkcI6|NVr!j8*$Y$<>oGRBT`exp+Bf&Ezz5S>P!00cy9@?n?&HYA#JT(F~4y2 zw39p+8v4r$0Oy(^p(G>tWsZT?@8|bM2fQVN22NgR;-lz4Q+UM8dMcm4YeV^4ZxIg# z5XZWEpKEV1*{pHqXoBsc_5^=I+q;Au2iL+3(*}x7Zj0~f@j(A@M><j|_rGVM?QM)# z4KpMR`7wE@VJ!tALWy}$swB#alMliXp0Dqjos?nx{>%7)2pDo5)}dQh^-4#VmU&{b z^Y=rDcabq?o`H1UZ?ihG9Z+MYHT#Ih@C(H5lr^wdj0o1A^SJ>z$|v3q<zFVp{Yf&c z8->}uZsa=+!#%{n_8LA4t4%2y90|J;oKm@yHJ5IfgKWg?)n<{ywj2#b@an;hzl7~v zkL%n+#a>?sy}C4CuwG1Rn(sSH3H{rW@SxDQ+_-^>dh9m&AZ?Qp63m-`Q@n!u@_qPf z5Y&b9rZA;XT3`P{@ZWLzPXtp`wb2!Qzi!)*|4VM*H-i7cO*56xlo3=AKc%bUBJxUp zQ&-CW1O%;ZQnrw1gergv2#3`#Om>7XqGe4LBSBF2iu^p5xEIkXuMGb@2E5O0YkL}} zC1e-{Xj46Rcs%fYvw!4{_xb!dv-yFOm)Qf`h1NslnLc2onCdw!Xe@6aZ&KGUsCUa1 zuSM)3sYv_=2Cyu%i`2l1Zg*^lYR9<uj0df-tuH~Rq*hL9EWvbNx$E~^6`nPl<vxk% zOj&4gRs23Vd(6dt!Nt(WO|Ld)jXbfuuyLKgF=i}ziTPL*@Ae)Im)5<2x(a!0P_r~` zs`BV|@K&OZEQqW!96(RuQ%<+0fd*&fq^Z#S1gSL@4s}`4#c9PnJ*-ExnOQ@7GJzu1 ztuD++NvrV?C`g_=pfrq^(B_;Jvg-7YdApp#c%9~)D7_;6X+n|YDEt*T!D7}bJSxRP zq_F!_af6(~tVhzqJ*`fPeSK-lzH`gl``IDf(7aeMhkkd~X*_Z;_L@=!RMmLlykZXX z(t92Byr_hifNy|;f{<^^s=6g(<q~r@RZIm&8&SEtg&N+963Y*%MVC2?Mz2C^qh<2< zutotsBBwsM-y2{6Gk_*g3M~Nfoj*K!Bkt)7eu0*(5a$eY-4_QyE0CqotI{9L5Bf%> ze#Zpn=o;)36r0TlK$R6%$1yk>4pkmNeL-PSyhP<WNySRFH+dQ;HcD0TKSjodU<}dh zVbo(RQ{y&nm?jHtPBZ=q4vMj~ev~uXpq(OXGpf5{1to18$@r}}?=(1WVP8J@`~(Q+ zc*JatbB8`Uq(n8CK-GUgtmAlKcvn-rYk1zgazN61R(>Bd@njLmd*_0>>N_o%g&2~r z3`Gvg<9Uj~Jr9<!1gTXU2oNfjZ?%}{_a~m)m2=L)l3EXb41RMMD^&X|nvio~7#@44 zHUKhShK^<j%^n`vO{GT*Ou{oS013=OHMzz&k(CmR=DM(_5&;|Dz2d_u_vZXhk}<0) zoG(SEeNl6V$gIfh<*U<6u5=%&mtqiX?$sEQ<{<4wmBFw4d!QEKXwQ%qjC+^4y)A-E zWNVLi)DMN75S->0FvwYNco(y5e6h$y*vilo7uY!lAKd$-7TTf^?H@j(L!(E(fRD!+ z?fRpbjBR0RT%cbqldUJ`q+GM+8rq{_G`rb$e^t($Y{9)wIH1)B);Cd%(%EWFIEx*g z_n<!h94#RWp||V}l%hSy>jUV1t-*2BB>`9#>4mtg-AswaJ<M0ommh0OncAo$L322S zoss>)xF&a1pmIgX-HXt?3GF%SKXo4%4YcFnwO#MEV>Z4%cGo{FaIK@a6EVY){E}eE zI8v2PjAsub-jwbU%!&g2tk(3g?tIS46L%Kuk|8_t=xWJyq~>*~b};%URNvPy+$$an zl(_w~JD$qbU-h9?EWnmC6ilO0$f7X1e9B89<-X2v17#Bt*-XSHe~m<9qcRimXZ9N7 zi%w=;=Sizm{7qy8AplW%7WiDKTcY88*wYX<&cG%c;G;vF)qVIIKdc59pmU(%eJ_~q zS7@)mr`P51;?(btIBE8Ft2P|%?xIg!3SX&L^#lXJe_PM~Uf%v$_;5e9X}G=%pXGPq z`;YPTQZ|NW#%4zLN{(ih|JCSKT2sJK!u*t`wuDdm1#3n&4e#!sV`)R4h?q;Zyd01R zR!g<Xtmiu@)klay716JtbDul)x-V&x(RG~%vurmMHC4Hny^FIQk-W766$6zXDQ0}j z@pSbz`5mcx9`57q2E9$r4Uq#<|8soD_y^rOcn-$hPs;1>A;k3|s-Jc|p03f+8#{Qt z0&&4Y+_o&ddSX3q0NlE;@q<cEQcB_{7gT|1H~f5LgN&`3%6}lS<Qj8M86YofZy^0i zlr;;*as$+5kttp%E92_XAMT06*wn^Gh!UI2GqJq{h$8AkHR)(7c@o0ZgjS~?s7mw7 z(;R!+B_qv(CZSqArw3_yl9m&?V~C`vD<p!_P7)7kkIbLwxjujQrqAtXVg+Rx*g|T( zq^%U(*^fa&ek^(^m^fW|Jp{~*Kpsh+*k9fibSPyW%9Ne~sZ}SGc)u-Yy`(iYWtIh! zlUbz2%@wNF$}UPIW@uA32Ct@a@awY91^DUBy9J$y7KP3?aj7-{N|V0|+ck3aM0M1r z>?j)O1{Gjk_?4Mj)wwS{s|Wc8)j)DLb|{XTn@8!D&~b@iIMW73KVfydbi4&vncv3F z7^e=AWPah8j33Q#AA28r;`I8DsY#>k0cGy2s-8U#qNRxYkbAxKHxtE>D~q!k@g1Pl z6g$5Vs*vTuRD+9#iW;c#3J(OgknFN=BHQZp0RE(ajIR`fyMg0IrVA0nCU!;L-SG>N zdG0B08HTkE8=dyr-`hARUKz1nbzaddCA3Mm_|?dny*1l>(ufap_7ieXz^Pbb%hySW zCx;qiiYJxz+%*i61mghNNY=liz@o9ilL0Q8PSgD3<wCUZXx6hbdf(WvG7ncWyA}Id z2L+W!JnUmWuEbE$oq)&xLlg-`TK1fl-NP;}&s4hShqT-a6Axk9Ac_wV%ffHk@b}+6 z0}L%){!5)lQRn?qR8yBvu$(eGc2_fm(LXT@h<M|8QA)cEVeiv%QHRU~^iWM``3rUg z?75l657b^Eu0tw3l6Eq3A3Ji7`5lC`MT97}M^Otp%9R}944{y-23k7vLUK*>%&(0N zgs_GYTP+Yv2O7kjCi0G%I;`akcaA#ZC)|KUHfchi@D^MsJK(9A4j=aDs}$X;6^d;A z`QfIjuQy!21aa<6K+hKn7xUBR!Ifs%#+5`;Cf!qpkx}O`p&csIU|cNq2J*SmX}8pM z$2lQ2++812hu?zuu8RoxRJeK(AbeAm^(3aA@p?4`X%DtdrYEPkG<b?JzgIoKwA!2< zCHQCaaq#$9j854+s}z(uB-^?oM+vU0Ji>*!TSE$E@$g;g8iq8x<VS0spLF{`W79px z6K(?;?Md)|W~S)CZ{Y;_!KLjLH(R625k!kboFAle{Kl9!Ikfvx)xBeKPUDWEl|rZ3 z>8}z2=Pqz^aGr_v{8zK#?{(+@R-}K;yw-wD#ZZ0s2s5C5{2={L&4#}k4Dv<}-|~~e ze}w~PCcb^I!a^MGP6t7W8xs&0=v5Y%U<%+Dlr_&y49+3@iHNSwYeh2(Pc3DAeHbKy zm3d?G1u&d_pZvKC!)hSpD127^DR;V(F6DmrdyF;J()lUlBcuMP_T?>m>+=V#9}R%0 zF4J!bS6E&YY;skLyur5RP1t%Fzv~?ZplqO-01<sxN?<9-bbZk<JR)Ff#pZz+<r=IW zAWlRGEl7^O0R$j4AT^*MKTLu6(Ysc^)P1+0rst@pVj+m6tk9u{4kqbcBrYpc<=%bB zex=<|SNi10BAC2ZDeR4=ij6!|HGtu(*_R;0-ti+zVC4M40PEvLt)R0VsO0*Oa>%Y! z&9L#NAt!$t<hu0rj%q7o(_*eH3G-B?iTOcw>(>ga%*$yNoDSI$Rrl0M+l7grK~*(- zT@0;~K_paMCd*ZUr{MuPeU1GaaUKRvG8rTR6BJ2Fo^?4FtArdL?U2o99!JoKmlS5! zROV{-<pk?G`-Y4JSX#A`8=~P2vHX4GvSJDQz|DD~2Q8#vak2PIbvwOQdq5gUGp zqLoHfg{%kOim&D|%Jv!zcLQl;pHbbMJX*`EyTmd`GI0E{ZIBzq*(6MLDfsP>0+-I@ z)o3YPqPJRb%^iMIXnp{RHBHtlEyT5H+zo;j&wU>lbC8j3gHjXlKv?8j8_>3rmk5p( zRok4Y%1w>$_&hlf9{nF@hVwNjoxdC@7J=hU96Z*!#lRjFRKk1Q8WqFzn9mojjx5rK zW;J@J_fF-EjHs+GWqoHKT^iG=Nr!)Oq|E=i?0wHh1FcxTW83gHCcoq%3;~x!a#JO* z!ov@83rhN<A~$HH2`3JOq%u>k5Az18GTBhMOBGRqI=Du@*_#rk;i@wD>#`&T(T_~B zJf-)I9NKnd`s&=%Ut2XEW09Y_(B?!;O3|UULTSCfD-4KJ=?3o@tm`n#)co}nQI66) zUUsztl>VS|vwpy~ewCKy1vQe23I$SP>b7pJcu?X80;8TRR2Pp?+G;K+n?S&)toiAm zl^`Q6@!M@Pm^ZT5%?8uL@Ez3+zsG}z;=!(PutIk0iu~kHm-g+#?j!3Ca2T%=;ht;s zj}MP&0i80$wB{X)veGlcll+B*N-#ztU~eFfpd%8E58%k38n%Fuu9@7tB_$y&u)yal zM)wFoq3lGdJzfNMT(JhOAfJ9$8V!QL+C5L0pC+K-1W=4f!k$gBu<wk}v*w_Df@WNj z*wL(zj|otZF}*+OUE&YPKagF3&6o|h#_p<F^Ki?yrFdgmaERHIx;m~1FGAvTN2adl zRM`0PL1?BO{eJYzz1%`IEv8(E%qWY#_6kC@&iOSqgtjrB3b~}IOQe@c<QFA1xTS_o zny>bNrExK}u!)RtjNx4kSVgR{6$SGjK2zFCP`Q3eUTd|(qi*KYa0$!~pv9V2Mh=KL z;qUCvjvY=~l^+mmw%n_VUzT9uo1^t|^-?reIDt^$stvwo6n3(CZjY#s3KWW3m^}Xs zyF&Ba#1Y$dlEqoLk-hiB$%+!&f$toK&nWQcudD`m=kn{`>szH`|BR@J?Rk1;6N~<1 zyn0f{8<rM6cNbSAz2%&8?vO(GO0?P`!a|DPL0~icO23H0<tqEpWjF)S-)l*gY~K-q zo>&qTlDu9{tm?So=RYk=OsOjeZ)`Nd3}I3tEwC@PUjlwl)XA&ER@T_6SvjGaM{Z!H zfH)mZL{IK;8U5}zdFtrG@qQx_AwuklM)7#{@%5Km_3wrDpC$Ok$e_gN+raqxJ?}{S zpGxq*rA+}-GixIUBjLZAzyB@TRH|4gDlQ>?PIg?Tj%EHNfdu|FXbMZoub)Qew+b54 z8?qXKDq<B6p}Di$kr6CzPzmEn#I1g2!AmsAn4*f2uXvMKk+`tn+^F@j@_C&7c^&(H z{HMDrky_=L+XR>|W1+|*uyNfa+v~CUY30cCZT%)%XY2h}4@6609=3+!yk2?y05e`2 zmXlBC$6Bd~h%jch5h4)JuB${K!WtG02=15SJ1WQdh$Q`=3Qi!Non<ooOZgi_XNu)~ zeflQb`w+Wo*f&K*U7q2eQT~`V4juh=A$zpLa8db~JO|II%cFF7-c{SI!(dVIn8mEp z4h5|4Y_F`7wiySk!!uJi)WbBaz^s!F9m6*gQBQ2ZY}B@%JvVs6LQy(oEd|?4km~D@ zLjJ=3D|*DckTR7zn}s$r<^Jw1`K#F>sXI~XL1LjPo7TkRqN*@a?uP}wRC;V<7)P;m zY{)4El=?MEDiwM)3nHsfLF)&`%c`-Ejp(%t?iMkWSqHJqT;IRMQuVXwR^c;=2TL?J zk-?N)EX$)B&=)d81sm8?Y5f<>JiSN)!!ROaRYhe`=~jyk^5@aO|6nXC8I}*^2IG&? zy43)$HlW#rVw4X%OCLHx#)D;GS%sg{`C8@q5M%kK7(3&gj`)qx?M=ki%xqAGAMF^L z+EEs{Kr9?jBOD^DmBWR}4;VFY*_$%<L4uQwNpkh+qKF-nQl6#H{!}hJYOMrTvgoJ^ zPTxI?Ky@p#I;oVk2Ttb6ZMHIB%)jMDqLiDKzQ=>6XGMq=X{RQ&`J-Llsiny%B$d5P zuGY$x+NHr%GK`S#_Tty1dswFALx^U<fG%YhETmRlD!xBE9bkm6tQQ$1OgS_Cn+S3$ z!YZE(wcrknI?9PqK$x}GP$L}<$z?z`IZ7Q}MmRrKHIES<+IcA<X)5(=S!dz>rBG*+ zP31M9ad&L3UGOm)QFHN{u8J1X<Ny^*5F!$C8kS$RUkMV9g*Z!5YZkHz!*P4DorP!N z8bfo=7ONlKdYc%n`?#GrDd;Kw-LoWnzq8X3a1o^426SwjuFauNlm!HB?(+%yTw?7i z8+G<Nj5Vil_xCNaadNH8pZ(whZ`qu;*MftVac8mBC()0*X`2kBSGQE3<GShSOZeAI zFa3u{z1p*c>8mFkgxi{s_w5m}9XC~1Zc#6MC%C&$4*qTrk%3l^@YD2<35>^DcjYE$ zG^+txo0oV)#HnD9@zn|v_Rui8JR=S#88-nSrzriQ<nLc>rxj#-1oJMZbltUVW&vvv zt6@&NKSP9}eADBpW)O<TALMzi1r6`V@5bu8sS-qBhDhdPs3YtR*tvEd?u}}4MXxg( z@cF#is3#(-M`oaj(F69&8Ow`e!OqUlbaCSKd+p<(&F=Hi{PJdhQq;r=lQ1nlF>I@g zn-t2CQ8YpK+q(gD@b^KC2vfU4dB0r9*Pv4wBKR&A0Inp<<!}PvkV^Nu0WI>eR`n<w zP>cnC%&YBBmt=4QE>W=pVn49kb2q-88(Gt{Sru4ni9@dz>9riOfn&amY<Ttz7s8`6 zu!=yry)-YNFPx6mzBT{^-?@S_eDATmwL>b?o;XuqiSI86?eJh^X1#Sum$}<tYN_CE zUb>h->%keB(Nf}sw2`V>vWkA>ry9o+_LaG7Q(%o_M%wDz?{VV1AnORq<3|a#NRi(| z7hI0lN%4SEJa?>So~$<X)5#yvx2R4t{P6t2Kp*cwI)2Gxo|!g5ej8c;*iu^N)&P~f z9#lVVoT;&QyQ*N&Tg(M~eXDI-%@D`~R_V-Grb;8`>md%J_aun|o4&;6GXEM;a~O@} z*n2h(oQ1b;T-5sx_q+nOE%jwH`-NUvU|6AyHlx7Yrg{u7*(6T<1w9q-3D=quY~~uu zsueCy*`rBGc!pm`Su|NrfV_mzjZx$4UXjUO8SYLgsMVCH>?~jKF%My*0D(oYW@etl zeS29f{ruZqFXVL_S$o(-HF(Q_>yuv&dpr0UWz(?L)X2!x1fnLkGl+UIbb&I0b}a~W z%@=jepH)JSf+O1M9H4E5=Nh>^_#z4ZyvDMRTH==nrAMud^X`v_WocK^IrSD;AvS;l zvjm?I`s!kIkZTh&hj4Ao3)R_KEQ$uG0<~C+lOdQAc?@zY4AWw&d(L?^^c&#Kf=!== zI#_n0on_rpK?*ZzN4287NNHiA5qcot75nMo&(O$#h3Tm-UXY8PK<VG+nYoK(v^e_k zVn+fkE8i)iQHgYE4C$zCsGYQ5LlxCK1uMjluydv<Y~{0WNJaa|Y=Gc?1ov&G2)z5h zAS!2$zqY7Pn-Ps4n&A)A4apHnB5Yr^j6hDRG8_X*iXwbe(&y^c?3KInMojXXC#>(- zD!2zNID(<8D^a5OI(8ZlO671+uz2Rqjx(>Xml;0rWBgs2>y=Y4TiLXYE)ArWvjqYm zUM;!6JGnXoA8Uy<gbRL2!(T|}qLP_6aF6$(CG1d^*+zW=K2UoKP6o2dR6b&RO>dIC zYT@#Gg>1BhbhZQt?0Z1sh~?Sj<e|(ik>iW0{#1xlhXdhj(4pWFAR#P0S(B+GE3wQS z-&mGROT4wgBd;cMpW>B-pOf|ojoIY??t|>Im7s-{5e72z?;qT14=jL+hv~S$$PJy( zb>oLQ4B&V<ehJ48ZY^*=K$8O~%Y^di-i<$koM&A<147Fb^5nQ4J_D{R9Kh_eaV`)d zO*s&@9=XLyPicNBEn^FG<4$iO9isrPl1$%yv!2i_ni(c|EeX@|IN&3QYk;5Hq&?xL zrJnDzPXn`K`et-g6YxB6DIJW_l)Gl`fZ;V*M2=2#rbKu?fP`Ov#YO#{sQi<{z?Hi` zntoH5O1S^UZSr5sYGiF}{;RDusQRXZpn}Xp5DiIZb<$v-=oB92NF0L#i+uwJ_)GL4 zmY8#1Qd9sG76TN+Pd>Hb)On+=>0w5Bu(G|p^0KP3(hsJr{Br8eMKpj%|Ed0H9TFyy z^h1wFg4?0nWRk1eW3rWn<^7E32^)ZyZGEv1TGUjJBf@<9H*(#!E_PRhSuZe-`F0F4 zBds(IIFuMV_wJ5?J`Qm&0VgKWI~7be?58x~u<J8dZ1$~f#x)FQ2JU-A@Dy10_733= z8MZV+*3OPZU$yIV+BGH25$Mz%EuX7zFb}+Uf4@*4&&{<-U-z|b=ruje7QFXxKT=;g z=X>I{4d;92H9E`|!e@@}8KMtAAdmSr3AFZ2z+1n8R_p+;0ORtM?<5l=V$_n5KLNoG z95iF(q;m1_%y{qX;YTkZ-<&BvJky}q@IEv#{Lb?<bAtJWX{nQY2d1G*quXh$+|s_e zlY1uScMh9_TVz%fv`fz14j)@`dp$l>BIbTWLnHeWKD!1c^?l;ntn!(;u$5J2`9|Z^ z3c78soOkvZR*6M9NqHl+jE6!epi><?XG!lKs;Rk+i^Fvhx_!>r!X~0BC}DfPe?$c_ zsH+y0bzQXs3&(1vuj4c8%5Dh+>**PnG|f=@!v4Cy`(+ceV@)d?A_n8bH%;Qwo8!f& z%a{ycp=ZT}S^^RP)EgJbVwvSZl#Cea$As)s)O)*yH&@@NRc$yf-L)K3_02ryaPcrC zjav@Y3zsJe(n2{KB-OTvf(+CU0rBX&dDN9bWaD?BM2v6--h*>jNnHu`9T6Q8q7DVc zGI|I`z(gHzWSrTS?H)}J5ea(zRzOW-F^6!Urb_K}HHT8p0vBItaZqWG`k<qDHhK?r z(v&TicJ2w$?}+_!VbuNlDd}9%w;zYshx+|%0aJ=IWEn9d4BD+=gcckvI%{WKN!MX> zIS*-W^b4+?wgJ^ZxTb^4-;L~IPoc0Jd$DJ`M|;~KU#5Er?@x5Wtxs@)S)6Dg>4R3O za45<0T4SJ{eE}gzo|2Apl14anrfo;`mXAb)vFN~)A}0_od2w%s=YpXeqOo6`WMy_& zfq>C%;YA2gLQQpM`2ah$lRN}xy2LIEqXQ7a0!a(UO_&v*Lu>Gj9wh2+z6h7{{e>eO z7n1WrGSYH#r}Rv(qcy}S;+V}k${NUDC^giir~UkzAQ=+H*1)Y)<98kM2580#WMlbq zIpg`=fCD4&5{+bQh!c<Y2M>fO;^X4Xs>n;12@7d7t(v%~bd3QRt)=SKvh#q+mj}4t z5v+_CB3kG9d*MU!)YXI}m(*)%xmT_wBt%z8Ba;=_l}WQ}e>8oiN~{Y?HH2zk6;Tnb zTGhoiC293tocDoUqTiZ=<lh%j32B6H%_OHdFSi3;MN^DMLw+{=3I9ddS(j=#VqhHp zGuYhI{TgfsK{%*T2AiUOTOo=@IivOwUvA+@#n6qf^bn0GBk4Z9P|MVnj{6JW?E35| zH4e)`{uUli=&?|0qL?a^DT&~mFMMlKlzDkhOu9-|-EA}b;@~Am^VbcTjvBQ%;YxI& zXR>%JTxELVskjhzX;s2GvW{C|V_jJraCE^<S^>0ke9W8)9c>g-s3MwN3;s+5Nh-cN z?JfN|6nhn7IDdVde3T>vGb+NsoK-Y^5O(^g>SrFEGcJC2;PYBZ>Cl+zR|t2!WlSW) zcSi0zT(a{AC(FY`u|#XBgUb1`ccme}sE-HcZSt}tu}(AR?$TLKq;Unlms<p`1|EQ1 zT{!m(ZWAU2YrY_YUha(HmU>5jb@Dm8ZTxNd#@!bAEgz4UQ>Vy!=Ef=AHcquPI`VNC z(sWWCq54fp(^2a|#2L{g(7o$b@O&jj>8M5NNjSqW^wj42=S}BaJq*tH22bYe%X>V8 z$q{jM!Q^HNmmR&6hyLSZvqLtflotEze)(N#C_=pn@gZ?n7Mqjj<+}fhMsv2LH;c>7 z_<3tQgA2{%yX*dFsSl_3wdv(;?fpyQJr$ohE2I*ULN-=rtGCnR>%#oKOlhzJVE|l{ zLI8B^Dtt6{5ntl<3Z$#5>bGQ8%Tv=mG<%STzG^iDZ{iU@=Wld{D^T8EYwA_Nn|eX0 zyfa2!k}8;_sa7+EY-4T3_12Hqfl;OP$R3<LyIY80cJd;zCy%^IJbgvmE@uQ4oi})D zgs5T&&b$+yh4oBfgH=(i0V{uY0zOb9J?M^<NzPodT%sQzMvb(kWY-)vLEcodT&ABM zW{tF^Fq5CBGU$xNp?GfC;#=k2)2m&e(#t&}giaIB`WkD%zYpth@8a7&D%fT>ZZz%* zx?Lgx(enl?INmQ|D5}Jq&p2^#T3@8M5NXojLNhZNs0~`a>Q(mWHZlamJL)yET29jf zu|gFequ>r={}tN(i>+S?_8w@irx||97UZ@Kavwjub@?~(PnD9v#>(DCtDZ!p-8Mo- zDeDKbxiXEsSG^xt7PWD3%hA47zKz#EjY%Q$Si8|%eEbW1`Jf>65^4iUG3*Y?VYhln zkpVgZ)gx|JfM95+EarA0vbJQoj%K{nnc4zJ0Zpfmu~enpj#BWb6ryr_^|p6d?!Yr* zZ+>Efx0$&bfomga8>G;5Ov=J;8ny_lj@f2jBlkb_0S5u~Rij!XdQV(i<<f#EZ~&zT zOhnWQk?OZ7ks3co;nFAk;_8RbO~~b=rDp^)4noe2&})_LohDZ-f>HrnFv~mSUVhvR zv{HzvZ<(}S7fnFN9*c>-*ZA&{%KpH&9H?@~D65rhr<IbDjkuuJ_kCFQDpX}BFdl@& z;YY*t1!sj$v_&r@=>bkY{z9lh@adV?Z`!S3CD1id8wC7e;^Oz%{jd4azcZA7a+h4? z&3A=wO>XKtL+?Kt4CRgfrp6^`eXDV(!(YKt%SLM8P(a{PaGs@jcopDX4fBi00vJSy zU^%}Vt^4RKF_`IANIUO@P3BKPwgHckP+a}dzV8A1-qH2Y)ix{l(Rtl3O<P-M<EQV| zx7%m;(Lu)6*XIe!k9g9uma;v7s?wB2JLsjsGbtn%$MpdXc2w)o#5H}!{Cq5%vk_h8 ziVZnC6#?b(Ex2lz!7MhqKcy)q(<lru#+SxN3@?xZmY2B?sYXdu#fFC)X%`7aXl=&i z(i@GKE`#JOEkPcTnZd$tP!Nz8OIE|qHngOnwMaoDl1Bavj#Dep**2C)u2!Su39Yat zh?TctO7(;5IuR}D&Y3&6nzeOCNlg>tzUk>z8cg5NV@7$Q_X^4P@=vx&9D`(m{~EGX zOI>L&cl$K+=MduNLPnNr7?SWz=c7`_Oy;2OAB;aYQ&_Oq(sn=v?v#oXcc(?^(7_jT zTO#NFqo%||yij#S+1xT3!wqqP-mkbTm^wF3|J6@P$&xk_YQ&)kTR1?*#4^>B4dqmt zY@R60bY>ZnQU5)Dv7*+`Rjz?Q+<~l|p7CU%KIjn;Q_W~D#BCA2>gZ0zghz==ojL0S zOpP}=jRS3@3+DzXp=ylEiie9t0W8^Jv#nMD<@s9)P%Hu?r4Kz8O?5aJ_|hN|4;!4n z791WJ^%)cf(vuQWQWCvJR`;0AuwBJ<BwVpJ>VYRsr{K%;^`09DJ3;|3rq%!6EM577 znaxcQHS}TbRkF0b!H3hXs0bYlYC>j)zmR`NDxhJ7Z$>}{GqYw~dBIB(i4!g8H^~<S zQ-O)!WZ4*ol~mcw%Zx>bdQ+IDwvY;ci2wua%YZZU@nNipZ!Qho;xuYu`wPIvvlXf! z&Z`+St_g}6_cA?>pRmEHl)Fw5Qhe7uUI?*|;2Mnm7;Wd;fj&%@?=g1kPXa;!M_CT; zBMhG?P{dbmoDZ}=WpU%x!tyV~_#D&nQi4x$Tm(`jt#)aq9t|?FT?U3g=z}9~Kin{g zefUiV?u2A`a7Adg!O5TyCc;HwS5oeKfkE*@6JTnkcmnh|A29O%Sl5L{VF?nnQ|-Q5 z<8lj5{s!ZB4Hb?*?khhYQi|(X1b~CV-Q^bif(rp%U1buZyHu!{&1QamEb<OayBC#z zJ6;dABlVVMpOOW;<P}i{fAlb(W!oP?xHn=XX2^Op0`HQ{AnNv)&UFH6MK-U!^twOC zn$ySwr{3e-zzuf4;id6boC=BA6og%Dt6n0xXH0tSBC5F?23*U@VGT`G4|oO0?aJqG z1063Q$5fPywW1r4=O-28AHT|eaU|aqJa+|L5St)sv=U!2C{4NN{MCqYi!^v_)WOf$ zDN7V>AE7^6?8@&E5IsYHh`;{A2-M*p<>-mi>2VG_WKlu`c1Yp(lD6HI3;0C!lgrE( z9cq>qoj3ATmd?C~%v=CQJUFku8&=^4{lZ-<YlP+VuiagLuS5T=Pz+DDF_Pbg;A!Ch zC6`vg-ayet(8$42z{d95Jn&yWV1+H4Sy@DG6mYBxR_0i#qk)MJ(^UD1O;|C>qpT1f z{(6*b@o(#8L|hZ<kxpUg&;ZESk1x_a7Y$u`aX^^PqjiU=kIAP@hqt4v>McP>ewy2a zLh~qk$MNK1Pd8$DDMF=!qlnoo3;I=4EwpUNMw9#Y)Aq?kqgNWVgH`8dn`eO~{<JCr zd`;Ew2yPp8|8$1-BMs{O%%l^|@{Osox!QS&Eu0d8t;^CKy32E-OqL&Og7QszPgdQb z>~;20>}d|Zc@|XdHl0}7E|e-P>|Eh@j*|H<)-B9i(SCkDW*!mHdk~FU3NF&U8V=v< zg-bZ0>={r27m)e4Gn}XjHX7fVuXMzeciB^76LW0TY!XzGP397W+^R=@D9EP8hV&Kp zQVQCfBf-vnVn_;Q`E#O8c-s%TvI5zlKSySSwAW<i3ue@~lRilZR8KKWm(#FRA5sc( z_FQmL^K3Z>RhjuBWr>mjXz#_qBbjOCA^i~}yeZ^$ncff@p(7U-qg$2MB|6^)nS=+H zF@txNdUkt1B~u^N4m<BPtkdbo`c8)4;N54U^q)}lfqw%gk#eau_ScOSS1qLVy_7?9 zb|9|<8aw9Z`f<;=?jr6L*`tK)2jON-@EGGPT!W*hP^16w3{qIu-1CB4v2D-vgC^LF z!1gk5VkLupEiI!`8vPDbn@CxNy=>1=3@duislddsqwnAl6HDF?nk>&C`BC2yR1V8T z;@H)1nHy{11lHKGWB35Z!7(73PFv*XltaZHtj;l3ET-zgU-Kq^zls06qj=Az!dc(q zMgRBbKZZ8`J9hTll51jb<lyk{E2<R50o_N7>i_X1rN_GqN@;`#=%TCpvlQN=gg?E^ zs*F%5BhnYpmQ>JB^;&mqk>&ZpoAc*+jc9Cf3WB~tYg0hYat7E+iBe@CT|f!zGg0dw zzO<m2Wb@g?<uPek<-!HOr(&E=tCvWG#l%xJFOySzRfCHWVhWDOX!s;-V=NqV=Z=QF zIxt_@9*T%{1i{~9sG}?jTUfDdFtl%fDK~#V+CLB7CnV`g{_R3e_>P_+`cKNu_n{SR zEzSOCJ|R=Z!U01C&0AUBta71E?t+v^RT@Jb#qD6;$}BNl!M9v{S2@b;f-rJU(@>+9 zC6-7iPD0)k!U>$p1^8K)AzqI?l@4-z8`%~SmEH3<jpxaiFWUHBRw8p#V_ud!efv?z zn|AgS=at;&!&bK^z&3^JmLQHc-HlL(xjwuCuypFQojRe3<o!02TLu$dq(hy%R#z6v z0z_RW>LAg+kee`eeI1vLuJk4lV6qS^O*BxghtN4Df{N_|?@Ui#(6wFh{yYP^-)Qd~ z`n{!FRgRv_BpH%4HPs|ynZipdJ`q>zt!0-hyN;9L7UJmxP;t?Yu60ufE2ocF3#S6A zcF7V&zl2jUE2mnuv~rkqr!3YCY}u&10DWqEoDTty=6Ld<P(Rs3wBc}3F^E<z{Wx1A zyOdv}yAnY2iABgfc%mnh4vhle*sRBl8sgO|Duundf>Lmy*&KS_q-Uun6=%0<=~m7P zVe`wYd}1rkmJ$B&+5-K!ZjFDd4qjS*uOq_fp@pADEDqy9b4iqP`3pv6UwB{~uJV*h zX`>CtEeko-J;=v6N5LAG+SHUb)|5&D6%6Q9YLJPuh9F3F?ECt<B3p5o7>Nt=ruAO9 zbcI%disC`^IdwP$2f^Fv1#vp`Pf91};y>VqU-5I)vH6aZSLf&tN%_9aBkxpEmt{R) zHg7AVP0f1mcdO1lH_O%^FGL1z2~%Jk(%#lOSaBHFcC3f-!8kcq?pXRM@dt&cmODTq z$L&X(o}Q8oRD{zuJ9?bfIfl6rVL{qBLE)QB5L37YxnXI6>`9OvdOH{`);qwP4cAg| zJ`gsc$<0t520LrdQ7znhJ8m7klNXXQ`&aZ?Q{U5~$@_HHdT1<A9VR>N&sjkrJO-yW z5Dat<g|rgVB<yIJyXpJ3<`Zfg%}7V*{9Wv7ElrA~6Uf5AY)cRODVi#J(tloF{n|PW z@2BK#8ZNyjo&QXCF0H%ju}`451qa5joHw{e%_kX~m)S>c?yHtJuBjC+Ww0!K6jP_= zPL{r+F{li++PsD4rt~Mc^eO95o0e@G-eydJ;H2uRrcr2Sw^Zz$M1?xVMN2_MeRQ>i z=7p=zmvTw0mE*(J)cen|j^Lnq#dL!*vi<SI-nLG$iM)#O0$CN&{B@0+tw#j8hsRB& z;!E9CFpe`sFb}_XHxGJ))%XVgVaK)1tLqgUj(xC8rUC`%s(1i9m>jFPm5&-A1))|* z8<3-pwJSbs@Moz8{G|m$el2Icz;nSGw*}y=dU^`@3b!F^+9y(b<z#(jyvX;u?Hr+5 zmv9j_Z18zUb$Ro5EVJK9l`cDc^gtvG-Kxnj0mgAyFnUOZuBp#*luPJ<V`oOF$i2h~ z^=qq-k1ODepy?%ZpGC-egsDY(cFSo{F*WEhxG&`6wHqw3Z#Y~7>lu#jhKQ;|kWzHr zZnD}5<5}k)^XeTiX+ILNJw$F^bv&2U1#Xc?9=?x|`3t?4)BpZk9gtO)u}9LMNBhk2 z3iBG>cH)$R@JGuq!o<*GUAJr~cM4D!A!GYV(Bu*i1%|;|G>QYDg}U7>b-IZFtd-j| z%07`a-xJ~~aJUt5`FP7(zGG;Kot=G0g@!F!kwdZYJMm1%H+7Zwi9A~Il=>24JHiWQ z%Ig#{(*B9E))m?#R04p8Ji~Gc!Qrcn|L8}Ta0X)|yd;3RlW6W-*}?+O!CMLYb}y)d z3qs-#wIEwD`&b+z$L37&65=Z}+@`yN>{a{O_D*W2dI@Xn4ejK%?|)g^4gaj$<k9yw zA3v==YOPoA*c`WpZ~pj<>V&6nA=)3LdOx>H@^(!Z40E7xmzy~j#BflMIvjFYR5%}5 z7jYR~r$f3eBzE8_+#)@Q)S_c4Ou%=}^YuF8gbyNJDaCao2ZK-n4BK?M<_(|ED{{q> zOt(`g$*fh_XLahvjq9<(gl`hwJw&!ozp0Wq5#3!pEXHnU`Kk@dDL)xLn=_<$4aevh zFmO$8cL|wlukcLOY!5YXjaKTO`WpA*_4dlPdi|;PAb@yHkoRiv3I7bX*(cNbisl`v zv(21s@toM#zN^2#vvGZG?dr<H*@1yQh9Q+CLmxJFTOV;&_m00rLy<H^`_zy|2xR_8 zlCBeQPrWI{2X<#!`^;BL8$%AhZPYAzcKncsQ_VWwp=@+-f;d~3Uhhw`3v+Aq$JtF< zg~wd#1xE6vk)Ih?3iP1B2af(gRPgc<@ME>E?MRY!Jw)4D6|70^rVB(Z9&`B=#voqQ zu1}b?kA%|^<|kC_Gu7Jz$K%;k#*h!L_SwKTLEZyh@hpy;_E*5twTUKfn$Y?|b$xWL z;3rpsXF#Z;upV)Q>LYtY#cN+S8f$(GjO>w8pl3`wSYY#I?zuTuZc<K1_LBS+F^w3L zxCY?eb*Hae95I6V!^6M5w10nM|M~dB9*4iYeY0Y{?+2LfKRv#Rrr$yLhLSc0dX@q< zHWp^ziBC56|GnQf(ds)s0e1LnEvZQphOglFE+Bxu2DWqpNNr;X(k}(PT+zI%DkBBx zvCLNOP@F#~d0@Y!BC0=RhgLfCD=%_miWrtgeY`n1I6S_`!q;GaMAsDMfZSys5Bd2G zt43^xUYiBtr=s$^l1nP55b0%s)l-h&f!c$&(c<)mgDRuWJI(DoSLLaccl?2+wzRRX zL_`I?eS6KVQgW=Xu)12&+?voJ>Wni!rbIPTa4}~#nSNJ7W3jXs8B<&I@JGQMJ3OH@ z3T6m0V^s^%#c%D0{iD`Ca59NOyj6mQ*xFf%LV<Xan1i*!JYYkEYX1mHZcnaL2i<Th zGC^){HD$+b$~0WUh%((l-k(VC@_!h6=itirtzEd2bkebH+jcs(ZQEI~x?|h6ZKq?~ zw#|-{o4xmYzO(na=f3s*G3Tnes#dM4`5WUIdd3*3gwTE=`9A`nwORS9VcjZCR@WTO zf`~iTEcm@#lJvQ!)wahM+*_|LBj9aBG#v5O>R>3ZZCUP1h(Aa4Zc2^hNi#q<QSY8h zswA_O!a|_E6AeGo;!jAFJVc~!q+RKgt@<9$5(?$rL$KUbQOoCIBR}BNt_-^{C)*4- z6c84L5l%~$>_ns~R9iTQRACxK2EM}CYD6pF8GaY0s}!y--Qm??ynBKPgOmoh-EItR zLr0kL4@D+bl7h(F_6fz{&UfqR`w}ruFQp|gIW^nto7V58lUow}vLUfDsJ@#vXHMCf zrbFh~cH|*wmHrv3nF0q3=9r#*Tjmcn+rxN@oP$`3iPs{-O6+DQ0V$>Gg13n^&E?U# zDNic*<ljQ?&I0$cAy~5{BzNk;f%fosi-J$^k5nSkC4iGc616lCI)&!Mi>mR#_Y#ZY z6md1UL5{(X)L^d*)|YVz)UFsrkj+Dnvq~t%A!9)rl+me98VY+&Hp(Kz{C<jxM$)*M zFkiy}ck0X|F3T)}Tfe~y#3M{*X=viLau7>O!Rmx7Zces8K_aaf4z^;sQ?@`l;QKh& zqtRvuavWJ78LXKzvQk{-MHxQBx3laYIWnOj`YZ4B9HP=wcuP#?I|#$~SoM&MUgeOS zrcSBQzv9im>(9S6>yHLh_u)FX#ZQe={~V!5`2W%@Rei_L-qZhyGo2zCWO~2D3x9k? zA|nvu_zwF8IUL@RpBbJqS19!B{XqD6M51=R239jB=(jDo;09qIYU9!m=G%|g%dAPd zFG<Py=tb<L(CHobxxVnUGPusADpn1<T3Fj;D76mqVKBE7CKUo4d|t%RY^~LlO1#fi zzh9~*ZGMaNfk{4;-$toygv1n%4J|9v@UmUd^b9ET#=RU7g|DhzA4=ouC$^x`ZY)~| zjKb@*K(1VE!sxGfvy7m&uUrsAc>(7HnZ)|r{UpB8&&Pd^nT3Vp<bIu$kI-<sgZd+J z`1hCb&(|b=Z1L#%nK*R*EPVby6Neg~WPW|azd{`^<qt(AW#kX7-=l49+;`WHoo41K zv}RVZD4;3z-)(>`c?xjVo|n9Oc4{R@4Q|>Z^4Jp<nP7IA6ATfgb>XpzzdeCGa|vu^ znQ=Z`fHXSU|9Je2&v_036Q7;AO+P+f%s{)!lJ9om3BB8+6uq&9ntXBj){aopit&oB zeWLQ=K+y$UM7q>#&K0i^1_!Z8MfnE5401%uvh(h<PulzR?x61l+xKx;MTTJuV)tT0 zL?T2=Vv9%0M<R=AbSL{xqPN>y*7C&ZlVb$alfO+zig_&Q6{8>F*3fF^<R@T4Vk}D$ zvdoQCb9pk(teQJ!Zr0v5k|>0n*@LN8=R|em$P8N7p33B(ZG=qoa{&f0rD8=cWd_TQ zvJ%9DJMtV&gOGNiJ=zS9r>CY8<lLuVVNB}`b3&{LF-~L$kyOHSp99aVY<lhRlSd^r z9M#m@8gkTfFW7My%mN0WyFGoY6Y3T1sT9-w2h$A$M+{`3jYSqhwNGjW(xGr*P=86t zawg!|L?B1(V4ws+dt~lQ+!u&2&|4@t(JO?91p3iR6+pr%UJss+hbn`H4LZrL?3lFE zBsyvwvCSZ*B(EpHt5S?Vu|de9(B+Bqi}a_VtJ*`;%uN+R<r0QL*soP?)rL;m3k$=; zP-5Dv38T{hb1GqX>yOmalbqbft=3sm{ix(kMYvh>Yp6m4+?*t_v0cy|?ll|_T2iq& z+zd3VS}tB%EtkK)ClK+y8o#~#!hR{?YrKD`tbDJprkJc8Ut5h`{MEKU1W?V=%8ISE zG<^Cd0LkCX>lJ2qA7<<CZLDE-p@npFX4_-3AJ~-!=WlW>N+9b+#qx`Bj?b|DLpAtl zD;Q^V#*h32AMBAD0{WYa``3Wm<6Qe}nc1&XYhRr+=`cZR&+1~48a;;*&WbL_37&OY z;Nf|QDezaw7l|D1eL`yRp{HqusPg7#AK}k<AxK;Url=D3*(Hh(pr@qp__w{Gt2idc zBbjWq1cni{0HE(LH?JHzgIJM2!ghb8&LEpAmtUK@E@|bN#vpEgmAsl5)&#HBuJ^Us z&Ur-{@k*-?1$&{<&@7-)B=$(_eP`WQAS7g^6)15*zn!&=k(%cqV&sDrJH|=R2Jp{c z$lW8gRhO1!eS>3O7e40p^f|zI>_6$8YR|BWY$b|njVzWGJK+q{$S=#zZ<p+DLndoi z<bMmm5Di0RZdaaCG@_ZPANOrFrjdlQG*_T`q4+GDd#=nje0D6sW62a*fb2`$RAy%e zQSPx<P#KN~0MQ~o!7~uw0MF$rE_6d|<zYEmPY?iRbxR)K@=8X%XA6`?q?=R_Sa>v) z=k7u)2#G6|MWx5f=HV$3TZFPyB#)9DD3+;zS{g^mo3!3(2OclDU=@lkLeG{ZVHM_{ z1`gjt`X%2<2nbgZ?zyw%$W{^Doi_LvxZ~tVAVXc5TSU^~Kc0YY;&wNwUh$AUW+r*Q z5N~=9Kltu>$lu^Zd(t7qQD$O{QmK#-GE>eL6P$b0?vnk*-}pOV{Ts^u=mNktyEuXR zgfY@j{s!%TL3~478)svO&lCpTpG$-U|MmD6t`(@Bx+u+~d}O$-rAg5eOM$}^gTeQ5 zBL;~|N(#&lz%!=`5hDnd-<h-%qmeS%AAo`LPK8FTgf6TsnBk#H&J;x`_2_AqHD*26 zSUOcydRzXwfs3z%e9Hh_N-+*M6pX?FCOKZt>K-o7-d0~Wo@N^!HojHk{0PSn(Z_)k zjvnZp7wd|xBXVFx>?S`0kK9r79}V{m7gtx|bwCK;jj`C1kEWFQio{N9OtyEH?<sY{ zt{kCEe&nij!j0O!>nbpKOv#PGPn0=xJ&#%5J9}d<GRVYYmKbKjt?7r#O@=pl`l#`h zZtIk@lVA{yB(x5(OOjJ(;ab`!*ziD<+SJTp4N+~{WscjXkkQ1Mcs_#xDgf5!gx`bM zk`u}8qDrg%7uB?Qg8QO~i;Wd`QbTPfgLP6yLxxOdC=CPFCLR3A1dmk13NM!>j8r&` z<`V&cT~NH9E{T=tWxSncF_V5Td<E1;NSBi>5tAcj1V*z&eh@>p0I<BPvQcwWQt7#o zenv|ZVyRp}kb4tOgXK7OSK|%Ps!%4^K~U@XTGXEDuW`z8JU(N$Fa};vJ=bCSSe)R@ zxg#kIyuE8;BA{(CTo`GK5DNY7i##{D!z*6=@THgvc7F~Z-|F4{xYuz}e&13a(-(tk z)M&4wM`%EwbMzW9m<Hm&-_TTHAO50F<jglNi+DygMdUI+tP@(GC@=#@-{u64<~wh3 zzCZ5BRN(iFwj%61`5v705jDd;al}GE3UtIuOZnJJyNQcBtzY$!zhtL~u2ah(u)ccq zGccRmQjmk6P(qEn*5n2X>kG+kv@UBNXx8q1XQ}o_L`g4nYKrqn%tphUZ@Z=uJzI>d zriYdI%Cm&`CaEm?QmAcQJ6NaRC8n8hn$O~twI0-pqZEcKj%~CFSSMLP+qAjfcV3;| z2bk9{d`1Q^?IC!_?50~ZZqI}4Rfa2F(B1}HMUN>yS-WUp-XTpXDWHAWEVq6OL`W*E zG&#yPS0*YOT~+jDyEq_dSC&3bok~QK7rSDZO_;7|XrPIz2TNVpwBpRdh*NaaV6?kD zAirW3KWMxMk;e^>NuZm$HrcK`JmprDNaqUUMn^N?V6c1qz<7J`)KJ(~^uNY_h=wi; zqt3I08Q3o@tJ#zjt1mJvr#QB4)kL3uGqX3x>s(&U<=h|G*urS4A%BzRJzpszQ5KiI zV6l0_8?Sa0GNi(^7Xih5g{_X6pE9v++)55rhG^`;vXUd&AopvM<-7@CaI~|9^NP(k zDZGN<#i*ITooROxs-;v8C7*s|3)0zCsq$DxJJND3G*T96+6CLhWKlou^TgLkH0i_R zuf|6he1(5uC-o{#PhTzG*W|od>^wys1)mrmrhLdn4(*3?y2VjKpIma>Q1o%)Pda)e zc3b;skgt|i51sE|ba{WMsO=y$v8C*;BDYCNkgucH%OI|oQ-Mi9qgl1MDM)4BQwcfP zd!9=xC&Vg1okh@n_NJmxA-s_<H)wp*5iU@AY1ggx(RC2_4giBsu*L&!Dp3wSr9rWb zxUE<kcygB5I6&WOX0eA5ATG)g2Jsr^_*x{FC8i@p-Yxt{SdTF`+>j`Snxps*3m0&O z!K*1Zeh5~{>d*)Q#+rxAP|lCt1TPhS(KK~!TGBA$6o~VPoozz9GzqY=b0nddaCYbf z?mk8S=2(Avv}NAg)=$g%0?b)LdTBS+){7}np)h5MI4oJ5$)A8tRJR62S)A%n;{_DY zVoYv%CG0s2C?|qnugD7<U7bE}i7DQ@w%gJ6H$jPXOXEtAet^`UH2L1Czuuc0=FVx1 z5m;6DD}l7$+&`{P3o}EQ+7gZ}U_<B@lsZWhP@Ex9FYi7R+f8_KP;H<>n;IJ2805=U z4_0xEor)z0lUg*N-C`j;mo?otcK?fwGTbJ#5dp(BhTgpz+Cwf(r@U|db#+R10XiGU zBjjGE^7l2|Xh$_e{sn-HVY9pb_f<IQbW&bIj+O{jID$pPbtRQOU&V!fz6;a7i#?mr zi{IUhXoZ5W_8aoOae5s18&<>EISa8`>QU11f^uscIf})RsnmzCH|SndDAvRlYfp)R znk*S#-w1_O96|HXz+3t~>Q)QPhS=t^!|Fhx<b>Iy6+)X6+4>O{kPSL8SLb!)3o-AX zPUi$}l?;v;(!k-@-|a-33C=1e^}RF&o9E}vz;y@4fm~x?nPz^Zbt|V@WcKKM-q;#C ztt2X0!Rsv}R*bEXlY2xs+5!kWtTd|X-7;C(q_=5T)|C1xvJkg{G%W2a8jx$A6gA2c zolvmM(oC1As6Dsn0gou<0mFrQHAhj=bgaux@hBeQuUJHawR_@`)aZjq*ppX$m+I`U z2|w&NdmyBCiTT<{uT9f?bg#(YLkF+mEOfffW4FZRBZ~UmBWYYUth$*D$TCq}b~x<6 zOoma5exnOUdhPpxO-BKi)$gz~We10WyQQkFWzQjnjkEW}oBI(wZV_#@-$a+f<^MvS zX42p6j+Z2>MUesTl4NwJQ!7B3XyM1y6jvXH+wc9GYPy1wu=oU@-)r&1dqS(~8+)5V ztef+GWqB;_Tt!7m#{{@#!OW5B<cm6nDgu;NuL;gKbsD(WxU#4kejDwI^uYOhygT=0 zeI4?l8hKI<C873T3DzblC&W_sdZ(U0G%JydmR58JE!uN(TQ_*LF2Eu-BFf~0=ynO_ zqt<1-l0BpIp8hNn{oR@Pr<)O7+&^Le>1GUkx*3fBtD7O`U~X;hXzpzMf4LfNp2#jJ zAMd1tXRvYK1=y*<CHaRyb7(+Uz7m^?W5P;fVnH^<jT_a`pZSklv1>y8&iz(VAlzN1 z^AoKHau`?x(qdYpU8AA6U!~$f{G&8W#p{x-ZCToRN|x`v=4Im&XY;}P^1;K_B=cpl zqzFhWXcRLsM^bny$OZ;d3Wf)~<VYD|Av<?8=w6ELDr>)2q!0n-iT=%%&5G~2T3lF3 z5aF3cgPqa<Q-VHQpQ+Kzs7|?;)oQUC#HF@d+uQR?+S0pCM018!Q&<b!^RN)*h5m8} z=0)$DH}}?vvt=L8P-u|abv0g8b0`m{{b$0L;edB<aJSN+N@NYG+%>kv%bR*jiLV^t z4gBNWbR7r=uYd40{+d+gWtaNJKUCI1+vu~?`7u6J7RoFV0VYM}Wr0^QyV$9NK~G6t zgjh-07US)09{9b{j@*E~hWuDk<kWH`DOTKDnjO(OF}9N#D!W_|ziH!w^s=U6JGh0h zv1T;95lb6YJXG^MTi*$Nn!YNoN2`c!jgG#G#mu%G(z>L!ZLCyh@VE?eB?gG;Bzd}Y ze)?*l8VQ&FRFQCmkj@NawGl!J8$tq05*V$XL&UBZGEcVB7>JjMo`TAB1G$KY6{DI% z0EjS<gq~~GS$WZ&=}0NbIP9w@NFWN+YC8EPLj@T>JK~O3fp<RRarsW2qa3h1qk9{T z{=4dt{t+<mcsLV|uEv3VDWJB1Wf|zv&hlfFW6t@WOP=Tm8m||HzMho}6(&_$pEpo^ zxri;Q!;yIh06aSbPGy+bumTHs!fN_D&P!$`dSqbq@{O<&iJp3N13NfcwyR?nC<v0? zPakeZ{FL3l7g)7uJB?-(8bigJ8F|%ABt0BHPGqrx7PYZeniI@EEpl=f>h(d`hvF1? z+ndcbn=U~ae`r3xS+^(2X)af$9|1>~KclO8tivAfh&|MhbLWwgMOQ=JbT!dj$Ps%` zABD^j+CXd&bFGjtXO~!}gne8`clO$eyJ9Ci($p@I<j~O*WOMGChP!N+yR%}K%T=b| z#fdu#in6olb4)i7*1Ozb)Rk`}+O;7H-}JR&d*4nNr*~l1=_9C)ioN(C-8E#G?)){? ztHz-173O+zc-XAv)zhtrci3jl{-x6^(2sn{@?F_SCdv2Q-Kxh`@TP5r(?_m%0=Xw= z4ejh5>oqZpUHJ#kK8EH&s%XU#9KIapwmdan(lx&Hpn7dV!O5djCZcs<Ku3D5&@h$~ z&&YddMtb7|hco49tiog>-B>e+CJt`Sc}5wQxueT;X>SJe=WxsK$`cvNJlv=!j5SM9 z(RZ{D2P7H5c~Cfj9+ea44FT?i?wU9T$wfQ=l1$q8Qp?J~ms9dBu#*e~K+=VLS__4V zh_4BYDq9|g>uca6K3O8GX<>T&Em7%Y@b5Gm%uG==wjI>^`xW`1Kn1>8N4J&cPHQ5_ zF);tC8Hi@ycJbO-qptihCPIuSGrNN6H1i`a*8MZzDTh|mg0+?{)KRitF}z9qaiYl1 z`2(t*rr`YE#w+nABb(6i(*2ee*mP;h(!k0gCbiLEOjh;AZk99sRM^En7ON3xGMIHt zQZIHr#nM3W6w|&!gp3uv!97J!sV1Wt2CStH0;WRClSY}5h`iW+bPN`fJ7`Ijcl`B1 zM}K#p;evbP3S7Ws1u@+^yiw}pM1w=#czfn&$)S9CVlh!;P+N;2j^&k62oMCemykxX z3deNx=7`Y&4&{Dda0oZ;u0dh;o%TAyjPRW_7Q3iHz)}4P{<A_J>^m#R83qW9_9!%f zcl$<v%Y4HnD|n9WTeZXo9?@qQ>SO>WPw(Huw2wkY{~KL@&w%4iHt)eqkG0~UD@q|; z6r)mr!$yc?pBZgD|1;Mu1Z4w8yhsVq;%}FkOJIg?ihZ<~dzYpU4OOO8VQOqkdXNi$ z$c-pBBXct*9wxB2#@-!?GCbpFR!SG1_C{9W_RHl*CZm5R7nk^*7fejzmmJ+Cgqk=T zNm@}XrFY}~=z!=tD8Ex>AdRiqo?S?KH9=i$PJQQ}I+4l_tRu&?WWqc*|Htz%bELYC z+@*w`GwK{Rs=Gi!EomepUGdFV%Gzv7^&<$DBo_OzTi;R%J#W-Gmd{_bCbHOT9SX3- z?gFD(bmLdb>gl7-5u&<(--k9}DBEf7?oT~-M}_s+NOmqem?zk)jP7&{@S%`kv7kq} zCFuZjie1PPo=KY~G6!EJS@#hoUiTv-Sr0Od9k?#fKfI33N4pNquiB9o-$WFa60S+6 zIHr~-FfV8ppV>F4$UhYlQqY7JYgOl_J=U=oo9W%j&oAmz7oQACBIzKem3(fE9aS1u zge0a>8X=}pMIGjLXm;vn=0L0r5ZRm*zQf@_Su`X?ow-0WM6l^nu-I{Lc`0ZPNOhxW zFb^J(^iOs9)^JLTN!?~%e@0O6HMb@kvrk~L$IkLw++zQBt^=*uS~tJ3BiOlA;9Cbl zCtQ*})rLUPP(P-8c!L4sLdbEm_E-;2E~2&pfv*8XYrjLX0g8Jc=Upg%j{(mD6jtI= zc<>U0CihR?8nm=NAfbMJ_8oA8ov&bh6jlg_)zaKi=R2Th@JV(>t}reki}p>fAYA6C z=L$D=Q3}Bx3B%2@DUmM;4reL{yZpuszvTjORV=QGv9)=WGKBAV)@4xS%myhg1VZ!9 z6t(P<xfsVfd?08=k2>?|U@GRwi7WjmcVIhVzZNF8hY+GPy(68(e<a;YQ)I)%$l%W1 z;cQ1rQ|CN#hrjKk2&%<)&Ez>W-VjeF#XW|Ehn(YOF1;J2`qFl{?$zZ>RGK3LdLsfk z@b%ZWGn4%72OrPx04)!@u;LMaweJ4iZTY7|lZ2AR(e^otj^op*`QIHH1>?^(rN%af z|LM>qDF0Bz5=QrCh2U_|f(oJ0lSGkU-9u#eFKrN_ESSp$ivO;05<V;4>Q6PS-L6%Q zGf21d?P!xdFQ6vxeRFbqaq4=#?N-8Do{J68_R{&ndwKi5w2t=i`up2Yw>8ykFcT!P zZ4eYda?-CdO5Q%vn}-@-OG;$V+^yD7e{3|c7}cwiP~kPXYm7uC=<Py@FQbq)6l(f% z+80UzZTI;E=&=E!uRpO^Y?LGRF>P7V&=G~}EbN>1qrF=dvnDg6*$oz#klT6?RD`Li zW39PuH458?>}b~m(kU4F63>Iaa%s`i)NGU{1=RJAvc%>?ItMIDtTF6!!Vj$R)D6=s z7B4yFJug*{_ACL`1LbQfK(?EE+>X7U_z-H)t-s}ofpjg?suT?nVZeRsRH5l<bd7Lu zKs3sG6;oOZkkUmC^a0VabR%&7q{KYUlRs%9!dzUn>ZV>h4`H6O<p+jOAZzO^>+ZtP zQI|IPuHtlegsSQ!?YF){#zh}wC`wc-*|fq|HS2@k6g38G)N9HJudy2Q544`L5k;_s z?*d>B?R2_vV9Fi^dXvb>)n=<BVPJH(Ed#^Oy)Pg;@pi=h$17=sJr-e_=(XHR)*DkR zM0!cV;Mg#GwkypwsiLTI3CN(4a=aPqvm8sX7s-A+#^~oWnL>tQHda?;=Wo+qh;wpb zZge9HUO26!5WHZP6m49tvp`SRTOCSf=+P{eyKyy|3!LL>!AQz9D5E8g(kERk2B*B^ zaGJ3;Rd|iQXHrgWzVkZi$@1!Rr{!8G1j`;}!`CR69XnLnxpU6W$8^wygd-A%>(|gF zeYn9+JaE$ABpx-Z3{hNbA370K^~A{uFEUh6@=M?C$y)q^zt&zY0ql6@olmUn%E)^z z-pI_d6~)2wG{nH>ry$-NgzBLEBp`&tjL54G)q|E#joOt?)x{s?!6afXeMU&md_#%J zGDqnbe$FaDNEQm8LQL-YS|Reb-t6D>#r7cYmoy+kM3)iu`L?16*!IV?A8Ot;kml?U z{yp^R`(wjCZ(rwdpW`#8zD2bQ3b5Kt&I0a$-`FEE7vO$DnZ(=Thzhy5yn|CR5@BzV zOkDCMUV(M}hR}HWdz18m8195V&`*mY>Zsy-!NbtkEWwM|;)lm=q1-$zRLuvU8_TeJ z(ebvl+YgOzG}~qCzzGuUFjR*`S4I`jY_;T~<+BIlhVgIChG=f0iMTMHtfCK_W#mcW zI&flj*G89<4;LqOxv#Jw><U9Fup@r_N!t870Q?ggeq2Y2=6)8?>^|Y)zm=!|ol^bR zGNS(obrNEwWmmt$2X2lB&7wC!<b0L*m7O35Y!NX>gog-Oszi|+B*bB-*+x|tQ&*Yp zG?%4J3wl3=H}$z}kX0R+fVr6Wb7*<zt(nQfuaDPP&@GUSR=eth++ZiP$!dL>Nl91v z9!apn@02A`=r<82Q8`l*o#25Inw0jbFu*a+Zt#kQ3o-(@53ZEbR&k(Sv_a69EBcIA zdA8n&;2&D2Ro=<PF=7p3Z<W}=bwVKvP9|ALzn|lB)vl9srp+Fnf?pU^V?H>J!sIU5 z$V#L}T_tjMc7g|&n{!$q1J8c|Oak^J!;u%&CGr=1e@FS{$hZ|3o#U-7&LbeK%fuGs zJd%$aoB#}eu^Hn^xbAJE=p<Di>qFUcbMpu2Kk%V8%keDI`I*|biHjD&RRs$v2s6uB zd&>nDh#jSw9V}aIcT9@pp&pYl>*9`C`B<e8W^ohguC;t^%NB&CRX0s9*9$3ULx}z% z)v1SS5(X!pL8QB}{N}TUa<h5)MP=aUvyc(cfl@!C+P%LVOV~;s`CvAr3r7={JvEuA zqhXeT)7j}?0`T`^{-*%k&F>GQfASNcK1+nu|7)<TtRViMXRjb_JNq5p3yaJ7v{ig% z=1N%sQ^MXLIEKAZNdPooj8-gPXs6k^VveMN$OY-X%5Ik|S(4Jne`_R4V2qO%UKsgG zKXcP{<19`6$IJUQ(@#-5=w!7;`_=D2Sez$dN+B-L)Oxc&1KT(oiCc<#XQuV0oO{TT z+n__|j~I(RuJya*oO{V#8Mv=~_kMbKjZnAMOulGm`o|uMD`N)~K_{LLlF3|-g>-ar zAR25v+A~8UA`nlUs-Aa1)k;U)(wzsp_Pszmjq)52UEI0N0d(94edrpo;*^lVOUTsi z`(Ap-`lV=k4Mgoe&Ux{SD$TwJR`9W9EKIoc==Al|=Nv@QVeE#uP$FK0W!0TYX|5IM zh>+oudS7wJm#IH{T_u*Y)C42?r5yJx#W<0sR?|7e>0B^dr!_}?Q&=@ndt&LXW8y;( zrjL};>ZX)_wN>rX`xuO_cSVRx&oLNZ3rT^3+ldr=?{uJq%)>oasaUqk3xj#4k{%KT ziYv=iBRzm;>@m2-J_G4MmdhzN9yX?yXC?#fQvp|QiPn0}Ocq$G{grzK3-ucfc|cAf z_r$-{5P4R1YJ>Tl;SMlX@IpP#OtO?*MBBtzKAc9VR6A=qMWIvR8bN838_F^=Uu=+3 zS(e#S8mq|3;X<-mny;7t<sds=vNG~Cp=j^7$i;60ihPkco$$L@^@es!pNT~K2rY^7 zw?FBqf0wI&OWYrI`xYF*Y|2lGqy7IOaZ>-6#L53L`ThN(wLxxVDNu?(0~)?fT6JoW zAcS8!5m_3W_WHV!HBW7&V2$P#CG!pB)|faI-RoWyW0FQ#8&$q(FWqC}sT1%EAp6Vf z;}N5ah<i?dD>6_S2SdqeuewlQyEibBV{JaiK(UtxBN@{I^91@N67Sg{iJ!qzJMc{B zZoyEk`fbXCf!(?N@h2CMv4r#9P4=jv?tnQX73>=l*sOD&VVR4CaHJ^?<aE;-IktPv zmBHyfmB%Hcnfz}33@in#TUWKoim2yM#m^v~(*nR=ORjR8SU_g9XYPI=H##w8VKwwE zPWQUYOM6yvE)WLm$C_g-*Xp$g0h(WODqp8TIN3x<a0`|9L@g7AeUkfeh8cX@20)ir z`ud?e4bf5$*A0wl`zeOR9t^YDb_*yqDIhHHe0YjgPhXOC$wcjyWuQ)R@f3;=5=N^R zG2+eEL(lAWF#qnEP=Xj`ETq3)(|kCSaySFSeA2I&Xy;dz|99^tqK#ONj0z|Df~tj| zuM~PW6vMP~Mlq&)fO|kSoa0dTcNOVa;b%WHh%Y46v6CZB62q4i3PZMRorHiu&s``+ zLvlkS(fHvE{YXX*3~%4(!VPpmuE8<0tO!I61nDt_)%iZvecWNHke`suwZ^rJ5H-HW zYs7ul0!m^476cX28b>!usmu|7lV<)y4Dy2Z3jLO=_^(y@zD>ad9Hn!)QI+Vb(rqS3 zI_9?1>ocm}f6CzBCGDRw=qj$Yk^X7+6hF-#&Hs*i%Hl%*DTJ}BGJlx7kMVBvZ~}7; za?>Mz8XyRwdqi*nelalwE#f`z^H%*BL)A2=xj_qCjXq(#Y`6eUOIrl-zF{;buDTD; z)Rg<pv{Sw>yt^GRP_|ac47P?qVbAqSJq{35&<mNt{ucCmY$w`*0!;6S^hz3pkTP+d zXhX0M0wZ%8HIu!xNdkkU>T+lXU2?Wh_M7KkE{1e=bn(vz&-TpF`H=Y@-rf##uXyK( z%UT&i$fDdvkJZzydx95%+$Sxj8^&8@>+XpX@!*QUD5yc)QZpi?bI^E~rs0sI*3)6l z62vjExMnX?SmeWAPOHxwuA(rx%jfJd-geY8FcIOc75lIfuG@MjmL%m|u3;{)CUW|Z zcYOg2Ry=v4V1sMUJB_hXRRKbTC)4;$dA-v{y2fjhm4iA%b5iZ_(yI9%Qa{}2dDxd3 zg=yVHI-8%c&d6{as)seqYketdWk~V)q&u@+j6xs&w03LH0iV{6Z{SOnLYEdP;}@^e z9TK(sU^y1Q6$Wz2JjmVjwg|PrIHK0ZDu%RArs^MDn7<$HzmNTo0`f69Xg$U!?1X#< zLd5^|*d2`jsvV2}e?<5Il~spTC1mZvSRzfQO6$0I(tc@$9Vj6=8|$4yamAokXB<vi zoY-xkevTyxoM9q7ml<6j3|!akfFMRe`=X4T%U1|KpfjT3P{cNR+^kXFm-2?+!nGf- zFY|a`cn1V=keUgC(l|ednB~u>VnaGK7Z~C+?OO=8T3Iyb2@aMr+nP70eU~33Z)EYz z+0G1%4Sa#NpLH5Hg;q=uye%=Wmuk~LJHxwaRWqF8>Twhv=G_{EF7J!p`psV*q500O zP;Dhy&ZIR4EntMlRIE7xWQty;##-eZ^}FR|XwBAM{CIAB!Em-=kC(nQ*W3wxCZQEz z#2g7@nuR4zup+W<-%>--pZL{9eC_V|baKTj*zyC=bXDBkNDCAQPAlHe)C=1lH=Rm< zDvO(J{W)-&*l&TEOWB(mJzmN=%AmSqJV44>O(Bk@Og}C6G<MFFRMLPvgqF`C(*f?M z86pfV>sxD|_Qv+t#A>k?3T)LASi80!3ygv;8S<nc+`Ha&DrD7f_vLV@8=(mH_ps!k zUUnS^j_aJ8jYdENJxWzWSQPDk!W`7Y-D3KfOcY}y+lVI2@ruP;{E%pN3<1!!N^eM@ z%0&wmY+*Fseb(~amA8%6*jxdW&ghA<U%iZ7TF)DIA-$_-6LW{D9La?Ex>Ky4gTo2| z(T$wus|d$evGKo2dJ{fuZ~{Z>j&pf&$5c06DOKmx$V8HUEat9?$Q=+XxA&X}nsx5; z=LX4|4~eMZt~B&wo+HahHz%%Ve?wF~-lq>iFSNs@9FKQ)Z|gHsZg*o%rgH-zhBE?E z1~^uD`~}E<CXQ0^RO_0T=w*tmGtn7*m24I$Gv9={B!qFL67LPh7MniHqM4%JMgw`Y z6^j-C5GG}X-NSQ*{Ss(`hT}Vb33v?oqFZT%Ujwd4*i(;8|0ewTfBRZ+5;AT;%CPnv z;d?i9InyTZqEcgr-h!`Wh|IEqEqL?{i)>@VTu*5Agkchk`D*h>9vQ(tY4vG^uj2;c z!IOpwwatOX$XC2JyI`z#P%cMx0WZy`pb57m0sINQ*(3aN4kV{}LOoR9wzcyvkqtiJ z+e^23U`E3u$%cY5OYqOCAOts3h{uV%iBq4Ml=hS4UV{(qCXx1#q`-VDGi&cCc7r2q zr>a0oCXrf=?1#wLQ5}8}J@HI*1a_|Wwy+5$51k|4W<Jx9oRKI@3a&6zWh+x&!48y6 z${eAA9ib84K`yZiQ)B%G;nd1`zY<(e6s-m57&^LGlm}h2>9ajCTnLNZ0U`37rNVtq zdI2DfafOYFWoG%5iEizH*j>Y4<jEOO6pJvf2uyqP<!^W)`bfiekqR!I-hJzq{cz7_ zOyr`P4$<oet2O{i%o>+HI<4aEH{E!B`t=9Y{2fsK2{jhLyx4A^P=o#1uS@=4pyqQ~ znz^GJ-T#=DzqRcuTPm)KAoEyuF@}CI)PayjO8sP3!jXK(Wr?q6xI`DT6qJ09kDw>4 z-Cyzbd5znX<Z~>{%5VltHYwEQI*+pOP(js`%4X6}UT;%%x#T&#Siax<czyr&Q+|ok z{fgXQR{867N~jIDN=#S0uQ@2w3<p&PfbyVbO6oKu6qXo;x>T*F7CW<4?yAM{M@}v% z1?Vxn%AUJ&cM@bLq8Xj$Q?9iPMkU8?{7w4TO46oq96^_HZB^NMFI+Tm88y(+3}myT zs7gp?(sU;q3rP)7fH_wdgQPi;;VhCkr+Tjri$tQ<%Y=x_EG5*Mlu1T==IVS#c!_PR zjXWDv<^IJnL{YV2;u^|gtvY2q)4Fo+#=*eTJ0;~R`QBZ;W-VmPH53oTDtXdi9!uu_ zSYk>7bgFYH2azcfIJ2!<VMnLY9>!FBLj)S#QUQ}2Xshh(DiyB$StVSiSkWL^OCHHS z=JH{f$TXaljCzajwoQ^*l~n$&X^u=M(y>Jcx#+@>3Kr)nBzH6WDkzL(J5(!^ni8HQ zC66#@yK$YaM_N#o<ghqsIly_`Qy$;*w`Es5)s!aDVv$IRmCU8dc&;S}s0eroM~dHr zFWceQJ|#{k;2mPqJL_0*X(MahTZ@rpTH|pHNnE{Vk&0f2tU#T1vM(@}u7&#Gy^x&? zS1_H%c3uWP3$y(!o<Wx^Yu(zQd}j3Y<=c#vW<x)j>9PhD_*Hs2o4r6dLi7~<0_<Tl z5hX95T-37-qkag6g$bUXdI12}p1eA=qtKI}Hm@I`JpCo55S_3GQLBODR2%a@R2ZgB zJ;_gy3A3*fRWCJ7KQv$PDi6{pQPN{m=toSne-k~?d(2VnJLZ`gu}Nn@-^k>Yn@Z*3 zr)gD!(w#mlZ1K>IMB?HECovrlAt|&c8My5Vbl?t-zL)@hXHj=XK`H5e_<EB1VR=uk zhOV8u%ksAx8BOlihQd7-K3o<3%#CBrM#-1<v2Pzqm`KqOR6P5#!xHgj<H7Hzik9D8 z4%*MtqusT!cs6trwvWCRpIf~%S>_N4V)#|jUMl86Ft}+oj5Se3;vt`jBvBc8ea}4A zUCbY<-{m6wQHZly56*HQNU8eO1Q#yK4hDnndg^SZ5i^~z@M^q27zB<(W{_^DSifp= zF>E1V5}R!h;@wTAgQV{&Pt}NZ^)7PAfjlILif$Wp0sM6ck-3BbB&>Ge4Vk_Z^Ee9V z+wSqvm(u_|L)Rnuqe>O7LimTDVVGO?aLw#s-UYqiDv{XfYJVvGs0lwCNDh7@ynYLn zJZn-B@ARn^ajbYT<NEFz<NaRua(;747y;gfi$ACGyBSoU)hHO?C%VmQ`6Z6}H5efZ zBSx=}c~UP>zRqeDJA~)DxG#8%vo1W^<fksC_zi9az3eG3jkpOk9CvQ46dY!}Iw;(S zaludDD06`!0*Q%T-U<ZLXe>cx-tz=b1lq-5`o6uq4Q~7LElnN8pNVWoYGIDJ*{5t; z?&sp~#NyuuW!wAWKK{%T{T;Oa31>PGD(K~(EeyqQ|0|pc|A}gUpxM7>f~%hYKvqTZ zwsB^QlOnw&HqQQDOmWbl=_Aq_f{YjpAuZq}C=g1QVMUrolD6#R!us`DrzW?;w?Snp zG&ufI1H3{~ky=G*?pglVOE=i*w-2CuQ_l;l+B4F$?1P8Vj>GiNRbG=VpC2w8FAuAW zKvunYO67uT-TtB6Y7W8V!KGLDTK=C~Fi7k<mSUxm^$|t)=nJy7`{l8zdOkUI3bK^0 zrC(&r$OoAyGy4G!kL^ZLk|$8H?m8OJxxPp<R4H`Zqm(*bVUV2)!Bso?p%Lr_JC?2` zUvyQkK1F(438*t?3k5~fPNJJld2aaWlNQ?IDAL`e#4I`81bVY7pfa>Uu~k}z2XE&h zBqHTAlNoLNn}jrQT<sSFc42-l86tfThzK?D6KKvVE>u6Lg$Hm9gst5O76xmFVI$6c zY9dZ;l=}ncED#qmY|~5vjyW5Qq@IWNq`u+I6>0O<IZJK@1*?@Bzpdy}@Sx@?6Y)zB zTpEz(MHc;e%}{VxYxsOJ2j)R-)1rD_V(QEZ6DhczbztFUWI(x|hk@f<xO|lzvr!=0 z9A#pOeD^Ln_z_3D(+CN~@bor9IahsXB6`9?Pfjz9Tq1%y90{U5Hv)?x^y?CX&yBHZ z_nW_~?B{xt&{eRgg=#?r%S)xMaEV-}5CwKCu!yUR?_J@8ObM(;V3uHr429$XFTjAi zZeJF7c)<j#Vi9Xlo*F$vce`mR%OQKbjb&^CG0Jm<+SJ(0gHS{=1HmX=8*ekB7*3Sw z3^-Y$5w$jcX<f&M*_@FGCG0-Cxawy}^WDjrM)5~ZW?CX~k@bH0MScT|Bu_ny*fq%V z(P|>vqQjMgZp|hu@b21nw)_?4B|2-TF9>93-WIiHCd|ZuiELfQ@<6%44{|dMXF`!X zBI~zK?8MV|I`$TUvdhb)qO&Ms1E4x4V%c))y#C8LP3E<zD0)B1M$1Rq3G+wX2`HtF zfjTZ!rpS>v6MxK4=)=_M6^5B*uiF0hNRYR1Mf9rHD{CjyEz8m#Danlilf;m>4N1$G z)}om{9GTYWe;eq_#_|d+4x?%>-m95Bf5lp9{@7x)+3hq?a|e$6D$v{ZSm29==^da8 zHMdp*gz_rVEB&g{dr3UBY3T}Qd-a~|@pksI_&HhdIw94o9>1z9wFQa^ul-4*aXkHv zQjW!C=SkC4_RZ;FWo>L(b5e@VM*Eip8kAM5Alz+bGvFJPS(8jwTASyqEnU{r)(nZy zz(-ET@%BU&a2RhHJE%l0SG1R>=9G0BLvJK~gK(l7af1JsFgt1OiHF>DyWh#}>;?y7 zhdn%AF4}JvYz?F6+Y!3TO>0_jd3_Ro-fpVjjKu4r>t1O$7y{-r997{Z1S@rvCLjZz zN0JdPnTo6qAqvr&_UT<Je#T-Q;osXBf6Mf4(Ncn6ilqwGIwU?Hmb4S!f;!l%@~tgU z5W$dz9z;7jX}!2e{~mfa<Wuaq8qQvEh?P$RHWfcQK0@c@y;Se}I~l;c&aKE53&y|K z@tNgt-luPUg(#kkdA*YjN`P!6GLTMX&{UybpFRA3f^agi?VvnN$!D`r=^u6-v}Cw@ z_n;RUj{8g(m!8s-XTO>r9i{JUtdKARE8HFhUnxCR$Uso#c4)P0Ph>``v%JhnonE}x zgUZ@Fs#|nJ2PeS$1-mKs)&Vu02S$~^Bz@l+`xZx^p%E~r0O|ULCLQWp{wy1nt<7>c z0c3|_`qcZIn^(`Fja1KmxJ}j}Cbyt!%;o6ft<xlRJU6sMPFK;<h_uyQ0x_gl=BlMa zSO4+TucN0rIZ#hf_ipOYuM=Co`OMv?olC04XwOR89UBUJ7SpBmrMb7RGOA_u6`ckh z>>-G{;(j`eVKdx!tn2>MXR$MkzpfH=1fS%D`<0cRNA4Iq`u1fEq!E?HmEa^cDw2rp zlZeW2t>#8!)mGE}FR11vo!CIM*!C<W3_5gX&Q_jLFMgBN=wCIH79M7$XY#Q}P-GoK zvL0s=Tf{C&)$ZU<%(_z3RB1<Vo({Fm+`w_YMl$POUOAa}+Ux7a5z$GGUJ_Nc(J^V3 z+J$&}n+~}V{i54j>xqKmaJktPm;iZgj;`ycgKCP~$D;mPO?^`h1j)+pof4meI^UeM zhB^l*O4@b4uo5QvoeS|oQPX_+Rq}|qY>SzuLm~pIJj#4w07YdGhC7(ACx{QQ$Y;kl zYFcEM69tZk2)aZ<S)*A__6y-W7YrvC!K07$hGvP%Ia|>&`l4@87_HSm>+VZyKmQpL z5I6O}u;vkh{9Wi^h=|HjTXDWEU&phY#8>UR)d4XX18lrrnRs|>XgGZ|s+Ater3hyg z8<zJ-SOwgHXWrlRt)2tF$)=c)cgpiKY+Qro6kf#6zax|ci92y9!Ik(;SkRRe6P@Pq zIDd`dA#977BQul5m*w`6MKr{<#^dLM?drE$LeCzH;4fvhlOf<p7Gdmb&oAdmZDbX) z3>wlB8s?sdMD~>EE<*7X={C)%QR_C0|C07jq8j1m{Nq|eL(ApJpqu#(Np=$H$2R3i z7q{UR_4Jn&6lgd~@T(t2zkuUD^78#K2huf3gyw>9EMEEk2x$Ip=l|&eMDNwNDtxAG zAwI|O|F`+i#;%6Oc8=z@Hvfugg#Y!$U-bKkxJjGOVnNW4w0s69MTOMBKt!`_(3`4z zAHy7Q;Dk_MF=Ci+GFWxQl?Gf(rwaDFD6ZfaT3_t9fLsY|g0BZ4R4np!+Ux4-Hodv1 zKAvxP$$qxcJFay}<EUE&WLe`h*=hFTz$gcz=(?if-TNPERstL!lYMxM)ofZK=~{?9 zJduL~g0lSl4vIGM&}$#42V-BL3oKrev+NA}GJK|S+%G&f@IpE?q6lUkHo*fuR~`Cp zyDp%ruqqkK8@1ymb{q-E^Nd7bX|i&bS+!Tu(=lyy(FG|61KC;n)nXI)8OeI$WD7%h zV)HZlg+N9I=Q(HU(tU1bthQe~vxO#*>6MTgJ0c5o?xF%HP$=+XT6=J#nu!gZ$9QaJ zc_1M)(N7>g_cGhc%M?LB#I1VTD0b|EWm3SF!>gp*?%6bp3ep5|Vsh-s!SV^ijAJ`j zOKu$gKn{%f0Y(QRs?iusgNj(m?+!wcC9P{*p&{v>bki<~Um@S@DMaM-UU9mt#mF7p zRLZiaBiat-Zy4IQk<JtH9t--+_oWqrSu5K<#)RT1-gGX>_*o}^j3}Q1>gawzwR(Up zzq7d2Gg*-ebfqN_C6rc{(jKDhXDDQS4{{ay_3skW@{xs*giO<l+2aCqDlS7~iaMF_ zs6I;Ja@LjtGMn+sA>ymbSWWe7%D9o_Rg`|HJeX2Rictq4-tZyJ7^KQ}an1yEl{EbZ zF{bd!>3v0sM|XcO;du<qq?2(RM46KV)QD9`?X38TDM`p7CFItkKQ4;4683~Y1Mt5~ z<v-;$ul|6H>NCCj_&JW|zmXpPEwAFT3QnJXtF`feNNhs<u*0Xs27ZK~VGMRhqjP;1 z>%pZ90p~K(XOKe~Ay8)br(~Dz+XA;579(mz;s%53qCune+35nY+ahs=3C%UN`ZlOi zx|M5wfAg@&MCA4Hc8~QF(45c*Jw}Yko`+i}p5EU=44p2!15AtAY_!GL%d6|kT2%!x z*`$5gJwpTLoTOiT#@V?SskM9my|4ZIYkT^meJTO3EmxzK5qd@`_by$F`k~CY*80_& zs%Ho7!Hp&KbnS}}eLhtq(FJIP({@EEdaqr7Lor%W<lTm|$bR5C)0h%<lm3EE+C?ip zTfSB5P6J75Z1Gq@!ix{ld0_Lp{Wt>YJTAB~{tq@SW%owKStAj_N8T#)_|C6^CDFBm z+La0SraiG56zeJ)C=n(Zk_zE$ErVFh!(w6(f&@Yyi#TgUTvgCe+gNXx`KWN7HThAq zh*Yu|jO(HMoDXj;uS9{#%7?a_jAxf&rOAl;Ll@lLY~vFY2OePuVL3}-#H>mQYwn$6 zX{`%gD45L_i`cXvQTY;Hu5A_+XGZfd+>&cGC?b^~rDMek7O_3bV+GY{yC*SB^jST? zsEVK4_rPrO?U0Nu-uarMx2JR~-?zlTnXec8wJx-J$CP-_2qW(mzRpyZU4dvEm-0Au zfF*q{O|+T^dnnxz#y?6Hq!Uyt`Z^u2X_~g$J@dv<;4$GBSp7B;aq_gnIgYzc{$_=E zN0+PJgG+3VliviC4^QSnH*>cpnwb_HjV6W~s;SpMiT;>>`<p5&GF;9Jtk=j`Gi7i1 z%L?ar-okqa>ki=&dG%{xb7A)ehhY7BNvh5Y6tWNg8CO}2pcM@igRuG~30-)YX)Y-% zLk-*7gynu`wNna9Xi;)a`N*b(q?HjcilA_Ae)c%++JVOM=>eq$e_R0|*+yeL1?TvM zZUOVupS{kv>=k77jyVafG(5$iDUHZ4KO2!f{M$wC!?{a`xinCe8mj}A7^%Ga<Z9{z z9>4YFro~8y3OW7Kui%sB;uUNZ*EVSr8L@d7N1TN?fzK<AbI(`YlQu_0;gViJUWTaF z9YP;MYDp~-dyj1_{EL6|cZK_>DvAao6N!JSV$r86{x_0=1>n<aNPOOe^c{`=wGY$q zbM}ty|1|CvC~1H8z$5d_+HlEPbl;Hdd?Obyr#VGa;V%ouH2fk?Ps~eu{uAolrj85# zk>VX#*D^QR%-}AhPj^T6ihnm_xgk+ODtz7XU}BByFq7lq!u#!M8|mk%YxH+SRW7>< zB<<!2dp|=?A9S12ob2=_b{n!Gj$VdQ`=DJ~LDl70gXLHSS6D%J{n?e8vCw_1WU86E zj0p9>N1W9f;~0X}6fI-=gY{ayBb{oTntE+*qz!;&1>u~2laaCt&7{hy-E1_Sbr!)d zIft@?fy(1bh}(jA7Qn0v&MgHDTu4``@-pgZrY2(NrF(oGA0R$N!n+pr>$qEHLy;^4 za++aQg>`6by0)D^^V>b2`hm9TI%#-bjw9W#_6a*uJMkK-ag;WVGVuPhnp0&O6eIE+ zba&rkYjahpeKNSb^LNrU(KZtKxW?0Hx<({Bsix7iB`bJCb|-A(KqRUeN^2SomI{gl zWwa)-dEza(=r7DlMlBKUA7#^tONL_B;7`>p`p=AU=NhE@O?@OPYt~i7xT~dPfvZVg z5<n!=esRzp9(SX3v<IX6F=VnPrSlk@vV;LPJ-k|90%r#orE_3N?cpBck_9vER^ur` z6wwWa-UNdb@air4=$Fe)&s~bE2;LpI;UjeFoTO9qsb^OVtywOjZS)M|H;##mWsmUW z38x?MWmqZ14O3M<x5iDcC3wLlN{em~JO?Hs+|48lD7ENiBb_i!i<TL|M|wj~m1lzq z78`S-<g^^ZDY3eM(@Bd#vUHsm7Ks|demxYBGNvfKdnbPrytC~i5djc9fDTY;y#_CZ zooNbf5_QJEKpPIAGs40f-oHlI!0All{H$BtYVmTMOH$L;-RHKEJ3$CPb@T0vu!yv9 z*fsK@mWg){8G(=C5KY1&umtW!b_1JbFM~i6@7Jl7ne~o;rMSr`u#}z^o{&dPD4S}Q z@u3%KumaWU5)Q>6@_?_wL*H)hV|d50=bdD*&mt1^i5m)R@)nVkV9M-B-xST=h-R$3 z7GX)Vf}a^0jG4WmkTi}o`@Ci@jQ0fX6eXei;v*}j45jBISxR~4i=7$Do!birAUe4C zO&O&dBG`udu^L$JQ>cFZSrz@eHvUsjuV6+Yy*~An@N@6me>0hX=qZ3s)XLUC-%8Qg z!Cc?U+}-$d0j8a~jp<)bUWJPGpV{j$n9ztvtCOjGW}jGOD~ks4G{iH+&R>C~`eRea znnt25xdJys4rIe{Cx8{+sd}ai-Um@9cNIhtR#x=hFz1Jp4ZuW)hfBd{xA?8?=fsK( z|IjDm=NQSWPa>c-qW#!|A&_i=vHV0LGBuT&e08awv|hGFbD>R&EzAQ~2O)hup!lQQ zl4Y`<8Pfqc#8<u1sp<d|SY~(Cv%21~t-NI*DpCHXzJm>gs7cWwvi`<$oC0&j=TN!6 zx71Lz;k@V8G=Ni=7Z9mQ+Yzma|1w3DC%(Ng&r&Wze@h^*yHPJ~%a6~>Q%47{Yp;V* zi(P2VU50}K<04C^Q6GN6PO`qTh%xD87Vh!QL>YfI5YX!o+NwO6UP@J{O=@1QaQk(k zsBK7p*y*0FsDJD!mj?_YyulAiER&ShPUkIc8&n}81c^?nQ+t6%&!`5pv64VHgjjLo z2<+7DI@(6MKdnRR=TB#d2mJH%(`fft7d|f2(cjRE3p73jHrZ)6Kc-TsR`1<q*e)}D zi;}!|%)zn5e`%niF^*8Hwr&S+pz(%cb|ic)<ci?=7-P|u)ZTy|r&qZ8z8uUP(`BH! zl_ImcwU0u;X%<aTs$*Sz=b)M|?NRM)9IfXP3tDuL81AIVdYQ41<f+0~^7w^K*)z}_ z1q6Lho$Jj%0lQ5JpxyhsKH=F>u?iRddv|N->XICTFF#7!5@Pa6exuP5HG+;u(vuMc zbe0NjbLx^N%%-7Fi<uip(VF_`m^#w0pfx)STcD{P9HiGG`KQxazkF({CHi-Z<kOfT zcVx)JHDF%8eBoVk_TPn31m5@B3ZB282E5mH6k)LG1EbhUn;~3|Nc?o|&SEx>$MB9~ zrWyD+k2P(d7!V0iT(=FwLEg`h)<{k|I9uzb=7eRQsk5B>82J;28>tmd)h-s*aq($Z z>5bf^l`!~dy#>$EpkD(X;RcW1a2P6QQyz}OwmrmgABIIafH716iTC5NN@2n1Rbl94 z`%-@3=Hh_FYa|4soK*GJ^?^g0IdXXx$i?%yG5K+%(%~4MO%dsZ&FkV+>Q45u1Iddn z!FSPb7S0?Jhe~p3I@dA_dptIGTX_G6uy5dwgw49`j%~AJ+qP}nc2Z$?+_7!jwr$(C zolb7vnfdO#v+jKBu2uC1s`hz~_Su_w^UIGlny6Y5(<*%Hx3e5&Ji;uoU~1LzBMV+r zwt^tmK>+EB^qn7bTR5Gz^c}3;<V)SZj;H?~!v7BLzi2n494|93P~X0>qy2ZH*FS?> z!uD(NZEIjHsU#=+@1<0N8l;!D2<E3;ZJV9jouhM{OsmXlp|%Wby)RG!F^{>Bky2cJ zY<)q2AKi#l>xHRa>)R|aVm?ZHv=GAb4^4#M<d)xLfD)t%_*?dGiv<U;K^25WKu&)i z+QiDVQZ#hkPmHr|c^!SenYw<0Kk-3qqwL(}!Kqm`j|Nj~UmP7_@pT4Rv1lg&!*`bN zc)+qf@AO67_PHnuWpO*l;p_EGV0E5~`L0t(r|I1p!Q0N*mjzY5Ibhp98DU;dPt(b1 z=j~u~kPl>Fb(ZXC`HXjeT{vNH#bjMsVnnB2J?`PHpA9_iKR$I}#9O*Mid$ye^fk-% z{n0&7n8OF${DLRoJ{}Nq^ioH{zu60ZjzQ;p+!N-ejJk@;qB=NYfQ_;O2wt8)<zdLZ z-k@YY68$#YztwR6Aj8U>yKetwW<ZQqgAQ%1rd)|?zo3Cz$nRrBY|8rN+LUsmnnxok znLT64mTMIO5Ux}bPU@hDMJP76ZfY%Sb5+)|F?}FiyDZsEuQm)h4NA5dG!k_-87n<x zaV6HI+TOy8T0YbyS{>UvQf9VgZNywaEc3`99<s`Cng8vgQf0Yj-MH2O3mXTKBzRV? zZkAux=$MPqx?nNT2CKEoLs~l!DQ2j%j=K095l?G7U8=u2c#C^s8iiY9sF=^lLo09J z%=yGRM8t!1MsMWWF=MN>j{?hm7|m{>wg`oDw}S_{-?%LLmPnc>7O2?=4J9{a1yJad z3g0U>frRBlCFi7$hh@wl6il;bGGN+`iTvFWcd3GN*=#(~xXP+j;h4YRC`e*2NO~zv zFmcK1L2Ns(N*AXivnJuzpfyv>@31P0OA)^(+yLONbbSohFSBni4&1pmtPN%y)hK>+ zL>^66r2?&TXe@%M7>{?6BRr@u-}~hBP0wszFdF<i-tkOno`~DgBBdtTx35XreatZg zsSj9LsJPyZO5r+JCE7Gu6&oBs*67OTpdvL68?p9$E;t((iZZY>RGylM=T@5+7Y|sK z#P-Yy3QI|atD8HHScTPLpqjKrh$sX~Llnd=-lAx&gGrNyW~9gEz&AQ{CWi#IXh~!= zao&duta(w?30uInV>=^4qU{NpFs<Y+-=n5RPiFXXsMq?}!4q6{yYo9z7g93o3*yKP z;|?oa7SI8HB7uc88TM525G*stg6>cN1>st7q?)~aUzJOH=oZ9yy7v1lU|qiwdJu%G zLaWct<sGgIeHa^m#NqWcycqM0e)vypB;WS0$gvwtUkanyL=Dw>W<xRO8HvnDzTIyM zi8=mII9x9$3bdGcd=>zip{yJ97k3@~*M6tSm9+5Y@w)LrY^;ycJsE9MdaY2ZtLkxK z_wm}X2=n>XNeye+qV}Wl+vHGb!%F3T<~GBQS{_uBQ%dVr&X1rj=y;R*U$j!dAlZ8~ zC2J-_o-(+f-D~ZLoDt@JVLx|ma6fyySlWr4dVHvh-}nG(LqBgaBcE=*Q`u1K&Q_o~ zSyf?LnWdV_;MJ;Hg<&#<#0pv82>zy)F+MX#qHVE1>m}k#y{?7F+qmF{<0sO|*Ee*J z)c>*&;vl3vRaDd68BPgOvG`@rQe|Pi|3Y-ns*zdlS;gZ)gsNhEj%n+{C3h@CBonl> z<`AqG4U4%6tNYl+=_=G|2{lBaD9pGo_oIeP1gQjQAK6kUNKi%JfpRvaPRpHX$IlUi zk*!}_ljN+C_n~;k#;W`fq_A+zVgseAajY<RomcQkYNfVesWxi27N_B09wr=lFPWga z66)c{2o4UoO{Bm}On^r@voj|m0hk6HHR%ynDHBqhNlMKVd%5zG$7AY2Uexb<TGATD zuKF627O$9^<;2xU2bZ`64u<v!yYF~X_rgRtNkvq0RZFWQ#|fBrIw=b^YXbT{gH4MH z>u)POw<)!Tv;FT|K!0L{>rCkOT4;a@;##SQDrZ6##hcm{MNdio^iHm~9Tdi0AZ86s z;*h{-SW!VH#y<wBD-mNQbcrxO{L)#VV5nv6lSuE!w{nU8+^-Vgh5sQ>_mkAom@1fy z8^nQ)Oye1%>voBd9+g(Q4{BJoDtY=>0?ydA0&}cC&=-R%3heiLsrR)Sk6$@4RPWOd zPlQT==C>O-i%epuGQ1!%ZPq`$=CtK!LuJICamlUdoe%4`a6MBS0{iw?3YRC|<h#*p z!Rw_0`>=$3A=|nr<yBa{C<B;3j%17}q+|IJ1N+DovFOMcmW#qEWDOG`S}uQ)zV5)z z<i=vTHB;{64Jr?``AX*y-}Wjq$|$HtE2j1XNm6&fn*gy8A1(nN4F_MN%^;ZYp@P@n zqLCf%g!vlmF+^K9%f>_i7<G$*;270r4&UgEIBQkJ*Dz$WkvJfnR0C7qb2KA3lA~H+ z%ve@a@^sU~p&8(_%ye!0OPZ03c61%Nf6d*nqsbf6n9vr^2eSVb0l-QHbf@$N77!-A zB$TWU!)%R!u;!#da`9i3Rj1bZ=X=AL-6efm&0kF?v({&;^!nAY<U_J(g}ESoOV8-j z_`1^=0xNvguB8?IQnIF{Nl}bH<C5wdY^SKe;{CvLWKLho-+33B-`N>1K)~YdLDaD9 zxY23upeOGWdSSwdW3)7P%MP%OoDa-B7cnVlBIMKVuEuNQlDfzD_)<IxG5V$YtJC71 zAjycJBi1L$i4R(7dS^K@7jcR`P8Y(2YvvQLw!e*B-n3cVmZ(+6xiH*3_e&=H+Z_OB zhU^ZH-3Nk<o7q$_lkrYFwK@iBN~$dSTPubzxk@~fiSh^xqqSha0wLk3s=i#Z2(qfk z9^^P41l4gufLJ!$G<ky>#WY3sQ2=hb)TBJV!zYB7x1^u|(kA^3nVY(ri19sZ>8_y( zY_8xe6|RTLo;WTnAvXfvmx_o4Y?J~?DM_e*y*H`CxnkuQU`+bp#~}T^J=^34NS+<? z+S>1(i~bY1AP2G<*Y65<5@5%I)`LaWsOT|!hUdLS4xqFIy>u!$&`PcxOhhvj!xeF! z&}M7wVTwsG=Xim#@>KHU%N*K^<Z5!1T`$*1#ucPE-tHomv9a6DAl3ynvTJQLpbaF1 zUR?Lx)~{L#0fU_^2+4f|>%?5U{MjDyKC}GW`!fUWzVvTv6k+NIM9~m+t-s1J;>sZX ztQ11eFzU`6fNZyQV;|OsusQ=-JiBgN)DM0_5-p88AgZyJ@kza8_hckpEV*d5N9-u0 zg`p}Ft6-?~u{XHOZr2-(S2+Y~!?$uCw)L@Op1)|yL$}%uSP-bmr>X71x(jX!r0ecM zzu*bg1oR@H*^4+1v;AgT4D@2j+^`N0evCVWYCXyzFR|cVn8wz}f9p3YuOHG7lgkEq zV}O>+1(K^#<C)mJhv@($qW3wCzxXV!L$l-4QQ~u1*n>urVWsYnxM4Cle81y{H7llE z$mi-G0xgw<%@uyYpERzlD|RDNn3J}0)EGfW<e*)h7QQdv(}k?cl>#j08LEby3!$7Z zREJ%N{;`?2r&yb!4fVozTJTunQm!&$qm|mxmpOffuHm*!_bYXQ3KiL(>>P7h3dsE# z_?u6BqpA?qo4n#!XBg`C%k4?JP<cJwZ<UeM)&OZp-j!Yg6`p9hDri@L+LAM-EzD$q zW39!}6G2LpV-ja@wq~52=h{W|8aDS_CilEz29G_1)(0(1=~;6y&A1`-lF<d9oh267 zty;Ga-3#=gma$U4=>z=}{I8YB-wWq|m(+jJNuk^hZi~NGBCcO^Ez<wO@%m>;{Z}dd zMe{PX_*ah{5x4aZLB}qwRb2`iJ}6aC6y<5fcp-%V^ZOirppt8Ok%OLn&Ba>4dP-Xv zL+5eV*YOcDWC-cU_s(a%XEO}5C$!=VmfPu+j1xCgUapOg_qz-5UmVnhGZ8Dc&O3#^ zS{ApI$#I8`%x?K9Z1zjtKtf$pJO(Ri>vw@?+!{KD`c^P2v1iY|2Ow#Q8{3eNHv`K> zdIwuDkV|Wacp;4#9>N<AJe}w6v?j9#%C%myJ&mZ>s7q^gKtbB>OCClkjR*4+lG~6) zK2bSz@l|ZrS`+%>o9K}cc=XPwg{+vnByMT7-X=TImQ|x2L#hjhwHaDOhGESViz9$) zBCnvagVZ*&#jRA^gfuRJ>(%v#6VgLX6QhjEd&S|Ik<=l`D1%&j7px9~_lWC7VbLeq z7w+khk>14;P2<3>)%J2-%NsdDCt`@FB%Tl5As0MqmI~+J!$gUcW2q*0fvyWB0Pslr zRG+MM1|=m%9S3aPh$@J$N+9DtImU^JJ<JJnpP`%nqpJk--sp#aI<x;Q%nnS)6!J&J zDQ(qATUosQM5ssWZid(QX5p$<Y>)urpc#LdjJo@%-#JOV^O_k>tMHa`Oz~4?>Wc^r zD|aX~@|iJm=<q$EH^BX!<QLWBG2jznN`HP=#;+)7%fEzS%;^j!Ac=d6E!_$AKb?## zN9C7dl5ol1=d2Rb)rIV;5%c0lK^Mfy<RN*W@VINw48Tj!1Y-`w0H0QG30f)6lv~EY zo3sXUkNg=PL5?9FQH>oCj~y|OHO7_*2~FgT-e(?J5J$>O*jFGPX)s61i`b_?<vHVL zES7*u4*el<(G;y7Lo6cQ6eErQV?p#bH1r&f_%>m5WQoWP$!bG_D0W};Ue?ft_^RYs z2t2lZb0oZ!;S=aD?Ef9%|Hl4b?c^T7F*)qZjhh<#+c*6G75nNk(*GO`C8$ArDIX+! zW^qM%nmH2meaWygejhiw?bZA)1QBpOPt1?Z&tDd2Knxt0!ptO)y=WO`<KkV9s^y;` zQjt<A(jzwXqau)ZdUa`a$hGaF)uv#<wQ0?zNlr2)^KOI7T{hs)LDH2&=Uv8<+vMlE z`$KOS-S_5LQqP%C@OJfI{&@A<0vg_<-9;uo;z7K?!R^Vx!6tW@8a#&E)#!IOQDBh} zHwu_|OxMj2&*d<3!_#&@Xzq@j-{a8du7CNGnS8Xvh?xK+o%yV{Er5q$aF%Yuea&3B zi}u`OK7Xx$`1yvT)9H72LlSh7kIG^_=O)2-5yvMPKbYVa?eEva=rLTY5ctT%d+7is zQMOIm6@S@nt6+9ggmxVaG~M9hZaw7UeNy*P37Y18$vy4Aekne6cf-TJhxy`TKC1!q zE#BDa#&44uuE?1@yJ6}s-QaWjh}ttZTK|x?*hF1LE{zD><+4iS6ynLTr<|<|*tTA; z?u;lxji|7KSS^j<F1I+!NdaFPlqp*UxZ1AQ>o(d<MA%qCUcQ=hr&{XI9H6GX)Kk<D z36fh!4iZ&#=-|d=KFW)QQ+yl>v!krxoQ8~Ul5#3#%n%!xI<e2Fv^m+?<Ps^arAWFg zT}qPfj;x+(rmj$`xfPR*jIWIjnOVu5NA|A-JFtHpm~ORp8mSSdYch^MG%Cw6cRGzU zhT5EqD%$i<GQfa9-Tg%V6npuJ`*}q&-qFkg!jt~Hh|p7MuMVCmVh<7CrKSk9jVQ)e zibE`TnY)Uf3<VonCeXE!QdCWnIfB_kemUSv@VmW@WWK_0;$%pp%rWV%yUo&$eKsSs z7L?ORmR>1@KnMbQY)CX`R}n`&{%E&Rs<q@olKf}oStz39*bt|3%$31<OEUGO6Hykt zyD|G?fMG75Fu6Op6t<^_;9G#Vn=!uDXp#qszx$9K^9s^>TIitVk^@7aBBZ+y&58g- zxI$|#8`fIRt<mXl>GD!WS@<nC(AkjYR&_v))DRs8F@&f$yD55J6V1#Ta%6dAD7C** zt!QQHa;OdIX150NRSy_)SAW%V&gm%_vfVBXau?W9YMF(Jk!N1W);6EaJGzh6Zr4ql zHsz2K=?AzSGHJ!?+Jr#lIXSJ;``VcFJKe`r|CK``eFaIXbgl1z39QLLPTGp^ZtZJq zEf#W`uw5HWT914_jnT%^h~+A~f?>0vfliKcb6i58QHXJVGIaKGKmN5C=7;g_)H99R z1U>6xE;~w6i#YWOj0=3%*gW^QVN|C6vSzP58A232>Vz+YG&W?%@AB@sdvv6eJ5?ab z>`_}O&uPLIy@k!S7Qq+OGTUUWzsf`YG`nc)2z~3j8Yz$x#>x}!2wAfS2M@p@<rpc5 zTO-bZnS_hu&L6SLVi}PF<xC-!iIz&zA>I(_5zc^;xt$@7`4sS}dDX<T<QUN=*g>2> zjc@>+(f%;IJ)aR&L6S;lyXht7Lrqbq!>m>aqCu+cZmx_31mf^cU~gRt=o=~HXbFPI zrSCLv_)Ux)puYT?!&Lh{0UJTEC4L#{Y6n4*LQjHE>Da^0g<*ynMtF4wI}n@q?0DQT zp;{4YQh!Ro9VW8NrIaDb@q}qdj&pf&8WE_dJ!o}TJOv(?^sNze#QR3s{Hin)4{~JT zQ?4E#hCzz4zbH{Wv}X?Y^fI#F4WaaI6dNC;j1KZ5_&GwEP%X0Hr9yj1d;uALpkGsh zla{5dtBH(Nt69eb5j!}R0CR(mMx!Gm@Yg#h7g0%=TZsUsJF*yWVk;64;=^J(Zry0w z=7<FwTPo`eCq)tmWlaikg%5}?5en}3Qwh;>@B?WFQ@piGh;22SOpSc3Qj@u`CM97V zS|s7kfqCr=<wyI-Waq?a7|{Ag#gn~QtO3|+7+=4>#W9q`(w1~GFQcN6UiJIVS}*?a zFYxaI7`mV!#`EuZp0;&IuAZC5Q)w6OVLW<8rntm1aYGmFWd|t?IF;Mb*=B&89S^*X zQ1e|d7D}*obhg`bRB1EX&U0J8xTopNd`>rd;EGA)Yi?*UKDfKdmT8WGlQLdEjoO$% z%=<P*dpidllh902<SaWrKaaE0EeHVP_5F_HK-Wg=am5_42N-Cuf$FP_hHUiPM+hd0 z&q~Ym05z||8)Lh`Cow@N<cALcu9-X{q?YP5`0W=J*T94L<6C5&V9Gk(pma?*V(+}q zdG&a)N6JHHe|-g=ek)&e4@`}vDOer#iVEg9Z$IfF`yoB}oar+i_5kIq`UA3|S`A|& zYKEvp7Q&%sudIP?hJZ_ET=G;eZIx3Pex^3DoRKbmqo($&JV5HL#vEgeAV#flzXka9 zoYx*>j$D2TOrG|}5cb4cGx85=t(+PB3a=i=y5tzS8(2>tc{vP5t+6SbS9dk7X3eg> zkMEU=ra=}u{Ul6SazCN|wSI7q!@O($tZTo=#QDjuHM_%d7NAxeOU^frvp=<Be%93t zp5GR{SNumyg+?jYK&j=Kj}XTZB{1jHdyGx$S79`4-3ci2-uGZ!#e<Znl3?vouT&i! zDh7zl_w*{4^x-N+FjE!!0-JtG*&?FL04J?W(z3PG1&*DA(bhmDsijMmrcv#n6`miR zHfLDv$yP>sPW$>p>>;>rGaPyWaorGeI-n?UM`6h3LhJ3W>50L2h7fm#p=|czwMS?b zL%f-@KF)c4=u!^YDEH}+tL=PS*pt-^ikjB+3fHtpZ`jdYjeIKxeo`XimECv-x#%G~ zVdds`+ZEspmzy!WL0G!)a|Vi<R&z+!9YB1=!z)<2VebebJ6;l>TLZ*?1We7j;~Y#C z71d+17f$p#*zjh~P~Mcgl4Q=M#>}iTWN!o@Ym({CE3%h(qv*}!^-8Vgu@~@6W<n^Q ztNm8!-wehyE!+`!<m<(#!N2OAzyU_rYTM*ASs`J?-vb{ag(_a4Jx6QbQ3;o0X*k_g z=h&W}6~8V?JEfR(fbaVi{LmGZcf3RHm)Uoq;lo@N86T;O>-k#%t;5g#OJ%{N#(o@= zu6&N#3imUYbvHa{l2qo}6q6=6!*E$fkN!9>MB{mg@mjLx`hjXNy|j;~QRk2g$7+#w zZ2l$%r)7gC(`yz?CPmjcT31$MybUE{QffAtjh!RV<PN4+*T;<v{3kx&u21`xCCz(i zswLNDw$ZnSAu*Ohd^js<+XPVzk|R~ENg-*cTWupF>oE!H<<XAI(8W`j&4pl#g%7G0 z*n0y*7t{&kdIJcLvQq#YDSZMqzI~$7MG_2R*KWQyvdVjz;ypOcNTZL2MDFbpxa7@u zS>*`3an+KG=zC+&hAxBHP+`kK2+tR@VT>+|Z&!F1PxzwG-dtq7q9ZMRwi8SmMI%XX z<jYeoZtH_biQ5+AS9wL0Q~H_-RlNRXjmj#Fnsz0(EW@M#sJpZD?`B}oa{7qATCr~+ zXvnX}9vV6_2q<o#>ECS+SX@NAw<pi4ikW61ATF0osssGpksh>w2cgv|aiBh-fxxz; z`y^aA*&LHBAJ|3>yzv)@4ZO>Ya)R{=awf5_H6>fD0130LeiWH~*Qzh=qx<{<U}Ip_ z+SGj8InIv_&aPGo$5RS(D=v-a`6OD9hmj`Go1|2T<E<!KI<z>3tNPrfK%3v0DgAy1 zri$VeDGcL$N9Ri@xUabnTzW?}gz#i@iWmPGXV_{VPJ`R(wDa2oM(h20Xj_-_3~&w8 z2;$_xLQ<LDAyoxSnU@51*UV}+&C*zLYl88Sfb%#ifc?{YB*9<B!uDNt`qbI9gL-LD zO$vMIpv|;lVQg->nDdEXeB{P{V;sRLK`XStbbKaNfP*S1uK!y?<7@~EwOU>n&UV%_ zd45Q;WE{Q!JNb@}x@eq&(A<qJls?BqHw!azngyEeK5vWvp+1|=;ILvimpLum?7{kx z<cypNyW|18C@LV(@0nF)7hE|a%ZZOissRv(w$0`YIyoaaYmSInpDcN7S(?qM$uE_x zIK}s#G^>fXG{?9qJ$6E>DZrp9!BZb<Td;6%pef|WG$de|Gh_i=P!f?@=<1QlIwP?v zSY*!S9Z^|yH4S@D)cJ=q@EG<q`_8%UFfT(B(ZzC(q7bx1D&fKCdIxp9H@LYR+8!oM zW$OM~O$eAb9N1nS@@Lv`NfOLuT<Bno`Ho#Aec!wQWj)tvL_HF|0k6N2Ym^@$nb@VP z7YhE~r8{1n4TatHQxr*{Z*LH?hJ@Y0miX#MGqjt~oZq?|&B&*IUlhp&9vHz%n_Qkc zUz8&5lPTt{^Pp?s_0y{U&n)MfAKXO8mM&Qfq(vySYF`6AC@^>Db-rPf2WZ9ENh7$b zPna&|1200Si30jDJ;F`5XtS`j;V~z2cJK>BB&piu<fS%?Sy)^l@MKB{j2tZ%2rd*S z(bg2M+P1TfQY%9*yx@U6!b4vt;x!KTh=tQ)kU{#e{YO0gOWKqm%^=?>_z#qJp$1g_ zj4J1EXPJF0os2AcXH*JxeND;}1)X3l=r5-W=T9_Bcg9=VENpL<3*0I`vazSS1=i$U z5M_5xv2s1mA5??V@lMoe)dgV;SpwPNEqpngn`EDGfAw{L@815iuM0U$*%JS{TigFy z6*B#ozRt<Xnoh{Y$=S~4%OK0y&dAQ%Nl8gs)WGP=vBLddy`HLu(wZvD2MB9ugrGVQ zB&|dp0_8q}i!Zfx1j94}j-ZjGmN>e>*0N>9LCii}yK~`ZafXF>5&S<`0FILh-Ged7 z^qCxPTw`vXPE!e=Z=Y8`zj+1W&tdc`LirCD)r6y>m9@Y7!Dm*h8{H@mc%(K$w*v+Z z{Rf=T(x^M7i2~8f6_slWcBw#1g3g|0M@rnGf?T2bG`iGHCrZ`EbFWq(M$`TJGY=p^ z+4fg_HPAax+*#_>sZla!r+W1oBs=%;Voj&ob(;Q&fD(BG6ph&2Cb*66pDFfKhD98H zWZE~CcVJz>pryyEtTk$<E$x{0R;_}JQOBoy*E#BQdiIvT`Unk9vGHuJY;lXq*=zF8 zQh}4qT-y{~mMp8@un3ew{M2Z#O=aP;V=L{YVYShVelqZ8WV|RdmbYfbiaZOuwLq@e zhZ;i{cok0L#bnpF^pmNTLmW1Wm|?#>RQAf-uK9@k)AoDOmDH$%TpnVPA0$+G;l`_w zt+YBFJEam)z3hbRCABY5)wMWQ_qUf|6hBhJrC_|FlwE{yrM7F}k;qz+rPudN@p_^e z*CEL?q{f`AK2KWN7aU$?D)xd`DU6mq6MWd-E$fGwWIQbjTfg8ViYE)0liWFHDZ_=s z$7Z}Wpr>WUJ{7OB9mXJ)bMxf^DcG$YPgtVn+#NJqD-1ISaAc^;{%?!bzeE;a(g&Es zFwvsa$1R_~=W#QkNN1EuK>k^o3h{GD=_HesS$c$@aB+AZFV#Y=p*#JM_&Ep5Q_;AC zl2%|@sp?>^v0<l#6C2uSRLNtvcCpw(yh47R5uKRoT0yOS8kzlhVv;+_7fgam-!h~G z+H}8cYs+IK<XoY8`i_<;N8T^v(Gh%HH!Z?fT9K|GVsSoTr+llRX=dI)!t!fu5Sv`| zk)<`fYuY=Y--`G%S`|MUN7!%QCU)=MqFE@Dj9!$B$d{&ahx3OSj#N)D^HokAc7V{1 zlyGdGw`88+9_XGNan$tPn?wL!i=B9tW;U{i%JYZFT3N=UX+Dq62K`zD{aR1=M{k!n zYWO*JejSaR_c1Al4EIDf{?pnm4h+wu;DFe4A2%|y>?pY?#(^3!Bz*J^`AXYT5VF{D zfqb2W5wk>(Xk5n3A^k7+(n-JYMhx|=>Qn(VHxpS*>7C5}*c@%X#70an!FJ+dq0kSI zW0W`M(h~%glzQaa*>KBq2rPkB`a+0lWwJ~XZQ;yYokT!*cV)$BxL^#E=#0o}Y52wl zq9<u=ObvzU{%%S*cY)VpNQ@v1(GUb90Z`_~kbiVca6S6ea2~tp>n^6d00&w~Ooh5A zUOPHbof*C3iL|IId6tghz6lJG6M>(r=;4-s46RRF-^Xa+pO{gk@=Bunrp#aU+z9ik zRjZnWE<iu*%kPh#sSv(?2j5t0s{kGP>6L0C8`v~B?*`;Y_0yxxe+;1h{v7@Lq55n1 z8p-3%vHB(9aQiiYCHOB7mGhU$B;8-LS7L^L5zrOa{vx3Bq%}L>Xvcy{&c#dR*q&a? zL*GCM#*-&tIhLFj7oQ3>tdt{xFKMmFp5WiWh(i#}!*Ayy)S=~imne_aahWY1jZaR# zf85=DsjG9-?R;0IPA=Biudq~St10XeLXMK=HduCjmlL2Y<ncL#a5<Hx#bJq^WR{sq zS0*i)y8-`W&4Gz`(S+$Z<OwsdL<p1n!@DoqEiD*ER4Rf*s0CZNmX8m21TZW{AX2JB z0ssu}@$dcY5#c-7B`O%F*9pnlFLS5fx6PiS$*}VroZ^sZBtk4D{!Pl0BD=8M-x^ZH z%DTN=Eniy`5)?tx4C5kmBZw!{-g$du*or-DzaD9Xx@Ml+Q!UEk5eFS*dG8#NSvfOi z>D8luB@z>^MIeWiLa$u850;mLLeX~`;T05-)=<@v<uXB+erI3F)M9(r><Rr!)jI#v zo)NHQ(G&!e)|8)0i3g4dUstGrKBlI~1rE+7mf(__KsW(cHh({78Fh`jTu+CTN+5@~ z{qe2sUF9`sUG2|7S06oCmO=ZJzVEgmSl16R&M(O~(D`B`*wwpcDJam2K2GwuETXdL z6?)!ebwN40dp#DeHZia6ZpMnJkx~?<914-tJrizEt<QfLp!^*U{|3rmlS)12{THn- zR-4$@l>Wa>D*pi#83PO3f5IeCdChfB6lH@*&zOo3k~JTd`C!q{>5Fvgs!bL^>Wff} zOv~WgEwt1>Q=71=7#&|(=<P4&lWli^ek{~$QbC*fLXKue?70J?@J{b!I+fyWdd0E$ z25<KPEZ-mG7dJdQjVf+9NfNDwAR<s61}RM<FPTkkq}lVW7Pxqu3{++Ow*hMiRWkCj zO3X){pF8!idb~pf0k4&2A=?nbNO%R4F!}|Jzd^C7=HRKV*_{2USDlP_sVN)4GlQ#8 z-L0p1iBTtLt|4e+Chh0(V_{Acx1HD%%+j1%v&DqGVz6mY%=q3a>u1K9jV;Rq%M?S! zVYpr_mkgmqur(9$hxJY2fg>S1vhIOG7@Ry137O}}OK0;mI(mubnln$(PWE!8S>pp1 zfwQI~E&<a%5>ar&)y4h&QB?J~&q1h@aAEmMn{1ytBdCBPARd*N@@wVNcl?P&pMDMP z+PpN2K7PoOXW$A*Gq5jJr%k+Vv3BPa;}dYz89=g~Ryqs|)UJsiGaEy#A&V|Kk*w4% zHkN9^Q!JMTJ!<1Pk?TFg4ZebOVN6t6@2A1+DlRq<8KATsYtGxHy)01|(i!kB9|L6X z5>zso>sdp4{F39{+FWPFx+f)L+JVh&4N_w(r|HvR9A>IWbL|J=bGg3ulvlf}s2~~_ zXi2FNBe1n=Yb@Bx-QiV`XS2Q=w5x}ToVRI3=^LQ0t!`8R(b|BcRfIxZ3Z`ysIeRpJ zZL6IsYT#L7;>;h}M70HNDXiEcV2mP%-OK@wDctdNcRIhbn*AK9^WUA9Oqtdy5;Di! z$E~r{Vh={Xr$FL^l)k5q*qW6rN}0jI=KJP(VrRuX=uID@#9S)yMOEa&#~yg<F;Fd% zOOaj<Yl>!tLnx7H7jY&+<>L3kcSP4tx$o&Guz#q9Cx!Q2C`NlQC;*2?C|5PowBBWj zlmKK8kb3%}U5HfCt4CPf#NR^+Ei89oEE>ivvD5D0=6mNq#-Ozlc2<JIyoDmMi@L(Z zBpQSh1p>`BOAa$?)XA>;6r7`#{1hzx%q=fs_dj9}`)R-VWXv%wbF7hy{G0~ED_0r5 zi%Ba_jF=aQPaZ0NDfBL`5U+mZfS5EqR<v&bX0(3?SlZFI^LxY~{o~gBj`&yQ`S)o2 zcbxw9puf=V6Tf^t=!{?0=l>d~PUd#@|BO?Y*bQ4G0hFOnU}!CUE8j#*k&1;yTK#os zI+l(ch8hBUfdiivS^ZR#;A(#c-UL!CWIC^J_@e;RM9B@>wDXjdyB99A!>6pQu5ayw zV~nBf6gj`pHPbD3R?Sz;*N*9xjXDv0*muL!hmZT-zD#?2sy7l8%HPE!-t9-A#d!zy zMLxor<~^4_#I~USnD4?a2nxrs!Du;7=1JvTEcACO6W&jH4~%F+31Z&$YkN@<=1gMT z+FA)qwB3f*bMYYFd^oZmhDrUzNo8dG!JdV1(ypj!Nog2lN*B#!cRLbibSaaN>KQsT z8dl^eyKoMv=I!5l)L5&3@jRHbv)N!(3RQsdepc)gcjzjY@Z307nf5qsfg?Gm({$PY zi906Lq7Cw%F`bb>8|42%mC+}F+XmO@Fx3NB3TIi&h+}=8Oxk&AK;L=jn>!gHDQ;(e zsqVFS*Qez1U1a*3{tiK-e6Dv2En6^@M5%dYYG`VMscM=J5aAThs(U@7CiDfqzMhP^ zzwrz?_A=QCG2EA=+3UvkFUbP`E`lc#)b()~+ua$;=kRu?)wYe7$n{p|74t0l@tl$B zEI<Y0amJ+-x{tK3o4~C_be?py5SA{OI4`WDGy@qn|GmD;PM$OZ6|7?_<SjM!*CA;= zMPc3d{6-*mTf@kI?xp^Ym4Bn?uh;&i2)&s83q{Lc-~ZOXxP0BF(+L_lnXobon;6*{ zn>Z4GaURtizgW!wV-uDj-y`{D6Xu;(7!fhESgLYExSK<BjE6!O3QiTsKjW`BmDXIZ zHJfkEI<R&7!_S<rI|_-c=0~P*;zo)))78YemsjWHcO0Xkzz9*)FO8&S=V@c|DdBht zutO&0NtN<(Q2&kFHDJb#eP6|f&d>uFR>=HLWC3CEysQ91EQpF*!1q<td_}OOsEH1= zxsrL9O#C55H=>xrSjTpJQe<AQeTg40!^sp=;i1n3;s+-q2{0uYyw5vXF{?JQC-RTV zGmmOJGwS03;NV(#qs8pYrtI%Yyh1!n+cCd`-$^mXrs?A~UzVOe(R%SNW(qqPTba9i zovMW!C3WG^aJw(sf4R738Sp3=_Y}A#G<Rd)Y?Zi1nuMlqEnLe3L(!?31S~>tV%0dt zoA!gLZu|U0IpFU<`+xo+`|JbIcVDU32=2ct2mHT($iKSCL@OoiBh;a()5clCzVCI* z+TMNY5JV0MH9gDg=j1)h-^2YwjG!%Gdj$z+cllRG@+;P4xjH86nQV%fE}1RT8ZY~0 z)*$CRxF^<p0)2eH7^3`tvcv=n)urjHyLhH9x{lJ1xZB>X-ma!Xijx?@7G};kJ9Y{r z{4I}D^+&VMoQ2BS22#<+#hp~k)4(QXXe>Gl=Gp}koY%mq#i!OdH)3|&oGov1yw!?4 zu`p-qy{WLZwCZZHUh+=r6L6&l966|pVtkB@y|_7DRETVp^Ms62oF^j-E?U$rHyjV| zUTn%SvM}0sc^%wbjh!6@iH3kkJ%VCS@_EW*n5KD)Vyvj+s+mhur3))c9u`EXxUjXP zbBatEk)sL@4OjB(!!l?+IYPvmWCxkbb_ycwO=qC!)*dwh8?uGHc{S;%C)iE9(c^HI z`%>gigF$yTz9R|Ced_F}Qgnecanf|Kja}=YpN=UH*4iBMrq0>n<KF`xo*k*v>Z~JZ zuc%^WO?w9{c4~S%+SU6$?hpkDY$HxbL21$u*wrx@8_pKeRkU!_F;s$xQbbM0musH= zt!f%}@jMu?B1#=_1C6y@)kaQfHF!wM&<ko4dn&CI#EZ)BV>`b3gU?P$)8}su)33SV zBs^s`5!i&qX1mi-q|A;~(7`|)TD9jCRzj!jDdgq&8}&PGeD6L3W+H2d`8CBs(1fCf zNx5$1nUr{7MxrVk3Hg+NK9ON0YX3NgM_M_zpWlUzbU|Y0tfzO(a%>l|LcLN5>u?&} z5DpZ~(5Uvxp=~6YMyX42emQ7KP|eO&DI8G+lKb#nD}{pnVHVxP%6Pv$@X;)&&q^&3 zA@WhsT0&R*a-^>>DF>pgLdaqw8{+tp=1}dlq>}2fJ$Inn|B=lv*k+}tI<9_Isddua zuw@Y9HR9(TB`vj*Empg-Y)W9wlai*cQ^&@_=*E{9UElM#24Dlry%lufi$|wVy&1<c z&7xy^JIFMD8}oJs%JSv(vcj3?e`sd5RIVUhUglm#Jr>gOBb$cWtK7MS^O0T6T9}W^ z7IRUZp_tZ7=C5$Za>Eb3mv(SqGaXCDD|fJsIXlTbFmt6@qTs(6IOy5EH5hl@wgus8 z9F7>PQ_B&fm`625MeRTRRX|ZucTn%Fz1g9O{<LtatVxg%mel8Xh1#mgN}ayCdmARA z=CvDY7Z%<DG}p#`lkoM)?M<O0Q&A8-o$OTP5_mu<ARQ@DRR(Vw{&YHjn#*Q-_6maw z$yfTavX`w7$WE+rHc?Anc-|7RERvg8@RDrl$}azd-k{*?OD8${nLYY4I8|a<T62;~ zg?PhB)JZy3o9S`bq3`^Wuzc?$oYo^d*Cw)nxD>gw$-vDOG`Uvz#*p$5bmF-`C!OTk z=X|F3=X$6P<C?oLj|<qg@|Ay!p67Bm`Gfs4EQ2BH2>8)DnN!p!>8J7QX~a<%p<Ks} zGAZ|6>T*usXTIip$8bOMf**WL$P>cp8@m$zF0(gm(eW8O$QJ)~)G>~C9PL~ax#ZU1 z`_(kJcM{(86S>ru*cAK;_&w2UvX7wLanU`+A88XO*bvTOHVcrVnZO0edaUS9a+>LH z)bR0zC*0IJNSfoV>geY37yanWAY<R7ctu=b`nEh?188%mps##@Cj<aqsXh`!>Q=?L zZK8O3cvrqq8I~+EMG7$}zygOByCPkMKFU9h@Ei}&FrEj*^3+wjg6?eBg>aV_3!{o@ zmcQIM8_zbketQO|;o={C-eIOpbRZ_32<~kao<Z92QINEXfWAVefAW+*!`t6R9sl%` z{6MyRW=g2%<<5zeW?#)#eK`)5#Lv`}l!t)CQiX&nF=kiZrd{`+?rgnlb>db#8@|!{ z7-hO@pJU*<>OB}d=qcE{-8HnRu2*OA1`?7dxQ2#<qy$v~LQ{se1PKOh08)}CV<%*% zEJkOBzyg)=GZhHiPTp?b4%p7$j?Y%H*PJG0CxU=j1r-nghxa!dI9E0mAE(y?YHNl+ zKlG^%Ceo+N0)7L0J3qS951{*X1VF&qCb;I-1EKppo~<u#AJf!hz(5B{3oV-7T?~!k z1iXi*F9==<@GYahSW@TArRJ%sgZJ`>wU4FhwmJtddPV?bQ1xJIgLaO<$U3pG_pxkK z<Ad2b(y$Ma0>aL^o1P(lGy6BS;AtZ)ZKACswi7j%-8#sPW3c@STZb5Ift0pqGIxLm zWJUQ(dEsauBJ0P>`B8a6d39Ilhsybvt%DW5z$EW{YaYDVZo>hoTmOFeOl|H&);vjY zO%UAk)C|48ZEGLr+5Obw_DE+u`lP=0&{!qH(^c5{O@XtNR~JinmBl$A{GSp$e@~bH znMiFjA9wz85gtSM|0Yrq+kaFx|4gJ8sv6c>ONcyb+ITO|#1Z-2T&qY!iMSz+(o(hN z8n?MTs)AY};u?t?%7x;ZxiV64A{@0!AaMHi=BrmI6w|%-F`W1myPWteihVTGs1&W) zRI9lnGoU)YANP63NDu2`lq%v-w|YM%e;rMXXLw$&r?fnExNUmB@&2OKrmsOYB5mB3 z0G4|}nAvrJC6f-{v!LP0GY~9Opc!D6wq!pclRoiP(#%+#wXosJ+W{uc9031gZ!p-c z0qhWXx)U?wJ0fmvdc52%>`YuZjlhB5g#%BMk1iDQ0&t~BfQCKD@`iF{X0<m2=o<n| z_xq=xuZN|r_30UN<sD3;{o{~hQjWWi#b>gg<UI&7xN^5GZMaId@ie6in;nTeqB(24 z99R<~2F#f1=S9(wZ^lOetQ8M_GZ|@ebQJZ%NMYzgPE<JqE6V1)No^>alLbsUJ<p1i z?LUnP1V*X%?h0`fddzv40If1&2cc$l^Gw<_sjd0hvQ)~48>Dq9=I=NiZViWQ86kAz zfw?W#9tM?F74yO$1p^1xy&(<b=5m;+;KZy@Evm;`(fQgEqp>zShhuQ{j@#dXSD!M^ zfa%WWIHt&S3SRK{vI>+W9>oZA^l6Xoa3yHSL7+zMEkn}a@{=Oz%p5H?kfA>AXFUrX zOzN9rTGKV{iPa2!KSX2aa5gf=k@u-u7nxJ$Ik2emS^&GfH_s$P*4Z%(c#_6Y8|I=J znvsPWo1S`P7Yl85)8S&&_1RJeS}T`S#zwKVerAlUtDAX$)@bT;HoD6LL1I^Db7*ii zWh@$$$}%)pEp`m%wb+xIF6NQ`q)waXe2)M-q#h@-+2KA#ZM5?NL)q_2z|7*wlB9>1 zF*&NS4IDPB+E=8W-+ag@dP0-oX&P@Y9A&AgbOgjfns5zq#7VV0iD7lr#!KlKAGoXU zsUd|WRg!}&)g3j>vZ)R-7t$q+_Woh%qa45AX4rJqa?fZ@79mYm^q(xcvv$m6k#Ftn z7b^*TR`&An)BE+x9SCJj<bi9%a`KJp>et0`Pmvya6@5$8nDVs+2)2%!f<v46tE<^- zVmq`eN14@$L%rjA)tIj2KCRGvC!_+jA80PzD|v8nqHv~RF7O$vu|C@)JGSMTerprp zm4D^r{H^z%=zftQ^-HqX;QETn^mqAMh=%_3tghrsy!G$_-C^o#K-mC=Eo9Qj&+KF? zSE0&RL2YbDjR9?RwjIl!P9U}BXj`h`$C7sc(zaq+Q%@hANt#*~G)dJ&p;4!H<wXA` zrIAc$oOLA`hQ6V&$9Z+drdn;q$TQ?L`<v8t^2*qZjrC}&3R{zwe4M2t)}7tAA5#af z40isK{2e8JS%G33aGQLy?-Cf5o}FtGo8fM}=eDk79hgrVQ<BR@o>+P!4Hph%B(V-v z>war4tmh3KPhK6Ob7j|C0v9xZtL)09Bd9kWgE>^VWuG-~<SKBRPnWLK(w@^WLaH;C zt<eUT(}rplyX8X{rG+<ZDN8<LF}?H93O0=bQo9m~GnmFd9{elcOWJ&K8!bF}M$*j5 zn<WlbK^Tl+?iWv$>n>!2{xp8hH6zw<yj+i?u3feGrvA9wR_C7VtO}Hwe8iHdG!1oG z(AYSeC<_E6$J%z7vTxV?VbiyQm)jJA=gMJlS+6eJbX@Um0~BwzW;{8fRcPLIfJWiC zs_LIMWJ6y%LVZBl>2BL3-h{OeU)Bxl38Hp}YkCC^d{9dLVY%NuJ04<t!TkegdQH<F zZnvlO3}?I7cK?d!^XqC)uD@$17=X^F2*syh`>vewoKiYCr9$SD19mNiI#4x_;!~0N zwNC)*Qqg#qrP+Hr1$`Ir#`vj>KajOxc8&f3_HoL*jqN4WF>cg_zrkIO+}uaBIq{g* zpVr>hhIvNudM^(Z?F0|UISU=$l|*CZuu(Rtt;BY`I_9UCbyqt*OCX6#zhK2K&4<oM zue)<|9E44CYQ!!%;;%cnEH@J7(=Z&?72}SjX2u{sGQ`svL_k(*5c?C@@IB0{%uB!n zHk|yAe{Q6UN1)=TXhkmX@F(S7-Qr+910C>Z|JhHm0ZO?_4Q}mh>ISa)`ai%fW!&Aq zNV>|$LzGW?rsF32N3T15$E(4<Wf3RSe|qmMx&kRrx{lIZNBFH*Y5Z#}qF@HTT1cEU zR%2q;i@2HPdcXl>F2T@mUQD9b1BqM;IYeM20!_zsbqccIDvYw_iA5oVQwUbZe(F>T zh8g|8;YWyP665-57)918i+;n8G1utIB4ZQFTE}Y`#u5LXh$ZGFq}a`KjBJ)U{2evI z?a-DV!nMy`BSMSdCK=Q$MT>-=1Zr4Djr8S5!azQS=q8oeESC8DB9`bf!NgFU7Wrx9 zt{+Z=z;zVWFiD%_GReE&_T)!UK^%a;^*2v#7C^o=qyvfcape0h!3hCgqJKY8Z5lvX zu%=1==@aOk4r=-mML!6%cmaQCw1uY(V0L_EPIo#l2G~T&wAU>d`kL#0jkW%soc}Xz zmnnzvD}438pI=AS|4noFfBIhwBV~7clYge{1~m&$<Rw&}DiSNx{2oNs<Z2KI3`*hZ zzC;A;a1yOXRFp9KL1h99Ml^q#Xt7CiVS0@=Vx8K035u0g69QtJ+1}~cSni9yqYpo? zDfr>1_@WUGHGdKV9)8|_AFs`~OwUHotCpqNpP!#AKfhTIk-!SX_t`5bRO|JG&_8ZN zqLKAM7)2JziChzBDqb_knJM1~L&`C_s}6kIbD~5F=TnU_eh|bfgFnmu5McKQf z48qitXXt%)Ld^^Bl8-TcFYwa~tihwB1W5FOwU4LhDO_8@GPIX(vtjLqS6McP-LSxJ zgm*32v+Y^Hu3`KvG7wvMkp`*Si-6ed*P`B3y?%pm-Git8DBhL>>M^$ECaGqPqno&w z&N!!#(d3z{<XTg5fF8)q*Pz`WIx?-$^;I=u_SDz@5sgPw5-lB(4<{cW?P@LjgE^ij zd0f7DaYvf92W`ZfHBK@-W?<Xg4~8YEf18~vF#HDC!u1T$%V1_kW7egVOwk;Oya;?) z-ffd&bO>3e2~0uWW{Og1Jy*e=*zFxr=dGg2d{L6wldD1dH1Ot`cJfLgJ9OS499$Y= z!dqZP7{igw2y)5ob(aB=K_7-%MqSO@c!D<W?_WTKR#l>}Wt5O2F^0)T7M8DIoPMt0 zi(Av`0lP%8tkjWai`T-VG@3R5IY(j7&u2N!YDS%@g%Cq|MYRmtq?cVM(R*JAdFxsP zU0=&Djl_%NTe<wuCNZE>mE%8!KA}_ug2t8t&7s<&=uF{YG*S=ObxtxNE3F^1llrpf zEIu1<o5SxVz+v5*om={|*bqN9O#baw<mXLA;svKuKndlk#abiINq<pmeN9JeK5F3V zn)D}bs$5SNXyd{}!TG54)`V;dIwGqiDw!QDIv{WL@Tip|K9agi`^}}@-wjlCi#<Kk zA0Rg*#9qGVoxZ>j<PF6;?Er_b7^bV%6!}&oC&u@9ilHB)A7jigZ1`Iwbbvk#5iO5; zcA2WWrcvi5HlvCi?!t3w``vz?T5gWlkp*92Y2J}csvy^7mGc8gb5rkzfu_~gb+SO` zxR}ai)p@+#iUVjS)wNhT##^PSaK~`O8Jn@dW+~NhsP#D|mS<txR5}SqZHVkS&9Cc> zJqp@6mXmw4GpzjxSLRi4i0`^G^5?CW)?UoqMma}*iR~N>$L(vpbtgp4tLmgIUfnJ2 zL-%B0QuRvOOmgTuVc_li8s*i4kaGzZ6zN60$XhK#BfZ_6qF>Fa5<}*i+?BU}qu^v) zD*KipyNa%uzm&R{%|$J%;sYxRmCbzbd!h?#vfi5HtwQ0%ZL-Vk!IHe6BvtzMQlc&h z)@9uxSmW%^b)I{QY#V(JH+FvZZKK|y{3w53xR>Nxhvgwed@*lnCPNNAd<bLnbwBXm zQ44p+P@S#JZ~}e)?EFk%H7)_~$d5m0a}J<@jzS>ArKB>$V*dz8KR<GjqgnM`^gMS> zdw}-bG5U1;A&B)@fZ`LDot(qwk0r7e`Q`JSq|<$&2tudXx6Lp3V762W5CHXpi1*N! zPGC*2PQGh~7^&xXi>A4E#8Z4THmzw7x)Z+q{=I-Bc-xegk-V-R8Ayv<h;8*aZd{V` zH<PPs-VQ@@02N{naRkUMtdrQ`QRH;`0C;FNZKYv}Umo!N(GsUfgX~uJB3oI5sBOXG zhO!mi!HQ7ITUU~%3W~Yg!S^O-CE3s)lRlC9l{)ZVp(5xrq$4&061lO|wh8$<v60cl zQp6gi;<FSZj4H8fBpP@Xs}<4KCiRxhU&@8KDq{<=6(N?f6$$5)=IXUBGs9gW;N10? zE!n}vF;)-Lw)=v3i5MIMLPar3JnOdmx%rv`{H-b=`Pwqs?&?zf6P=UI5H}o)N9;CB zBEqMG#yA#R+Xj0k?>~MCjT_>zE~u~f9b&bO^(A7RJx(hbxp^*Y8m)0#SJmL+xlY!N zHH&RCUZO6G@zh97A05FmH_OR8olnZEDG7R5ia*xidS<*GhC$y|#O8+qQx977($#?I zDG<HGj|B#y8e*!3!m5)r?!m=$TgD7v-9Rjc?x~aM_IljFwf4W=!*+K8^0h*Zl5em} z3v2$chGrj>CM(Imrgjp5ywj!*>>=Tz91Nh(H_7b+#NW{VN>P7LME_1ve{EhQ_HFb2 ze9g=8ztR-te_5sfXNnRtasI#J_!05{*s1fIt;I422F-H8P6Kri7tHeqMxT<yTOb8! zh6L|}vo4N08~~`ybY}F<fbqM<2uuy@BCY#a6;ZNMR`x~!`+8khKY_Y2(-U@#FnJls zTLiuFb(z@9^>psEY+tzTX~H4IRwBH93lv<nd{<K-$FN=iPa06!zbKnNA0VW&zW_>_ zj6T!K#=ybURwvd*+>N;?r<S2nG$X>yz3QIFPS}Z=(6*Au4X<pB?`&ZyMdBv6q>+ia zlmw&o_x6u0z3vuWOz4+zX4qx_2oexhSyz}FIXAYclfcrNN_zipl$MAZabcJ1R~Z=| z)JcCOrma?w&&lKs<tCXtB&s4}B(*z6e7hcL-_9@;?D1~5kz5v&u(-Rk8qS<0Ge3gG zE1pql9m6>>yLAONliYKpaS}L1hWz$<mu+PJJbRvLmOCM^WV=$4P9Len1wh<t>x0dU zia*j)PQd(Q-M-n*Jq4{PQk7WH87?Sx&#jsDz?ub^+`bg`LWN>`h=<c>i^S2ogqMN~ zWKldN?NlpF?2%N}GwjxfJ66)sr-z3gj*33a4$uw~nLynq0hGT$-ZCn)@QLX9nx(46 zEa~gqf!&f?TWpH@z;UHo4byEG9I6esRTsUm++qXD-0@$&!Li^IEal|9V7%a_oBKp< zJ)feKpIin1Loe{}(D_eLxqQ2)9sW8HD*5s48_E9)DiZ@+Av=4E|5?3Ms6zs@)Dk|b zXig;LraaTtBjz}zkVP7;Qb}d<*d>Hg6XQ)SE(&FUKnL7i<40quMl9lBrhRj$X|yy# zxu}`wL(J6UV*6!<EM^U$;xlSdIhm+U(6al!F^$v58Gblz#Zj-wMegj~6}ertJy}1c z-(`7bX1#9YWqr3#(6rkYB1Pe~&V~Jnyn9~E9XVn&-@P@uxrO=sI~+e@XlVb&!QHF3 zn@os368RR;FHFPxe+YZ0AWgz<X>{70wmEIvp0<s*ZQHhO+qP}nwrx)9^cVY&*n3Bu z^Ph`~sEdlKc<Le}SFW`(QAHrherGby1uhWUO%Ae8r@Eq;1f4IC;tiPeyW*Vmv&WDf z-o1eHTId6P@#D#2y=I2}WUqo}Gu{sU={D47=%%*RK?Kr4&C^L(TNw(p3GFYD_C(%^ zUu%)}gxF!ZjYROA8GN~`^z(t;&oTTrL+b5|pRVeMpSJmBhXJ0AoW;j*NB6TJ^i3N6 zt)=Zv>A{!Km6PF$_l-D62m4VX@FxXx`gsjHiVar`N6N7X>CCVC$^(AY>#Yg8+sm1@ z2H{*Bt`PZckNT|K!=nxHdIA=Aoi|a|c%CCjnC;03yaW9DZ2YpR<N4%4P;21Lu-syS z__rFcml{`GNuZ%)J7r8#M7ZX)^u0b;9I4v;^f(Z!(X+hKmh@O-mzAq+P1cq4rS#c> z@js-ptT0Q3?X97<qll1TXzYQluDdhR>KAs%t_QN(&J6wKh?(|;GehsL{$#$S8RvPj zw@-0!t3B$?7RTn`;crtwD1W>Zv_t+xmwjz9S<Y#PgN6QRR1jagW=U>aiprz$AX<=7 z!+i{SLvVdsz?hfwvL38NaK{4w`KTPC*FpHgvAxk%A^=f|%_xd~4j4yIvXexrsn}g^ z@$K0>yVySYT2)FDJIbBfLlTCAc1~1PVUEbC<Q8A5F!)S)NXG$c<k;h%B`zTlqLxTl zA1+RHgM*jjezN2Gw6z3@Jx4|vN>wJQKu=+>nA(!dddPT$v@CCi6uekH{OVh0mU3&M zA)CcZiK+XF3Re$bgKTD|tf6@6%qjYSz5m8ofYo?mU|${gV0+ToI*)VrW(S@4;j=>= z%8Glv^UU*Kq+Fu~Fc(?AoqtW>-e$Xi&P-Q=+kXtV79ih4<JP-9ZaTNlx-v|-!D62Z zcJt+!3Ztm)n-ej?RDmNmvg>7D8%P1L*X0yy%vlQ)#z8!a3pUP?4UJ9WB|C8F@nE-= zWwCNxl3`SOf9(ZKiUkCr!nETvDtvve4%WX6SyOi6MoGboHmMq253?_07sk&%92w)B z$|fCwtyx(W4f5&uGR3U6Qzp5dD#anr(B5;irq(oI@-mo~9<8-ttJ8wwp~qgZn|Z;% zMD;E#J1-~(HxAg`b)tQGpOoz5QhD0(+juFe%Q8Ams}angQ?w3w>us5=<3_&KR|7Ao zEt5wiYlEc6hv2RDXk4j?G?H)8wEY0;s}Z~~?{ST_5OfDqs&lc7VW4e6JNw_%A3faG z!(cFUyDrcv9`}k{C;`^PfkWq&u*ybd=0{A4I|@KXs+6Sy!HhJhDri&@MdnI07hy%` zN?k=*w(nA`$*2sHEajw<Q}R>LPl^G<`-Ww0=6DZ_2ll#m8RY}Cmrh#}RwRiuY^!gq zQEAOmJ{#FYHSTU1SyRUKFm7T?`emW*g9;C4BunLJs^<#C)SW;!jf+O*Q*tmgO=2|7 zi%3pwdCBVLY35W7%VYAA!gtQa?M2BIV6bn8UuenCenRF3&bqF%GAELk>RT0biOszH zX$An!1e=2h=B_|f4c-M6Ukj+DBK`6)xvS)Jxh(r&D(a;oZNoCEp%2vZH93Hqd69aN zZJCQS1#^0GyE=trmCA}Ld+xF-CGDNIMVWO|w98R)BWV7j0rZ23FH%IvO4hJF`&G7r zX@_cv2ngv~bL|(&J!ZLSnWHdrlOiShjmgbJ19qqc5JQ%RyCNZ3)Ts5csfk_#j*4Ek zC|QF?3q5#n@B_9YMLPRadE!=aSwuS7sA`8XOA<?F5R5**@S>Q&0y{Lhu9%*%V|plN zyGILDd1XH$CF`}VdPcH;)Ivsv`-r4~smX)5*<kv!t5*H?xlpnLA(PdPmQ<*zV~l9p z%Vn1Tm_Fwu4O2rb>3rm+>|yiT%b`;xrn-)Lk1F@xQ^J(E+l3A@w@^9uW^rv(q@lV7 zhFCGY@pYrq4gJ)|I2q;lqAFl~ql53qfP43BZo(BRar1nl@FA?wx0vS~mla;by=WTh zsCiGxyksE;;<96vL{6?@#4T`W-b%1er<4?B6>svIY4qZ<Dv6euOf=Ha`e9e@D;9m( zRQk#Ha9V**qbt!(=U}?IpvE|7D+fd7sO2$2@l?HIl|F53Gue?gM{J^p2A0y<e)Rnp zY$_4`Y|a=Qsp(-b<KVTdp~tCtMn7#b=};pzjCfv$(JQuD#Kwp;cyS&q=5&aDYb;qi zL=yFlUBf1JxdL^TBD3jcVoN1eL6YBI5N1mjs{G1Y=ggpY3*oY@Rl&6^?i^i)_Li~w zZTqG%W8Vcnc~WWDH=7(eQT69GM=eEyu^fhbK@GhI&p{t$2`!qx3#kvC2upe45GZ^7 z#NqmryEllBB|8WF-Hk|R;tkuK75v8`P`^o@^Uyliu$)t7&C=?)iSOlKs^+`3<Jh)- zqvOz&G|1|H=V=-jBPLWdrJLQz&zg$cC>$@Glfhv*Tnj!hoyr50kGg3^$V_tcY{>>+ zqr%Af&7)FbSZULh<Ut(o$6SC0qv%HAqm*U&JX77z%o+2F)>&T_?Wge-+(>)YVdw9b zj^(bucyW)u;aPz<<l0mNZWu(S(PNJ|uy9`tprUg(mq8-63d@g`Lq*VI&>;+|1*(8{ z_TXFc^$6JLRl+8g@b>+240FR+*Vjfsb*_mY72+T?vpz|(F6v74FpKKcC(8%%sR+`A zEhzSCq4oT>J>k9YMb(uN)qafD2j(qZ80#c_2kqJvJ|CGFDJ`Zxme{F=fr)&FBsF|y zVVrv@z95JqDLW>+B9{l%vErNIdLvrEQg}*7pZO3jr)mOeQ#+~hSW8p|&j?%GY$<1S zzDyH-(Au0gc$6}`yrX1Qacfk&jVMS}&f<pZ;)a+DabvPbFrR#JOWhzUtPcp=o7R!B z&@`ABQ_PMM_ZP;oYgR|hSW}IVkAu7q(+ckARBgnGvqD2#YP!IZ4(RkRpO0n-Zh5D8 zy_VK5$9FU47=vrG$&F$h2leRu?W`ywM(CVyNno)3uW6=MAp*Scz-is?en`A{wTgZY z>d*|t2WHwR2*Xxt>(Wp=l(*11?N5w#83Vmc4!o!kBJW{0P`|mbk!k(AYOz+kuo%#e zau$~v3|b%V{Rq(EIwj;TfUy6F9F^w8V?XvfQQt!7`CA;Enhxz^o!BkxdWGG_X`q+C zXeS5+eW<Xtn9Bmo-{3diz@k<dT=vm?C$@`GJ@7ZkG9BrED+vcIh3zR^KGRt%d;FUr zFLlG72sXnbc6`wf8*i}N;j#x;uaqu5elF*?IK@=(^g<9A;eSY|hqJ`wHv)uW8k`G~ zc?Wy9rPf>sBr!H+x^eCYVFu)2uNF9SC1!%1%!BUS);-vc=!#HZb`fNk{N%L~J~(e> z+_|s7xAXWk3;6`x#fKjtb$azde4MNN0MfZ|#eM*6*C;=awo#UVVkl1?7^zz5z!Dp5 z*DSvt1f&261@P;RU*2guY<_M@V^8_UzRLL7fBtf#$V#9cDMPxh8;`Hl!xX`aj=dzW zvU7^;+VJ5KC302F@<vll=ULRxa)f&G1^M_Meb+dS;#4;7N;@(<UQWS=Q})$eZt;a3 z#KIInyn4Vm{Kek$$gZ>cwWzn`4cm<joM443q_nx>hD7I%WMR15p9D|jjz;CoqJ6Zo zM$24MS8tM1oUq2O618_ea>R12n1vP0l0|~?=#o8b-am1Y%VI4A3lXg{XutQ0oz`Ys z8MX+C6M*PLtonC>DbBZZaKGs)Zk?&M7#e=!9$BEB)Ve&>P3p%yJM|!R<bu%Yq|O=C z0aDDrflI*!&SIpFR$KI1Yzwop#+XJfZkEBSG+-tGH%<;H2SVr?T%VWP!jZpXa@g*Q zx!QurI79<nfQK5bB}!kdv%5i#675_;ey4S=sEi^pd=6^+Ub$S&sY0Vx%t~&<$Z_Bc zar^52@t{CxgDf;cmQiH{b5%5SRu+-3Bo*3#y5WF2A_gfU2D$F!Y=rDq&l7FrmY9Qg zB#UmB!849Zr(f|Ex;wJwAY<^W!IL-UX1C?F8hRJgc=Sb?C|h~zHP3t~W>Mio)oG7o zDJrM*_iNdDw9b5cPMP+H=2hRrIoyW;?qJO#!H0Uu;mGXY?ut8Bl@$6iv@=SD8Y@?b zgofmQyh1QL;-|c!CyqR2c};w?W!QzdFX!gS`9&qSv?^!`_Z7Hq@dZIx18W_3c;fcc znHNNrjMgy=x$&-{IJ}Q#Ztd%@afdX|+Q1~fI1F@6qqBe8!1!185hZLLqfnf-)EA%V zojB}8!|h{Gj<$6YJyPwV*q#uufa!D#XkmQLY;4b$NJ{5e_PpAuN26(B6!7WQnpZcK z^Yz2*P8})QecLo+8CBVk2MpU5F41k%{9a^h3CeQ(B<YfG<ARLTB0Jbqw5g90{NF+- z9Vi`Et0qxDS%u3K-2#|g*C_n(b#t@UAk?IdJ}guW%BDYBi8SXSKk@#fH~h~6@PC(v zRCo;-&ObKt?mr`8|8JSI|D`wll!ih^4hF<Odq%eZx%n??yee4(fUW#9_DP0L3I!oX zAw5CTs2q-vTh~0RZf>JwN>M1L?%pEP|7#%_lnl90yPWqQ;$znHPo7lrk@`QN572Eq zuP3#Xi6i?Q2U0;XvN&3=(X=dw=e741x|2!I?-#ZmAog%sBGW-3469a*J`ySDvwDnT z!c-ATf2!25*`1a^W~#!*;0i>|0Zq^qJ3%qFAzMlEO|$`AhE3Fg4XkZFNZM2p>+C$Q z^X~3)G6#2W1~W_;4k8P(k)e5V!GV0ejo_i#y*y^CRY|ZiWyeM=nKZWr-YNP8z=Elj zU=!fq2?nr1kXt~W(fA~G*}VO5ZS{E?&QzleYQ4L)OpDarP8#g0q;VVpvjM6KEyfTv zNKfJn_OhxB9old8vy5@H<b()|F@a$*+O=nidc%yiLpQ-0n9uBc5$G62Bw`N<9nu9W zuTRuMvkk_Fh{C1B=BLX5GcREz)7dc(HzL84X6Yp}XC6(jRslRt?xdmgTgBz1Jo?M+ zVrnvRs!Ue&hjy*{QO!%YD8;Y^fiNj)_M(gX$FpSB(qdd?#O2Ivs<^Z5aZa7F%@Ur1 z&ly>H9>zpfd8(Kuxw)p4``VKuy^$uEYRUo6zR8&gx1_y9fX|l)_HwmEZ?f~t()?^} z-h2{4=DhTWNw|HRi`(Q-a}G?t?X*Y+fXy_QiSh0GSJ`!VAq)wXMPx?5iDDajND!?k z#4*S7pW?n<)n398?aKqx5#HaDIHc~(n<uWmI3pMAV|9_-BW9U;p(-x{!N4QX+e^B3 zD0&Wwwc~eq%j|gjUeWNk1S6uZgLe#gX0L%i{ovn?Q)!%MiGUlVg(amVaB!cT*0y$@ zEb$}@VtM=1UzroeQTlU<U|3~}!R;lEHc?c;`~^%E)iteTQK5hPAf-`f=GIeOvl9MT zLy&#+Wnq%DT>{D0t2N2?v828&^@He3uJn+XGdg&Lv@G(=`k(c8ir+{`5(G}}OHm{+ zHSAAU;_g(1XRNnvPG3g8y@9rQ=F3ykWP2e-;BllX#x{U=k>8h}j%e4uWR^#;twvg( zO^lD*;!>rYr<ysNWujrN6UelMs2fdJ<@?)3y0&<}H6Hx&;$fKwq~P<~k;EM$x5Rli zPnZy$7DdWnb)4o1KLEKq6KDI8fM@roU~C3{Qvin%yuo@?ybS-uoQfU57k(4<ze07~ zGOc}pZ82xasnp`r0VyDDrzHmZ<RpUn<rwRT#2kDxRzX&=CjS8I$m}YzP~a;I7ONpn zzeB*{o3i`9#Lk^#s5h3Ur=}nsO{YKah;4kf00ViXRqIcjXOFTfG-oo#KMLrkx8Oq1 z{djZSsQo%9D<XaYU++E>NUJ@T1>{#;f)79PuS$BnnqJ}r`E;D#KXr?DNY#%>W%vES zkad6Zr7BL0#D+am(GpyjhzR`31831{0&(s(aVobruiM^O{@nvIRt(t`VnW$LE<)i# zOTIOjt^I9Eb2E4$@a6O$z&D`PpK&hoa^dyhFNVBDNQ^({4W!hZJZSw4Fi3L<e*?Wf zH^y`OAHWTn2vLnY3dw=4)B##yz(e<oedwi$S91QSfC-A`k;wmMlA<R%)gPIgkohwv zBasR+-U{O|=!ZBD74K<OS*;R(#?(8c08yJ!wA#xl0Fn_}ygF;Z+|cI~2=SS*nuN8k zf0|3*JG^Ir?5IlX-ylA?YP6qL%^tc%E84>CEhTYv|0nzydx)Z*EVTdj6RdhK3QaxN z2C0Ot$F_D~L$wO2LR>e9oS_3%IoJOjTz-qVTtmnyr1UyJVXGoHyhF(@h4Na#328|! zpYwz{A)P~Kh-3NE@dfN(7e$d>`;#xEmDvCfrO+$>fAIW&qW1sB^IHIm%jwT#5+>rW zUqt^msqepGya@0PP+CF#qJ3y(N`avqH2`H^9fV~%ZB${vgtY3-75R(p2`Ys}HxSgu zIVoj)jj#YvsHh4PPcIgyWR6)L7Qj+$iVCfZSkn0?`R)6K_zBalvJCw>-NiJ(E#2Pk zJJ4ow)9}*L(>25U^7Sw=0|4^G&Y^IHOpg=?W0~!AML=YbqQH4nmog9$QSyTb_Ge<R z_!F!KW=9+-pg_(|ho=ZVPah;9(ubps5Kv?<14}pl>gR9#A=ejkYXI*}_|<dRH^Jy# zo{O7~F-`S~NgKK*Oz_nP(Q~^S9|<t*r0jEGP7=FbSwMt3&vVt3{XN|1s4gpcD|4>C z=^kHe_8Q4r5~Q#0Noq**q`+%DImp74Fi&DhoAmSZ%LvKLJcT4BR&}WirHIh>fsH~U z0RNz=Bhx5|co(>E#3zG|r-P6Z+{w+;#Wh@fOF_3G9C|&1$Xs#|*(SXS?^5`$I0^bV zQd8%_V2P?@jE%{j78$G<hm(T$goGlpW)*^6r)fE-O8ZJ%w(x<rSkZ618PXbN6~G1Q z31eN29ToqUe5&{WfS>}xRHb54MF?dEK$L~NzF{aNmXnhFz`un6YDg%>^l|eLP0S3E z$VlhIQZ)9-0#tCADI}4}Rv&y0M<`|SvttN7;W{ggc_YQduh87Zk7oQLredM)MxDd- zgcMp#PJ6=rxjp6g0CvrgG5_?XDO3OI7NuHN{V`CV=H*gWizEe18l>|C^>Bp*u#t1! zd2AVFPDz!_W=s#-#xyu0o>(!2?bxY+49p@5nfWzw#WW6i)8#X7tzm3NZ;AtH%$|4# z^EB+aNij$2j<uVb*s=Pgu<Ed<Du{ZGq&gu|)VUB?`70+5aF?(tN&(jhQQa<M*YoLf zMTjQH#HE6KY%b;3xgz~v0hJ7>J;Mb^c-5&m@);rfW<1%fQU)?Duz|PDkuFM|5j&%; z`TBS;uz(?(yX<ff_R@VX&)j{%51HW`Wz8XcCC@+$LxCauy3+l3SCt_qSC#(g8USMd z3DTR=9m96Q?w?P}uRvMi#ZZ|!1&Q^)!=ch=6sRkAWs!Upt$rDl)=-{4eL7~oVT~UA zgV(jVFGB=+2kjw52_~w6hFzy}^$N1eG#`Y4!uf;~tj^72@$vc<<<5}Ajmq{Jd<1Yk zrta4qG|7ldJE!=RWqe}{H+>aB23GE4lG)O^hhO@i=zdRDop((%QmFuBbsHo8Z| z8lKX?%dC53LH5LB!v=ZFG90AaUq`v(F^x~+1gM<H-6sI;<0+Q#&u=!=_pujfNoV>6 zp>>+|j%rbY+<<N*vdfJ=8DxsBCl-pS6Q_h$4GDGZx6;MUXqA(O_K<TVdHN<}efB$G z9hJ%mN%0Kzaj6{UNpfucpls59CyTK{yd281>`Z|*h38+$-X6luWkyU@#gA))I5&7+ z>+EEDK8SJhG%Uq@IdcbyT`lYGLs<8zVVio6it-Ufl7tgWGoYMrgs%uY92Tzw#n4bd z7Zjs>&g&l!w4<3Jx6;!+LrKIqnLrxAE`PwT^Nc^>a9Z|YL2U+xSYF075;<!#445== z*apJfE&n2$Ox@-M-Lwf9tM%bsf>owP<%c*VeP1Q%;*Ic5<MkD&p?JI!J0|v;*lq_= z?-du3bhgusu}(x-iI2J0(FC<EM|4*f+2tdPsc#(5*}`YrDW`UV+z=Wvbfm=$H)E6k z-ANbS2_Ko2eRE+?kzW{nKkHC)iFt@YM+@rT+HfQjJ1ekSfll1pJvWH{ihizu1m|)N z$>KeMHb<YO)O^pJkOSfMFYAbKhmg^>6^pR=hOQK>huRjDcwyZ2%DmEZ-QylabJXR_ z&Xska^hZUw*n35CVhkoW8}TtM5YhBu?N9IWtS*>N`qLF-yGq~g0EX?6sjx~Cw8eTY ztyeSC@nf9gZk}PDkyycg^}xDx4OhYIg!x-9W~Sl%1M*rJHZ*9sb}|Tz8N$=v1^Hl& zJBEgr<x*Y9z`D!~k1=I4e#Yr{`Jsaj@<tcBIp%%H%PcqEW1HtSmnq^LSJkQL+~^(s z9URjT(P}7>Cdc?_48#0E<SVF~50)Ui@EH@v0oWIg%ma}b5{1-VhAGww;*jvU&ahfU zlbQOuBzDLxafC@AiA(D8&xk;OiM+R4T$<;4jq2rnP(lr%XenS|%f{9P{h<Ld<(3C6 zC?S=0pJLqsam_8?HNI#uVJg<@1><U+D`1m?(GldDg&S6R*bbA-Ff;M4k=P)!C%>PR zczGYIIh;6|YLwlmOm*C%GEzc)S<r7gm?c?Q*oT8fZvw21kT|#>y}&Z=JA*$WexlZ0 zJ*0yp5)|8WVzvHP%7Oa`H=H9|<DDJeXP<|u3B(z~ewC(HAFE9AT`wai`m8+lwB+%g zy><;@M>ZcW*Y43P5<?H{9m_^2jHN(IEpAOcCv5|zHrZiIWhaDX@7tttWvArw<aA|f zm?vj_$mZN5SoUs2rYlwBLGrUa`6M;!aMxCN2d}BHCF1ODR4#77(2!$v#7MxF%Iy2S zpA{W+Wo&da5+^6jDR~mALQ@yC^5^BupmaGesdCP3#kV5b%5Rlj8ng$iZHNi#HPqxg zt-)K4n3)}2{Unlim(DOB6uH*K5?cz{J%#N4B4Fq)TPx-6UjDME{F6!~PU(<*tq0_^ z737B(o&OMr|49%2H*r|r<Ew0d`SnW@<Nt>^$muzn{-3p=A0t7<CCu-fV^TJ08v+!6 zG#c>IMq;2$u_UyMT;!|VUh0^n@n+_(#yIA%F&es)&BV9No0V}^BX;4en0$eNQ2&^= zvtkE_=@C!a6VJ)BV^7$#uaoU&vvq9Uo-cR%>$aV@>6cfZ?}sh2=bi6AzL@=0`@ry^ zw2!)2w3LUJ`fsjbnV(|Qv`GU-!mT)f(LD)NfSX)k#NogaW%b>zx+a-XbxH%i$83<a z{c9MG_j%upZ9q6S&uV0jM=coJ*d98i_46*8Wzs~;c+!T_CN0~C!VoUrW>`mIeaDe) zSGYC&xLq6sQLXg&CXvaD1jtYFWJ|?rUj9f_WO&wn=X=pCExf>d8N?x;-`4yl#L<DE z^<`X-2ahX8OzT}Kc1+tH6&s$*!HWHfO*lQCEM)7G(^&hnEhUZItR`8m@IsUbyAgE^ z*3}WPK3Gb;-oUKl-H>K+s!Jc{9?RZYmIyPe7eBMrA|wi{$i}{20aFo7BD@>VhI@3- zfz<+bloIo{isA%KwU`7vc4Ce^ho<hhzgWJ3`$qd&7@C)RhaNGFlfx5z6#aUeR+(g@ z{lh5OTx)l2LxHd?4OGiut3v%BM5vMEAVvAN&6d-=1PY$4XwrQJ{Z%(+6K7^T7IQF9 z=VR&vKM{|_X?!QS2^_0-0(!UFbYU8kQ^Wx6-x~SbXx39K=DS%$G|I}WrS<YM*jX0+ zbu#T9p4+%<g=-da3t2P{(gDNA!**Wve91$BqJ~a_>}I^kk-!h|-q|$JmsY1OUw@mc zYom<j{^TOH%YUsfy$u=@7STbLw4H{Z-LV#AWs594<d-$_>&x8{Q*mDme_J$mF$@j% zb(Z2;Xc?0n1%i~={d!|9&lIn?&omo&oXi{12+M5DBYT@glo=NoO`qPhO<2a%$$%z% zT7LWIevP|j3E^SX^k#2-ZH?U%lA)|o;NMJMZ;f#Z`7MrLppV2F;Q%RUbrw0S{*>4Y z`hLEL=|B^Ql~&CRvwrvowTEQOaX4im=AUu|GPN$Ue_mf+;^9(h&RW?Bk-N+*cqTV@ z4)dCgGx0LuHCh6SSJoh(33cv7Si1Bj<%zlMZ|<dUQ;i-X+Js&~a9im@tqiaCZ!!zh zK^JD~5oki`ft%aJ;F3EJa4PI4#ep+t5$$kZ!JH8HynT4AuTYbp=o6`doZHNBJ_}bo zI#X9fI<r?8ZI!$5V8C5^Z))XsyAbuTW!$S$XZ7Ci&a(X)tnL1d`#qcZ#|!1og1sA8 zz<`IV4jg{%$CY659{y{r-<V%SxX-v2zS%3rH{pCe-ASRs-cx-%^XdGB&jIr9@4gbO z?r@Iz`<Z(%WxV!8WWO*q$@4Qw4R%(trRBA}k*I_f;m1Nf`+p1$165ztWA9YcoE`c9 zDjNj9n%aGonYYhtRMqxu&X_;$0(<h?`uPaRhSBm_JfrEDKhWPpxqk1Az%zSN95mwR z;EY2}ts%Rvg8uFb>_$i@M}X^}@X6PSZaQYqD44*Hs9xqkB#<WWFM~>v0~0y4N2tjR zSd29EKLy_svh5PyTOMXedU{d})>-Zzch^WBi?OCc96Hk!$Z!%1G@iK=o^upj4Q-@@ zb&*p%A}~{D2<jS*d-K;@6I02V;HdzM9-To{I*2CT7h%UD<HAh?)XGSp6(`h{))Av# zAwc5&b#%=X{S9orIlEz4ylHsfI6cB0CE~U1u8XTd%bB`UNg){CS-j19bYSI_zQlpR z_FxvO_K9hL1I&7HUu(=ozGhNJi>OmD@h%zlIAhP5)UL{&)eI83g-EMi<FJ3x5d1qz zs6p#b@v7@w<_J`Z(;cJ~kLkL@4YtRPc%n+BiPG_QGYe~pEGD4<&N#1~cs@TCGlh=> zhiM2IPbeX&^6^=j!?iXbaC<7Qg_Fa-rLCgAZMqV8>5>|~YJVtp0?%tS*#khLfU9@S zLt)c;&y|k-SF|<hGb%xe>RkuGp2m!weLvnVXxDE75z@FO=18nwP%#<2tUnqype~I) ziSpzS1l4i?H`cKiXh2N;LQJ#49tHK`nK5jm3^6=55!V2`CVUHs;{n~7W?GT)g9u_r zebRhu|7bpf>)YwqLXh^uLvhT|f8c1JL?_b+5}iU4071J4jH(pL_7O^;-?|X9aREnP z$pQD_vA6s#rN{%z1%oD)@8kAP%GNK(v9KCov&GV#F0|J+xztO3q~QC(Y9;wUw)mR- zqVS7(&op?2m8O5y5R>)O$}Bm$*Gek=#&L@4a~ILh{kSZOMwAeaZ6eBMZNlIb$xWm) z#Y@)W>=Mg!@)%^krr`tqp`$8Qgv#t;D1rN8i5iiEDnpmEZrN*Lgr#|AT_1f7%aF#y zQP6eaMWm*54_TR<<{Ryl;0iIh1NhH{ep#e7KXJPTn4Q}#&w&(A<I_8Jr~LzVAdPaC z8_{HTDBgYatCT2HByWm$U>oF}l)J0qZS~CfzT~B08!}e}$%T*(s7S1*ZDpnG$}=xf zII>r2^RmvV2Yc}6b?Kp6GB0aTn(EcKLMfWokh^wp%8R@Mu<BWs{`j|HEP+K~;V4&E z*@j<7S=TkWn3Oem{Q1@7h|Qieto1j6?r>p9Xo=)@PXQ-r0-^sXHH=CwpaLVXA}re? zHSOYbzi9H9lu4{);TEAhbuUQHj(y9FKM?C|^6&0rw?te+k#Y1<Ws>q??xDmqQDbQ! zP#l5d{l}2%P)jv`-{O=mG*fEB-eyQ#eo6+6axIjNiEdDAK;o5A8k`oOuSO<xrff^1 z7gLDX!x^R@Ogvkb9@2(BAf6VpDz}9*U`|WbN@kcj5a%;)rWb&%0M4UKA(6CTq-Vt> zAu!!{lj+xmu>oeI3qPFvhLXb+FwhQyiL)KF|93~g>_tTr|1o$HgpQfa0ISl=;IKR1 zPLo3)e%Q#?aA#ZIk3Yg_Yk9AOK|ilR;*LTQf78FdjF;r_qQ#-Jg)pE1i;Z%y7hCD- zhOq9^F9(%D?@c8=rB6tW(Q76M2wY#GWmMk?WZ0oIj$?Z=a%a$TD^j5rr7mf$2erW# zo5`7r$s0m)U*`CR)^XQ5d66|U#3QWo-Ik=;0LEFaKE#Ks4*lgoJo&of!z*IBCnn?; z6Yz4Nw>N0eA2l)r$*s3<iTa>Cet$*}Q{xXAhRgz&%>x02%-0ZlLTn<#EwOCPu=2dH z%@nt9Nq3iEoX2H4rbg}D;2E?sNHm!?6kqaUm*|vCts^;tbzbZIobqUig8m%;!w}K; zgd3swBcrZ^(7~3m;+o)5J(-RrO(~bd>2~SfaMb-0IG3Lkz52j`(@=>>Zv;5hE>DAZ z;iRgka`V;gM(+V$=4)u&n2%*#a%xA8uS)%s8rKfiq$iY}n9cjk9`wQj6th7VT~tRI z30~FGw>JW%WrpPrY{e`b{!!B5F^LRa3;_o2w@D$Tol0wd1~$E;auiSo!!kIc&q)?c zQ2r$G3e>-q-I!f7j^t^Ndc(sdpdN79z28KVZZjyBWH8E`rG63}S7bDNUHSC5G}VCl zQqq9=dbV8AhFqglJ+n9OfaCrVk{*!6zfG_M)x`E_n=JK=!S)Dyc1w453QBcKO7)07 zzxz_Z5TsoZ5k46hzA|*e<m@97-kEvwN4?)+Id#+ExW?oJ1btxP4BhlGdjG|v3759a z7J(sc7+qE@NWghb4C7TcZp;DUXt+H>I|w5T>(-YyXUqX1(TDAhXgEufjqHE1Po0Us z8QIiFdAa}9GG<MBsFVq!7r#A7FhPoC66qvMj&r5rVV25ih)!?EToI1H=!NbE5k$O# zhi!W^{7Nc1Mon5=*j_iLrm(PjNSU^^T9}+UinHY0hrAk=0NM^hTIZO78$US)>DCib zM~)ssAO_zcJzW>s+xDSlHXi;bz!{JA8JB0u(s<RT70;HHqjMpdm16t2NLuD*yy!)L zoV9^%{F$_#;yq9N;N%<rKQ+MrWcvSI1N_IZL8ECF?(xU+BkRX-j`06WJpA#`cd)Vi zKid&e$~%fbEub%J@7h}GAO&w0Ac?AF;=cvWloAx?wG!CStiJk9PU0!V2+j*r;H6?3 zxF(srt0ol(1^-H){fr$QAD8&X?=mw;wED~G2evXiX5OY<dLFK}dcMAnTz;9@0fdoh zn|EnCtMsu_P&8E#1=RZ@!}&GMhN<~ZTwO~r0jP#blLq`lgxg0$FRsmlZ8s0LQ4M^% zYay`iS%TKLw}>{U(8+Eb75nVg_w{`Zs9+p^#SdT&yP61)!}}4yd5KO72&S^=QU?-7 zUTd`{Pe+7Rj>T1#+M0`3z~9d3f->E5Xc$r^RZoW2RAw~TW1R<y@u($oQpMB_mZ(v7 z{j};z<y^_yOKgvZ@@x)cYe&jN7m*Iq{9;?#Rd1bER`x*CjmdzvS3e=Y=Ewq*730Tv zNm9*vm}0?;dkzx~jtz3;4qIxLDWmiWHw&hu6|3@8eVJhK2D5ly;9|o-0}gkFsS5%P z7f3}ZsKL%gCOE&7;hMLc!Zn6vN#V3LH~KJ2tJ9%y{><pNUyxFRp33ZwZu}+i*v(dR zh)MP;Y|;b9YX?oXYl%`;Y2`sM#$^JSS|0E3ZRMC1`X*5kV9P2F9&W)PESbHr{++?V zDyWra<oco0hXYyzoMIQzBJEf*1_FO-y9OE<eivX6&9%5RyMTg!Yzbv)<c0w&1_Z_X zYhYO>vSjir1Oz}ASkhx+u`(3uMTBgqF42cU;SIYU82A-HJkHie$-e3eowEF}Qn-if zZ#tbDE|p{FH1`>ABXKP@^vXjVk2q$Q$EQ1<uxC2Oil0{;a<Z7PGa0J$m|QL-%v77; zUKbP6Fn18nqD#7A17a}0*|wEpz=*NeMaE{sOyGO4x<$0=E}f!NBUuthF<K~t(^x!t zP9c`A9{$y;ZAh~GKE=%@+y4NrL7_V0HWNcTK6ncsE%Wm~TXIeJ(p*_hIN6F#$uP6z zU>8T%MSiWp^{<jT5dW7{SdwePeuuGdk`8){5+!Y42T@|WXb$9xH8a}~RN0Z@DRKR4 zoCwqz@z9ZALD?VZAC&Q5Qtk^<OJvxaL1Z7oM})30J_HGP_!~l;kKfYD<b1gW4IDxb zMY@EF!Z3p1B!)use7}QwnFnV>*z?6^ErseY33R2e2T6WZp5F@&fnS1<LM()g>SXrW zp|*>NHY`tLZx#^jA*`LJbGxAtYyCDk5spc&c9w+=EYxwF>*bC=#u9{cl+mww+PO2c zhFMHGmmJ)5PLaD{|74)Ue5QwFkrxn7MDle8m+_S5wnJUQ_UR-$3FgBAFSkniJ}QiW zJ0$Jm(|6Ci*3kr%skd-3*o4QZ+6Tv4FnDROn%yP!4h9)uXkhHB0O>YeEH%G9PG`Hu zAL9UZyMchxCB!C9!mU`^eCbfnOmYIa7_mW_xK}u<FfE*f;0yQtXgmcdN2V5iR9sa- zbgfXtR6OPULJv)}i1B)X=~m0X?!=IY1O#NClUr8?*U)1P1juj}*V*6>FRbbBa1<UX zjjf``Ux}k$BF0}IvB%vr=v_8Ho0A*2B&Z&@d{J4IEqVLRda;JL&3QxwPG<=RelniI zS*~JPuUK8L!L)uhJXsi(F8a0GVSS%jyBYz!Vox%lMy?k%?A?!$aU-E$N;e``#s9LA zw*QVxv)8S(Q~q;dn8o-Yic(ZaWc#nx@c)UF{~JU7XX|}fkbeDA=J>y3sI!s1<A2F0 zMQXo2m6nqDOtuZT4etd=fe1n4Z%L#`{c``PcS{2!!G;nCf|oN&;f?)eL^dW(^;NdK zD^RZ36;(!wrBtQzUl%}Wx_0JMZ+YLdZo#kKxN7dWDBp7K*!V2fFq-MQna+5*-W&_e z`S70XxaoBGKKYp8dD(Wb+5UI9#P&-UC>y@lShMs173g$O`0_*ow?=<v=Cn1HC*`zN zX~d|qO>+d5v)XW~!pU;JE{#RQQM2g4e7RF(goU%Y{#YHiW~nZUW#z0@d*njZAs~9? zqBV|X!|8I?4%x!_yfux7ufhP`!+Orn;+McH$Meq<Y>a!-oYpYCnvu0RSDYeFm&W!? zzFf5-P3|BV16h?#RK8xTGv3a1E3Ut|Qz3n$K}cG$6R>*8_zdb%-qVX$V0yi+p?CjW z>+!KQ<PbbNr8Yf-+v0Ecd-K*DQ~`DVeu21k{t)=p6AA(B3b8%reGR?4^;-1H8}sJw zpbH3c-|O;-N?7-^BlqBwlh=1w11n-=egd&kPK(UHg=5Z&FtKT9|M*|u*OhTSQGHho zF{)LVX<-dhd}N&q!DF$90YzYXvuS=$ok=M}-InF0bO{6n&7@Uf6*OqvuOKe+_i z`hs|1g@6?okq2RvSDdTtfzyUd`rIQ@NT8$sT{ekR8=?Oy@)`D__u-#E7+c5Dqq;in zOn?#a)T-L5MwH!Y?JOygV8r86cPnM5ha%)39|^)XPseyE3MA<a@sy`Z6g_=BH!UD= znJuIV>^?%x(4Yn?L^CWIMGW+4nLvuRO9vnUdH{2U?}<RwU_EtacVp~Aeu~V&QifPD zA{wd~UGWi~11&!}U^MX<)jgP=u2ZFWO+}c`hf`0w)_<X2!2uJU(4~B%U!csID%sc* z!=ibE$4sPUnBp)()FsPt5^wA!5>~HMq1;iR40Bfoaz`-8bLP1K)<$yB1KOBf(LU`M z*d-W7J`Wb%oFw_E&bakdxNJTi<B-bQPpNKEGdXB9i?X>^u6#AT2orxeozhu0J*VOw zDX#w^!J@5F1L@^sauj-MCNi5~GRDc<_+On7ecUNk>b}%i<lxptT5OvlHx*6dzS@*s zGWsLqGV{zc$+2`DUfeSz)x-U1OrZyMLpdhEkU_wx8-DyZX-@qSAObV$N%Y_Feu`WY zBGW!jPd)zdE<hzsq?3g4-|)x<R&gT#81$u49|e|?nr(U9k@8)icc8M&=W(|fWs~9J zp+T2s+5lK1x9B^e$4fg|G}wuDSD<@QM=LhoD2i*6{dW;=MKW~>9u^N`_=W+`otQhl zczKm1fF?PX=IDqcliH1z0cpi<lWG_V9PDZ-=SR>5l9)Rd(!qz)4`UbDDE&gQm0Rq` zWM(ZZc*c%kv4SzqS+f~lSl$T4(HWpV%&_MOOgVWa7!z?C>No1pqfVmDtdz2N9GXyR zh@~^e$U;L=Tj^`CUYL&_YJ)8AyOM*izAWyo3RM?PD%RWf@+#EXHWyCgb4Oc0iQ6|t zBds+jH;1dWEpg-yt<9$o`4}G6S(giHfdpt@a@X-Z7Q2<R_^kWdhb#v#Li|mh#-748 zo{torVi=)KJLAXXK-1*Jh~lSVTFiRGh(RUPLD1wUg0qai`!XQmrO@$NM}vk}B#77? zS&rD$7I6R^gjVnw0mrS{TMY=uVits0@H#D8-mHR&C^jhZM7wJtM!>`VbZll>YTUe= zGTdkh=taIY$}XeH=J)Y}9M^^-JDALb5xF(eY_4S`vjlbVZ`M%Atz<>>JC=pPUrB2Q zW{Q5xoEh`7vv`yjs<w8TIfQ1i#*;2V+FdYxw-4jQL-VD~xl+$zkPuNYO+^*m2Z>A8 zS&(R*5-J_t$ZklOS|qG*T@9Eq4fU@IT{zWnEcV?HC{#x1ccvvLODJqgilr3dE?*_j zxD$n<Is7pbDQmtEN$s?w&yIe|$f{F{#Ld}f&PVLVZDnh>#CP65kg=sF8iKV9AIbkP zmNBXM@#djPn_YllqC6P<n#~LwU!P-3=|nQBl~4@pGhA%!lWd<-T2>0H-9j|*&`~t4 zB8oUwbfg!Tq?ls+CzYsa)O7B!rJiqqX^AN%QfUq=j!_#Z1(nzQ3wkJl!;HeiMn(j@ zP=7=n`of-g9;lzT)}C3Igau<~vM;LD$tis`Q_NYiB6y#b%p(K?olU?9)Ax8=byKQN zf_t%ExJ#ii)}6YE!pNDJXsgbVa2igzH3)bG_h%X(7elO%Dq22`g7&pDZ<%x4h%an# z%8Vleih4sqX*FZ(BYXtgyu2W(G}Q~qT&xS0*Nl_V#YWiDzNx{{=;j%e61wT(4QY2@ z%4L4wiWmi96BgnR7tjX(c2|-M-PsRb;LJB^s!tXIFQhOl26&m_dJC=tue2ZT^(Hd% zdIv~tfn0IBsEn*ajUZH9aHFY%@WN<03d9ds_PXprfNz3soC?*nej4rch~}V376Nts zwQw`)-dMI%V=yrJi-W`r7w$357@~$I1u{=B)>LtB&p>{X0py{VbJ*#X2FOkdQ)~x% z-*e^+E4`V);cY;`wk6vndCP30aHzET;2rh#*yA08e=i>Gi{0tRu!Y1+#8?LiM8B%C z;em5Q$B6Tq&<T>-<~d^O^&+xU`XHkNgX4tM7`3j4IDyFYiU+#cH<2gvFs->pVX`IE zk#l*lngk{STtnkQ@g2cp&M<CqJV6K&Pw2?g3esWD3BaFfC)h4P*?6gTSA?a^d)3%W z4v4_LQSpt!{xwI(V7{{B8PoC2-$8-o3=)C=jL@;<!pC5_!sg81wfgA{l%%zpz`DY3 zFWm+Dk?jdSKUjd|4Ao%YB6@hi@h;wBgY&}QV7NkW=NY<`xOcR9#4gQncI)n%aTgp! zME*K`Me^vbJYf3`s~hH5q?&)w0?Q3k=oy`@%CB+t9x{W)?q5^;0zfQ|ejXtOjH@Z* z(Cpj8GdU1XI5y0fCc=hC<u&XMU6?wZ`qwFC(sD4ReydA$%Z+->$Q4AR95jZhdjdr{ zKDeCmD$D;ebRNVEf|p=!<SA~QEQMY=G7!f;FcmZ-WlQHt>>blnpM$Dl$(9ghcV|yL z8BAG7$Z`~Ps^naLJNMaw<1`6MfB0OgTvWcFpB7u-#0{%cu*yGQHh|gDN?)@rYluJB zq?!jG3JP!d$v3CIW*wrsl7#iMG6|+R<XlJ$%|}2vNSQ_p_Wm-F)Yh%=%BxYK^RXdb z65@7_GZx!UVN6I$Q0({<&I42FzBmt~XWWMrdo^_~WffkiFHaS9OpaQK8;Pn`fh?}x zqjq+<(U%dfc5_N7k#AWOZ`}<QrY``qB(LlQm84mo{!{9aSswd{=)jChfdAVPu!(vU zaz_iA0qPd}4R2YbgO4ubH#1kGN74J+mWU@pO`L$U=2z4skOU?7-ao|IZO|D^D1Eq) z(#FL<z#DDwBnUy)|E7DTfLL=JRpE6oM0=?YsBK&Kk=ci8LEMFIg7RH*^U1k^yV>%@ zL{yLeLast8ogK!`fnjO|t7fE3%E%O>JC}{V8fD6mr17545GY#4Q6wWaQ;f;sCJU1O z83i>A{pvIXXHR3lREeXAvkOi#jE@~BFi<sw#oUXKU{s<wj-@~~lrRc~xQ|~O7%SW} zMoqJ0oJN*l6ckb*RWy#HNI;Y!ACn`=5F{lZ1vLsyd5CWdN?3!*0mM<H*mYMCJ5X&V z3l{eiDiRQR%8Cb{U*a$xfTi6r4#GdgzX6jq<OJ*R8~aB-IFO`)*owlXg`uT|G4|6X z8J^<A3KlEGmL(E+r=(17Wlm=Ou>LejVjOCP_&3JQ1VQ6?VdMBnxng2Lh$I}w1hBL* z#=*r-!|wjEO_-O8QKd0<0+KX{U0t{|3bZr|#{MG-M#rDSF)7EUQ3_U$N*)u)93ya7 z5-QRhXjTwEKzg!-NJR-3i-@ci5(}Pm;xIP(OI5+v@zAA>aHNUu)rL<pW0F-9KY((l z2^zNx8@ET&|2#-Gi^IqSnuf_Zi0d|nb6^<Vt4PVnWRw~3^R?Y6JELS<qhwe+;u<Ph z2SD@y6D5E)$u3*5U7+L=2Ve{XFrGj-xo^Lxb~ys|)H)i+!93xT0GxWts8_zw+6xz$ zytzR-$wvVIJGN;3HUc~#^EiKP9CFQ)8M)z0S_O}Akld)C=@3rMHmr)BL`;SEgyXvg zvpmwcZl(8nIT2wf%SXS#*Dhso?PjeS+UY&kkBeaplEZA`!WwL4QbYYxI<%bej-7)p zX8Jn8IiuOei+OG7sRI!8%3-zh(C*Qg&J9N!wVRr>NoXcM+!(*HI%y|OOy)c-(56x# z&RW9N3<<jW;<{;Kt6Lt98I##kV8|h$;M?zyQTg+U$+RywGMdx){xJDK?hp_g8)J&A z`lx8q{^8;s(~(UZ5M%g2Ogit?NRHzxZcfSeA?*E5?DkBN0E6k2_I<|)2
<{5#o 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 literal 0 HcmV?d00001 diff --git a/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructBusinessTypeEnum.java b/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructBusinessTypeEnum.java new file mode 100644 index 00000000..4ae26e57 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructBusinessTypeEnum.java @@ -0,0 +1,226 @@ +package com.gx.obe.evaluation.struct.enumeration; + +import java.util.Arrays; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import com.gx.obe.util.utils.PredicateUtil; + + +/** + * @Description: 结构化商务类型 + * @author chenxw + */ +public enum StructBusinessTypeEnum { + +// ENTERPRISE_QUALIFICATION("EnterpriseQualification", "ä¼ä¸šèµ„è´¨è¯æ˜Žæ–‡ä»¶"), + +// EQ_ENTERPRISE_INFO("EQ_EnterpriseInfo", ""), + + /** + * null + */ + NULL("null", ""), + + /** + * è¥ä¸šæ‰§ç…§ EQ_BusinessLicense + */ + EQ_BUSINESS_LICENSE("EQ_BusinessLicense", "è¥ä¸šæ‰§ç…§"), + + /** + * 供货业绩(物资) EQ_Achievements + */ + EQ_ACHIEVEMENTS("EQ_Achievements", "供货业绩(物资)"), + + /** + * 已投产业绩 EQ_OperationAchievements + */ + EQ_OPERATION_ACHIEVEMENTS("EQ_OperationAchievements", "已投产业绩"), + + /** + * 在建业绩(施工/æœåŠ¡ï¼‰ EQ_OperationPerformance + */ + EQ_OPERATION_PERFORMANCE("EQ_OperationPerformance", "在建业绩(施工/æœåŠ¡ï¼‰"), + + /** + * åˆåŒä¸šç»© EQ_ContractPerformance + */ + EQ_CONTRACT_PERFORMANCE("EQ_ContractPerformance", "åˆåŒä¸šç»©"), + + /** + * 项目负责人 EQ_ProjectLeader + */ + EQ_PROJECTLEADER("EQ_ProjectLeader", "项目负责人"), + + /** + * 资产负债率 EQ_AssetLiabilityRatio + */ + EQ_ASSETLIABILITY_RATIO("EQ_AssetLiabilityRatio", "资产负债率"), + + /** + * æµåŠ¨æ¯”çŽ‡ EQ_LiquidityRatio + */ + EQ_LIQUIDITY_RATIO("EQ_LiquidityRatio", "æµåŠ¨æ¯”çŽ‡"), + + /** + * 主è¥ä¸šåŠ¡åˆ©æ¶¦çŽ‡ EQ_ProfitRatio + */ + EQ_PROFIT_RATIO("EQ_ProfitRatio", "主è¥ä¸šåŠ¡åˆ©æ¶¦çŽ‡"), + + /** + * 安全生产许å¯è¯ EQ_Qualification_SCXK + */ + EQ_QUALIFICATION_SCXK("EQ_Qualification_SCXK", "安全生产许å¯è¯"), + + /** + * 检验报告 EQ_Qualification_SurveyReport + */ + EQ_QUALIFICATION_SURVEYREPORT("EQ_Qualification_SurveyReport", "检验报告"), + + /** + * 资信ç‰çº§ EQ_Qualification_ZXDJ + */ + EQ_QUALIFICATION_ZXDJ("EQ_Qualification_ZXDJ", "资信ç‰çº§"), + + /** + * 施工资质 EQ_Qualification_SGZZ + */ + EQ_QUALIFICATION_SGZZ("EQ_Qualification_SGZZ", "施工资质"), + + /** + * 设计资质 EQ_Qualification_SJZZ + */ + EQ_QUALIFICATION_SJZZ("EQ_Qualification_SJZZ", "设计资质"), + + /** + * 监ç†èµ„è´¨ EQ_Qualification_JLZZ + */ + EQ_QUALIFICATION_JLZZ("EQ_Qualification_JLZZ", "监ç†èµ„è´¨"), + + /** + * 其它资质 EQ_Qualification + */ + EQ_QUALIFICATION("EQ_Qualification", "其它资质"), + +// EQ_QUALIFICATION_ZLJX("EQ_Qualification_ZLJX", "è´¨é‡å¥–项"), + +// EQ_QUALIFICATION_ZLJX_SJ("EQ_Qualification_ZLJX_SJ", "自治区质é‡å¥–项"), + +// EQ_QUALIFICATION_KJYF("EQ_Qualification_KJYF", "ç§‘æŠ€ç ”å‘奖项"), + +// EQ_QUALIFICATION_KJYF_SJ("EQ_Qualification_KJYF_SJ", "自治区科技奖项"), + +// EQ_QUALIFICATION_HYPM("EQ_Qualification_HYPM", "行业排å"), + +// EQ_QUALIFICATION_XJS("EQ_Qualification_XJS", "新技术"), + +// EQ_QUALIFICATION_CPRZ("EQ_Qualification_CPRZ", "产å“认è¯è¯ä¹¦"), + +// EQ_QUALIFICATION_HBTX("EQ_Qualification_HBTX", "环ä¿ä½“系认è¯è¯ä¹¦"), + + /** + * æŠ•æ ‡å‡½ TenderLetter + */ + TENDER_LETTER("TenderLetter", "æŠ•æ ‡å‡½"), + + /** + * æ³•å®šä»£è¡¨äººèº«ä»½è¯æ˜Ž LegalRepresentativeIdCertificate + */ + LEGAL_REPRESENTATIVE_ID_CERTIFICATE("LegalRepresentativeIdCertificate", "æ³•å®šä»£è¡¨äººèº«ä»½è¯æ˜Ž"), + + /** + * 法定代表人授æƒä¹¦ LegalRepresentative + */ + LEGAL_REPRESENTATIVE("LegalRepresentative", "法定代表人授æƒä¹¦"), + + /** + * è”åˆä½“å议书 ConsortiumAgreement + */ + CONSORTIUM_AGREEMENT("ConsortiumAgreement", "è”åˆä½“å议书"), + + /** + * æŠ•æ ‡äººå…³äºŽèµ„æ ¼çš„å£°æ˜Žå‡½ BidderQualificationStatement + */ + BIDDER_QUALIFICATION_STATEMENT("BidderQualificationStatement", "æŠ•æ ‡äººå…³äºŽèµ„æ ¼çš„å£°æ˜Žå‡½"), + + /** + * ä¸å˜åœ¨ç¦æ¢æŠ•æ ‡çš„æƒ…å½¢ BidProhibitionSituation + */ + BID_PROHIBITION_SITUATION("BidProhibitionSituation", "ä¸å˜åœ¨ç¦æ¢æŠ•æ ‡çš„æƒ…å½¢"), + + /** + * æŠ•æ ‡ä¿è¯é‡‘ BidBond + */ + BID_BOND("BidBond", "æŠ•æ ‡ä¿è¯é‡‘"), + + /** + * æŠ•æ ‡äººåç§° BidderName + */ + BIDDER_NAME("BidderName", "æŠ•æ ‡äººåç§°"), + + /** + * 工期 Duration + */ + DURATION("Duration", "工期"); + +// /** +// * å‘åŒ…äººè¦æ±‚ ContractorConditions +// */ +// CONTRACTOR_CONDITIONS("ContractorConditions", "å‘åŒ…äººè¦æ±‚"); +// +// /** +// * è´¨é‡æ ‡å‡† QualityStandard +// */ +// QUALITY_STANDARD("QualityStandard", "è´¨é‡æ ‡å‡†"), +// +// /** +// * æƒåˆ©ä¸Žä¹‰åŠ¡ RightAndDuty +// */ +// RIGHT_AND_DUTY("RightAndDuty", "æƒåˆ©ä¸Žä¹‰åŠ¡"), +// +// /** +// * åˆ†åŒ…èµ„æ ¼è¯„å®¡ PackQualification +// */ +// PACK_QUALIFICATION("PackQualification", "åˆ†åŒ…èµ„æ ¼è¯„å®¡"); + + private final String key; + private final String value; + + private StructBusinessTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + /** + * @Description: + * @author chenxw + * @param object + * @return + */ + public static Optional<StructBusinessTypeEnum> getBykey(String key) { + return Arrays.stream(values()).filter(PredicateUtil.get(StructBusinessTypeEnum::getKey, Predicate.isEqual(key))).findAny(); + } + + private static Set<String> keySet = Arrays.stream(values()).map(StructBusinessTypeEnum::getKey).filter(Predicate.isEqual(NULL.getKey()).negate()).collect(Collectors.toSet()); + + /** + * @Description: + * @author chenxw + * @param key + * @return + */ + public static boolean contains(String key) { + return keySet.contains(key); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructEnum.java b/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructEnum.java new file mode 100644 index 00000000..e52c4966 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructEnum.java @@ -0,0 +1,85 @@ +package com.gx.obe.evaluation.struct.enumeration; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @author chenxw + */ +public class StructEnum { + + /** + * ä¼ä¸šèµ„è´¨è¯æ˜Žæ–‡ä»¶ + */ + public static final String ENTERPRISE_QUALIFICATION = "EnterpriseQualification"; + + /** + * 财务状况 + */ + public static final String EQ_FINANCIAL_REPORT = "EQ_FinancialReport"; + + private static Map<String, String> structValueMap = new HashMap<>(); + static { + structValueMap.put(EQ_FINANCIAL_REPORT, "财务状况"); + } + + public static String getStructValue(String dataType) { + return structValueMap.getOrDefault(dataType, "未知类型"); + } + + /** + * 未确认 + */ + public static final String STATE_UNCONFIRMED = "00"; + /** + * 有效 + */ + public static final String STATE_EFFECTIVE = "01"; + /** + * æ— æ•ˆ + */ + public static final String STATE_INVALID = "02"; + + + public static final String FLOAT = "float"; + public static final String INT = "int"; + public static final String STRING = "string"; + public static final String DATE_TIME = "datetime"; + public static final String UNION = "union"; + + + public static final String IMAGE = "image"; + public static final String ATTACHMENT = "attachment"; + + + /** + * 资质文件 + */ + public static final String FICATION = "fication"; + /** + * 范本文件 + */ + public static final String TEMPLATE = "template"; + + + public static final String RESPONSE_ITEM = "responseItem"; + + /** + * 结构化数æ®ä¿®æ£ + */ + public static final String STRUCT_RECORD_TYPE = "00"; + /** + * ç»“æž„åŒ–æ˜Žç»†ä¿®æ£ + */ + public static final String STRUCT_RECORD_DETAILS = "01"; + + public static String typeConversion(String dataType) { + if (StructBusinessTypeEnum.EQ_ASSETLIABILITY_RATIO.getKey().equals(dataType)) return StructEnum.EQ_FINANCIAL_REPORT; + if (StructBusinessTypeEnum.EQ_LIQUIDITY_RATIO.getKey().equals(dataType)) return StructEnum.EQ_FINANCIAL_REPORT; + if (StructBusinessTypeEnum.EQ_PROFIT_RATIO.getKey().equals(dataType)) return StructEnum.EQ_FINANCIAL_REPORT; + if (StructBusinessTypeEnum.BIDDER_NAME.getKey().equals(dataType)) return StructBusinessTypeEnum.EQ_BUSINESS_LICENSE.getKey(); + return dataType; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructTechnologyTypeEnum.java b/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructTechnologyTypeEnum.java new file mode 100644 index 00000000..e2744ba3 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/evaluation/struct/enumeration/StructTechnologyTypeEnum.java @@ -0,0 +1,121 @@ +package com.gx.obe.evaluation.struct.enumeration; + +import java.util.Arrays; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import com.gx.obe.util.utils.PredicateUtil; + +/** + * @Description: 结构化技术类型 + * @author chenxw + */ +public enum StructTechnologyTypeEnum { + + /** + * null + */ + NULL("null", ""), + + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°1 + */ + PARAM_1("Param1", "ä¸»è¦æŠ€æœ¯å‚æ•°1"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°2 + */ + PARAM_2("Param2", "ä¸»è¦æŠ€æœ¯å‚æ•°2"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°3 + */ + PARAM_3("Param3", "ä¸»è¦æŠ€æœ¯å‚æ•°3"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°4 + */ + PARAM_4("Param4", "ä¸»è¦æŠ€æœ¯å‚æ•°4"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°5 + */ + PARAM_5("Param5", "ä¸»è¦æŠ€æœ¯å‚æ•°5"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°6 + */ + PARAM_6("Param6", "ä¸»è¦æŠ€æœ¯å‚æ•°6"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°7 + */ + PARAM_7("Param7", "ä¸»è¦æŠ€æœ¯å‚æ•°7"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°8 + */ + PARAM_8("Param8", "ä¸»è¦æŠ€æœ¯å‚æ•°8"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°9 + */ + PARAM_9("Param9", "ä¸»è¦æŠ€æœ¯å‚æ•°9"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°10 + */ + PARAM_10("Param10", "ä¸»è¦æŠ€æœ¯å‚æ•°10"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°10 + */ + PARAM_11("Param11", "ä¸»è¦æŠ€æœ¯å‚æ•°11"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°10 + */ + PARAM_12("Param12", "ä¸»è¦æŠ€æœ¯å‚æ•°12"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°10 + */ + PARAM_13("Param13", "ä¸»è¦æŠ€æœ¯å‚æ•°13"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°10 + */ + PARAM_14("Param14", "ä¸»è¦æŠ€æœ¯å‚æ•°14"), + /** + * ä¸»è¦æŠ€æœ¯å‚æ•°10 + */ + PARAM_15("Param15", "ä¸»è¦æŠ€æœ¯å‚æ•°15"); + + private final String key; + private final String value; + + private StructTechnologyTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + private static Set<String> keySet = Arrays.stream(values()).map(StructTechnologyTypeEnum::getKey).filter(Predicate.isEqual(NULL.getKey()).negate()).collect(Collectors.toSet()); + + /** + * @Description: + * @author chenxw + * @param object + * @return + */ + public static Optional<StructTechnologyTypeEnum> getBykey(String key) { + return Arrays.stream(values()).filter(PredicateUtil.get(StructTechnologyTypeEnum::getKey, Predicate.isEqual(key))).findAny(); + } + + /** + * @Description: + * @author chenxw + * @param key + * @return + */ + public static boolean contains(String key) { + return keySet.contains(key); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/Activator.java b/com.gx.obe.struct/src/com/gx/obe/struct/Activator.java new file mode 100644 index 00000000..92058afd --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/Activator.java @@ -0,0 +1,50 @@ +package com.gx.obe.struct; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "com.gx.obe.struct"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteDO.java new file mode 100644 index 00000000..b7ef4cb9 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteDO.java @@ -0,0 +1,49 @@ +package com.gx.obe.struct.beans; + +import java.math.BigDecimal; + +/** + * @author gnauh + * 数值区间模型类 + * + */ +public class AbsoluteDO { + private int startNumber; + private int endNumber; + private BigDecimal score; + public AbsoluteDO(int startNumber,int endNumber , BigDecimal score){ + this.score = score; + this.endNumber = endNumber; + this.startNumber = startNumber; + } + public int getStartNumber() { + return startNumber; + } + public void setStartNumber(int startNumber) { + this.startNumber = startNumber; + } + public int getEndNumber() { + return endNumber; + } + public void setEndNumber(int endNumber) { + this.endNumber = endNumber; + } + public BigDecimal getScore() { + return score; + } + public void setScore(BigDecimal score) { + this.score = score; + } + public boolean isInRange(int value) { + if (startNumber > 0 && endNumber> 0) { + return value >= startNumber && value < endNumber; + }else if(startNumber > 0 && endNumber <=0) { + return value >= startNumber; + }else if(startNumber ==0 && endNumber> 0) { + return value < endNumber; + } + return false; + + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteModelDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteModelDO.java new file mode 100644 index 00000000..fdc543ed --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/AbsoluteModelDO.java @@ -0,0 +1,43 @@ +package com.gx.obe.struct.beans; + +/** + * ç»å¯¹å€¼æ¨¡åž‹å‚æ•°åˆå§‹å€¼æ¨¡åž‹ + * @author gnauh + * + */ +public class AbsoluteModelDO { +// <!--èµ·å§‹æ•´æ•°ç»å¯¹å€¼--> + private String initialValue; +// <!--æ•´æ•°ç»å¯¹å€¼å•ä½--> + private String absoluteUnit; +// <!--æ•´æ•°ç»å¯¹å€¼å¯¹åº”分值--> + private String absoluteScore; +// <!--最高得分--> + private String maxScore; + + public String getMaxScore() { + return maxScore; + } + public void setMaxScore(String maxScore) { + this.maxScore = maxScore; + } + public String getInitialValue() { + return initialValue; + } + public void setInitialValue(String initialValue) { + this.initialValue = initialValue; + } + public String getAbsoluteUnit() { + return absoluteUnit; + } + public void setAbsoluteUnit(String absoluteUnit) { + this.absoluteUnit = absoluteUnit; + } + public String getAbsoluteScore() { + return absoluteScore; + } + public void setAbsoluteScore(String absoluteScore) { + this.absoluteScore = absoluteScore; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/AttachmentFile.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/AttachmentFile.java new file mode 100644 index 00000000..aeefcce6 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/AttachmentFile.java @@ -0,0 +1,120 @@ +package com.gx.obe.struct.beans; + +import java.util.Date; + +/** + * @author mazc + * @Description: + */ +public class AttachmentFile { + + /** + * 主键 + */ + private String id; + /** + * 父级ID + */ + private String parentId; + /** + * 项目ID + */ + private String tenderId; + /** + * 业务ID + */ + private String businessId; + /** + * æ–‡ä»¶åœ°å€ + */ + private String fileUrl; + /** + * 文件åç§° + */ + private String fileName; + /** + * æ–‡ä»¶å¤§å° + */ + private Integer fileSize; + /** + * 文件类型 + */ + private String fileType; + /** + * 创建时间 + */ + private Date createTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Integer getFileSize() { + return fileSize; + } + + public void setFileSize(Integer fileSize) { + this.fileSize = fileSize; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/BalanceSheet.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/BalanceSheet.java new file mode 100644 index 00000000..3fd3a900 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/BalanceSheet.java @@ -0,0 +1,156 @@ +package com.gx.obe.struct.beans; + +import java.math.BigDecimal; + +/** + * @Description: 资产负债表 + * @author chenxw + */ +public class BalanceSheet { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 财务ID + */ + private String financeId; + /** + * 总资产 + */ + private BigDecimal balanceTotal; + /** + * æµåŠ¨èµ„äº§ + */ + private BigDecimal balanceCecurrentAssets; + /** + * å˜è´§ + */ + private BigDecimal inventory; + /** + * 应收账款 + */ + private BigDecimal receivables; + /** + * ä¸è‰¯èµ„产 + */ + private BigDecimal badAssets; + /** + * 总负债 + */ + private BigDecimal balanceTotalliabilities; + /** + * æµåŠ¨è´Ÿå€º + */ + private BigDecimal balanceCurrentLiabilities; + /** + * 所有者æƒç›Š + */ + private BigDecimal ownershipInterest; + /** + * å…¶ä¸ï¼šå½“å¹´éžæ£å¸¸å¢žåŠ + */ + private BigDecimal abnormalIncrease; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getFinanceId() { + return financeId; + } + + public void setFinanceId(String financeId) { + this.financeId = financeId; + } + + public BigDecimal getBalanceTotal() { + return balanceTotal; + } + + public void setBalanceTotal(BigDecimal balanceTotal) { + this.balanceTotal = balanceTotal; + } + + public BigDecimal getBalanceCecurrentAssets() { + return balanceCecurrentAssets; + } + + public void setBalanceCecurrentAssets(BigDecimal balanceCecurrentAssets) { + this.balanceCecurrentAssets = balanceCecurrentAssets; + } + + public BigDecimal getInventory() { + return inventory; + } + + public void setInventory(BigDecimal inventory) { + this.inventory = inventory; + } + + public BigDecimal getReceivables() { + return receivables; + } + + public void setReceivables(BigDecimal receivables) { + this.receivables = receivables; + } + + public BigDecimal getBadAssets() { + return badAssets; + } + + public void setBadAssets(BigDecimal badAssets) { + this.badAssets = badAssets; + } + + public BigDecimal getBalanceTotalliabilities() { + return balanceTotalliabilities; + } + + public void setBalanceTotalliabilities(BigDecimal balanceTotalliabilities) { + this.balanceTotalliabilities = balanceTotalliabilities; + } + + public BigDecimal getBalanceCurrentLiabilities() { + return balanceCurrentLiabilities; + } + + public void setBalanceCurrentLiabilities(BigDecimal balanceCurrentLiabilities) { + this.balanceCurrentLiabilities = balanceCurrentLiabilities; + } + + public BigDecimal getOwnershipInterest() { + return ownershipInterest; + } + + public void setOwnershipInterest(BigDecimal ownershipInterest) { + this.ownershipInterest = ownershipInterest; + } + + public BigDecimal getAbnormalIncrease() { + return abnormalIncrease; + } + + public void setAbnormalIncrease(BigDecimal abnormalIncrease) { + this.abnormalIncrease = abnormalIncrease; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/BidderBasicInfo.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/BidderBasicInfo.java new file mode 100644 index 00000000..7777e92a --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/BidderBasicInfo.java @@ -0,0 +1,442 @@ +package com.gx.obe.struct.beans; + +/** + * @author mazc + * @Description: + */ +public class BidderBasicInfo { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 模型数æ®ID + */ + private String modelDataId; + /** + * æŠ•æ ‡äººåç§° + */ + private String companyName; + /** + * æ³¨å†Œåœ°å€ + */ + private String registerLocation; + /** + * 邮政编ç + */ + private String postalCode; + /** + * è”系人 + */ + private String linkMan; + /** + * ç”µè¯ + */ + private String linkManPhone; + /** + * ä¼ çœŸ + */ + private String linkManFax; + /** + * ç½‘å€ + */ + private String linkManWebsite; + /** + * 组织结构 + */ + private String orgStructure; + /** + * 法定代表人姓å + */ + private String legalRepresentativeName; + /** + * 法定代表人技术èŒç§° + */ + private String legalRepresentativeTitle; + /** + * æ³•å®šä»£è¡¨äººç”µè¯ + */ + private String legalRepresentativePhone; + /** + * 技术负责人姓å + */ + private String technicalDirectorName; + /** + * 技术负责人èŒç§° + */ + private String technicalDirectorTitle; + /** + * æŠ€æœ¯è´Ÿè´£äººç”µè¯ + */ + private String technicalDirectorPhone; + /** + * æˆç«‹æ—¶é—´ + */ + private String setupTime; + /** + * ä¼ä¸šèµ„è´¨ç‰çº§ + */ + private String companyQualificationLevel; + /** + * 注册资金 + */ + private String registeredCapital; + /** + * 开户银行 + */ + private String depositBank; + /** + * è¥ä¸šæ‰§ç…§å· + */ + private String bussinessLicense; + /** + * é“¶è¡Œè´¦å· + */ + private String bankAccount; + /** + * 员工总人数 + */ + private String employeeNumber; + /** + * 项目ç»ç†æ•°é‡ + */ + private String purchaserNumber; + /** + * 高级èŒç§°äººå‘˜æ•°é‡ + */ + private String seniorProfessionalPostNumber; + /** + * 䏿žèŒç§°äººå‘˜æ•°é‡ + */ + private String mediumProfessionalPostNumber; + /** + * åˆçº§èŒç§°äººå‘˜æ•°é‡ + */ + private String primaryProfessionalPostNumber; + /** + * æŠ€å·¥æ•°é‡ + */ + private String artisanNumber; + /** + * ç»è¥èŒƒå›´ + */ + private String businessScope; + /** + * ä¼ä¸šæ€§è´¨ + */ + private String enterpriseNature; + /** + * è‚¡æƒç»“æž„ + */ + private String equityStructure; + /** + * å…³è”ä¼ä¸šæƒ…况 + */ + private String relatedCompanyInfo; + /** + * æœåŠ¡èƒ½åŠ› + */ + private String serviceAbility; + /** + * 拟投入本项目设备 + */ + private String preInputDevice; + /** + * 备注 + */ + private String memo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getModelDataId() { + return modelDataId; + } + + public void setModelDataId(String modelDataId) { + this.modelDataId = modelDataId; + } + + public String getRegisterLocation() { + return registerLocation; + } + + public void setRegisterLocation(String registerLocation) { + this.registerLocation = registerLocation; + } + + public String getPostalCode() { + return postalCode; + } + + public void setPostalCode(String postalCode) { + this.postalCode = postalCode; + } + + public String getLinkMan() { + return linkMan; + } + + public void setLinkMan(String linkMan) { + this.linkMan = linkMan; + } + + public String getLinkManPhone() { + return linkManPhone; + } + + public void setLinkManPhone(String linkManPhone) { + this.linkManPhone = linkManPhone; + } + + public String getLinkManFax() { + return linkManFax; + } + + public void setLinkManFax(String linkManFax) { + this.linkManFax = linkManFax; + } + + public String getLinkManWebsite() { + return linkManWebsite; + } + + public void setLinkManWebsite(String linkManWebsite) { + this.linkManWebsite = linkManWebsite; + } + + public String getOrgStructure() { + return orgStructure; + } + + public void setOrgStructure(String orgStructure) { + this.orgStructure = orgStructure; + } + + public String getLegalRepresentativeName() { + return legalRepresentativeName; + } + + public void setLegalRepresentativeName(String legalRepresentativeName) { + this.legalRepresentativeName = legalRepresentativeName; + } + + public String getLegalRepresentativeTitle() { + return legalRepresentativeTitle; + } + + public void setLegalRepresentativeTitle(String legalRepresentativeTitle) { + this.legalRepresentativeTitle = legalRepresentativeTitle; + } + + public String getLegalRepresentativePhone() { + return legalRepresentativePhone; + } + + public void setLegalRepresentativePhone(String legalRepresentativePhone) { + this.legalRepresentativePhone = legalRepresentativePhone; + } + + public String getTechnicalDirectorName() { + return technicalDirectorName; + } + + public void setTechnicalDirectorName(String technicalDirectorName) { + this.technicalDirectorName = technicalDirectorName; + } + + public String getTechnicalDirectorTitle() { + return technicalDirectorTitle; + } + + public void setTechnicalDirectorTitle(String technicalDirectorTitle) { + this.technicalDirectorTitle = technicalDirectorTitle; + } + + public String getTechnicalDirectorPhone() { + return technicalDirectorPhone; + } + + public void setTechnicalDirectorPhone(String technicalDirectorPhone) { + this.technicalDirectorPhone = technicalDirectorPhone; + } + + public String getSetupTime() { + return setupTime; + } + + public void setSetupTime(String setupTime) { + this.setupTime = setupTime; + } + + public String getCompanyQualificationLevel() { + return companyQualificationLevel; + } + + public void setCompanyQualificationLevel(String companyQualificationLevel) { + this.companyQualificationLevel = companyQualificationLevel; + } + + public String getRegisteredCapital() { + return registeredCapital; + } + + public void setRegisteredCapital(String registeredCapital) { + this.registeredCapital = registeredCapital; + } + + public String getDepositBank() { + return depositBank; + } + + public void setDepositBank(String depositBank) { + this.depositBank = depositBank; + } + + public String getBussinessLicense() { + return bussinessLicense; + } + + public void setBussinessLicense(String bussinessLicense) { + this.bussinessLicense = bussinessLicense; + } + + public String getBankAccount() { + return bankAccount; + } + + public void setBankAccount(String bankAccount) { + this.bankAccount = bankAccount; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getPurchaserNumber() { + return purchaserNumber; + } + + public void setPurchaserNumber(String purchaserNumber) { + this.purchaserNumber = purchaserNumber; + } + + public String getSeniorProfessionalPostNumber() { + return seniorProfessionalPostNumber; + } + + public void setSeniorProfessionalPostNumber(String seniorProfessionalPostNumber) { + this.seniorProfessionalPostNumber = seniorProfessionalPostNumber; + } + + public String getMediumProfessionalPostNumber() { + return mediumProfessionalPostNumber; + } + + public void setMediumProfessionalPostNumber(String mediumProfessionalPostNumber) { + this.mediumProfessionalPostNumber = mediumProfessionalPostNumber; + } + + public String getPrimaryProfessionalPostNumber() { + return primaryProfessionalPostNumber; + } + + public void setPrimaryProfessionalPostNumber(String primaryProfessionalPostNumber) { + this.primaryProfessionalPostNumber = primaryProfessionalPostNumber; + } + + public String getArtisanNumber() { + return artisanNumber; + } + + public void setArtisanNumber(String artisanNumber) { + this.artisanNumber = artisanNumber; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getEnterpriseNature() { + return enterpriseNature; + } + + public void setEnterpriseNature(String enterpriseNature) { + this.enterpriseNature = enterpriseNature; + } + + public String getEquityStructure() { + return equityStructure; + } + + public void setEquityStructure(String equityStructure) { + this.equityStructure = equityStructure; + } + + public String getRelatedCompanyInfo() { + return relatedCompanyInfo; + } + + public void setRelatedCompanyInfo(String relatedCompanyInfo) { + this.relatedCompanyInfo = relatedCompanyInfo; + } + + public String getServiceAbility() { + return serviceAbility; + } + + public void setServiceAbility(String serviceAbility) { + this.serviceAbility = serviceAbility; + } + + public String getPreInputDevice() { + return preInputDevice; + } + + public void setPreInputDevice(String preInputDevice) { + this.preInputDevice = preInputDevice; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/BusinessLicense.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/BusinessLicense.java new file mode 100644 index 00000000..ce97142f --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/BusinessLicense.java @@ -0,0 +1,202 @@ +package com.gx.obe.struct.beans; + +/** + * @author mazc + * @Description: + */ +public class BusinessLicense { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 模型数æ®ID + */ + private String modelDataId; + /** + * 统一社会信用代ç + */ + private String registerNumber; + /** + * ä¼ä¸šåç§° + */ + private String companyName; + /** + * 法定代表人 + */ + private String legalRepresentative; + /** + * 注册资本(万元) + */ + private String registerCapital; + /** + * 使‰€ + */ + private String companyAddress; + /** + * 是å¦åŒºå†…ä¼ä¸š + */ + private String isInAreaEnterprises; + /** + * 登记机关 + */ + private String registerInstitution; + /** + * æˆç«‹æ—¥æœŸ + */ + private String establishDate; + /** + * è¥ä¸šæœŸé™èµ· + */ + private String busnissTermStartDate; + /** + * è¥ä¸šæœŸé™æ¢ + */ + private String busnissTermEndtDate; + /** + * è¥ä¸šèŒƒå›´ + */ + private String businessScope; + /** + * 类型 + */ + private String companyType; + /** + * 是å¦ä¸ºæ°¸ä¹…ç»è¥ + */ + private String isPerpetual; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getModelDataId() { + return modelDataId; + } + + public void setModelDataId(String modelDataId) { + this.modelDataId = modelDataId; + } + + public String getRegisterNumber() { + return registerNumber; + } + + public void setRegisterNumber(String registerNumber) { + this.registerNumber = registerNumber; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getLegalRepresentative() { + return legalRepresentative; + } + + public void setLegalRepresentative(String legalRepresentative) { + this.legalRepresentative = legalRepresentative; + } + + public String getRegisterCapital() { + return registerCapital; + } + + public void setRegisterCapital(String registerCapital) { + this.registerCapital = registerCapital; + } + + public String getCompanyAddress() { + return companyAddress; + } + + public void setCompanyAddress(String companyAddress) { + this.companyAddress = companyAddress; + } + + public String getIsInAreaEnterprises() { + return isInAreaEnterprises; + } + + public void setIsInAreaEnterprises(String isInAreaEnterprises) { + this.isInAreaEnterprises = isInAreaEnterprises; + } + + public String getRegisterInstitution() { + return registerInstitution; + } + + public void setRegisterInstitution(String registerInstitution) { + this.registerInstitution = registerInstitution; + } + + public String getEstablishDate() { + return establishDate; + } + + public void setEstablishDate(String establishDate) { + this.establishDate = establishDate; + } + + public String getBusnissTermStartDate() { + return busnissTermStartDate; + } + + public void setBusnissTermStartDate(String busnissTermStartDate) { + this.busnissTermStartDate = busnissTermStartDate; + } + + public String getBusnissTermEndtDate() { + return busnissTermEndtDate; + } + + public void setBusnissTermEndtDate(String busnissTermEndtDate) { + this.busnissTermEndtDate = busnissTermEndtDate; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getCompanyType() { + return companyType; + } + + public void setCompanyType(String companyType) { + this.companyType = companyType; + } + + public String getIsPerpetual() { + return isPerpetual; + } + + public void setIsPerpetual(String isPerpetual) { + this.isPerpetual = isPerpetual; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/CashSheet.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/CashSheet.java new file mode 100644 index 00000000..51123a06 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/CashSheet.java @@ -0,0 +1,60 @@ +package com.gx.obe.struct.beans; + +import java.math.BigDecimal; + +/** + * @Description: 现金æµé‡è¡¨ + * @author chenxw + */ +public class CashSheet { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 财务ID + */ + private String financeId; + /** + * ç»è¥å‡€çް金æµé‡ + */ + private BigDecimal operatingNetCashFlow; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getFinanceId() { + return financeId; + } + + public void setFinanceId(String financeId) { + this.financeId = financeId; + } + + public BigDecimal getOperatingNetCashFlow() { + return operatingNetCashFlow; + } + + public void setOperatingNetCashFlow(BigDecimal operatingNetCashFlow) { + this.operatingNetCashFlow = operatingNetCashFlow; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/Certificate.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Certificate.java new file mode 100644 index 00000000..5c41bd57 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Certificate.java @@ -0,0 +1,94 @@ +package com.gx.obe.struct.beans; + +/** + * @author mazc + * @Description: + */ +public class Certificate { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 项目负责人ID + */ + private String projectLeaderId; + /** + * è¯ä¹¦ç¼–å· + */ + private String certificateNo; + /** + * è¯ä¹¦åç§° + */ + private String certificateName; + /** + * è¯ä¹¦ç‰çº§ + */ + private String certificateLevel; + /** + * åºå· + */ + private Integer sortNo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getProjectLeaderId() { + return projectLeaderId; + } + + public void setProjectLeaderId(String projectLeaderId) { + this.projectLeaderId = projectLeaderId; + } + + public String getCertificateName() { + return certificateName; + } + + public void setCertificateName(String certificateName) { + this.certificateName = certificateName; + } + + public Integer getSortNo() { + return sortNo; + } + + public void setSortNo(Integer sortNo) { + this.sortNo = sortNo; + } + + public String getCertificateNo() { + return certificateNo; + } + + public void setCertificateNo(String certificateNo) { + this.certificateNo = certificateNo; + } + + public String getCertificateLevel() { + return certificateLevel; + } + + public void setCertificateLevel(String certificateLevel) { + this.certificateLevel = certificateLevel; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/ConditionDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ConditionDO.java new file mode 100644 index 00000000..87d40423 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ConditionDO.java @@ -0,0 +1,101 @@ +package com.gx.obe.struct.beans; + +public class ConditionDO { + + /** + * @Description: ä¸‹é™ + */ + private String minRate; + + /** + * @Description: 下é™ç¬¦ï¼š 00 å°äºŽ 01å°äºŽç‰äºŽ + */ + private String minInclude; + + /** + * @Description: ä¸Šé™ + */ + private String maxRate; + + /** + * @Description: 上é™ç¬¦ï¼š 00 大于 01大于ç‰äºŽ + */ + private String maxInclude; + +// <!--大于起始整数ç»å¯¹å€¼è®¡é‡å•使•°é‡--> + private String maxEqRate; +// <!--计é‡å•ä½å¾—分--> + private String value; + + private String awardLevel; + + public String getMaxEqRate() { + return maxEqRate; + } + + public void setMaxEqRate(String maxEqRate) { + this.maxEqRate = maxEqRate; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getAwardLevel() { + return awardLevel; + } + + public void setAwardLevel(String awardLevel) { + this.awardLevel = awardLevel; + } + + /** + * @Description: 得分 + */ + private String score; + + public String getMinRate() { + return minRate; + } + + public void setMinRate(String minRate) { + this.minRate = minRate; + } + + public String getMinInclude() { + return minInclude; + } + + public void setMinInclude(String minInclude) { + this.minInclude = minInclude; + } + + public String getMaxRate() { + return maxRate; + } + + public void setMaxRate(String maxRate) { + this.maxRate = maxRate; + } + + public String getMaxInclude() { + return maxInclude; + } + + public void setMaxInclude(String maxInclude) { + this.maxInclude = maxInclude; + } + + public String getScore() { + return score; + } + + public void setScore(String score) { + this.score = score; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/CustomModelDo.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/CustomModelDo.java new file mode 100644 index 00000000..da9f8082 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/CustomModelDo.java @@ -0,0 +1,54 @@ +package com.gx.obe.struct.beans; + +public class CustomModelDo { + + /** + * @Description: åºå·id + */ + private String id; + /** + * @Description: 得分 + */ + private String score; + /** + * @Description: æè¿° + */ + private String description; + /** + * @Description: 备注 + */ + private String remarks; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getScore() { + return score; + } + + public void setScore(String score) { + this.score = score; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/Finance.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Finance.java new file mode 100644 index 00000000..a9fde9bd --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Finance.java @@ -0,0 +1,372 @@ +package com.gx.obe.struct.beans; + +import java.math.BigDecimal; + +/** + * @Description: 财务报表 + * @author chenxw + */ +public class Finance { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 模型数æ®ID + */ + private String modelDataId; + /** + * 年度 + */ + private String annual; + /** + * 注册资本 + */ +// private BigDecimal registeredCapital; + /** + * 总资产(万元) + */ + private BigDecimal total; + /** + * 利润总é¢ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal profitLossProfit; + /** + * è¥ä¸šæ”¶å…¥ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal operatingIncome; + /** + * 资产负债率(%) + */ + private BigDecimal liabilitiesRate; + /** + * æµåŠ¨èµ„äº§ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal currentAssets; + /** + * æµåŠ¨è´Ÿå€ºï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal currentLiabilities; + /** + * æµåŠ¨æ¯”çŽ‡ï¼ˆ%) + */ + private BigDecimal currentRate; + /** + * 净利率(%) + */ + private BigDecimal profitRatio; + /** + * 主è¥ä¸šåŠ¡åˆ©æ¶¦çŽ‡ï¼ˆ%) + */ + private BigDecimal operatingMargin; + /** + * 净利润(万元) + */ + private BigDecimal retainedProfits; + /** + * ä¼ä¸šåç§° + */ + private String companyName; + /** + * 净资产(万元) + */ + private BigDecimal netWorth; + /** + * 固定资产(万元) + */ +// private BigDecimal fixedAssets; + /** + * 现金æµé‡å‡€é¢ï¼ˆä¸‡å…ƒï¼‰ + */ +// private BigDecimal netCashFlow; + /** + * 净资产收益率(%) + */ +// private BigDecimal returnOnEquity; + /** + * 总资产报酬率(%) + */ +// private BigDecimal returnOnTotalAsset; + /** + * 速动比率(%) + */ + private BigDecimal quickRatio; + /** + * 负债åˆè®¡ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal totalliabilities; + /** + * æˆæœ¬è´¹ç”¨æ€»é¢ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal totalcost; + /** + * 速动资产(万元) + */ + private BigDecimal quickassets; + /** + * 主è¥ä¸šåŠ¡åˆ©æ¶¦ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal mainIncomeProfits; + /** + * 主è¥ä¸šåŠ¡æ”¶å…¥ï¼ˆä¸‡å…ƒï¼‰ + */ + private BigDecimal primeOperatingRevenue; + /** + * 资产负债表 + */ +// private BalanceSheet balanceSheet; + /** + * æŸç›Šè¡¨ + */ +// private ProfitlossSheet profitlossSheet; + /** + * 现金æµé‡è¡¨ + */ +// private CashSheet cashSheet; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getModelDataId() { + return modelDataId; + } + + public void setModelDataId(String modelDataId) { + this.modelDataId = modelDataId; + } + + public String getAnnual() { + return annual; + } + + public void setAnnual(String annual) { + this.annual = annual; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public BigDecimal getOperatingIncome() { + return operatingIncome; + } + + public void setOperatingIncome(BigDecimal operatingIncome) { + this.operatingIncome = operatingIncome; + } + + public BigDecimal getLiabilitiesRate() { + return liabilitiesRate; + } + + public void setLiabilitiesRate(BigDecimal liabilitiesRate) { + this.liabilitiesRate = liabilitiesRate; + } + + public BigDecimal getCurrentAssets() { + return currentAssets; + } + + public void setCurrentAssets(BigDecimal currentAssets) { + this.currentAssets = currentAssets; + } + + public BigDecimal getCurrentLiabilities() { + return currentLiabilities; + } + + public void setCurrentLiabilities(BigDecimal currentLiabilities) { + this.currentLiabilities = currentLiabilities; + } + + public BigDecimal getCurrentRate() { + return currentRate; + } + + public void setCurrentRate(BigDecimal currentRate) { + this.currentRate = currentRate; + } + + public BigDecimal getOperatingMargin() { + return operatingMargin; + } + + public void setOperatingMargin(BigDecimal operatingMargin) { + this.operatingMargin = operatingMargin; + } + + public BigDecimal getRetainedProfits() { + return retainedProfits; + } + + public void setRetainedProfits(BigDecimal retainedProfits) { + this.retainedProfits = retainedProfits; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public BigDecimal getNetWorth() { + return netWorth; + } + + public void setNetWorth(BigDecimal netWorth) { + this.netWorth = netWorth; + } + +// public BigDecimal getFixedAssets() { +// return fixedAssets; +// } +// +// public void setFixedAssets(BigDecimal fixedAssets) { +// this.fixedAssets = fixedAssets; +// } +// +// public BigDecimal getNetCashFlow() { +// return netCashFlow; +// } +// +// public void setNetCashFlow(BigDecimal netCashFlow) { +// this.netCashFlow = netCashFlow; +// } +// +// public BigDecimal getReturnOnEquity() { +// return returnOnEquity; +// } +// +// public void setReturnOnEquity(BigDecimal returnOnEquity) { +// this.returnOnEquity = returnOnEquity; +// } +// +// public BigDecimal getReturnOnTotalAsset() { +// return returnOnTotalAsset; +// } +// +// public void setReturnOnTotalAsset(BigDecimal returnOnTotalAsset) { +// this.returnOnTotalAsset = returnOnTotalAsset; +// } + + public BigDecimal getQuickRatio() { + return quickRatio; + } + + public void setQuickRatio(BigDecimal quickRatio) { + this.quickRatio = quickRatio; + } + + public BigDecimal getTotalliabilities() { + return totalliabilities; + } + + public void setTotalliabilities(BigDecimal totalliabilities) { + this.totalliabilities = totalliabilities; + } + +// public BalanceSheet getBalanceSheet() { +// return balanceSheet; +// } +// +// public void setBalanceSheet(BalanceSheet balanceSheet) { +// this.balanceSheet = balanceSheet; +// } +// +// public ProfitlossSheet getProfitlossSheet() { +// return profitlossSheet; +// } +// +// public void setProfitlossSheet(ProfitlossSheet profitlossSheet) { +// this.profitlossSheet = profitlossSheet; +// } +// +// public CashSheet getCashSheet() { +// return cashSheet; +// } +// +// public void setCashSheet(CashSheet cashSheet) { +// this.cashSheet = cashSheet; +// } + +// public BigDecimal getRegisteredCapital() { +// return registeredCapital; +// } +// +// public void setRegisteredCapital(BigDecimal registeredCapital) { +// this.registeredCapital = registeredCapital; +// } + + public BigDecimal getTotalcost() { + return totalcost; + } + + public void setTotalcost(BigDecimal totalcost) { + this.totalcost = totalcost; + } + + public BigDecimal getQuickassets() { + return quickassets; + } + + public void setQuickassets(BigDecimal quickassets) { + this.quickassets = quickassets; + } + + public BigDecimal getMainIncomeProfits() { + return mainIncomeProfits; + } + + public void setMainIncomeProfits(BigDecimal mainIncomeProfits) { + this.mainIncomeProfits = mainIncomeProfits; + } + + public BigDecimal getPrimeOperatingRevenue() { + return primeOperatingRevenue; + } + + public void setPrimeOperatingRevenue(BigDecimal primeOperatingRevenue) { + this.primeOperatingRevenue = primeOperatingRevenue; + } + + public BigDecimal getProfitLossProfit() { + return profitLossProfit; + } + + public void setProfitLossProfit(BigDecimal profitLossProfit) { + this.profitLossProfit = profitLossProfit; + } + + public BigDecimal getProfitRatio() { + return profitRatio; + } + + public void setProfitRatio(BigDecimal profitRatio) { + this.profitRatio = profitRatio; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/IntelligentEvalDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/IntelligentEvalDO.java new file mode 100644 index 00000000..8e538601 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/IntelligentEvalDO.java @@ -0,0 +1,244 @@ +package com.gx.obe.struct.beans; + +import java.util.List; + +import com.gx.obe.http.json.JsonUtil; + +/** + * è¯„å®¡æŒ‡æ ‡ç»“æž„åŒ–åŒºåŸŸ + * @author gnauh + * + */ +public class IntelligentEvalDO { + + /** + * @Description: 供应商问题æè¿° + */ +// private String supplierQuestion; + /** + * @Description: 是å¦éœ€è¦ä¸Šä¼ 附件 00ä¸éœ€è¦ 01 éœ€è¦ + */ +// private String isMustBoundFile; + /** + * @Description: æŒ‡æ ‡æ¥æº 供应商å“应:A ,系统采集:B ,供应商å“åº”æ—¶ï¼šæŒ‡æ ‡å†…å®¹åªèƒ½æ˜¯99æ— ï¼ŒæŒ‡æ ‡æ¨¡åž‹å¯ä¸è€ƒè™‘ï¼›ç³»ç»Ÿé‡‡é›†æ—¶ï¼šæŒ‡æ ‡å†…å®¹ä¸èƒ½æ˜¯99æ— ï¼ŒæŒ‡æ ‡æ¨¡åž‹å¿…é€‰ï¼› + */ +// private String factorSource; + /** + * @Description: æŒ‡æ ‡å†…å®¹ 01 注册资金ã€02 履约异常ã€03åŒä¸šä¸šç»©ã€04 全部业绩ã€05 åˆæ ¼çއã€06 供应商ç‰çº§ã€07使用质é‡ã€08 交付履约绩效ã€99 其它类型 + */ + private String factorType; + /** + * @Description: 区间模型 05 时间模型06 å‡é™çŽ‡æ¨¡åž‹ 07 å¦å†³é¡¹æ¨¡åž‹ 08 + */ + private String factorModel; + /** + * @Description: è¯„å®¡æŒ‡æ ‡ä»£ç æŒ‡æ ‡æ¨¡åž‹+æŒ‡æ ‡æ¥æº+æŒ‡æ ‡å†…å®¹+四使µæ°´ç + */ + private String factorCode; + /** + * @Description: 开始日期 + */ +// private String startDate; + /** + * @Description: ç»“æŸæ—¥æœŸ + */ +// private String endDate; + /** + * @Description: å•ä½ ä¸‡å…ƒ01,个02 + */ +// private String unit; + /** + * @Description: å•ä½ ä¸‡å…ƒ01,个02 + */ +// private String unitCode; +// /** +// * @Description: 类型说明是å¦é¡¹ï¼šæ˜¯ 01ï¼Œå¦ 00 +// */ +// private String correctResult; + /** + * @Description: 评审模型æè¿° + */ +// private String intelligentEvalRemark; + /** + * @Description: 区间列表 + */ + private List<ConditionDO> conditionList; +// /** +// * @Description: 时间模型 +// */ +// private TimeModelDO timeModel; + /** + * @Description: å‡é™çŽ‡æ¨¡åž‹ + */ + private LiftRateDO liftRate; + + private List<ScoreOptionsDO> scoreOptionsDOList; +// /** +// * @Description: å¦å†³é¡¹æ¨¡åž‹ +// */ +// private VoteModelDO voteModel; +// /** +// * @Description: 自定义模型 +// */ +// private List<CustomModelDo> customModelList; + + public String toJson() { + return JsonUtil.jsonObjectToStr(this); + } + +// public String getSupplierQuestion() { +// return supplierQuestion; +// } +// +// public void setSupplierQuestion(String supplierQuestion) { +// this.supplierQuestion = supplierQuestion; +// } + +// public String getIsMustBoundFile() { +// return isMustBoundFile; +// } +// +// public void setIsMustBoundFile(String isMustBoundFile) { +// this.isMustBoundFile = isMustBoundFile; +// } + +// public String getFactorSource() { +// return factorSource; +// } +// +// public void setFactorSource(String factorSource) { +// this.factorSource = factorSource; +// } + + private AbsoluteModelDO absoluteModelDO; + + public AbsoluteModelDO getAbsoluteModelDO() { + return absoluteModelDO; + } + + public void setAbsoluteModelDO(AbsoluteModelDO absoluteModelDO) { + this.absoluteModelDO = absoluteModelDO; + } + + public String getFactorType() { + return factorType; + } + + public void setFactorType(String factorType) { + this.factorType = factorType; + } + + public String getFactorModel() { + return factorModel; + } + + public void setFactorModel(String factorModel) { + this.factorModel = factorModel; + } + + public String getFactorCode() { + return factorCode; + } + + public void setFactorCode(String factorCode) { + this.factorCode = factorCode; + } + +// public String getStartDate() { +// return startDate; +// } +// +// public void setStartDate(String startDate) { +// this.startDate = startDate; +// } + +// public String getEndDate() { +// return endDate; +// } +// +// public void setEndDate(String endDate) { +// this.endDate = endDate; +// } +// +// public String getUnit() { +// return unit; +// } +// +// public void setUnit(String unit) { +// this.unit = unit; +// } +// +// public String getUnitCode() { +// return unitCode; +// } +// +// public void setUnitCode(String unitCode) { +// this.unitCode = unitCode; +// } + + public List<ConditionDO> getConditionList() { + return conditionList; + } + + public void setConditionList(List<ConditionDO> conditionList) { + this.conditionList = conditionList; + } + + + public List<ScoreOptionsDO> getScoreOptionsDOList() { + return scoreOptionsDOList; + } + + public void setScoreOptionsDOList(List<ScoreOptionsDO> scoreOptionsDOList) { + this.scoreOptionsDOList = scoreOptionsDOList; + } + + // public TimeModelDO getTimeModel() { +// return timeModel; +// } +// +// public void setTimeModel(TimeModelDO timeModel) { +// this.timeModel = timeModel; +// } +// + public LiftRateDO getLiftRate() { + return liftRate; + } + + public void setLiftRate(LiftRateDO liftRate) { + this.liftRate = liftRate; + } + +// public VoteModelDO getVoteModel() { +// return voteModel; +// } +// +// public void setVoteModel(VoteModelDO voteModel) { +// this.voteModel = voteModel; +// } + +// public String getCorrectResult() { +// return correctResult; +// } +// +// public void setCorrectResult(String correctResult) { +// this.correctResult = correctResult; +// } + +// public String getIntelligentEvalRemark() { +// return intelligentEvalRemark; +// } +// +// public void setIntelligentEvalRemark(String intelligentEvalRemark) { +// this.intelligentEvalRemark = intelligentEvalRemark; +// } +// +// public List<CustomModelDo> getCustomModelList() { +// return customModelList; +// } +// +// public void setCustomModelList(List<CustomModelDo> customModelList) { +// this.customModelList = customModelList; +// } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/LiftRateDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/LiftRateDO.java new file mode 100644 index 00000000..bad418d0 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/LiftRateDO.java @@ -0,0 +1,159 @@ +package com.gx.obe.struct.beans; + +public class LiftRateDO { + + /** + <liftRate> + <_responseType>排å</_responseType> + <sort>1</sort> + <Score>5</Score> + <MinScore>0</MinScore> + <MaxScore>5</MaxScore> + <responseType>01</responseType> + <typeNote>01</typeNote> + <_typeNote>é«˜åæ¬¡</_typeNote> + <ranking>1</ranking> + <dealType>01</dealType> + <_dealType>æŠ•æ ‡äººå“应值最高为第一å</_dealType> + <dealScore /> + <unit>%</unit> + <decimalDigits>6</decimalDigits> + </liftRate> + */ + /** + * @Description: å“应类型: 排å 01ã€ç™¾åˆ†æ¯” 02ã€å‡ºçŽ°æ¬¡æ•° 03 + */ + private String responseType; + /** + * @Description: ç±»åž‹è¯´æ˜Žï¼šé«˜åæ¬¡ 01ã€ä½Žå次 02 + */ + private String typeNote; + /** + * @Description: 忬¡ï¼šæ•´å½¢ + */ + private String ranking; + /** + * @Description: 处ç†ç±»åž‹ï¼šåŠ åˆ†01 ã€æ‰£åˆ† 02 + */ + private String dealType; + /** + * @Description: 处ç†åˆ†æ•°ï¼šå¯å¡« + */ + private String dealScore; + /** + * @Description: 备注:å¯å¡« + */ + private String memo; + private String sort; + private String Score; + private String minScore; + private String maxScore; + + /** + * å•ä½ + */ + private String unit; + /** + * å°æ•°ç‚¹ä½æ•° + */ + private String decimalDigits; + + public String getResponseType() { + return responseType; + } + + public void setResponseType(String responseType) { + this.responseType = responseType; + } + + public String getTypeNote() { + return typeNote; + } + + public void setTypeNote(String typeNote) { + this.typeNote = typeNote; + } + + public String getRanking() { + return ranking; + } + + public void setRanking(String ranking) { + this.ranking = ranking; + } + + public String getDealType() { + return dealType; + } + + public void setDealType(String dealType) { + this.dealType = dealType; + } + + public String getDealScore() { + return dealScore; + } + + public void setDealScore(String dealScore) { + this.dealScore = dealScore; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public String getScore() { + return Score; + } + + public void setScore(String score) { + Score = score; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public String getDecimalDigits() { + return decimalDigits; + } + + public void setDecimalDigits(String decimalDigits) { + this.decimalDigits = decimalDigits; + } + + public String getMinScore() { + return minScore; + } + + public void setMinScore(String minScore) { + this.minScore = minScore; + } + + public String getMaxScore() { + return maxScore; + } + + public void setMaxScore(String maxScore) { + this.maxScore = maxScore; + } + + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/ModelData.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ModelData.java new file mode 100644 index 00000000..66abe545 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ModelData.java @@ -0,0 +1,54 @@ +package com.gx.obe.struct.beans; + +/** + * @Description: å¯¹è±¡ç»“æž„åŒ–æ•°æ® + * @author chenxw + */ +public class ModelData { + + private String id; + private String tenderId; + private String supplierId; + private String relChapterType; + private String dataCode; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getRelChapterType() { + return relChapterType; + } + + public void setRelChapterType(String relChapterType) { + this.relChapterType = relChapterType; + } + + public String getDataCode() { + return dataCode; + } + + public void setDataCode(String dataCode) { + this.dataCode = dataCode; + } +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/ParamValueDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ParamValueDO.java new file mode 100644 index 00000000..1f1fc468 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ParamValueDO.java @@ -0,0 +1,32 @@ +package com.gx.obe.struct.beans; + +public class ParamValueDO { + + //<!--æ•°æ®Code 如财务报告ä¸çš„主è¥ä¸šåŠ¡åˆ©æ¶¦ç‰èµ„è´¨è¯æ˜Žæ–‡ä»¶çš„类型 如:EQ_FinancialReport,也包括åŽç»æ‰©å±•有具体å«ä¹‰çš„æ•°æ®Code --> + private String dataCode; + // <!--æ•°æ®ç±»åž‹ stringå—符串 numberæ•°å— æŠ•æ ‡ç®¡å®¶å¯¹äºŽæ— å…·ä½“å«ä¹‰å¡«ç©ºæ—¶ä½¿ç”¨ --> + private String dataType; + // <!--具体的å“åº”å€¼ï¼Œå¦‚æžœæ˜¯èµ„è´¨è¯æ˜Žæ–‡ä»¶ç±»åž‹æ•°æ®è¿™é‡Œå°±æ˜¯å¯¹äºŽèµ„è´¨çš„æ•°æ®æ–‡ä»¶ 如:Finance.xml,如果是选项模型的这里ä¿å˜çš„æ˜¯é€‰é¡¹çš„Idï¼Œå…¶ä»–çš„æ˜¯æŠ•æ ‡äººå¡«å†™çš„å¯¹åº”çš„å€¼ã€‚ --> + private String dataValue; + + public String getDataCode() { + return dataCode; + } + public void setDataCode(String dataCode) { + this.dataCode = dataCode; + } + public String getDataType() { + return dataType; + } + public void setDataType(String dataType) { + this.dataType = dataType; + } + public String getDataValue() { + return dataValue; + } + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/Performance.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Performance.java new file mode 100644 index 00000000..019e310c --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Performance.java @@ -0,0 +1,658 @@ +package com.gx.obe.struct.beans; + +/** + * @author mazc + * @Description: + */ +public class Performance { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 模型数æ®ID + */ + private String modelDataId; + /** + * 采è´å•ä½ + */ + private String purchasingUnit; + /** + * 供货å•ä½ + */ + private String partner; + /** + * 项目åç§° + */ + private String projectName; + /** + * ç¾è®¢æ—¥æœŸ + */ + private String singningDate; + /** + * ç»“æŸæ—¥æœŸ + */ + private String endTime; + /** + * åˆåŒé‡‘é¢ï¼ˆå•ä½ï¼šå…ƒï¼‰ + */ + private String singningTotal; + /** + * 项目ç»ç†å§“å + */ + private String purchaser; + /** + * 代表è”ç³»ç”µè¯ + */ + private String purchaserPhone; + /** + * 业绩状æ€ï¼ˆ00:进行ä¸ï¼›01:已完æˆï¼‰ + */ + private String status; + /** + * ä¼ä¸šåç§° + */ + private String supplierName; + /** + * 项目所在地 + */ + private String projectAddress; + /** + * å‘包人åç§° + */ + private String buyerName; + /** + * å‘åŒ…äººåœ°å€ + */ + private String buyerAddress; + /** + * å‘åŒ…äººç”µè¯ + */ + private String buyerPhoneNumber; + /** + * 开工日期 + */ + private String startTime; + /** + * 承担的工作 + */ + private String workUndertaken; + /** + * å·¥ç¨‹è´¨é‡ + */ + private String projectQuantity; + /** + * 项目ç»ç† + */ + private String projectManager; + /** + * 技术负责人 + */ + private String technicalDirector; + /** + * 总监ç†å·¥ç¨‹å¸ˆ + */ + private String chiefSupervisionEngineer; + /** + * 总监ç†å·¥ç¨‹å¸ˆç”µè¯ + */ + private String csePhoneNumber; + /** + * 项目æè¿° + */ + private String projectDesc; + /** + * 调试范围åŠå†…容 + */ + private String projectRangeAndContent; + /** + * 调试机构人数高峰 + */ + private String supplierWorkerCountmax; + /** + * è°ƒè¯•æœºæž„äººæ•°å¹³å‡ + */ + private String supplierWorkerCountave; + /** + * 工程评定情况 + */ + private String projectDeviceResult; + /** + * 项目å•ä½è”系人 + */ + private String buyerLinkman; + /** + * 是å¦é™„è¯æ˜Žæ–‡ä»¶ + */ + private String isHavrAccessory; + /** + * 是å¦ä¸ºåŽèƒ½ç³»ç»Ÿçš„项目 + */ + private String isOurCompanyProject; + /** + * æœåŠ¡èŒƒå›´ + */ + private String serviceScope; + /** + * 设备åç§° + */ + private String deviceName; + /** + * åž‹å·å’Œè§„æ ¼ + */ + private String devicetypeSpecification; + /** + * æ€»å®¹é‡ + */ + private String totalCapacity; + /** + * å°æ•° + */ + private String number; + /** + * åˆåŒæ—¶é—´ + */ + private String contractTime; + /** + * æŠ•è¿æ—¶é—´ + */ + private String commissioningTime; + /** + * 备注 + */ + private String memo; + /** + * 建设规模 + */ + private String projectScale; + /** + * 专业人员人数 + */ + private String professionalNumber; + /** + * 专业人员人月数 + */ + private String professionalWorkload; + /** + * åˆä½œå…¬å¸æä¾›äººå‘˜æœˆæ•° + */ + private String partnerProfessionalWorkload; + /** + * 监ç†èŒƒå›´åŠå†…容 + */ + private String supervisionCcontent; + /** + * ç›‘ç†æ•ˆæžœ + */ + private String supervisionResult; + /** + * 关键人员姓å专业åŠèŒåŠ¡ + */ + private String keyStaffProfessionalAndDuty; + /** + * 实际æœåŠ¡è¯´æ˜Ž + */ + private String serviceDesc; + /** + * 履约日期 + */ + private String executionDate; + /** + * 规模类型 + */ + private String projectScaleAndType; + /** + * 设计阶段 + */ + private String designStage; + /** + * 设计范围 + */ + private String designRange; + /** + * åˆä½œæ–¹å¼ + */ + private String cooperationWay; + /** + * åˆåŒå±¥è¡ŒèŽ·å¥–æƒ…å†µ/åˆåŒå±¥è¡Œæƒ…况 + */ + private String contractExecuteCondition; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getModelDataId() { + return modelDataId; + } + + public void setModelDataId(String modelDataId) { + this.modelDataId = modelDataId; + } + + public String getPurchasingUnit() { + return purchasingUnit; + } + + public void setPurchasingUnit(String purchasingUnit) { + this.purchasingUnit = purchasingUnit; + } + + public String getPartner() { + return partner; + } + + public void setPartner(String partner) { + this.partner = partner; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getSingningDate() { + return singningDate; + } + + public void setSingningDate(String singningDate) { + this.singningDate = singningDate; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getSingningTotal() { + return singningTotal; + } + + public void setSingningTotal(String singningTotal) { + this.singningTotal = singningTotal; + } + + public String getPurchaser() { + return purchaser; + } + + public void setPurchaser(String purchaser) { + this.purchaser = purchaser; + } + + public String getPurchaserPhone() { + return purchaserPhone; + } + + public void setPurchaserPhone(String purchaserPhone) { + this.purchaserPhone = purchaserPhone; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getProjectAddress() { + return projectAddress; + } + + public void setProjectAddress(String projectAddress) { + this.projectAddress = projectAddress; + } + + public String getBuyerName() { + return buyerName; + } + + public void setBuyerName(String buyerName) { + this.buyerName = buyerName; + } + + public String getBuyerAddress() { + return buyerAddress; + } + + public void setBuyerAddress(String buyerAddress) { + this.buyerAddress = buyerAddress; + } + + public String getBuyerPhoneNumber() { + return buyerPhoneNumber; + } + + public void setBuyerPhoneNumber(String buyerPhoneNumber) { + this.buyerPhoneNumber = buyerPhoneNumber; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getWorkUndertaken() { + return workUndertaken; + } + + public void setWorkUndertaken(String workUndertaken) { + this.workUndertaken = workUndertaken; + } + + public String getProjectQuantity() { + return projectQuantity; + } + + public void setProjectQuantity(String projectQuantity) { + this.projectQuantity = projectQuantity; + } + + public String getProjectManager() { + return projectManager; + } + + public void setProjectManager(String projectManager) { + this.projectManager = projectManager; + } + + public String getTechnicalDirector() { + return technicalDirector; + } + + public void setTechnicalDirector(String technicalDirector) { + this.technicalDirector = technicalDirector; + } + + public String getChiefSupervisionEngineer() { + return chiefSupervisionEngineer; + } + + public void setChiefSupervisionEngineer(String chiefSupervisionEngineer) { + this.chiefSupervisionEngineer = chiefSupervisionEngineer; + } + + public String getCsePhoneNumber() { + return csePhoneNumber; + } + + public void setCsePhoneNumber(String csePhoneNumber) { + this.csePhoneNumber = csePhoneNumber; + } + + public String getProjectDesc() { + return projectDesc; + } + + public void setProjectDesc(String projectDesc) { + this.projectDesc = projectDesc; + } + + public String getProjectRangeAndContent() { + return projectRangeAndContent; + } + + public void setProjectRangeAndContent(String projectRangeAndContent) { + this.projectRangeAndContent = projectRangeAndContent; + } + + public String getSupplierWorkerCountmax() { + return supplierWorkerCountmax; + } + + public void setSupplierWorkerCountmax(String supplierWorkerCountmax) { + this.supplierWorkerCountmax = supplierWorkerCountmax; + } + + public String getSupplierWorkerCountave() { + return supplierWorkerCountave; + } + + public void setSupplierWorkerCountave(String supplierWorkerCountave) { + this.supplierWorkerCountave = supplierWorkerCountave; + } + + public String getProjectDeviceResult() { + return projectDeviceResult; + } + + public void setProjectDeviceResult(String projectDeviceResult) { + this.projectDeviceResult = projectDeviceResult; + } + + public String getBuyerLinkman() { + return buyerLinkman; + } + + public void setBuyerLinkman(String buyerLinkman) { + this.buyerLinkman = buyerLinkman; + } + + public String getIsHavrAccessory() { + return isHavrAccessory; + } + + public void setIsHavrAccessory(String isHavrAccessory) { + this.isHavrAccessory = isHavrAccessory; + } + + public String getIsOurCompanyProject() { + return isOurCompanyProject; + } + + public void setIsOurCompanyProject(String isOurCompanyProject) { + this.isOurCompanyProject = isOurCompanyProject; + } + + public String getServiceScope() { + return serviceScope; + } + + public void setServiceScope(String serviceScope) { + this.serviceScope = serviceScope; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDevicetypeSpecification() { + return devicetypeSpecification; + } + + public void setDevicetypeSpecification(String devicetypeSpecification) { + this.devicetypeSpecification = devicetypeSpecification; + } + + public String getTotalCapacity() { + return totalCapacity; + } + + public void setTotalCapacity(String totalCapacity) { + this.totalCapacity = totalCapacity; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getContractTime() { + return contractTime; + } + + public void setContractTime(String contractTime) { + this.contractTime = contractTime; + } + + public String getCommissioningTime() { + return commissioningTime; + } + + public void setCommissioningTime(String commissioningTime) { + this.commissioningTime = commissioningTime; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getProjectScale() { + return projectScale; + } + + public void setProjectScale(String projectScale) { + this.projectScale = projectScale; + } + + public String getProfessionalNumber() { + return professionalNumber; + } + + public void setProfessionalNumber(String professionalNumber) { + this.professionalNumber = professionalNumber; + } + + public String getProfessionalWorkload() { + return professionalWorkload; + } + + public void setProfessionalWorkload(String professionalWorkload) { + this.professionalWorkload = professionalWorkload; + } + + public String getPartnerProfessionalWorkload() { + return partnerProfessionalWorkload; + } + + public void setPartnerProfessionalWorkload(String partnerProfessionalWorkload) { + this.partnerProfessionalWorkload = partnerProfessionalWorkload; + } + + public String getSupervisionCcontent() { + return supervisionCcontent; + } + + public void setSupervisionCcontent(String supervisionCcontent) { + this.supervisionCcontent = supervisionCcontent; + } + + public String getSupervisionResult() { + return supervisionResult; + } + + public void setSupervisionResult(String supervisionResult) { + this.supervisionResult = supervisionResult; + } + + public String getKeyStaffProfessionalAndDuty() { + return keyStaffProfessionalAndDuty; + } + + public void setKeyStaffProfessionalAndDuty(String keyStaffProfessionalAndDuty) { + this.keyStaffProfessionalAndDuty = keyStaffProfessionalAndDuty; + } + + public String getServiceDesc() { + return serviceDesc; + } + + public void setServiceDesc(String serviceDesc) { + this.serviceDesc = serviceDesc; + } + + public String getExecutionDate() { + return executionDate; + } + + public void setExecutionDate(String executionDate) { + this.executionDate = executionDate; + } + + public String getProjectScaleAndType() { + return projectScaleAndType; + } + + public void setProjectScaleAndType(String projectScaleAndType) { + this.projectScaleAndType = projectScaleAndType; + } + + public String getDesignStage() { + return designStage; + } + + public void setDesignStage(String designStage) { + this.designStage = designStage; + } + + public String getDesignRange() { + return designRange; + } + + public void setDesignRange(String designRange) { + this.designRange = designRange; + } + + public String getCooperationWay() { + return cooperationWay; + } + + public void setCooperationWay(String cooperationWay) { + this.cooperationWay = cooperationWay; + } + + public String getContractExecuteCondition() { + return contractExecuteCondition; + } + + public void setContractExecuteCondition(String contractExecuteCondition) { + this.contractExecuteCondition = contractExecuteCondition; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/ProfitlossSheet.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ProfitlossSheet.java new file mode 100644 index 00000000..bef3045f --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ProfitlossSheet.java @@ -0,0 +1,132 @@ +package com.gx.obe.struct.beans; + +import java.math.BigDecimal; + +/** + * @Description: æŸç›Šè¡¨ + * @author chenxw + */ +public class ProfitlossSheet { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 财务ID + */ + private String financeId; + /** + * 主è¥ä¸šåŠ¡æ”¶å…¥å‡€é¢ + */ + private BigDecimal mainIncome; + /** + * 主è¥ä¸šåŠ¡æˆæœ¬ + */ + private BigDecimal mainCost; + /** + * 财务费用 + */ + private BigDecimal financialCost; + /** + * å…¶ä»–æˆæœ¬è´¹ç”¨ + */ + private BigDecimal otherCosts; + /** + * å…¶ä¸ï¼šæŠ€æœ¯å¼€å‘ã€è½¬è®©è´¹ç”¨ + */ + private BigDecimal developmentAndTransferCosts; + /** + * åˆ©æ¶¦æ€»é¢ + */ + private BigDecimal profitLossprofit; + /** + * 净利润 + */ + private BigDecimal profitRetainedProfits; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getFinanceId() { + return financeId; + } + + public void setFinanceId(String financeId) { + this.financeId = financeId; + } + + public BigDecimal getMainIncome() { + return mainIncome; + } + + public void setMainIncome(BigDecimal mainIncome) { + this.mainIncome = mainIncome; + } + + public BigDecimal getMainCost() { + return mainCost; + } + + public void setMainCost(BigDecimal mainCost) { + this.mainCost = mainCost; + } + + public BigDecimal getFinancialCost() { + return financialCost; + } + + public void setFinancialCost(BigDecimal financialCost) { + this.financialCost = financialCost; + } + + public BigDecimal getOtherCosts() { + return otherCosts; + } + + public void setOtherCosts(BigDecimal otherCosts) { + this.otherCosts = otherCosts; + } + + public BigDecimal getDevelopmentAndTransferCosts() { + return developmentAndTransferCosts; + } + + public void setDevelopmentAndTransferCosts(BigDecimal developmentAndTransferCosts) { + this.developmentAndTransferCosts = developmentAndTransferCosts; + } + + public BigDecimal getProfitLossprofit() { + return profitLossprofit; + } + + public void setProfitLossprofit(BigDecimal profitLossprofit) { + this.profitLossprofit = profitLossprofit; + } + + public BigDecimal getProfitRetainedProfits() { + return profitRetainedProfits; + } + + public void setProfitRetainedProfits(BigDecimal profitRetainedProfits) { + this.profitRetainedProfits = profitRetainedProfits; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/ProjectLeader.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ProjectLeader.java new file mode 100644 index 00000000..0c02d4b1 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ProjectLeader.java @@ -0,0 +1,216 @@ +package com.gx.obe.struct.beans; + +import java.util.List; + +/** + * @author mazc + * @Description: + */ +public class ProjectLeader { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 模型数æ®ID + */ + private String modelDataId; + /** + * å…¬å¸åç§° + */ + private String companyName; + /** + * å§“å + */ + private String leaderName; + /** + * 身份è¯å· + */ + private String idnumber; + /** + * 年龄 + */ + private String age; + /** + * èŒåŠ¡åç§° + */ + private String jobTitle; + /** + * 工作ç»éªŒï¼ˆå¹´ï¼‰ + */ + private String workExperience; + /** + * 当å‰ä¸“ä¸šå·¥ä½œå¹´é™ + */ + private String currentMajorExperience; + /** + * æ¯•ä¸šå¦æ ¡ + */ + private String graduateSchool; + /** + * 毕业专业 + */ + private String graduateMajor; + /** + * å¦åކ + */ + private String education; + /** + * èŒç§° + */ + private String professionalTitle; + /** + * 是å¦ä¸ºé¡¹ç›®è´Ÿè´£äºº + */ + private String isLeaderFlag; + /** + * è¯ä¹¦åˆ—表 + */ + private List<Certificate> certificateList; + /** + * 工作ç»åކ + */ + private List<WorkExperience> workExperienceList; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getModelDataId() { + return modelDataId; + } + + public void setModelDataId(String modelDataId) { + this.modelDataId = modelDataId; + } + + public String getLeaderName() { + return leaderName; + } + + public void setLeaderName(String leaderName) { + this.leaderName = leaderName; + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getJobTitle() { + return jobTitle; + } + + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } + + public String getWorkExperience() { + return workExperience; + } + + public void setWorkExperience(String workExperience) { + this.workExperience = workExperience; + } + + public List<Certificate> getCertificateList() { + return certificateList; + } + + public void setCertificateList(List<Certificate> certificateList) { + this.certificateList = certificateList; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCurrentMajorExperience() { + return currentMajorExperience; + } + + public void setCurrentMajorExperience(String currentMajorExperience) { + this.currentMajorExperience = currentMajorExperience; + } + + public String getGraduateSchool() { + return graduateSchool; + } + + public void setGraduateSchool(String graduateSchool) { + this.graduateSchool = graduateSchool; + } + + public String getGraduateMajor() { + return graduateMajor; + } + + public void setGraduateMajor(String graduateMajor) { + this.graduateMajor = graduateMajor; + } + + public String getEducation() { + return education; + } + + public void setEducation(String education) { + this.education = education; + } + + public List<WorkExperience> getWorkExperienceList() { + return workExperienceList; + } + + public void setWorkExperienceList(List<WorkExperience> workExperienceList) { + this.workExperienceList = workExperienceList; + } + + public String getProfessionalTitle() { + return professionalTitle; + } + + public void setProfessionalTitle(String professionalTitle) { + this.professionalTitle = professionalTitle; + } + + public String getIsLeaderFlag() { + return isLeaderFlag; + } + + public void setIsLeaderFlag(String isLeaderFlag) { + this.isLeaderFlag = isLeaderFlag; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/Qualification.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Qualification.java new file mode 100644 index 00000000..45d34844 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/Qualification.java @@ -0,0 +1,154 @@ +package com.gx.obe.struct.beans; + +/** + * @author mazc + * @Description: + */ +public class Qualification { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 模型数æ®ID + */ + private String modelDataId; + /** + * è¯ä¹¦åç§° + */ + private String certificateName; + /** + * 获奖工程åç§° + */ + private String awardProjectName; + /** + * å•ä½åç§° + */ + private String companyName; + /** + * è¯ä¹¦ç‰çº§ + */ + private String awardLevel; + /** + * è¯ä¹¦ç¼–å· + */ + private String certificateNumber; + /** + * å‘è¯æœºå…³ï¼ˆè®¤è¯å•ä½ï¼‰ + */ + private String issueAuthority; + /** + * å‘è¯æ—¥æœŸ + */ + private String issueDate; + /** + * 有效期至 + */ + private String periodValidity; + /** + * 获奖工程åç§° + */ + private String projectName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getModelDataId() { + return modelDataId; + } + + public void setModelDataId(String modelDataId) { + this.modelDataId = modelDataId; + } + + public String getCertificateName() { + return certificateName; + } + + public void setCertificateName(String certificateName) { + this.certificateName = certificateName; + } + + public String getAwardProjectName() { + return awardProjectName; + } + + public void setAwardProjectName(String awardProjectName) { + this.awardProjectName = awardProjectName; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getAwardLevel() { + return awardLevel; + } + + public void setAwardLevel(String awardLevel) { + this.awardLevel = awardLevel; + } + + public String getCertificateNumber() { + return certificateNumber; + } + + public void setCertificateNumber(String certificateNumber) { + this.certificateNumber = certificateNumber; + } + + public String getIssueAuthority() { + return issueAuthority; + } + + public void setIssueAuthority(String issueAuthority) { + this.issueAuthority = issueAuthority; + } + + public String getIssueDate() { + return issueDate; + } + + public void setIssueDate(String issueDate) { + this.issueDate = issueDate; + } + + public String getPeriodValidity() { + return periodValidity; + } + + public void setPeriodValidity(String periodValidity) { + this.periodValidity = periodValidity; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/RespItemDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/RespItemDO.java new file mode 100644 index 00000000..ac07b5d2 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/RespItemDO.java @@ -0,0 +1,82 @@ +package com.gx.obe.struct.beans; +/** + * æ ‡ä¹¦å®šä½ + * @author dell + * + */ +public class RespItemDO { + +// <RespItem evalFactorId="630d6016d5234dbea9d311e0446b2298" fileId="55961ba60deba50831be7cc254b09201" fileName="商务部分--测试.pdf"> +// <id>23a81f9448314bc99127036432262165</id> +// <pageNumber>1</pageNumber> +// <endPageNumber>3</endPageNumber> +// <name>(1-3)商务部分--测试</name> +// <isNewRespItemInEditor>false</isNewRespItemInEditor> +// <IsUserBindInFactor>true</IsUserBindInFactor> +// </RespItem> + + private String evalFactorId; + + private String fileId; + + private String fileName; + + private String pageNumber; + + private String endPageNumber; + + private String name; + + public String getPage() { + return "ã€P" + pageNumber + "-" + endPageNumber + "页】"; + } + + public String getEvalFactorId() { + return evalFactorId; + } + + public void setEvalFactorId(String evalFactorId) { + this.evalFactorId = evalFactorId; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getPageNumber() { + return pageNumber; + } + + public void setPageNumber(String pageNumber) { + this.pageNumber = pageNumber; + } + + public String getEndPageNumber() { + return endPageNumber; + } + + public void setEndPageNumber(String endPageNumber) { + this.endPageNumber = endPageNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/ScoreOptionsDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ScoreOptionsDO.java new file mode 100644 index 00000000..10d4cf85 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/ScoreOptionsDO.java @@ -0,0 +1,35 @@ +package com.gx.obe.struct.beans; + +public class ScoreOptionsDO { + /** + * @Description: 评审得分项id + */ + private String scoreItemId; + /** + * @Description: 评审项åç§° + */ + private String name; + /** + * @Description: 得分 + */ + private String score; + public String getScoreItemId() { + return scoreItemId; + } + public void setScoreItemId(String scoreItemId) { + this.scoreItemId = scoreItemId; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getScore() { + return score; + } + public void setScore(String score) { + this.score = score; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/SelfEvalParamsDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/SelfEvalParamsDO.java new file mode 100644 index 00000000..db9865a1 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/SelfEvalParamsDO.java @@ -0,0 +1,70 @@ +package com.gx.obe.struct.beans; + +import java.util.ArrayList; +import java.util.List; + +import com.gx.obe.http.json.JsonUtil; + + +/** + * 供应商自我评结构化å“应内容 + * @author gnauh + * + */ +public class SelfEvalParamsDO { + +// <paramValueList> +// <paramValue> +// <dataType><![CDATA[string]]></dataType> +// <dataValue><![CDATA[4bbd0336c9624562a6b3639d92824ff5]]></dataValue> +// </paramValue> +// </paramValueList> + + /** + * 下拉选项内容 + */ + private List<ParamValueDO> paramValueList; + + public String toJson() { + return JsonUtil.jsonObjectToStr(this); + } + + public List<ParamValueDO> getParamValueList() { + return paramValueList; + } + + public void setParamValueList(List<ParamValueDO> paramValueList) { + this.paramValueList = paramValueList; + } + + public void clearParamValue() { + if(null != paramValueList) { + paramValueList.clear(); + } + } + public void addParamValue(ParamValueDO paramValueDO) { + if(null == paramValueList) { + paramValueList = new ArrayList<ParamValueDO>(); + } + paramValueList.add(paramValueDO); + } + + /** + * 获å–选项值 + */ + public String getSelectParamValue() { + if(null != paramValueList && paramValueList.size() > 0) { + return paramValueList.get(paramValueList.size() -1).getDataValue(); + } + return null; + } + /** + * 获å–选项值 + */ + public void setSelectParamValue(String dataValue) { + if(null != paramValueList && paramValueList.size() > 0) { + paramValueList.get(paramValueList.size() -1).setDataValue(dataValue);; + } + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/StructDateInfo.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/StructDateInfo.java new file mode 100644 index 00000000..2f5770e5 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/StructDateInfo.java @@ -0,0 +1,59 @@ +package com.gx.obe.struct.beans; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class StructDateInfo { + + private final List<TemplateDataItem> templateDataItemList = new CopyOnWriteArrayList<>(); + private final List<TemplateTable> templateTableList = new CopyOnWriteArrayList<>(); + private final List<ModelData> modelDataList = new CopyOnWriteArrayList<>(); + private final List<BusinessLicense> businessLicenseList = new CopyOnWriteArrayList<>(); + private final List<Finance> financeList = new CopyOnWriteArrayList<>(); + private final List<Performance> performanceList = new CopyOnWriteArrayList<>(); + private final List<BidderBasicInfo> bidderBasicInfoList = new CopyOnWriteArrayList<>(); + private final List<Qualification> qualificationList = new CopyOnWriteArrayList<>(); + private final List<ProjectLeader> projectLeaderList = new CopyOnWriteArrayList<>(); + private final List<AttachmentFile> attachmentFileList = new CopyOnWriteArrayList<>(); + + public List<TemplateTable> getTemplateTableList() { + return templateTableList; + } + + public List<ModelData> getModelDataList() { + return modelDataList; + } + + public List<BusinessLicense> getBusinessLicenseList() { + return businessLicenseList; + } + + public List<Finance> getFinanceList() { + return financeList; + } + + public List<Performance> getPerformanceList() { + return performanceList; + } + + public List<BidderBasicInfo> getBidderBasicInfoList() { + return bidderBasicInfoList; + } + + public List<Qualification> getQualificationList() { + return qualificationList; + } + + public List<ProjectLeader> getProjectLeaderList() { + return projectLeaderList; + } + + public List<TemplateDataItem> getTemplateDataItemList() { + return templateDataItemList; + } + + public List<AttachmentFile> getAttachmentFileList() { + return attachmentFileList; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateDataItem.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateDataItem.java new file mode 100644 index 00000000..c72117ec --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateDataItem.java @@ -0,0 +1,100 @@ +package com.gx.obe.struct.beans; + +/** + * @author mazc + * @Description: + */ +public class TemplateDataItem { + + private String id; + private String tenderId; + private String supplierId; + private String relChapterType; + private String dataCode; + private String name; + private String value; + private String type; + private String dataType; + private String unit; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getRelChapterType() { + return relChapterType; + } + + public void setRelChapterType(String relChapterType) { + this.relChapterType = relChapterType; + } + + public String getDataCode() { + return dataCode; + } + + public void setDataCode(String dataCode) { + this.dataCode = dataCode; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateTable.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateTable.java new file mode 100644 index 00000000..f54b6e52 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/TemplateTable.java @@ -0,0 +1,82 @@ +package com.gx.obe.struct.beans; + +/** + * @Description: å°èŒƒæœ¬è¡¨æ ¼ + * @author chenxw + */ +public class TemplateTable { + + private String id; + private String tenderId; + private String supplierId; + private String relChapterType; + private String dataCode; + private String xmlPath; + private String tableName; + private String tableInfo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getRelChapterType() { + return relChapterType; + } + + public void setRelChapterType(String relChapterType) { + this.relChapterType = relChapterType; + } + + public String getDataCode() { + return dataCode; + } + + public void setDataCode(String dataCode) { + this.dataCode = dataCode; + } + + public String getXmlPath() { + return xmlPath; + } + + public void setXmlPath(String xmlPath) { + this.xmlPath = xmlPath; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getTableInfo() { + return tableInfo; + } + + public void setTableInfo(String tableInfo) { + this.tableInfo = tableInfo; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/TimeModelDO.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/TimeModelDO.java new file mode 100644 index 00000000..7f872429 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/TimeModelDO.java @@ -0,0 +1,138 @@ +package com.gx.obe.struct.beans; + +public class TimeModelDO { + + /** + * @Description: 基础分 + */ + private String baseScore; + /** + * @Description: æ–¹å¼ï¼šæ–¹å¼1 01,方å¼2 02 æ–¹å¼1 会用到以下节点 æ–¹å¼2 åªä¼šç”¨åˆ°äº¤è´§æ—¥æœŸï¼Œåªèƒ½ä¾›åº”商å“应是æ‰å‡ºçް + */ + private String mode; + /** + * @Description: 日期:yyyy-MM-dd HH:mm + */ + private String deliveryDate; + /** + * @Description: 天数1:å¯å¡« + */ + private String dayFirst; + /** + * @Description: 类型1:扣分01 + */ + private String dealTypeFirst; + /** + * @Description: 分值1 + */ + private String dealScoreFirst; + /** + * @Description: 天数2:å¯å¡« + */ + private String daySecond; + /** + * @Description: 类型2:扣分01 + */ + private String dealTypeSecond; + /** + * @Description: 分值2 + */ + private String dealScoreSecond; + /** + * @Description: 是å¦é¡¹ï¼šæ˜¯ 01ï¼Œå¦ 00 + */ + private String option; + /** + * @Description: 备注:å¯å¡« + */ + private String memo; + + public String getBaseScore() { + return baseScore; + } + + public void setBaseScore(String baseScore) { + this.baseScore = baseScore; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getDeliveryDate() { + return deliveryDate; + } + + public void setDeliveryDate(String deliveryDate) { + this.deliveryDate = deliveryDate; + } + + public String getDayFirst() { + return dayFirst; + } + + public void setDayFirst(String dayFirst) { + this.dayFirst = dayFirst; + } + + public String getDealTypeFirst() { + return dealTypeFirst; + } + + public void setDealTypeFirst(String dealTypeFirst) { + this.dealTypeFirst = dealTypeFirst; + } + + public String getDealScoreFirst() { + return dealScoreFirst; + } + + public void setDealScoreFirst(String dealScoreFirst) { + this.dealScoreFirst = dealScoreFirst; + } + + public String getDaySecond() { + return daySecond; + } + + public void setDaySecond(String daySecond) { + this.daySecond = daySecond; + } + + public String getDealTypeSecond() { + return dealTypeSecond; + } + + public void setDealTypeSecond(String dealTypeSecond) { + this.dealTypeSecond = dealTypeSecond; + } + + public String getDealScoreSecond() { + return dealScoreSecond; + } + + public void setDealScoreSecond(String dealScoreSecond) { + this.dealScoreSecond = dealScoreSecond; + } + + public String getOption() { + return option; + } + + public void setOption(String option) { + this.option = option; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/beans/WorkExperience.java b/com.gx.obe.struct/src/com/gx/obe/struct/beans/WorkExperience.java new file mode 100644 index 00000000..c124ea48 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/beans/WorkExperience.java @@ -0,0 +1,126 @@ +package com.gx.obe.struct.beans; + +public class WorkExperience { + + /** + * 主键 + */ + private String id; + /** + * 项目ID + */ + private String tenderId; + /** + * 项目负责人ID + */ + private String projectLeaderId; + /** + * æ—¶é—´ + */ + private String time; + /** + * å‚åŠ çš„ç±»ä¼¼é¡¹ç›® + */ + private String projectName; + /** + * æ‹…ä»»èŒåŠ¡ + */ + private String jobTitle; + /** + * å‘包人åŠå…¶è”ç³»è”ç³»ç”µè¯ + */ + private String contractInfo; + /** + * 承担的工作 + */ + private String bearWork; + /** + * 容é‡ï¼ˆMW) + */ + private String capacity; + /** + * æŽ’åº + */ + private int sortNo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenderId() { + return tenderId; + } + + public void setTenderId(String tenderId) { + this.tenderId = tenderId; + } + + public String getProjectLeaderId() { + return projectLeaderId; + } + + public void setProjectLeaderId(String projectLeaderId) { + this.projectLeaderId = projectLeaderId; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getJobTitle() { + return jobTitle; + } + + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } + + public String getContractInfo() { + return contractInfo; + } + + public void setContractInfo(String contractInfo) { + this.contractInfo = contractInfo; + } + + public int getSortNo() { + return sortNo; + } + + public void setSortNo(int sortNo) { + this.sortNo = sortNo; + } + + public String getBearWork() { + return bearWork; + } + + public void setBearWork(String bearWork) { + this.bearWork = bearWork; + } + + public String getCapacity() { + return capacity; + } + + public void setCapacity(String capacity) { + this.capacity = capacity; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/AttachmentComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/AttachmentComposite.java new file mode 100644 index 00000000..4e35993f --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/AttachmentComposite.java @@ -0,0 +1,56 @@ +package com.gx.obe.struct.composite; + +import java.io.File; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.common.file.widget.FileButton; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.component.utils.CompositeUtils; +import com.gx.obe.components.core.Constants; +import com.gx.obe.struct.beans.AttachmentFile; +import com.gx.obe.struct.service.AttachmentFileService; + +public class AttachmentComposite extends Composite { + + private final AttachmentFileService attachmentFileService = new AttachmentFileService(); + + private final Prop<List<AttachmentFile>> attachmentFileList = new Prop<>(); + + private final String tenderId; + + private String bidFilePath; + + public AttachmentComposite(Composite parent, String tenderId) { + super(parent, SWT.NONE); + this.tenderId = tenderId; + + RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL); + rowLayout.marginRight = 5; + rowLayout.marginLeft = 5; + rowLayout.marginBottom = 5; + rowLayout.marginTop = 5; + rowLayout.spacing = 5; + setLayout(rowLayout); + + attachmentFileList.bind(l -> { + CompositeUtils.disposeChildren(this); + l.forEach(t -> new FileButton(this, new File(bidFilePath + t.getFileUrl()), t.getFileName())); + this.layout(); + }); + + } + + public void refresh(String supplierId, String businessId) { + bidFilePath = Constants.getBidFilePath(tenderId, supplierId); + RxSwt.run(() -> attachmentFileService.getAttachmentFileList(businessId)).checkWidget(this).exe(attachmentFileList::set); + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/ClearBidReviewEntryComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/ClearBidReviewEntryComposite.java new file mode 100644 index 00000000..17114e51 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/ClearBidReviewEntryComposite.java @@ -0,0 +1,317 @@ +package com.gx.obe.struct.composite; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.core.widgets.ELink; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.core.widgets.ImageButton; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.common.icons.IconsActivator; +import com.gx.obe.common.widget.button.EvaluationButton; +import com.gx.obe.common.widget.text.EvalFactorText; +import com.gx.obe.struct.dialog.EditOpinionShell; +import com.gx.obe.struct.enums.EvaluationFactorTypeEnum; +import com.gx.obe.struct.listener.EditOpinionListener; +import com.gx.obe.struct.listener.ReturnListener; +import com.gx.obe.util.utils.ObjectUtils; +import com.gx.obe.util.utils.StringUtils; +import com.gx.obe.util.utils.UuidUtils; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; +import com.gx.obe.web.service.SupplierEvaluationFactorService; +import com.swtdesigner.ResourceManager; +import com.swtdesigner.SWTResourceManager; + +public class ClearBidReviewEntryComposite extends Composite { + + private final SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + + private final Prop<EvaluationFactor> evaluationFactorProp = new Prop<>(); + + private final Prop<EvaluationContentData> evaluationContentData = new Prop<>(); + private final List<ReturnListener> returnListenerList = new ArrayList<>(); + + private class EvaluationContentData { + private String supplierId; + private String factorCode; + private EvaluationFactorTypeEnum factorTypeEnum; + } + private EvaluationFactor curFactor; + private SupplierEvaluationFactor supplierEvaluationFactor; + private Composite factorOpinionComposite; + private Text opinionText; + private Text supplierOpinionText; + private ImageButton opinionBtn; + + private ImageButton supplierOpinionBtn; + + private EvaluationButton saveBtn; + + private Label wordCountLabel; + + private ELink editOpinionLink; + + private EvaluationButton backBtn; + + public ClearBidReviewEntryComposite(Composite parent, String tenderId) { + super(parent, SWT.NONE); + + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gridLayout = new GridLayout(3, false); + gridLayout.horizontalSpacing = 0; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + EvaluationContentComposite composite = new EvaluationContentComposite(this, tenderId); + GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_composite.widthHint = 600; + composite.setLayoutData(gd_composite); + evaluationContentData.bind(t -> composite.refresh(t.supplierId, t.factorCode, t.factorTypeEnum)); + + ESepator label = new ESepator(this, SWT.VERTICAL); + label.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 1)); + label.setBackground(ColorConstants.BORDER_LINE_COLOR); + + Composite composite_1 = new Composite(this, SWT.NONE); + composite_1.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_LIGHT_SHADOW)); + GridLayout gl_composite_1 = new GridLayout(1, false); + gl_composite_1.verticalSpacing = 1; + gl_composite_1.marginHeight = 0; + gl_composite_1.marginWidth = 0; + composite_1.setLayout(gl_composite_1); + GridData gd_composite_1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_composite_1.widthHint = 400; + composite_1.setLayoutData(gd_composite_1); + + Composite composite_2 = new Composite(composite_1, SWT.NONE); + composite_2.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + composite_2.setLayout(new GridLayout(1, false)); + GridData gd_composite_2 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_composite_2.heightHint = 260; + composite_2.setLayoutData(gd_composite_2); + + EvalFactorText text = new EvalFactorText(composite_2); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + evaluationFactorProp.bind(text::refresh); + + Composite selfOpinionComposite = new Composite(composite_1, SWT.NONE); + selfOpinionComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); + GridLayout gl_selfOpinion = new GridLayout(1, false); + gl_selfOpinion.marginWidth = 0; + gl_selfOpinion.marginHeight = 0; + selfOpinionComposite.setLayout(gl_selfOpinion); + selfOpinionComposite.setBackground(SWTResourceManager.getColor(240, 240, 240)); + selfOpinionComposite.setBackgroundMode(SWT.INHERIT_FORCE); + + supplierOpinionBtn = new ImageButton(selfOpinionComposite, SWT.NONE); + supplierOpinionBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + supplierOpinionBtn.setLeftMargin(20); + supplierOpinionBtn.setRightMargin(20); + supplierOpinionBtn.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); + supplierOpinionBtn.setText("自评æ„è§"); + setanswerBtnCss(supplierOpinionBtn); + + Composite selfOpinionTextComposite = new Composite(composite_1, SWT.NONE); + selfOpinionTextComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + selfOpinionTextComposite.setBackgroundMode(SWT.INHERIT_FORCE); + GridData gd_selfOpinionTextComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_selfOpinionTextComposite.heightHint = 150; + selfOpinionTextComposite.setLayoutData(gd_selfOpinionTextComposite); + selfOpinionTextComposite.setLayout(new GridLayout(1, false)); + + supplierOpinionText = new Text(selfOpinionTextComposite, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL); + supplierOpinionText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + supplierOpinionText.setEditable(false); + + Composite opinionComposite = new Composite(composite_1, SWT.NONE); + opinionComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); + GridLayout gl_opinion = new GridLayout(1, false); + gl_opinion.marginWidth = 0; + gl_opinion.marginHeight = 0; + opinionComposite.setLayout(gl_opinion); + opinionComposite.setBackground(SWTResourceManager.getColor(240, 240, 240)); + opinionComposite.setBackgroundMode(SWT.INHERIT_FORCE); + + opinionBtn = new ImageButton(opinionComposite, SWT.NONE); + opinionBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + opinionBtn.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); + opinionBtn.setText("评议æ„è§"); + setanswerBtnCss(opinionBtn); + + factorOpinionComposite = new Composite(composite_1, SWT.NONE); + factorOpinionComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + factorOpinionComposite.setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gl_factorOpinionComposite = new GridLayout(2, false); + gl_factorOpinionComposite.marginHeight = 0; + gl_factorOpinionComposite.marginWidth = 0; + factorOpinionComposite.setLayout(gl_factorOpinionComposite); + GridData gd_factorOpinionComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_factorOpinionComposite.heightHint = 180; + factorOpinionComposite.setLayoutData(gd_factorOpinionComposite);; + + opinionText = new Text(factorOpinionComposite, SWT.WRAP | SWT.V_SCROLL); + opinionText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));; + opinionText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent arg0) { + wordCountLabel.setText(opinionText.getText().length() +"/2000"); + } + }); + opinionText.setTextLimit(2000); + opinionText.setEditable(false); + + wordCountLabel = new Label(factorOpinionComposite, SWT.NONE); + wordCountLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));; + wordCountLabel.setText("0/2000"); + + editOpinionLink = new ELink(factorOpinionComposite, SWT.NONE); + editOpinionLink.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));; + editOpinionLink.setText("修改"); + editOpinionLink.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/edit.png")); + editOpinionLink.addMouseListener(new MouseAdapter() { + public void mouseUp(MouseEvent e) { + editOpinionAction(); + } + }); + + Composite buttonComposite = new Composite(composite_1, SWT.NONE); + buttonComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + buttonComposite.setLayout(new GridLayout(2, false)); + buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + saveBtn = new EvaluationButton(buttonComposite, SWT.NONE); + saveBtn.addMouseListener(MouseListener.mouseUpAdapter($ -> saveAction())); + saveBtn.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1)); + saveBtn.setText("ä¿å˜"); + + backBtn = new EvaluationButton(buttonComposite, SWT.NONE); + backBtn.addMouseListener(MouseListener.mouseUpAdapter($ -> returnAction())); + backBtn.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1)); + backBtn.setText("返回"); + } + + public void refresh(EvaluationFactor evaluationFactor, SupplierEvaluationFactor supplierEvaluationFactor, EvaluationFactorTypeEnum factorTypeEnum) { + this.supplierEvaluationFactor = supplierEvaluationFactor; + this.evaluationFactorProp.set(evaluationFactor); + this.curFactor = evaluationFactor; + EvaluationContentData data = new EvaluationContentData(); + data.supplierId = supplierEvaluationFactor.getSupplierId(); + data.factorCode = supplierEvaluationFactor.getFactorCode(); + data.factorTypeEnum = factorTypeEnum; + this.evaluationContentData.set(data); + saveBtn.setEnabled(false); + opinionText.setText(ObjectUtils.getObjString(supplierEvaluationFactor.getOpinion())); + opinionText.setToolTipText(supplierEvaluationFactor.getModifyReason()); + supplierOpinionText.setText(ObjectUtils.getObjString(supplierEvaluationFactor.getFactorResponse())); + } + + /** + * @Description: è®¾ç½®æŒ‡æ ‡åˆ†ç±»çš„æŒ‰é’® + * @author wangxiang + * @param imageBtn + */ + private void setanswerBtnCss(ImageButton imageBtn) { + imageBtn.setRightMargin(10); + imageBtn.setLeftMargin(10); + imageBtn.setTopMargin(5); + imageBtn.setBottomMargin(5); + imageBtn.setRightMargin(20); + imageBtn.setLeftMargin(20); + imageBtn.setTopMargin(5); + imageBtn.setBottomMargin(5); + imageBtn.setRightMargin(10); + imageBtn.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); + imageBtn.setForeground(ColorConstants.SKIN_SELECTOIN_FOREGROUND); + imageBtn.setBackgroundColor(ColorConstants.SKIN_BG); + + } + + public void addReturnListener(ReturnListener returnListener) { + this.returnListenerList.add(returnListener); + } + + /** + * 修改评审æ„è§ + */ + private void editOpinionAction() { + + if (null != supplierEvaluationFactor) { + opinionText.setText(ObjectUtils.getObjString(supplierEvaluationFactor.getOpinion())); + final boolean saveBtnIsEnabled = saveBtn.getEnabled(); + saveBtn.setEnabled(false); + EditOpinionShell editOpinionShell = new EditOpinionShell(getShell(), curFactor, supplierEvaluationFactor, new EditOpinionListener() { + @Override + public void editOpinion(String opinion, String modifyReason) { + saveBtn.setEnabled(true); + opinionText.setText(ObjectUtils.getObjString(opinion)); + opinionText.setToolTipText(modifyReason); + supplierEvaluationFactor.setModifyReason(modifyReason); + } + @Override + public void cancle() { + saveBtn.setEnabled(saveBtnIsEnabled); + } + }); + if (null != editOpinionShell && !editOpinionShell.isDisposed()) { + // 设置界é¢ä½ç½® + editOpinionShell.setLocation(factorOpinionComposite.toDisplay(0, 0)); + Rectangle rectangle = factorOpinionComposite.getBounds(); + // 设置界é¢å¤§å° + editOpinionShell.setSize(rectangle.width, rectangle.height); + editOpinionShell.open(); + } + } + } + + private void saveAction() { + if(!saveBtn.getEnabled())return; + if(opinionText.getText().trim().length() == 0) { + MessageDialog.openShortMessage("评议æ„è§ä¸èƒ½ä¸ºç©ºï¼"); + return; + } + saveBtn.setEnabled(false); + backBtn.setEnabled(false); + supplierEvaluationFactor.setOpinion(opinionText.getText()); + boolean saveFlag = false; + if (StringUtils.isEmpty(supplierEvaluationFactor.getId())) { + supplierEvaluationFactor.setId(UuidUtils.getUUID()); + saveFlag = supplierEvaluationFactorService.insert(supplierEvaluationFactor); + } else { + // TODO 这里需è¦ä¿å˜ä¿®æ”¹åŽŸå› + saveFlag = supplierEvaluationFactorService.updateAssignProperty(supplierEvaluationFactor, new String[] { "opinion", "factorResponse","modifyReason" ,"paramValues"}); +// saveFlag = supplierEvaluationFactorService.updateAssignProperty(supplierEvaluationFactor, new String[] { "opinion", "factorResponse" ,"paramValues"}); + } + if(saveFlag) { + MessageDialog.openShortMessage("ä¿å˜æˆåŠŸï¼"); + + }else { + MessageDialog.openWarning(getShell(), "ä¿å˜å¤±è´¥ï¼"); + saveBtn.setEnabled(true); + } + backBtn.setEnabled(true); + } + + private void returnAction() { + returnListenerList.forEach(l -> l.returnAction()); + } + + @Override + protected void checkSubclass() {} +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/EvaluationContentComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/EvaluationContentComposite.java new file mode 100644 index 00000000..d272a06e --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/EvaluationContentComposite.java @@ -0,0 +1,242 @@ +package com.gx.obe.struct.composite; + +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.widgets.ELink; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.common.widget.button.RectangleRadioButton; +import com.gx.obe.component.handler.TabHandler; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.components.core.Constants; +import com.gx.obe.components.core.global.Global; +import com.gx.obe.components.core.inter.PdfFileView; +import com.gx.obe.struct.beans.ModelData; +import com.gx.obe.struct.enums.DataCategoryEnum; +import com.gx.obe.struct.enums.EvaluationFactorTypeEnum; +import com.gx.obe.struct.enums.ModelDataTypeEnum; +import com.gx.obe.struct.handler.RelChapterTypeHandler; +import com.gx.obe.struct.parse.BidFileIndexTreeXmlParse; +import com.gx.obe.struct.service.EvaluationContentService; +import com.gx.obe.struct.service.ModelDataService; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.web.entity.evaluation.EvaluationContent; +import com.swtdesigner.SWTResourceManager; + +public class EvaluationContentComposite extends Composite { + + private final EvaluationContentService evaluationContentService = new EvaluationContentService(); + private final ModelDataService modelDataService = new ModelDataService(); + + private final String tenderId; + + private final Prop<EvaluationContentData> evaluationContentData = new Prop<>(); + private final Prop<PdfFileData> pdfFileData = new Prop<>(); + private final Prop<String> tips = new Prop<>(); + + private final Prop<Boolean> showFile = new Prop<>(); + private final Prop<Boolean> showSwitch = new Prop<>(false); + + private class RootNodeChapterData { + private String name; + private String type; + } + + private class EvaluationContentData { + private String supplierId; + private EvaluationFactorTypeEnum factorTypeEnum; + private List<EvaluationContent> evaluationContentList; + } + + private class PdfFileData { + private String url; + private int pageNum; + } + + public EvaluationContentComposite(Composite parent, String tenderId) { + super(parent, SWT.NONE); + this.tenderId = tenderId; + + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.verticalSpacing = 0; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + Composite composite_5 = new Composite(this, SWT.NONE); + composite_5.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); + GridLayout gl_composite_5 = new GridLayout(2, false); + gl_composite_5.marginHeight = 0; + gl_composite_5.marginWidth = 0; + composite_5.setLayout(gl_composite_5); + + Composite composite = new Composite(composite_5, SWT.NONE); + composite.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, true, 1, 1)); + RowLayout rl_composite = new RowLayout(SWT.HORIZONTAL); + rl_composite.marginBottom = 0; + rl_composite.marginTop = 0; + composite.setLayout(rl_composite); + + TabHandler<RectangleRadioButton> handler = new TabHandler<>(composite, t -> new RectangleRadioButton(t, SWT.NONE)); + + Composite composite_6 = new Composite(composite_5, SWT.NONE); + GridLayout gl_composite_6 = new GridLayout(1, false); + gl_composite_6.marginHeight = 4; + composite_6.setLayout(gl_composite_6); + + ELink link = new ELink(composite_6, SWT.NONE); + link.addMouseListener(MouseListener.mouseUpAdapter($ -> showFile.replace(t -> !t))); + link.setText("切æ¢è§†å›¾"); + showSwitch.bind(link::setVisible); + + ESepator label_1 = new ESepator(this, SWT.HORIZONTAL); + label_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + label_1.setBackground(ColorConstants.SKIN_BG); + + StackLayout stackLayout = new StackLayout(); + + Composite composite_1 = new Composite(this, SWT.NONE); + composite_1.setLayout(stackLayout); + composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + Consumer<Composite> topControl = t -> { + stackLayout.topControl = t; + composite_1.layout(); + }; + + ModelDataComposite composite_2 = new ModelDataComposite(composite_1, tenderId); + + Composite composite_3 = new Composite(composite_1, SWT.NONE); + composite_3.setLayout(new FillLayout(SWT.HORIZONTAL)); + + PdfFileView load = Global.PDF_FILE_VIEW.load(composite_3, SWT.NONE); + load.setFileNotExistMessage("文件ä¸å˜åœ¨ï¼Œè¯·æ£€æŸ¥æ˜¯å¦å·²ä¸‹è½½æŠ•æ ‡æ–‡ä»¶ï¼"); + pdfFileData.bind(t -> load.openFile(t.url, t.pageNum)); + + Composite composite_4 = new Composite(composite_1, SWT.NONE); + composite_4.setLayout(new GridLayout(1, false)); + + Label label = new Label(composite_4, SWT.WRAP); + label.setForeground(SWTResourceManager.getColor(200, 200, 200)); + label.setFont(SWTResourceManager.getFont("宋体", 20, SWT.BOLD)); + label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true, 1, 1)); + + tips.bind(t -> { + label.setText(t); + label.getParent().layout(); + }); + + showFile.bind(t -> { + if (t) topControl.accept(composite_3); + else topControl.accept(composite_2); + }); + + evaluationContentData.bind(d -> { + showSwitch.set(false); + handler.start(); + if (CollectionUtils.isNull(d.evaluationContentList)) { + rootNodeChapter(handler, d.factorTypeEnum, t -> { + showFile.set(true); + RxSwt.run(() -> getFilePath(d.supplierId, t.type)).checkWidget(this).exe(pdfFileData::set); + }); + } else { + handler.listHand(d.evaluationContentList, EvaluationContent::getEvalPointName, t -> { + showSwitch.set(false); + switch (DataCategoryEnum.MAP.getOrDefault(t.getDataCategory(), DataCategoryEnum.NULL)) { + case MD: + getModelData(t.getRelChapterType(), d.supplierId, md -> { + if (md == null) { + topControl.accept(composite_4); + tips.set("当å‰ä¾›åº”商未检测到" + t.getEvalPointName() + ",请检查是å¦å·²è§£æžç»“构化数æ®ï¼"); + } else { + if (ModelDataTypeEnum.EQ_ProjectLeader.getKey().equals(md.getRelChapterType())) { + showSwitch.set(true); + showFile.set(false); + composite_2.refresh(t, md); + RxSwt.run(() -> getFilePath(d.supplierId, "EnterpriseQualification_technology")).checkWidget(this).exe(pdfFileData::set); + } else { + showFile.set(false); + composite_2.refresh(t, md); + } + } + }); + break; + case TDI: + case TT: + case NULL: + showFile.set(true); + RxSwt.run(() -> getFilePath(d.supplierId, t.getRelChapterType())).checkWidget(this).exe(pdfFileData::set); + break; + } + }); + } + handler.end(); + }); + } + + private void rootNodeChapter(TabHandler<RectangleRadioButton> handler, EvaluationFactorTypeEnum factorTypeEnum, Consumer<RootNodeChapterData> callback) { + handler.listHand(initRootNodeChapterList(factorTypeEnum).map(t -> { + String[] split = t.split("-", 2); + RootNodeChapterData chapterData = new RootNodeChapterData(); + chapterData.type = split[0]; + chapterData.name = split[1]; + return chapterData; + }).collect(Collectors.toList()), t -> t.name, callback); + } + + private void getModelData(String _relChapterType, String supplierId, Consumer<ModelData> consumer) { + RelChapterTypeHandler typeHandler = new RelChapterTypeHandler(_relChapterType); + Optional<ModelDataTypeEnum> modelDataTypeEnum = Optional.of(typeHandler.getRelChapterType()).map(ModelDataTypeEnum.MAP::get); + String relChapterType = modelDataTypeEnum.map(ModelDataTypeEnum.EQ_ProjectLeader::equals).orElse(false) ? typeHandler.getRelChapterType() : _relChapterType; + RxSwt.run(() -> modelDataService.getModelData(tenderId, supplierId, relChapterType, relChapterType)).checkWidget(this).exe(consumer); + } + + private Stream<String> initRootNodeChapterList(EvaluationFactorTypeEnum factorTypeEnum) { + if (EvaluationFactorTypeEnum.BUSINESS == factorTypeEnum) { + return Stream.of("Business-å•†åŠ¡æ ‡"); + } + if (EvaluationFactorTypeEnum.TECHNOLOGY == factorTypeEnum) { + return Stream.of("Technology-æŠ€æœ¯æ ‡"); + } + return Stream.of("Business-å•†åŠ¡æ ‡", "Technology-æŠ€æœ¯æ ‡", "Price-报价"); + } + + public void refresh(String supplierId, String factorCode, EvaluationFactorTypeEnum factorTypeEnum) { + RxSwt.run(() -> { + EvaluationContentData evaluationContentData = new EvaluationContentData(); + evaluationContentData.supplierId = supplierId; + evaluationContentData.factorTypeEnum = factorTypeEnum; + evaluationContentData.evaluationContentList = evaluationContentService.getEvaluationContentListByFactorCode(tenderId, factorCode); + return evaluationContentData; + }).checkWidget(this).exe(evaluationContentData::set); + } + + private PdfFileData getFilePath(String supplierId, String relChapterType) { + BidFileIndexTreeXmlParse bidFileIndexTreeXmlParse = new BidFileIndexTreeXmlParse(Constants.getBidFilePath(tenderId, supplierId), relChapterType); + PdfFileData pdfFileData = new PdfFileData(); + pdfFileData.url = bidFileIndexTreeXmlParse.getRootNodeFilePath(); + pdfFileData.pageNum = bidFileIndexTreeXmlParse.getPageNumInGenerateFile(); + return pdfFileData; + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataComposite.java new file mode 100644 index 00000000..22cf2745 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataComposite.java @@ -0,0 +1,129 @@ +package com.gx.obe.struct.composite; + +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.listener.RoundBorderLineListener; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.call.Call; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.struct.beans.ModelData; +import com.gx.obe.struct.enums.ModelDataTypeEnum; +import com.gx.obe.struct.factory.ModelDataFactory; +import com.gx.obe.struct.handler.RelChapterTypeHandler; +import com.gx.obe.struct.inters.IModelData; +import com.gx.obe.struct.inters.IModelDataDetail; +import com.gx.obe.web.entity.evaluation.EvaluationContent; +import com.swtdesigner.SWTResourceManager; + +public class ModelDataComposite extends Composite { + + private final Prop<String> title = new Prop<>(); + private final Prop<Integer> count = new Prop<>(); + private final Prop<ModelDataTypeEnum> modelDataTypeEnum = new Prop<>(); + private final Prop<ModelData> modelData = new Prop<>(); + + private final Call call = new Call(); + + public ModelDataComposite(Composite parent, String tenderId) { + super(parent, SWT.NONE); + + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.verticalSpacing = 0; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + Composite composite = new Composite(this, SWT.NONE); + GridLayout gl_composite = new GridLayout(1, false); + gl_composite.marginTop = 5; + gl_composite.marginHeight = 0; + gl_composite.marginWidth = 0; + composite.setLayout(gl_composite); + GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_composite.heightHint = 400; + composite.setLayoutData(gd_composite); + + Composite composite_2 = new Composite(composite, SWT.NONE); + GridLayout gl_composite_2 = new GridLayout(2, false); + gl_composite_2.marginWidth = 0; + composite_2.setLayout(gl_composite_2); + composite_2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + Label lblNewLabel = new Label(composite_2, SWT.NONE); + lblNewLabel.setFont(SWTResourceManager.getFont("Microsoft YaHei UI", 10, SWT.BOLD)); + title.bind(t -> { + lblNewLabel.setText(t); + composite_2.layout(); + }); + + Composite composite_4 = new Composite(composite_2, SWT.NONE); + composite_4.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + GridLayout gl_composite_4 = new GridLayout(3, false); + gl_composite_4.marginHeight = 0; + composite_4.setLayout(gl_composite_4); + + Label lblNewLabel_1 = new Label(composite_4, SWT.NONE); + lblNewLabel_1.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1)); + lblNewLabel_1.setText("共有"); + + Label lblNewLabel_2 = new Label(composite_4, SWT.NONE); + lblNewLabel_2.setForeground(SWTResourceManager.getColor(255, 93, 0)); + lblNewLabel_2.setFont(SWTResourceManager.getFont("Microsoft YaHei UI", 10, SWT.BOLD)); + count.bind(t -> { + lblNewLabel_2.setText(String.valueOf(t)); + composite_4.layout(); + }); + + Label lblNewLabel_3 = new Label(composite_4, SWT.NONE); + lblNewLabel_3.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1)); + title.bind(t -> { + lblNewLabel_3.setText("æ¡" + t + "ä¿¡æ¯"); + composite_4.layout(); + }); + + Composite composite_3 = new Composite(composite, SWT.NONE); + FillLayout fl_composite_3 = new FillLayout(SWT.HORIZONTAL); + fl_composite_3.marginHeight = 1; + fl_composite_3.marginWidth = 1; + composite_3.setLayout(fl_composite_3); + composite_3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + composite_3.addPaintListener(new RoundBorderLineListener(ColorConstants.BORDER_LINE_COLOR)); + + ModelDataDetailComposite composite_1 = new ModelDataDetailComposite(this, tenderId); + composite_1.setLayout(new GridLayout(1, false)); + GridData gd_composite_1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_composite_1.heightHint = 500; + composite_1.setLayoutData(gd_composite_1); + + IModelDataDetail modelDataDetail = composite_1.getModelDataDetail(); + call.bind(() -> modelDataDetail.refreshTitle("")); + + modelDataTypeEnum.bind(t -> { + IModelData iModelData = ModelDataFactory.create(composite_3, modelDataDetail, t); + iModelData.setCountWrite(count::set); + modelData.bind(iModelData::refresh); + }); + } + + public void refresh(EvaluationContent evaluationContent, ModelData modelData) { + Optional.of(evaluationContent).map(EvaluationContent::getEvalPointName).ifPresent(title::set); + Optional.of(evaluationContent).map(t -> { + return new RelChapterTypeHandler(t.getRelChapterType()).getRelChapterType(); + }).map(ModelDataTypeEnum.MAP::get).ifPresent(modelDataTypeEnum::set); + this.modelData.set(modelData); + this.call.exe(); + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataDetailComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataDetailComposite.java new file mode 100644 index 00000000..3eaf2bc1 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/ModelDataDetailComposite.java @@ -0,0 +1,147 @@ +package com.gx.obe.struct.composite; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.component.handler.TabHandler; +import com.gx.obe.struct.inters.IModelDataDetail; +import com.gx.obe.struct.widget.TabButton; +import com.swtdesigner.SWTResourceManager; + +public class ModelDataDetailComposite extends Composite { + + private final Prop<String> titleName = new Prop<>(); + + private final IModelDataDetail modelDataDetail; + + public ModelDataDetailComposite(Composite parent, String tenderId) { + super(parent, SWT.NONE); + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.verticalSpacing = 0; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + Composite composite = new Composite(this, SWT.NONE); + GridLayout gl_composite = new GridLayout(1, false); + gl_composite.marginHeight = 10; + composite.setLayout(gl_composite); + composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + Label lblNewLabel = new Label(composite, SWT.NONE); + lblNewLabel.setFont(SWTResourceManager.getFont("Microsoft YaHei UI", 10, SWT.BOLD)); + lblNewLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1)); + titleName.bind(t -> { + lblNewLabel.setText(t); + lblNewLabel.getParent().layout(); + }); + + ESepator label = new ESepator(this, SWT.HORIZONTAL); + label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + label.setBackground(SWTResourceManager.getColor(222, 234, 245)); + label.setLineWidth(2); + + Composite composite_1 = new Composite(this, SWT.NONE); + GridLayout gl_composite_1 = new GridLayout(1, false); + gl_composite_1.verticalSpacing = 0; + gl_composite_1.marginHeight = 0; + gl_composite_1.marginWidth = 0; + composite_1.setLayout(gl_composite_1); + composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + Composite composite_2 = new Composite(composite_1, SWT.NONE); + RowLayout rl_composite_2 = new RowLayout(SWT.HORIZONTAL); + rl_composite_2.marginBottom = 0; + rl_composite_2.marginTop = 0; + rl_composite_2.marginRight = 0; + rl_composite_2.marginLeft = 0; + rl_composite_2.spacing = 0; + composite_2.setLayout(rl_composite_2); + composite_2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + TabHandler<TabButton> handler = new TabHandler<>(composite_2, TabButton::new); + + ESepator label_1 = new ESepator(composite_1, SWT.HORIZONTAL); + label_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + label_1.setBackground(SWTResourceManager.getColor(222, 234, 245)); + + ScrolledComposite scrolledComposite = new ScrolledComposite(composite_1, SWT.H_SCROLL | SWT.V_SCROLL); + scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + scrolledComposite.setExpandHorizontal(true); + scrolledComposite.setExpandVertical(true); + + Composite composite_3 = new Composite(scrolledComposite, SWT.NONE); + GridLayout gl_composite_3 = new GridLayout(1, false); + gl_composite_3.marginHeight = 15; + gl_composite_3.marginWidth = 0; + composite_3.setLayout(gl_composite_3); + + StackLayout stackLayout = new StackLayout(); + + Composite composite_4 = new Composite(composite_3, SWT.NONE); + composite_4.setLayout(stackLayout); + GridData gd_composite_4 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_composite_4.widthHint = 700; + composite_4.setLayoutData(gd_composite_4); + scrolledComposite.setContent(composite_3); + scrolledComposite.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + + modelDataDetail = new IModelDataDetail() { + + @Override + public void refreshTitle(String title) { + titleName.set(title); + } + + public void addBasicSubpage(Function<Composite, Composite> initSub) { + handler.start(); + addSubpage("基本信æ¯", initSub); + } + + public void addSubpage(String name, Function<Composite, Composite> initSub) { + Composite subComposite = initSub.apply(composite_4); + handler.hand(name, () -> { + stackLayout.topControl = subComposite; + composite_4.layout(); + composite_3.layout(); + scrolledComposite.setContent(composite_3); + scrolledComposite.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + }); + } + + public <T> void addAttachmentSubpage(Consumer<BiConsumer<String, String>> supplierIdAndBusinessIdConsumer) { + addSubpage("附件列表", p -> { + AttachmentComposite attachmentComposite = new AttachmentComposite(p, tenderId); + supplierIdAndBusinessIdConsumer.accept((supplierId, businessId) -> { + attachmentComposite.refresh(supplierId, businessId); + }); + return attachmentComposite; + }); + handler.end(); + } + + }; + + } + + public IModelDataDetail getModelDataDetail() { + return modelDataDetail; + } + + @Override + protected void checkSubclass() {} +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableComparisonComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableComparisonComposite.java new file mode 100644 index 00000000..0d5488fc --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableComparisonComposite.java @@ -0,0 +1,124 @@ +package com.gx.obe.struct.composite; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.component.comparison.Column; +import com.gx.obe.component.comparison.ComparisonData; +import com.gx.obe.component.comparison.ComparisonTable; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.component.utils.CompositeUtils; +import com.gx.obe.components.core.Constants; +import com.gx.obe.components.core.vo.TableXML; +import com.gx.obe.components.core.vo.TableXML.Tr; +import com.gx.obe.components.core.vo.TableXML.Tr.Td; +import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.struct.beans.TemplateTable; +import com.gx.obe.struct.service.TemplateTableService; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.util.utils.StringUtils; +import com.gx.obe.web.entity.Supplier; + +public class TemplateTableComparisonComposite extends Composite { + + private final TemplateTableService templateTableService = new TemplateTableService(); + + private final Prop<ComparisonData> comparisonData = new Prop<>(); + + public TemplateTableComparisonComposite(Composite parent, int style) { + super(parent, style); + setLayout(new FillLayout(SWT.HORIZONTAL)); + comparisonData.bind(t -> { + CompositeUtils.disposeChildren(this); + new ComparisonTable(this, t); + this.layout(); + }); + } + + public void refresh(String tenderId, String relChapterType, String dataCode, List<Supplier> supplierList) { + RxSwt.run(() -> getComparisonData(tenderId, relChapterType, dataCode, supplierList)).checkWidget(this).exe(comparisonData::set); + } + + private ComparisonData getComparisonData(String tenderId, String relChapterType, String dataCode, List<Supplier> supplierList) { + List<TemplateTable> templateTableList = templateTableService.getTemplateTableList(tenderId, relChapterType, dataCode); + if (CollectionUtils.isNull(templateTableList)) { + return null; + } + Map<String, TemplateTable> templateTableMap = templateTableList.stream().collect(Collectors.toMap(TemplateTable::getSupplierId, Function.identity())); + TemplateTable templateTable = templateTableMap.get(Constants.BIDDING_ID); + if (templateTable == null) { + return null; + } + TableXML tableXML = JsonUtil.jsonToBean(templateTable.getTableInfo(), TableXML.class); + if (tableXML == null) { + return null; + } + List<Tr> headList = tableXML.getHeadList(); + if (headList.size() != 1) { + return null; + } + Tr head = headList.get(0); + OptionalInt indexCol = IntStream.range(0, head.getTds().length).filter(i -> "åºå·".equals(head.getTds()[i].getContent())).findAny(); + if (!indexCol.isPresent()) { + return null; + } + ComparisonData comparisonData = new ComparisonData(); + tableXML.getBodyList().forEach(body -> Optional.ofNullable(getContent(body, indexCol.getAsInt())).filter(StringUtils::isNotEmpty).ifPresent(comparisonData::addRow)); + + supplierList.forEach(supplier -> { + comparisonData.addTitleCol(new Column(supplier.getId(), supplier.getSupplierName())); + }); + + IntStream.range(0, head.getTds().length).forEach(i -> { + comparisonDataInit(templateTableMap, tableXML, head, indexCol.getAsInt(), i, supplierList, comparisonData); + }); + return comparisonData; + } + + private void comparisonDataInit(Map<String, TemplateTable> templateTableMap, TableXML tableXML, Tr head, int indexCol, int col, List<Supplier> supplierList, ComparisonData comparisonData) { + Td td = head.getTds()[col]; +// if (td.isNeedFill()) { +// comparisonData.addItemCol(new Column(col + "", td.getContent())); +// supplierList.forEach(supplier -> { +// supplierComparisonDataInit(templateTableMap, indexCol, col, supplier, comparisonData); +// }); +// } else { +// comparisonData.addHeadCol(new Column(col + "", td.getContent())); +// tableXML.getBodyList().forEach(body -> { +// comparisonData.putHeadContent(getContent(body, indexCol), col + "", getContent(body, col)); +// }); +// } + } + + private void supplierComparisonDataInit(Map<String, TemplateTable> templateTableMap, int indexCol, int col, Supplier supplier, ComparisonData comparisonData) { + TemplateTable supplierTemplateTable = templateTableMap.get(supplier.getId()); + if (supplierTemplateTable == null) { + return; + } + TableXML supplierTableXML = JsonUtil.jsonToBean(supplierTemplateTable.getTableInfo(), TableXML.class); + if (supplierTableXML == null) { + return; + } + supplierTableXML.getBodyList().forEach(body -> { + comparisonData.putComparisonContent(getContent(body, indexCol), supplier.getId(), col + "", getContent(body, col)); + }); + } + + private String getContent(Tr tr, int col) { + return tr.getTds()[col].getContent(); + } + + @Override + protected void checkSubclass() {} + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableListComposite.java b/com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableListComposite.java new file mode 100644 index 00000000..9f502bd3 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/composite/TemplateTableListComposite.java @@ -0,0 +1,125 @@ +package com.gx.obe.struct.composite; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.common.widget.button.RectangleRadioButton; +import com.gx.obe.component.handler.TabHandler; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.struct.enums.DataCategoryEnum; +import com.gx.obe.struct.service.EvaluationContentService; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationContent; +import com.swtdesigner.SWTResourceManager; + +public class TemplateTableListComposite extends Composite { + + private final EvaluationContentService evaluationContentService = new EvaluationContentService(); + + private final Prop<TemplateTableData> templateTableData = new Prop<>(); + + private class TemplateTableData { + private String tenderId; + private List<EvaluationContent> evaluationContentList; + private List<Supplier> supplierList; + } + + private final Prop<TemplateTableComparisonData> templateTableComparisonData = new Prop<>(); + + private class TemplateTableComparisonData { + private String tenderId; + private String relChapterType; + private String dataCode; + private List<Supplier> supplierList; + } + + public TemplateTableListComposite(Composite parent, int style) { + super(parent, style); + setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + setBackgroundMode(SWT.INHERIT_FORCE); + + StackLayout stackLayout = new StackLayout(); + setLayout(stackLayout); + Consumer<Control> topControlConsumer = t -> { + stackLayout.topControl = t; + this.layout(); + }; + + Composite composite_1 = new Composite(this, SWT.NONE); + composite_1.setLayout(new GridLayout(1, false)); + + Label label = new Label(composite_1, SWT.WRAP); + label.setForeground(SWTResourceManager.getColor(200, 200, 200)); + label.setFont(SWTResourceManager.getFont("宋体", 20, SWT.BOLD)); + label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true, 1, 1)); + label.setText("当剿Œ‡æ ‡æœªç»‘定å°èŒƒæœ¬è¡¨æ ¼è¯„审点ï¼"); + + Composite composite = new Composite(this, SWT.NONE); + GridLayout gl_composite = new GridLayout(1, false); + gl_composite.verticalSpacing = 0; + gl_composite.marginHeight = 0; + gl_composite.marginWidth = 0; + composite.setLayout(gl_composite); + + Composite tabComposite = new Composite(composite, SWT.NONE); + RowLayout rl_tabComposite = new RowLayout(SWT.HORIZONTAL); + rl_tabComposite.marginBottom = 0; + tabComposite.setLayout(rl_tabComposite); + tabComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + TabHandler<RectangleRadioButton> handler = new TabHandler<>(tabComposite, t -> new RectangleRadioButton(t, SWT.NONE)); + + this.templateTableData.bind(d -> { + if (d.evaluationContentList.isEmpty()) { + topControlConsumer.accept(composite_1); + } else { + topControlConsumer.accept(composite); + handler.start().listHand(d.evaluationContentList, EvaluationContent::getEvalPointName, t -> selectAction(d.tenderId, t, d.supplierList)).end(); + } + }); + + ESepator label_1 = new ESepator(composite, SWT.HORIZONTAL); + label_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + label_1.setBackground(ColorConstants.SKIN_BG); + + TemplateTableComparisonComposite comparisonComposite = new TemplateTableComparisonComposite(composite, SWT.NONE); + comparisonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + this.templateTableComparisonData.bind(d -> comparisonComposite.refresh(d.tenderId, d.relChapterType, d.dataCode, d.supplierList)); + } + + private void selectAction(String tenderId, EvaluationContent evaluationContent, List<Supplier> supplierList) { + TemplateTableComparisonData data = new TemplateTableComparisonData(); + data.tenderId = tenderId; + data.relChapterType = evaluationContent.getRelChapterType(); + data.dataCode = evaluationContent.getDataCode(); + data.supplierList = supplierList; + this.templateTableComparisonData.set(data); + } + + public void refresh(String tenderId, String factorCode, List<Supplier> supplierList) { + RxSwt.run(() -> evaluationContentService.getEvaluationContentListByFactorCode(tenderId, factorCode)).checkWidget(this).other(ArrayList::new).exe(l -> { + TemplateTableData data = new TemplateTableData(); + data.tenderId = tenderId; + data.evaluationContentList = l.stream().filter(t -> DataCategoryEnum.MD.getKey().equals(t.getDataCategory())).collect(Collectors.toList()); + data.supplierList = supplierList; + this.templateTableData.set(data); + }); + } + + @Override + protected void checkSubclass() {} +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/dialog/AuxevaluationFullScreenDialog.java b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/AuxevaluationFullScreenDialog.java new file mode 100644 index 00000000..d4084101 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/AuxevaluationFullScreenDialog.java @@ -0,0 +1,49 @@ +package com.gx.obe.struct.dialog; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.core.utils.SwtUtils; +import org.eclipse.swt.core.widgets.EDialog; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; + +import com.gx.obe.components.core.Constants; + +public class AuxevaluationFullScreenDialog extends EDialog { + + private String stageId; + private String token; + + public AuxevaluationFullScreenDialog(Shell parentShell, String stageId, String token) { + super(parentShell); + this.setTitle("è¾…åŠ©è¯„æ ‡"); + this.stageId = stageId; + this.token = token; + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite container = (Composite) super.createDialogArea(parent); + container.setLayout(new FillLayout(SWT.HORIZONTAL)); + + Browser browser = new Browser(container, SWT.NONE); +// browser.setUrl("http://dtjg.cse-bidding.com/bidweb/#/auxevaluationFullScreen/projectInfo?stageId=" + stageId); + browser.setUrl(Constants.getAuxiliaryPlatformUrl("bidweb/#/auxevaluationFullScreen/projectInfo") + "?stageId=" + stageId + "&token=" + token + "&sourceType=dt"); + return container; + } + + @Override + protected Point getInitialSize() { + return new Point(1502, 950); + } + + @Override + protected void initializeBounds() { + super.initializeBounds(); + SwtUtils.setCenter(getShell()); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/dialog/EditOpinionShell.java b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/EditOpinionShell.java new file mode 100644 index 00000000..bc634238 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/EditOpinionShell.java @@ -0,0 +1,429 @@ +package com.gx.obe.struct.dialog; + +import java.math.BigDecimal; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.core.widgets.ELink; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import com.gx.obe.ColorConstants; +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.common.icons.IconsActivator; +import com.gx.obe.components.core.enumeration.EvaluationFactorEnum; +import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.struct.beans.AbsoluteModelDO; +import com.gx.obe.struct.beans.IntelligentEvalDO; +import com.gx.obe.struct.beans.LiftRateDO; +import com.gx.obe.struct.beans.ScoreOptionsDO; +import com.gx.obe.struct.beans.SelfEvalParamsDO; +import com.gx.obe.struct.listener.EditOpinionListener; +import com.gx.obe.util.utils.BigDecimalUtils; +import com.gx.obe.util.utils.ObjectUtils; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; +import com.swtdesigner.ResourceManager; +import com.swtdesigner.SWTResourceManager; + +public class EditOpinionShell extends Shell { + private Listener deactivateListener; + private EvaluationFactor curFactor; + private SupplierEvaluationFactor supplierEvaluationFactor; + private IntelligentEvalDO intelligentEvalDO; + private EditOpinionListener editOpinionListener; + private ELink editOpinionLink; + private ELink saveEditOpinionLink; + private String editOpinionStr = null; + private String editOpinionValueStr = null; + private Composite editContentComposite; + private Text reasonText; + private GridData gd_editContentComposite; + private GridLayout gl_editContentComposite; + + + /** + * Create the shell. + * @param display + */ + public EditOpinionShell(Shell shell, EvaluationFactor curFactor, SupplierEvaluationFactor supplierEvaluationFactor, EditOpinionListener editOpinionListener) { + super(shell, SWT.NO_TRIM); + setBackground(ColorConstants.BORDER_LINE_COLOR); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.verticalSpacing = 1; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + this.curFactor = curFactor; + this.supplierEvaluationFactor = supplierEvaluationFactor; + this.editOpinionListener = editOpinionListener; + addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + removeListener(SWT.Deactivate, deactivateListener); + } + }); + + editContentComposite = new Composite(this, SWT.NONE); + editContentComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + editContentComposite.setBackgroundMode(SWT.INHERIT_FORCE); + + gd_editContentComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + editContentComposite.setLayoutData(gd_editContentComposite); + gl_editContentComposite = new GridLayout(1, false); + gl_editContentComposite.marginHeight = 1; + gl_editContentComposite.marginWidth = 1; + editContentComposite.setLayout(gl_editContentComposite);; + + Composite reasonTitleComposite = new Composite(this, SWT.NONE); + reasonTitleComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + reasonTitleComposite.setBackgroundMode(SWT.INHERIT_FORCE); + reasonTitleComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); + reasonTitleComposite.setLayout(new GridLayout(1, false)); + + Label reasonLabel = new Label(reasonTitleComposite, SWT.NONE); + reasonLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); + reasonLabel.setText("ä¿®æ”¹åŽŸå› ï¼š"); + + Composite editReasonComposite = new Composite(this, SWT.NONE); + editReasonComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + editReasonComposite.setBackgroundMode(SWT.INHERIT_FORCE); + GridData gd_editReasonComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd_editReasonComposite.heightHint = 40; + editReasonComposite.setLayoutData(gd_editReasonComposite); + GridLayout gl_editReasonComposite = new GridLayout(3, false); + gl_editReasonComposite.horizontalSpacing = 0; + gl_editReasonComposite.marginHeight = 0; + gl_editReasonComposite.marginWidth = 0; + editReasonComposite.setLayout(gl_editReasonComposite); + + + reasonText = new Text(editReasonComposite, SWT.WRAP | SWT.V_SCROLL); + reasonText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2)); + reasonText.setTextLimit(200); + reasonText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent arg0) { + } + }); + + saveEditOpinionLink = new ELink(editReasonComposite, SWT.NONE); + saveEditOpinionLink.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, true, 2, 1)); + saveEditOpinionLink.setText("确认修改"); + saveEditOpinionLink.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/save.png")); + saveEditOpinionLink.addMouseListener(new MouseAdapter() { + public void mouseUp(MouseEvent e) { + saveEditOpinionAction(); + } + });; + + editOpinionLink = new ELink(editReasonComposite, SWT.NONE); + editOpinionLink.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); + editOpinionLink.setText("å–æ¶ˆä¿®æ”¹"); + editOpinionLink.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/back.png")); + editOpinionLink.addMouseListener(new MouseAdapter() { + public void mouseUp(MouseEvent e) { + cancleAction(); + } + }); + createContents(); + init(); + } + + private void init() { + deactivateListener = new Listener(){ + @Override + public void handleEvent(Event arg0) { + close(); + } + }; + + addListener(SWT.Deactivate, deactivateListener); + editOpinionStr = supplierEvaluationFactor.getOpinion(); + reasonText.setText(ObjectUtils.getObjString(supplierEvaluationFactor.getModifyReason())); + // 如果是智能评审类型 + if(EvaluationFactorEnum.SCORE_TYPE_AI.equals(curFactor.getScoreType())) { + intelligentEvalDO = JsonUtil.jsonToBean(curFactor.getIntelligentEval(), IntelligentEvalDO.class); + } + if(null != intelligentEvalDO) { + if("F".equals(intelligentEvalDO.getFactorModel())) { + addComboOpinion(); + }else if("B".equals(intelligentEvalDO.getFactorModel())) { + addLiftRateOpinion(); + } else if("G".equals(intelligentEvalDO.getFactorModel())) { + addAbsoluteParamOpinion(); + }else { + addStringOpinion(); + } + } + else { + addStringOpinion(); + } + } + + /** + * 确认修改 + */ + private void saveEditOpinionAction() { + removeListener(SWT.Deactivate, deactivateListener); + if(null != intelligentEvalDO) { + SelfEvalParamsDO selfEvalParamsDO = JsonUtil.jsonToBean(supplierEvaluationFactor.getParamValues(), SelfEvalParamsDO.class); + if("F".equals(intelligentEvalDO.getFactorModel())) { + if(null != supplierEvaluationFactor.getParamValues()) { + if(null != selfEvalParamsDO) { + selfEvalParamsDO.setSelectParamValue(editOpinionValueStr); + supplierEvaluationFactor.setParamValues(selfEvalParamsDO.toJson()); + } + } + }else if("G".equals(intelligentEvalDO.getFactorModel())) { + Pattern p = Pattern.compile("^\\d*[1-9]\\d*$"); + Matcher m = p.matcher(editOpinionValueStr); + if(!m.matches()){ + MessageDialog.openShortMessage("请输入æ£ç¡®çš„æ•´æ•°ç»å¯¹å€¼ï¼"); + addListener(SWT.Deactivate, deactivateListener); + return ; + } + if(null != selfEvalParamsDO) { + selfEvalParamsDO.setSelectParamValue(editOpinionValueStr); + supplierEvaluationFactor.setParamValues(selfEvalParamsDO.toJson()); + } + }else if("B".equals(intelligentEvalDO.getFactorModel())) { + + BigDecimal value = null; + try { + value = new BigDecimal(editOpinionValueStr); + LiftRateDO liftRateDO = intelligentEvalDO.getLiftRate(); + if(null != liftRateDO) { + editOpinionValueStr = BigDecimalUtils.round(value, ObjectUtils.getIntValue(liftRateDO.getDecimalDigits(), 6)).toString(); + editOpinionStr = editOpinionValueStr + liftRateDO.getUnit(); + } + } catch (Exception e) { + MessageDialog.openShortMessage("请输入æ£ç¡®çš„æ•°å€¼ï¼"); + addListener(SWT.Deactivate, deactivateListener); + return ; + } + if(null != selfEvalParamsDO) { + selfEvalParamsDO.setSelectParamValue(editOpinionValueStr); + supplierEvaluationFactor.setParamValues(selfEvalParamsDO.toJson()); + } + } + } + if(reasonText.getText().trim().length() == 0) { + MessageDialog.openShortMessage("è¯·è¾“å…¥ä¿®æ”¹åŽŸå› ï¼"); + addListener(SWT.Deactivate, deactivateListener); + return; + } + supplierEvaluationFactor.setModifyReason(reasonText.getText()); + editOpinionListener.editOpinion(editOpinionStr, reasonText.getText()); + this.close(); + } + + /** + * å–æ¶ˆä¿®æ”¹ + */ + private void cancleAction() { + this.close(); + } + + private void addStringOpinion() { + gl_editContentComposite.numColumns = 1; + gd_editContentComposite.grabExcessVerticalSpace = true; + gd_editContentComposite.heightHint = 60; + + final Text opinionText = new Text(editContentComposite, SWT.WRAP | SWT.V_SCROLL); + opinionText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + opinionText.setText(ObjectUtils.getObjString(supplierEvaluationFactor.getOpinion())); + opinionText.setTextLimit(2000); + editOpinionStr = opinionText.getText(); + opinionText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent arg0) { + editOpinionStr = opinionText.getText().trim(); + } + }); + editContentComposite.getParent().layout(); + } + + /** + * 设置下拉选项评议æ„è§ + */ + private void addComboOpinion() { + gl_editContentComposite.numColumns = 1; + gd_editContentComposite.grabExcessVerticalSpace = false; + gd_editContentComposite.heightHint = -1; + final Combo opinionCombo = new Combo(editContentComposite, SWT.READ_ONLY); + opinionCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + opinionCombo.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + selectOpinionAction(opinionCombo); + } + }); + + String selectParamValue = null;// 下拉选项的值 + if(null != supplierEvaluationFactor.getParamValues()) { + SelfEvalParamsDO selfEvalParamsDO = JsonUtil.jsonToBean(supplierEvaluationFactor.getParamValues(), SelfEvalParamsDO.class); + if(null != selfEvalParamsDO) { + selectParamValue = selfEvalParamsDO.getSelectParamValue(); + editOpinionValueStr = selectParamValue; + } + } + + int index = 0; + List<ScoreOptionsDO> scoreOptionsDOList = intelligentEvalDO.getScoreOptionsDOList(); + if(null != scoreOptionsDOList) { + for(ScoreOptionsDO scoreOptionsDO : scoreOptionsDOList) { + opinionCombo.add(scoreOptionsDO.getName(), index); + opinionCombo.setData(index + "", scoreOptionsDO); + if(null != selectParamValue) { + // å¦‚æžœæœ‰ä¸‹æ‹‰é€‰é¡¹å€¼ï¼Œåˆ™é€šè¿‡å€¼è¿›è¡ŒåŒ¹é… + if(selectParamValue.equals(scoreOptionsDO.getScoreItemId())){ + opinionCombo.select(index); + } + }else { + if(scoreOptionsDO.getName().equals(supplierEvaluationFactor.getOpinion())){ + opinionCombo.select(index); + } + } + index++; + } + } + + } + /** + * @Description: 修改下拉框评审æ„è§ + * @author chenxw + */ + private void selectOpinionAction(Combo opinionCombo) { + if(opinionCombo.getSelectionIndex() >= 0 && null != curFactor) { + if(null != supplierEvaluationFactor) { + ScoreOptionsDO scoreOptionsDO = (ScoreOptionsDO)opinionCombo.getData("" + opinionCombo.getSelectionIndex()); + if(null != scoreOptionsDO) { + editOpinionStr = scoreOptionsDO.getName(); + editOpinionValueStr = scoreOptionsDO.getScoreItemId(); + } + } + } + } + + /** + * ç»å¯¹å€¼æ¨¡åž‹ä¿®æ”¹ + */ + private void addAbsoluteParamOpinion() { + gl_editContentComposite.numColumns = 3; + gd_editContentComposite.grabExcessVerticalSpace = false; + gd_editContentComposite.heightHint = -1; + + String selectParamValue = null;// 下拉选项的值 + if(null != supplierEvaluationFactor.getParamValues()) { + SelfEvalParamsDO selfEvalParamsDO = JsonUtil.jsonToBean(supplierEvaluationFactor.getParamValues(), SelfEvalParamsDO.class); + if(null != selfEvalParamsDO) { + selectParamValue = selfEvalParamsDO.getSelectParamValue(); + editOpinionValueStr = selectParamValue; + } + } + AbsoluteModelDO absoluteModelDO = intelligentEvalDO.getAbsoluteModelDO(); + + final Text opinionText = new Text(editContentComposite, SWT.CENTER | SWT.BORDER); + GridData gd_opinionText = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1); + gd_opinionText.widthHint = 50; + opinionText.setLayoutData(gd_opinionText); + opinionText.setText(ObjectUtils.getObjString(selectParamValue)); + opinionText.setTextLimit(2000); + Label unitLabel = new Label(editContentComposite, SWT.NONE); + unitLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); + if(null != absoluteModelDO) { + unitLabel.setText(ObjectUtils.getObjString(absoluteModelDO.getAbsoluteUnit(),"未知å•ä½")); + } + + Label tipsLabel = new Label(editContentComposite, SWT.NONE); + tipsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + tipsLabel.setForeground(ColorConstants.NOTE_TIPS_COLOR); + //<bidFillMemo><![CDATA[æ¤å¤„åªèƒ½å¡«å†™æ•´æ•°ç»å¯¹å€¼]]></bidFillMemo> + tipsLabel.setText("请填写整数ç»å¯¹å€¼ï¼"); + + opinionText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent arg0) { + editOpinionStr = opinionText.getText().trim() + unitLabel.getText(); + editOpinionValueStr = opinionText.getText().trim(); + } + }); + + } + /** + * å‡é™çŽ‡æ¨¡åž‹ä¿®æ”¹ + */ + private void addLiftRateOpinion() { + gl_editContentComposite.numColumns = 3; + gd_editContentComposite.grabExcessVerticalSpace = false; + gd_editContentComposite.heightHint = -1; + + String selectParamValue = null;// 下拉选项的值 + if(null != supplierEvaluationFactor.getParamValues()) { + SelfEvalParamsDO selfEvalParamsDO = JsonUtil.jsonToBean(supplierEvaluationFactor.getParamValues(), SelfEvalParamsDO.class); + if(null != selfEvalParamsDO) { + selectParamValue = selfEvalParamsDO.getSelectParamValue(); + editOpinionValueStr = selectParamValue; + } + } + + LiftRateDO liftRateDO = intelligentEvalDO.getLiftRate(); + + final Text opinionText = new Text(editContentComposite, SWT.CENTER | SWT.BORDER); + GridData gd_opinionText = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1); + gd_opinionText.widthHint = 100; + opinionText.setLayoutData(gd_opinionText); +// <unit>%</unit> +// <decimalDigits>6</decimalDigits> + opinionText.setText(ObjectUtils.getObjString(selectParamValue)); + opinionText.setTextLimit(2000); + Label unitLabel = new Label(editContentComposite, SWT.NONE); + unitLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); + if(null != liftRateDO) { + unitLabel.setText(ObjectUtils.getObjString(liftRateDO.getUnit(),"未知å•ä½")); + } + + Label tipsLabel = new Label(editContentComposite, SWT.NONE); + tipsLabel.setForeground(ColorConstants.NOTE_TIPS_COLOR); + tipsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + //<bidFillMemo><![CDATA[æ¤å¤„åº”å¡«å†™æ•°å€¼ï¼Œå°æ•°ç‚¹ä¿ç•™6ä½]]></bidFillMemo> + tipsLabel.setText("è¯·å¡«å†™æ•°å€¼ï¼ˆå°æ•°ç‚¹ä¿ç•™"+liftRateDO.getDecimalDigits()+"ä½ï¼‰ï¼"); + + opinionText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent arg0) { + editOpinionStr = opinionText.getText().trim() + unitLabel.getText(); + editOpinionValueStr = opinionText.getText().trim(); + } + }); + + } + + + /** + * Create contents of the shell. + */ + protected void createContents() { + setText("SWT Application"); + setSize(450, 300); + + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/dialog/FactorClearBidStepDialog.java b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/FactorClearBidStepDialog.java new file mode 100644 index 00000000..79836536 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/FactorClearBidStepDialog.java @@ -0,0 +1,176 @@ +package com.gx.obe.struct.dialog; + +import java.text.MessageFormat; +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.utils.WidgetUtils; +import org.eclipse.swt.core.widgets.ELink; +import org.eclipse.swt.core.widgets.ESepator; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.common.icons.IconsActivator; +import com.gx.obe.common.widget.button.ImageRaido; +import com.gx.obe.component.handler.RaidoHandler; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.components.core.enumeration.EvaluationStepEnum; +import com.gx.obe.step.dialog.EvaluationStepDialog; +import com.gx.obe.struct.enums.EvaluationFactorTypeEnum; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.web.entity.evaluation.EvaluationStep; +import com.gx.obe.web.entity.expert.Expert; +import com.gx.obe.web.entity.tender.TenderProjectEntity; +import com.gx.obe.web.service.expert.ExpertService; +import com.swtdesigner.ResourceManager; +import com.swtdesigner.SWTResourceManager; + +public class FactorClearBidStepDialog extends EvaluationStepDialog { + + private final ExpertService expertService = new ExpertService(); + + private final Prop<EvaluationFactorTypeEnum> evaluationFactorTypeEnum = new Prop<>(); + + private final Prop<Expert> expert = new Prop<>(); + + public FactorClearBidStepDialog(Shell parentShell, TenderProjectEntity tenderProject, EvaluationStep evaluationStep) { + super(parentShell, tenderProject, evaluationStep); + } + + @Override + protected void createFromArea(Composite fromComposite, Composite gridComposite) { + evaluationFactorTypeEnum.bind(t -> { + switch (t) { + case COMPLIANCE: + setStepNameText("ç¬¦åˆæ€§æŒ‡æ ‡è¯„è®®"); + break; + case BUSINESS: + setStepNameText("å•†åŠ¡æŒ‡æ ‡è¯„è®®"); + break; + case TECHNOLOGY: + setStepNameText("æŠ€æœ¯æŒ‡æ ‡è¯„è®®"); + break; + } + }); + evaluationFactorTypeEnum.bind(t -> expert.set(null)); + + CLabel label = new CLabel(fromComposite, SWT.NONE); + label.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL)); + label.setAlignment(SWT.RIGHT); + label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + label.setText("评议类型:"); + + Composite composite = new Composite(fromComposite, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); + + Composite composite_1 = new Composite(composite, SWT.NONE); + composite_1.setLayout(new GridLayout(3, false)); +// RaidoHandler<ImageRaido, EvaluationFactorTypeEnum> raidoHandler = new RaidoHandler<ImageRaido, EvaluationFactorTypeEnum>(composite_1, p->{ +// +// }); +// RaidoHandler<ImageRaido, EvaluationFactorTypeEnum> raidoHandler = new RaidoHandler<>(composite_1, p -> { +// ImageRaido imageRaido = new ImageRaido(p, SWT.NONE); +// imageRaido.setFont(SWTResourceManager.getFont("微软雅黑", 10, SWT.NORMAL)); +// imageRaido.setImageSize(24); +// return imageRaido; +// }); +// raidoHandler.start().hand(EvaluationFactorTypeEnum.COMPLIANCE, "ç¬¦åˆæ€§è¯„è®®").hand(EvaluationFactorTypeEnum.BUSINESS, "商务评议").hand(EvaluationFactorTypeEnum.TECHNOLOGY, "技术评议").end(); +// evaluationFactorTypeEnum.bindBidirectional(raidoHandler); + + Composite composite_2 = new Composite(composite, SWT.NONE); + GridLayout gl_composite_2 = new GridLayout(2, false); + composite_2.setLayout(gl_composite_2); + evaluationFactorTypeEnum.bindExe(t -> { + WidgetUtils.setControlVisible(composite_2, t != null); + composite_2.getParent().layout(); + }); + + Composite composite_3 = new Composite(composite_2, SWT.NONE); + composite_3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); + GridLayout gl_composite_3 = new GridLayout(1, false); + gl_composite_3.verticalSpacing = 0; + gl_composite_3.marginHeight = 0; + gl_composite_3.marginWidth = 0; + composite_3.setLayout(gl_composite_3); + + CLabel lblNewLabel = new CLabel(composite_3, SWT.NONE); + lblNewLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1)); + expert.bind(t -> { + lblNewLabel.setText(Optional.ofNullable(t).map(Expert::getUserName).orElse("")); + lblNewLabel.getParent().layout(); + }); + + ESepator label_1 = new ESepator(composite_3, SWT.HORIZONTAL); + GridData gd_label_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_label_1.widthHint = 100; + label_1.setLayoutData(gd_label_1); + label_1.setBackground(ColorConstants.SEP_LIGHT_COLOR); + + ELink select_expert = new ELink(composite_2, SWT.NONE); + select_expert.addMouseListener(MouseListener.mouseUpAdapter($ -> selectExpert())); + select_expert.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/search.png")); + select_expert.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, true, 1, 1)); + select_expert.setText(MessageFormat.format("选择{0}", "验è¯ä¸“å®¶")); + } + + private void selectExpert() { + SelectStepExpertDialog.selectExpert(getShell(), tenderProject.getId(), evaluationFactorTypeEnum.get()).thenThrow(expert::set); + } + + @Override + protected void setFromData(EvaluationStep evaluationStep) { + evaluationFactorTypeEnum.set(EvaluationFactorTypeEnum.MAP.get(evaluationStep.getEvaluationParamByKey(EvaluationStepEnum.EVALUATION_FACTOR_TYPE))); + RxSwt.run(() -> expertService.getEvaluationStepExpertList(tenderProject.getId(), evaluationStep)).checkWidget(getShell()).exe(t -> { + if (CollectionUtils.isNotNull(t)) expert.set(t.get(0)); + }); + } +// +// @Override +// protected String valFromData() { +// if (evaluationFactorTypeEnum.get() == null) return "请选择评审类型ï¼"; +// if (expert.get() == null) return "请选择评审专家ï¼"; +//// return super.valFromData(); +// } + + @Override + protected void getFromData(EvaluationStep evaluationStep) { + evaluationStep.setEvaluationParam(EvaluationStepEnum.EVALUATION_FACTOR_TYPE, evaluationFactorTypeEnum.get().getKey()); + evaluationStep.setRoleType(EvaluationStepEnum.CUSTOM); + addStepExpertUserId(expert.get().getUserId()); + } + + @Override + protected String getTipsText() { + return "è¯„å®¡ä¸“å®¶é€šè¿‡å¯¹ä¾›åº”å•†æ ‡ä¹¦åŠç»“构化数æ®è¿›è¡Œåˆ†æžåŽå¯¹æ¯ä¸€ä¸‹è¯„å®¡æŒ‡æ ‡å½•å…¥è¯„å®¡æ„è§ï¼"; + } + + @Override + protected String getStepNameDef() { + return "æŒ‡æ ‡è¯„è®®"; + } + + @Override + protected String getStepType() { + return EvaluationStepEnum.FACTOR_CLEAR_BID; + } + + @Override + protected Point getInitialSize() { + return new Point(600, 400); + } + + @Override + protected String valFromData() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/dialog/SelectStepExpertDialog.java b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/SelectStepExpertDialog.java new file mode 100644 index 00000000..119055c0 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/dialog/SelectStepExpertDialog.java @@ -0,0 +1,166 @@ +package com.gx.obe.struct.dialog; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.widgets.EButton; +import org.eclipse.swt.core.widgets.EDialog; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; + +import com.gx.obe.ColorConstants; +import com.gx.obe.bind.promise.Promise; +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.bind.prop.RProp; +import com.gx.obe.common.icons.IconsActivator; +import com.gx.obe.component.grid.FGrid; +import com.gx.obe.component.listener.SelectionListener; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.components.core.enumeration.ExpertEnum; +import com.gx.obe.struct.enums.EvaluationFactorTypeEnum; +import com.gx.obe.web.entity.expert.Expert; +import com.gx.obe.web.service.expert.ExpertService; +import com.swtdesigner.ResourceManager; +import com.swtdesigner.SWTResourceManager; + +public class SelectStepExpertDialog extends EDialog { + + private final List<SelectionListener<Expert>> selectionListeners = new ArrayList<>(); + + private final ExpertService expertService = new ExpertService(); + + private final String tenderId; + private final EvaluationFactorTypeEnum evaluationFactorTypeEnum; + + private Prop<List<Expert>> expertList = new Prop<>(); + private RProp<Expert> expert = new RProp<>(); + + public SelectStepExpertDialog(Shell parentShell, String tenderId, EvaluationFactorTypeEnum evaluationFactorTypeEnum) { + super(parentShell); + this.tenderId = tenderId; + this.evaluationFactorTypeEnum = evaluationFactorTypeEnum; + setTitle("é€‰æ‹©è¯„æ ‡ä¸“å®¶"); + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite container = (Composite) super.createDialogArea(parent); + container.setBackground(ColorConstants.BORDER_LINE_COLOR); + GridLayout gl_container = new GridLayout(1, false); + gl_container.horizontalSpacing = 0; + gl_container.verticalSpacing = 1; + gl_container.marginHeight = 0; + gl_container.marginWidth = 0; + container.setLayout(gl_container); + + Composite composite_1 = new Composite(container, SWT.NONE); + composite_1.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + composite_1.setLayout(new GridLayout(1, false)); + composite_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + composite_1.setBackgroundMode(SWT.INHERIT_FORCE); + + CLabel label_3 = new CLabel(composite_1, SWT.NONE); + label_3.setFont(SWTResourceManager.getFont("宋体", 10, SWT.BOLD)); + label_3.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/television.png")); + label_3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + label_3.setText("è¯„æ ‡ä¸“å®¶"); + + Composite composite_2 = new Composite(container, SWT.NONE); + composite_2.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + GridLayout gl_composite_2 = new GridLayout(1, false); + gl_composite_2.marginHeight = 0; + gl_composite_2.marginWidth = 0; + composite_2.setLayout(gl_composite_2); + + FGrid<Expert> composite_3 = new FGrid<>(composite_2); + composite_3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + composite_3.addIndexColumn("åºå·").setWidth(50); + composite_3.addColumn("å§“å", t -> t.getUser().getUserName(), SWT.CENTER).setWidth(100); + composite_3.addColumn("è´¦å·", t -> t.getUser().getUserAccount(), SWT.CENTER).setWidth(100); + composite_3.addColumn("专家类型", Expert::getExpertTypeAndRole, SWT.CENTER).setWidth(250); + expertList.bind(composite_3::refresh); + expert.reader(composite_3); + + Composite composite = new Composite(container, SWT.NONE); + composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + composite.setBackgroundMode(SWT.INHERIT_FORCE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + EButton button_1 = new EButton(composite, SWT.NONE); + button_1.addMouseListener(MouseListener.mouseUpAdapter($ -> confirmAction())); + button_1.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/yes.png")); + button_1.setText("确定"); + button_1.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1)); + + EButton button = new EButton(composite, SWT.NONE); + button.addMouseListener(MouseListener.mouseUpAdapter($ -> close())); + button.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/close.png")); + button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + button.setText("å…³é—"); + + init(); + + return container; + } + + private void init() { + RxSwt.run(this::queryExpertList).checkWidget(getShell()).exe(expertList::set); + } + + public List<Expert> queryExpertList() { + List<Expert> experts = expertService.getExpertList(tenderId, ExpertEnum.ALL); + if (experts == null) { + return null; + } + return experts.stream().filter(getExpertPredicate()).collect(Collectors.toList()); + } + + private Predicate<Expert> getExpertPredicate() { + switch (evaluationFactorTypeEnum) { + case COMPLIANCE: + return t -> true; + case BUSINESS: + return t -> (t.getEvalBidTypeNotNull() & ExpertEnum.EXPERT_BUS) != 0; + case TECHNOLOGY: + return t -> (t.getEvalBidTypeNotNull() & ExpertEnum.EXPERT_TEC) != 0; + default: + return t -> false; + } + } + + private void confirmAction() { + close(); + selectionListeners.forEach(l -> l.selection(expert.get())); + } + + public void addSelectionListener(SelectionListener<Expert> listener) { + selectionListeners.add(listener); + } + + public static Promise<Expert> selectExpert(Shell parentShell, String tenderId, EvaluationFactorTypeEnum evaluationFactorTypeEnum) { + SelectStepExpertDialog dialog = new SelectStepExpertDialog(parentShell, tenderId, evaluationFactorTypeEnum); + return new Promise<>((s, f) -> { + dialog.addSelectionListener(s::accept); + dialog.open(); + }); + } + + /** + * Return the initial size of the dialog. + */ + @Override + protected Point getInitialSize() { + return new Point(600, 400); + } +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/enums/DataCategoryEnum.java b/com.gx.obe.struct/src/com/gx/obe/struct/enums/DataCategoryEnum.java new file mode 100644 index 00000000..2a725314 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/enums/DataCategoryEnum.java @@ -0,0 +1,35 @@ +package com.gx.obe.struct.enums; + +import java.util.Map; + +import com.gx.obe.util.utils.EnumUtils; + +public enum DataCategoryEnum { + + NULL(""), + /** + * å°èŒƒæœ¬æ•°æ®è¡¨å• + */ + TDI("TDI"), + /** + * å°èŒƒæœ¬è¡¨æ ¼ + */ + TT("TT"), + /** + * å¯¹è±¡ç»“æž„åŒ–æ•°æ® + */ + MD("MD"); + + public static Map<String, DataCategoryEnum> MAP = EnumUtils.toMap(values(), DataCategoryEnum::getKey); + + private String key; + + private DataCategoryEnum(String key) { + this.key = key; + } + + public String getKey() { + return key; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/enums/EvaluationFactorTypeEnum.java b/com.gx.obe.struct/src/com/gx/obe/struct/enums/EvaluationFactorTypeEnum.java new file mode 100644 index 00000000..83a9f806 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/enums/EvaluationFactorTypeEnum.java @@ -0,0 +1,23 @@ +package com.gx.obe.struct.enums; + +import java.util.Map; + +import com.gx.obe.util.utils.EnumUtils; + +public enum EvaluationFactorTypeEnum { + + COMPLIANCE("compliance"), BUSINESS("business"), TECHNOLOGY("technology"); + + public static Map<String, EvaluationFactorTypeEnum> MAP = EnumUtils.toMap(values(), EvaluationFactorTypeEnum::getKey); + + private String key; + + private EvaluationFactorTypeEnum(String key) { + this.key = key; + } + + public String getKey() { + return key; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataClassEnum.java b/com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataClassEnum.java new file mode 100644 index 00000000..00227a17 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataClassEnum.java @@ -0,0 +1,30 @@ +package com.gx.obe.struct.enums; + +public enum ModelDataClassEnum { + + /** + * æŠ•æ ‡äººåŸºæœ¬æƒ…å†µ + */ + BidderInfo, + /** + * è¥ä¸šæ‰§ç…§ + */ + BusinessLicense, + /** + * 财务报告 + */ + Finance, + /** + * 业绩 + */ + Performance, + /** + * 项目负责人 + */ + ProjectLeader, + /** + * ä¼ä¸šä½“系认è¯è¯ä¹¦ + */ + Qualification; + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataTypeEnum.java b/com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataTypeEnum.java new file mode 100644 index 00000000..f5bfe2d7 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/enums/ModelDataTypeEnum.java @@ -0,0 +1,126 @@ +package com.gx.obe.struct.enums; + +import java.util.Map; + +import com.gx.obe.util.utils.EnumUtils; + +public enum ModelDataTypeEnum { + + /** + * æŠ•æ ‡äººåŸºæœ¬æƒ…å†µ + */ + EQ_BidderBasicInfo("EQ_BidderBasicInfo", ModelDataClassEnum.BidderInfo), + /** + * è¥ä¸šæ‰§ç…§ + */ + EQ_BusinessLicense("EQ_BusinessLicense", ModelDataClassEnum.BusinessLicense), + /** + * 财务报告 + */ + EQ_FinancialReport("EQ_FinancialReport", ModelDataClassEnum.Finance), + /** + * 项目负责人 + */ + EQ_ProjectLeader("EQ_ProjectLeader", ModelDataClassEnum.ProjectLeader), + /** + * 施工业绩 + */ + EQ_Construction("EQ_Construction", ModelDataClassEnum.Performance), + /** + * 勘察设计 + */ + EQ_SurveyDesign("EQ_SurveyDesign", ModelDataClassEnum.Performance), + /** + * 监ç†ä¸šç»© + */ + EQ_Supervision("EQ_Supervision", ModelDataClassEnum.Performance), + /** + * 采è´ä¸šç»© + */ + EQ_Procurement("EQ_Procurement", ModelDataClassEnum.Performance), + /** + * 生产业绩 + */ + EQ_Production("EQ_Production", ModelDataClassEnum.Performance), + /** + * 安全生产许å¯è¯ + */ + EQ_Qualification_SCXK("EQ_Qualification_SCXK", ModelDataClassEnum.Qualification), + /** + * è´¨é‡ä½“系认è¯è¯ä¹¦ + */ + EQ_Qualification_ZLTX("EQ_Qualification_ZLTX", ModelDataClassEnum.Qualification), + /** + * èŒä¸šå¥åº·å®‰å…¨ç®¡ç†ä½“ç³» + */ + EQ_Qualification_ZYJK("EQ_Qualification_ZYJK", ModelDataClassEnum.Qualification), + /** + * 环境管ç†ä½“系认è¯è¯ä¹¦ + */ + EQ_Qualification_HBTX("EQ_Qualification_HBTX", ModelDataClassEnum.Qualification), + /** + * 全国工业生产许å¯è¯ + */ + EQ_Qualification_QGGYSCXK("EQ_Qualification_QGGYSCXK", ModelDataClassEnum.Qualification), + /** + * 其他资质è¯ä¹¦ï¼ˆåŽèƒ½ä¼ä¸šèµ„è´¨è¯ä¹¦ï¼‰ + */ + EQ_Qualification("EQ_Qualification", ModelDataClassEnum.Qualification), + /** + * 国家级奖项(åŽèƒ½æ–°å¢žï¼‰ + */ + EQ_Qualification_GJ_JX("EQ_Qualification_GJ_JX", ModelDataClassEnum.Qualification), + /** + * çœéƒ¨çº§å¥–励(åŽèƒ½æ–°å¢žï¼‰ + */ + EQ_Qualification_SJ_JX("EQ_Qualification_SJ_JX", ModelDataClassEnum.Qualification), + /** + * 所建工程国家级奖励 + */ + EQ_Qualification_GJ_GCJX("EQ_Qualification_GJ_GCJX", ModelDataClassEnum.Qualification), + /** + * 所建工程çœéƒ¨çº§å¥–励 + */ + EQ_Qualification_SJ_GCJX("EQ_Qualification_SJ_GCJX", ModelDataClassEnum.Qualification), + /** + * 资信ç‰çº§ï¼ˆéœ€è¦ç»Ÿä¸€ç‰çº§ï¼‰ + */ + EQ_Qualification_ZXDJ("EQ_Qualification_ZXDJ", ModelDataClassEnum.Qualification), + /** + * 设计资质 + */ + EQ_Qualification_SJZZ("EQ_Qualification_SJZZ", ModelDataClassEnum.Qualification), + /** + * 施工资质 + */ + EQ_Qualification_SGZZ("EQ_Qualification_SGZZ", ModelDataClassEnum.Qualification), + /** + * 监ç†èµ„è´¨ + */ + EQ_Qualification_JLZZ("EQ_Qualification_JLZZ", ModelDataClassEnum.Qualification), + /** + * 检验报告 + */ + EQ_Qualification_SurveyReport("EQ_Qualification_SurveyReport", ModelDataClassEnum.Qualification); + + + public static Map<String, ModelDataTypeEnum> MAP = EnumUtils.toMap(values(), ModelDataTypeEnum::getKey); + + private String key; + + private ModelDataClassEnum classEnum; + + private ModelDataTypeEnum(String key, ModelDataClassEnum classEnum) { + this.key = key; + this.classEnum = classEnum; + } + + public String getKey() { + return key; + } + + public ModelDataClassEnum getClassEnum() { + return classEnum; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/enums/PerformanceStatus.java b/com.gx.obe.struct/src/com/gx/obe/struct/enums/PerformanceStatus.java new file mode 100644 index 00000000..cc4f9574 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/enums/PerformanceStatus.java @@ -0,0 +1,39 @@ +package com.gx.obe.struct.enums; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +import com.gx.obe.util.utils.EnumUtils; + +public enum PerformanceStatus { + /** + * è¿›è¡Œä¸ + */ + PROGRESS("00", "进行ä¸"), + /** + * å·²å®Œæˆ + */ + COMPLETED("01", "已投产"); + + public static Map<String, PerformanceStatus> MAP = EnumUtils.toMap(values(), PerformanceStatus::getKey); + + public static Function<String, String> keyToValueFun = t -> Optional.ofNullable(t).map(MAP::get).map(PerformanceStatus::getName).orElse("未知状æ€"); + + private String key; + private String name; + + private PerformanceStatus(String key, String name) { + this.key = key; + this.name = name; + } + + public String getKey() { + return key; + } + + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/factory/ModelDataFactory.java b/com.gx.obe.struct/src/com/gx/obe/struct/factory/ModelDataFactory.java new file mode 100644 index 00000000..1ac96794 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/factory/ModelDataFactory.java @@ -0,0 +1,1476 @@ +package com.gx.obe.struct.factory; + +import java.io.File; +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.widgets.Composite; + +import com.gx.obe.common.icons.IconsActivator; +import com.gx.obe.component.form.FForm; +import com.gx.obe.component.rx.RxSwt; +import com.gx.obe.component.table.FTable; +import com.gx.obe.component.utils.CompositeUtils; +import com.gx.obe.components.core.Constants; +import com.gx.obe.struct.beans.AttachmentFile; +import com.gx.obe.struct.beans.BidderBasicInfo; +import com.gx.obe.struct.beans.BusinessLicense; +import com.gx.obe.struct.beans.Certificate; +import com.gx.obe.struct.beans.Finance; +import com.gx.obe.struct.beans.ModelData; +import com.gx.obe.struct.beans.Performance; +import com.gx.obe.struct.beans.ProjectLeader; +import com.gx.obe.struct.beans.Qualification; +import com.gx.obe.struct.beans.WorkExperience; +import com.gx.obe.struct.enums.ModelDataTypeEnum; +import com.gx.obe.struct.enums.PerformanceStatus; +import com.gx.obe.struct.inters.IModelData; +import com.gx.obe.struct.inters.IModelDataDetail; +import com.gx.obe.struct.service.AttachmentFileService; +import com.gx.obe.struct.service.BidderInfoService; +import com.gx.obe.struct.service.BusinessLicenseService; +import com.gx.obe.struct.service.CertificateService; +import com.gx.obe.struct.service.FinanceService; +import com.gx.obe.struct.service.PerformanceService; +import com.gx.obe.struct.service.ProjectLeaderService; +import com.gx.obe.struct.service.QualificationService; +import com.gx.obe.struct.service.WorkExperienceService; +import com.gx.obe.util.utils.NumberFormatUtils; +import com.gx.obe.util.utils.RuntimeUtils; +import com.swtdesigner.ResourceManager; + +public class ModelDataFactory { + + public static IModelData create(Composite tableParent, IModelDataDetail modelDataDetail, ModelDataTypeEnum modelDataTypeEnum) { + CompositeUtils.disposeChildren(tableParent); + switch (modelDataTypeEnum) { + case EQ_BidderBasicInfo: + return initBidderBasicInfo(tableParent, modelDataDetail); + case EQ_BusinessLicense: + return initBusinessLicense(tableParent, modelDataDetail); + case EQ_Construction: + return initConstruction(tableParent, modelDataDetail); + case EQ_FinancialReport: + return initFinancialReport(tableParent, modelDataDetail); + case EQ_Procurement: + return initProcurement(tableParent, modelDataDetail); + case EQ_Production: + return initProduction(tableParent, modelDataDetail); + case EQ_ProjectLeader: + return initProjectLeader(tableParent, modelDataDetail); + case EQ_Qualification: + return initQualification(tableParent, modelDataDetail); + case EQ_Qualification_GJ_GCJX: + return initQualification_GJ_GCJX(tableParent, modelDataDetail); + case EQ_Qualification_GJ_JX: + return initQualification_GJ_JX(tableParent, modelDataDetail); + case EQ_Qualification_HBTX: + return initQualification_HBTX(tableParent, modelDataDetail); + case EQ_Qualification_JLZZ: + return initQualification_JLZZ(tableParent, modelDataDetail); + case EQ_Qualification_QGGYSCXK: + return initQualification_QGGYSCXK(tableParent, modelDataDetail); + case EQ_Qualification_SCXK: + return initQualification_SCXK(tableParent, modelDataDetail); + case EQ_Qualification_SGZZ: + return initQualification_SGZZ(tableParent, modelDataDetail); + case EQ_Qualification_SJZZ: + return initQualification_SJZZ(tableParent, modelDataDetail); + case EQ_Qualification_SJ_GCJX: + return initQualification_SJ_GCJX(tableParent, modelDataDetail); + case EQ_Qualification_SJ_JX: + return initQualification_SJ_JX(tableParent, modelDataDetail); + case EQ_Qualification_SurveyReport: + return initQualification_SurveyReport(tableParent, modelDataDetail); + case EQ_Qualification_ZLTX: + return initQualification_ZLTX(tableParent, modelDataDetail); + case EQ_Qualification_ZXDJ: + return initQualification_ZXDJ(tableParent, modelDataDetail); + case EQ_Qualification_ZYJK: + return initQualification_ZYJK(tableParent, modelDataDetail); + case EQ_Supervision: + return initSupervision(tableParent, modelDataDetail); + case EQ_SurveyDesign: + return initSurveyDesign(tableParent, modelDataDetail); + } + + return null; + } + + /** + * @Description: æŠ•æ ‡äººåŸºæœ¬æƒ…å†µ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initBidderBasicInfo(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final BidderInfoService bidderInfoService = new BidderInfoService(); + + private FTable<BidderBasicInfo> fTable; + + protected void init() { + fTable = new FTable<BidderBasicInfo>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("æŠ•æ ‡äººåç§°", BidderBasicInfo::getCompanyName); + new ContentColumn("注册地å€", BidderBasicInfo::getRegisterLocation); + new ContentColumn("è”系人", BidderBasicInfo::getLinkMan); + new ContentColumn("组织结构", BidderBasicInfo::getOrgStructure); + new ContentColumn("法人姓å", BidderBasicInfo::getLegalRepresentativeName); + new ContentColumn("技术负责人姓å", BidderBasicInfo::getTechnicalDirectorName); + new ContentColumn("æˆç«‹æ—¶é—´", BidderBasicInfo::getSetupTime); + new ContentColumn("ä¼ä¸šèµ„è´¨ç‰çº§", BidderBasicInfo::getCompanyQualificationLevel); + new ContentColumn("注册资金(万元)", BidderBasicInfo::getRegisteredCapital); + new ContentColumn("è¥ä¸šæ‰§ç…§å·", BidderBasicInfo::getBussinessLicense); + new ContentColumn("开户银行", BidderBasicInfo::getDepositBank); + new ContentColumn("银行账å·", BidderBasicInfo::getBankAccount); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCompanyName() + "基本情况表")); + modelDataDetail.addBasicSubpage(p -> { + FForm<BidderBasicInfo> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("æŠ•æ ‡äººåç§°", BidderBasicInfo::getCompanyName); t.add("注册地å€", BidderBasicInfo::getRegisterLocation); + t.add("è”系人", BidderBasicInfo::getLinkMan); t.add("电è¯", BidderBasicInfo::getLinkManPhone); + t.add("邮政编ç ", BidderBasicInfo::getPostalCode); t.add("ä¼ çœŸ", BidderBasicInfo::getLinkManFax); + t.add("网å€", BidderBasicInfo::getLinkManWebsite); t.add("组织结构", BidderBasicInfo::getOrgStructure); + t.add("法人姓å", BidderBasicInfo::getLegalRepresentativeName); t.add("技术负责人姓å", BidderBasicInfo::getTechnicalDirectorName); + t.add("法人技术èŒç§°", BidderBasicInfo::getLegalRepresentativeTitle); t.add("技术负责人èŒç§°", BidderBasicInfo::getTechnicalDirectorTitle); + t.add("法人电è¯", BidderBasicInfo::getLegalRepresentativePhone); t.add("技术负责人电è¯", BidderBasicInfo::getTechnicalDirectorPhone); + t.add("æˆç«‹æ—¶é—´", BidderBasicInfo::getSetupTime); t.add("ä¼ä¸šèµ„è´¨ç‰çº§", BidderBasicInfo::getCompanyQualificationLevel); + t.add("注册资金(万元)", BidderBasicInfo::getRegisteredCapital); t.add("è¥ä¸šæ‰§ç…§å·", BidderBasicInfo::getBussinessLicense); + t.add("开户银行", BidderBasicInfo::getDepositBank); t.add("银行账å·", BidderBasicInfo::getBankAccount); + t.add("高级èŒç§°äººæ•°", BidderBasicInfo::getSeniorProfessionalPostNumber); t.add("项目ç»ç†äººæ•°", BidderBasicInfo::getPurchaserNumber); + t.add("ä¸çº§èŒç§°äººæ•°", BidderBasicInfo::getMediumProfessionalPostNumber); t.add("技工人数", BidderBasicInfo::getArtisanNumber); + t.add("åˆçº§èŒç§°äººæ•°", BidderBasicInfo::getPrimaryProfessionalPostNumber); t.add("员工总人数", BidderBasicInfo::getEmployeeNumber); + t.addLong("ä¼ä¸šæ€§è´¨", BidderBasicInfo::getEnterpriseNature); + t.addLong("ç»è¥èŒƒå›´", BidderBasicInfo::getBusinessScope); + t.addLong("è‚¡æƒç»“æž„", BidderBasicInfo::getEquityStructure); + t.addBig("拟投入项目设备", BidderBasicInfo::getPreInputDevice); + t.addBig("å…³è”ä¼ä¸šæƒ…况", BidderBasicInfo::getRelatedCompanyInfo); + t.addBig("æœåŠ¡èƒ½åŠ›", BidderBasicInfo::getServiceAbility); + t.addBig("备注", BidderBasicInfo::getMemo); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> bidderInfoService.getBidderBasicInfoList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: è¥ä¸šæ‰§ç…§ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initBusinessLicense(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final BusinessLicenseService businessLicenseService = new BusinessLicenseService(); + + private FTable<BusinessLicense> fTable; + + protected void init() { + fTable = new FTable<BusinessLicense>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("统一社会信用代ç ", BusinessLicense::getRegisterNumber); + new ContentColumn("å…¬å¸åç§°", BusinessLicense::getCompanyName); + new ContentColumn("使‰€", BusinessLicense::getCompanyAddress); + new ContentColumn("法定代表人", BusinessLicense::getLegalRepresentative); + new ContentColumn("注册资本(万元)", BusinessLicense::getRegisterCapital); + new ContentColumn("æˆç«‹æ—¥æœŸ", BusinessLicense::getEstablishDate); + new ContentColumn("è¥ä¸šæœŸé™", d -> d.getBusnissTermStartDate() + "至" + d.getBusnissTermEndtDate()); + new ContentColumn("登记机关", BusinessLicense::getRegisterInstitution); + new ContentColumn("ä¼ä¸šç±»åž‹", BusinessLicense::getCompanyType); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCompanyName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<BusinessLicense> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("统一社会信用代ç ", BusinessLicense::getRegisterNumber); + t.add("å…¬å¸åç§°", BusinessLicense::getCompanyName); + t.add("使‰€", BusinessLicense::getCompanyAddress); + t.add("法定代表人", BusinessLicense::getLegalRepresentative); + t.add("注册资本(万元)", BusinessLicense::getRegisterCapital); + t.add("æˆç«‹æ—¥æœŸ", BusinessLicense::getEstablishDate); + t.add("è¥ä¸šæœŸé™", d -> d.getBusnissTermStartDate() + "至" + d.getBusnissTermEndtDate()); + t.add("登记机关", BusinessLicense::getRegisterInstitution); + t.add("ä¼ä¸šç±»åž‹", BusinessLicense::getCompanyType); + t.addBig("ç»è¥èŒƒå›´", BusinessLicense::getBusinessScope); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> businessLicenseService.getBusinessLicenseList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 施工业绩 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initConstruction(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final PerformanceService performanceService = new PerformanceService(); + + private FTable<Performance> fTable; + + protected void init() { + fTable = new FTable<Performance>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("ä¼ä¸šåç§°", Performance::getSupplierName); + new ContentColumn("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + new ContentColumn("项目åç§°", Performance::getProjectName); + new ContentColumn("项目所在地", Performance::getProjectAddress); + new ContentColumn("å‘包人åç§°", Performance::getBuyerName); + new ContentColumn("åˆåŒé‡‘é¢ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + new ContentColumn("开工日期", Performance::getStartTime); + new ContentColumn("竣工/计划竣工日期", Performance::getEndTime); + new ContentColumn("项目ç»ç†", Performance::getProjectManager); + new ContentColumn("技术负责人", Performance::getTechnicalDirector); + new ContentColumn("总监ç†å·¥ç¨‹å¸ˆ", Performance::getChiefSupervisionEngineer); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getProjectName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Performance> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Performance::getSupplierName); t.add("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + t.add("项目åç§°", Performance::getProjectName); t.add("项目所在地", Performance::getProjectAddress); + t.add("å‘包人åç§°", Performance::getBuyerName); t.add("å‘包人地å€", Performance::getBuyerAddress); + t.add("å‘包人电è¯", Performance::getBuyerPhoneNumber); t.add("åˆåŒé‡‘é¢ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + t.add("开工日期", Performance::getStartTime); t.add("竣工/计划竣工日期", Performance::getEndTime); + t.addLong("承担的工作", Performance::getWorkUndertaken); + t.addLong("项目质é‡", Performance::getProjectQuantity); + t.add("项目ç»ç†", Performance::getProjectManager); t.add("技术负责人", Performance::getTechnicalDirector); + t.add("总监ç†å·¥ç¨‹å¸ˆ", Performance::getChiefSupervisionEngineer); t.add("总监ç†å·¥ç¨‹å¸ˆç”µè¯", Performance::getCsePhoneNumber); + t.addBig("项目æè¿°", Performance::getProjectDesc); + t.addLong("备注", Performance::getMemo); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> performanceService.getPerformanceList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 财务报告 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initFinancialReport(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final FinanceService financeService = new FinanceService(); + + private FTable<Finance> fTable; + + protected void init() { + + final Function<BigDecimal, String> toString = t -> Optional.ofNullable(t).map(NumberFormatUtils::format).orElse(null); + + fTable = new FTable<Finance>(tableParent, SWT.NONE) { + + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("ä¼ä¸šåç§°", Finance::getCompanyName); + new ContentColumn("财务报告年度", Finance::getAnnual); + new ContentColumn("资产总é¢ï¼ˆä¸‡å…ƒï¼‰", toString.compose(Finance::getTotal)); + new ContentColumn("负债总é¢ï¼ˆä¸‡å…ƒï¼‰", toString.compose(Finance::getTotalliabilities)); + new ContentColumn("资产负债率(%)", toString.compose(Finance::getLiabilitiesRate)); + new ContentColumn("主è¥ä¸šåŠ¡æ”¶å…¥ï¼ˆä¸‡å…ƒï¼‰", toString.compose(Finance::getPrimeOperatingRevenue)); + new ContentColumn("净利润(万元)", toString.compose(Finance::getRetainedProfits)); + new ContentColumn("净利率(%)", toString.compose(Finance::getProfitRatio)); + } + }; + + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getAnnual() + "年度财务报告")); + + modelDataDetail.addBasicSubpage(p -> { + FForm<Finance> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Finance::getCompanyName); + t.add("财务报告年度", Finance::getAnnual); + t.add("资产总é¢ï¼ˆä¸‡å…ƒï¼‰", toString.compose(Finance::getTotal)); + t.add("主è¥ä¸šåŠ¡æ”¶å…¥ï¼ˆä¸‡å…ƒï¼‰", toString.compose(Finance::getPrimeOperatingRevenue)); + t.add("负债总é¢ï¼ˆä¸‡å…ƒï¼‰", toString.compose(Finance::getTotalliabilities)); + t.add("净利润(万元)", toString.compose(Finance::getRetainedProfits)); + t.add("资产负债率(%)", toString.compose(Finance::getLiabilitiesRate)); + t.add("净利率(%)", toString.compose(Finance::getProfitRatio)); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> financeService.getFinanceList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 采è´ä¸šç»© + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initProcurement(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final PerformanceService performanceService = new PerformanceService(); + + private FTable<Performance> fTable; + + protected void init() { + fTable = new FTable<Performance>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("ä¼ä¸šåç§°", Performance::getSupplierName); + new ContentColumn("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + new ContentColumn("设备åç§°", Performance::getDeviceName); + new ContentColumn("è§„æ ¼å’Œåž‹å·", Performance::getDevicetypeSpecification); + new ContentColumn("项目åç§°", Performance::getProjectName); + new ContentColumn("总容é‡", Performance::getTotalCapacity); + new ContentColumn("å°æ•°", Performance::getNumber); + new ContentColumn("ä¹°æ–¹åç§°", Performance::getBuyerName); + new ContentColumn("è”系人", Performance::getBuyerLinkman); + new ContentColumn("è”系方å¼", Performance::getBuyerPhoneNumber); + new ContentColumn("åˆåŒæ—¶é—´", Performance::getContractTime); + new ContentColumn("ç¾çº¦åˆåŒä»·ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + new ContentColumn("投è¿/è®¡åˆ’æŠ•è¿æ—¥æœŸ", Performance::getCommissioningTime); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getSupplierName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Performance> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Performance::getSupplierName); t.add("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + t.add("设备åç§°", Performance::getDeviceName); t.add("è§„æ ¼å’Œåž‹å·", Performance::getDevicetypeSpecification); + t.add("项目åç§°", Performance::getProjectName); t.add("总容é‡", Performance::getTotalCapacity); + t.add("å°æ•°", Performance::getNumber); t.add("ä¹°æ–¹åç§°", Performance::getBuyerName); + t.add("è”系人", Performance::getBuyerLinkman); t.add("è”系方å¼", Performance::getBuyerPhoneNumber); + t.add("åˆåŒæ—¶é—´", Performance::getContractTime); t.add("ç¾çº¦åˆåŒä»·ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + t.add("投è¿/è®¡åˆ’æŠ•è¿æ—¥æœŸ", Performance::getCommissioningTime); t.addNull(); + t.addBig("备注", Performance::getMemo); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> performanceService.getPerformanceList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 生产业绩 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initProduction(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final PerformanceService performanceService = new PerformanceService(); + + private FTable<Performance> fTable; + + protected void init() { + fTable = new FTable<Performance>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("ä¼ä¸šåç§°", Performance::getSupplierName); + new ContentColumn("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + new ContentColumn("项目åç§°", Performance::getProjectName); + new ContentColumn("项目所在地", Performance::getProjectAddress); + new ContentColumn("å‘包人åç§°", Performance::getBuyerName); + new ContentColumn("ç¾çº¦ä»·æ ¼ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + new ContentColumn("开工日期", Performance::getStartTime); + new ContentColumn("竣工/计划竣工日期", Performance::getEndTime); + new ContentColumn("项目ç»ç†", Performance::getProjectManager); + new ContentColumn("技术负责人", Performance::getTechnicalDirector); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getProjectName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Performance> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Performance::getSupplierName); t.add("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + t.add("项目åç§°", Performance::getProjectName); t.add("项目所在地", Performance::getProjectAddress); + t.add("å‘包人åç§°", Performance::getBuyerName); t.add("å‘包人地å€", Performance::getBuyerAddress); + t.add("å‘包人电è¯", Performance::getBuyerPhoneNumber); t.add("ç¾çº¦ä»·æ ¼ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + t.add("开工日期", Performance::getStartTime); t.add("竣工/计划竣工日期", Performance::getEndTime); + t.addLong("承担的工作", Performance::getWorkUndertaken); + t.addLong("项目质é‡", Performance::getProjectQuantity); + t.add("项目ç»ç†", Performance::getProjectManager); t.add("技术负责人", Performance::getTechnicalDirector); + t.addBig("项目æè¿°", Performance::getProjectDesc); + t.addLong("备注", Performance::getMemo); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> performanceService.getPerformanceList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 项目负责人 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initProjectLeader(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final ProjectLeaderService projectLeaderService = new ProjectLeaderService(); + private final CertificateService certificateService = new CertificateService(); + private final WorkExperienceService workExperienceService = new WorkExperienceService(); + + private FTable<ProjectLeader> fTable; + + protected void init() { + fTable = new FTable<ProjectLeader>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("å§“å", ProjectLeader::getLeaderName); + new ContentColumn("身份è¯å·", ProjectLeader::getIdnumber); + new ContentColumn("年龄", ProjectLeader::getAge); + new ContentColumn("èŒåŠ¡", ProjectLeader::getJobTitle); + new ContentColumn("èŒç§°", ProjectLeader::getProfessionalTitle); + new ContentColumn("å¦åކ", ProjectLeader::getEducation); + new ContentColumn("æ¯•ä¸šå¦æ ¡", ProjectLeader::getGraduateSchool); + new ContentColumn("专业", ProjectLeader::getGraduateMajor); + new ContentColumn("工作ç»éªŒï¼ˆå¹´ï¼‰", ProjectLeader::getWorkExperience); + new ContentColumn("å…¬å¸åç§°", ProjectLeader::getCompanyName); + new ContentColumn("本专业工作ç»éªŒï¼ˆå¹´ï¼‰", ProjectLeader::getCurrentMajorExperience); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCompanyName() + "基本情况表")); + modelDataDetail.addBasicSubpage(p -> { + FForm<ProjectLeader> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("å§“å", ProjectLeader::getLeaderName); t.add("身份è¯å·", ProjectLeader::getIdnumber); + t.add("年龄", ProjectLeader::getAge); t.add("èŒåŠ¡", ProjectLeader::getJobTitle); + t.add("èŒç§°", ProjectLeader::getProfessionalTitle); t.add("å¦åކ", ProjectLeader::getEducation); + t.add("æ¯•ä¸šå¦æ ¡", ProjectLeader::getGraduateSchool); t.add("专业", ProjectLeader::getGraduateMajor); + t.add("工作ç»éªŒï¼ˆå¹´ï¼‰", ProjectLeader::getWorkExperience); t.add("å…¬å¸åç§°", ProjectLeader::getCompanyName); + t.add("本专业工作ç»éªŒï¼ˆå¹´ï¼‰", ProjectLeader::getCurrentMajorExperience); t.addNull(); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addSubpage("è¯ä¹¦åˆ—表", p -> { + FTable<Certificate> table = new FTable<Certificate>(p, SWT.NONE) { + + private final AttachmentFileService attachmentFileService = new AttachmentFileService(); + + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦ç¼–å·", Certificate::getCertificateNo); + new ContentColumn("è¯ä¹¦åç§°", Certificate::getCertificateName); + new ContentColumn("è¯ä¹¦ç‰çº§", Certificate::getCertificateLevel); + new LinkContentColumn("查看", "查看", ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/view.png"), t -> { + String bidFilePath = Constants.getBidFilePath(t.getTenderId(), supplierId.get()); + RxSwt.run(() -> attachmentFileService.getAttachmentFileList(t.getId())).checkWidget(this).exe(attachmentFileList -> { + Optional<File> fileOptional = Optional.ofNullable(attachmentFileList).map(List::stream).flatMap(Stream::findFirst).map(AttachmentFile::getFileUrl).map(bidFilePath::concat).map(File::new).filter(File::exists); + if (fileOptional.isPresent()) { + RuntimeUtils.openFIle(fileOptional.get()); + } else { + MessageDialog.openShortMessage("文件ä¸å˜åœ¨ï¼"); + } + }); + }); + } + }; + fTable.addSelectionListener(t -> RxSwt.run(() -> certificateService.getCertificateList(t.getId())).checkWidget(table).exe(table::refresh)); + return table; + }); + modelDataDetail.addSubpage("个人ç»åކ", p -> { + FTable<WorkExperience> table = new FTable<WorkExperience>(p, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("æŠ•è¿æ—¶é—´/竣工时间", WorkExperience::getTime); + new ContentColumn("项目åç§°", WorkExperience::getProjectName); + new ContentColumn("容é‡ï¼ˆMW)", WorkExperience::getCapacity); + new ContentColumn("æ‹…ä»»èŒåŠ¡", WorkExperience::getJobTitle); + new ContentColumn("承担的工作(简述)", WorkExperience::getBearWork); + new ContentColumn("å‘包人åŠè”系电è¯", WorkExperience::getContractInfo); + } + }; + fTable.addSelectionListener(t -> RxSwt.run(() -> workExperienceService.getWorkExperienceList(t.getId())).checkWidget(table).exe(table::refresh)); + return table; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> projectLeaderService.getProjectLeaderList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: ä¼ä¸šèµ„è´¨ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 所建工程国家级奖励 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_GJ_GCJX(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘奖å•ä½", Qualification::getIssueAuthority); + new ContentColumn("获奖工程åç§°", Qualification::getAwardProjectName); + new ContentColumn("获奖年份", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘奖å•ä½", Qualification::getIssueAuthority); + t.add("获奖工程åç§°", Qualification::getAwardProjectName); + t.add("获奖年份", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 国家级奖项 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_GJ_JX(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘奖å•ä½", Qualification::getIssueAuthority); + new ContentColumn("获奖年份", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘奖å•ä½", Qualification::getIssueAuthority); + t.add("获奖年份", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 环境管ç†ä½“系认è¯è¯ä¹¦ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_HBTX(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("认è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + new ContentColumn("有效期至", Qualification::getPeriodValidity); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + t.add("有效期至", Qualification::getPeriodValidity); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 监ç†èµ„è´¨ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_JLZZ(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 全国工业生产许å¯è¯ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_QGGYSCXK(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("认è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + new ContentColumn("有效期至", Qualification::getPeriodValidity); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("认è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + t.add("有效期至", Qualification::getPeriodValidity); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 施工资质 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_SGZZ(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 设计资质 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_SJZZ(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 安全生产许å¯è¯ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_SCXK(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("认è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + new ContentColumn("有效期至", Qualification::getPeriodValidity); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("认è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + t.add("有效期至", Qualification::getPeriodValidity); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 所建工程çœéƒ¨çº§çº§å¥–励 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_SJ_GCJX(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘奖å•ä½", Qualification::getIssueAuthority); + new ContentColumn("获奖工程åç§°", Qualification::getAwardProjectName); + new ContentColumn("获奖年份", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘奖å•ä½", Qualification::getIssueAuthority); + t.add("获奖工程åç§°", Qualification::getAwardProjectName); + t.add("获奖年份", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: çœéƒ¨çº§å¥–励 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_SJ_JX(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘奖å•ä½", Qualification::getIssueAuthority); + new ContentColumn("获奖年份", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘奖å•ä½", Qualification::getIssueAuthority); + t.add("获奖年份", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 检验报告 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_SurveyReport(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: è´¨é‡ä½“系认è¯è¯ä¹¦ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_ZLTX(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("认è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + new ContentColumn("有效期至", Qualification::getPeriodValidity); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + t.add("有效期至", Qualification::getPeriodValidity); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 资信ç‰çº§ + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_ZXDJ(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + new ContentColumn("有效期至", Qualification::getPeriodValidity); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("è¯ä¹¦ç‰çº§", Qualification::getAwardLevel); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + t.add("有效期至", Qualification::getPeriodValidity); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: èŒä¸šå¥åº·å®‰å…¨ç®¡ç†ä½“ç³» + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initQualification_ZYJK(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final QualificationService qualificationService = new QualificationService(); + + private FTable<Qualification> fTable; + + protected void init() { + fTable = new FTable<Qualification>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("è¯ä¹¦åç§°", Qualification::getCertificateName); + new ContentColumn("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + new ContentColumn("ä¼ä¸šåç§°", Qualification::getCompanyName); + new ContentColumn("å‘è¯å•ä½", Qualification::getIssueAuthority); + new ContentColumn("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + new ContentColumn("有效期至", Qualification::getPeriodValidity); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getCertificateName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Qualification> fform = new FForm<>(p, 1); + fform.init(t -> { + t.add("è¯ä¹¦ç¼–å·", Qualification::getCertificateNumber); + t.add("ä¼ä¸šåç§°", Qualification::getCompanyName); + t.add("å‘è¯å•ä½", Qualification::getIssueAuthority); + t.add("å‘è¯æ—¥æœŸ", Qualification::getIssueDate); + t.add("有效期至", Qualification::getPeriodValidity); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> qualificationService.getQualificationList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 监ç†ä¸šç»© + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initSupervision(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final PerformanceService performanceService = new PerformanceService(); + + private FTable<Performance> fTable; + + protected void init() { + fTable = new FTable<Performance>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("ä¼ä¸šåç§°", Performance::getSupplierName); + new ContentColumn("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + new ContentColumn("项目åç§°", Performance::getProjectName); + new ContentColumn("项目所在地", Performance::getProjectAddress); + new ContentColumn("ç¾çº¦åˆåŒä»·ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + new ContentColumn("委托人åç§°", Performance::getBuyerName); + new ContentColumn("委托人地å€", Performance::getBuyerAddress); + new ContentColumn("委托人电è¯", Performance::getBuyerPhoneNumber); + new ContentColumn("总监ç†å·¥ç¨‹å¸ˆ", Performance::getChiefSupervisionEngineer); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getProjectName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Performance> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Performance::getSupplierName); t.add("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + t.add("项目åç§°", Performance::getProjectName); t.add("项目所在地", Performance::getProjectAddress); + t.add("委托人åç§°", Performance::getBuyerName); t.add("委托人地å€", Performance::getBuyerAddress); + t.add("ç¾çº¦åˆåŒä»·ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); t.add("委托人电è¯", Performance::getBuyerPhoneNumber); + t.add("总监ç†å·¥ç¨‹å¸ˆ", Performance::getChiefSupervisionEngineer); t.addNull(); + t.addLong("ç›‘ç†æœåŠ¡æœŸé™", Performance::getServiceDesc); + t.addLong("监ç†å†…容", Performance::getSupervisionCcontent); + t.addBig("项目æè¿°", Performance::getProjectDesc); + t.addBig("备注", Performance::getMemo); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> performanceService.getPerformanceList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + + /** + * @Description: 勘察设计 + * @author chenxw + * @param tableParent + * @param modelDataDetail + * @return + */ + private static IModelData initSurveyDesign(Composite tableParent, IModelDataDetail modelDataDetail) { + return new IModelData() { + + private final PerformanceService performanceService = new PerformanceService(); + + private FTable<Performance> fTable; + + protected void init() { + fTable = new FTable<Performance>(tableParent, SWT.NONE) { + protected void init() { + new IndexColumn("åºå·"); + new ContentColumn("ä¼ä¸šåç§°", Performance::getSupplierName); + new ContentColumn("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + new ContentColumn("项目åç§°", Performance::getProjectName); + new ContentColumn("项目所在地", Performance::getProjectAddress); + new ContentColumn("å‘包人åç§°", Performance::getBuyerName); + new ContentColumn("åˆåŒä»·æ ¼ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + new ContentColumn("勘察设计æœåŠ¡æœŸé™", Performance::getServiceDesc); + new ContentColumn("勘察设计内容", Performance::getDesignRange); + new ContentColumn("负责人/总工程师", Performance::getChiefSupervisionEngineer); + } + }; + fTable.addSelectionListener(t -> modelDataDetail.refreshTitle(t.getProjectName())); + modelDataDetail.addBasicSubpage(p -> { + FForm<Performance> fform = new FForm<>(p, 2); + fform.init(t -> { + t.add("ä¼ä¸šåç§°", Performance::getSupplierName); t.add("业绩状æ€", PerformanceStatus.keyToValueFun.compose(Performance::getStatus)); + t.add("项目åç§°", Performance::getProjectName); t.add("项目所在地", Performance::getProjectAddress); + t.add("å‘包人åç§°", Performance::getBuyerName); t.add("å‘包人地å€", Performance::getBuyerAddress); + t.add("å‘包人电è¯", Performance::getBuyerPhoneNumber); t.add("åˆåŒä»·æ ¼ï¼ˆä¸‡å…ƒï¼‰", Performance::getSingningTotal); + t.add("勘察设计æœåŠ¡æœŸé™", Performance::getServiceDesc); t.add("勘察设计内容", Performance::getDesignRange); + t.add("负责人/总工程师", Performance::getChiefSupervisionEngineer); t.addNull(); + t.addBig("项目æè¿°", Performance::getProjectDesc); + t.addBig("备注", Performance::getMemo); + }); + fTable.addSelectionListener(fform::refresh); + return fform; + }); + modelDataDetail.addAttachmentSubpage(c -> fTable.addSelectionListener(t -> c.accept(supplierId.get(), t.getId()))); + } + + public void refresh(ModelData modelData) { + supplierId.set(modelData.getSupplierId()); + RxSwt.run(() -> performanceService.getPerformanceList(modelData.getTenderId(), modelData.getId())).checkWidget(fTable).exe(l -> { + count.set(l.size()); + fTable.refresh(l); + }); + } + }; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentFactory.java b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentFactory.java new file mode 100644 index 00000000..68e92d02 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentFactory.java @@ -0,0 +1,73 @@ +package com.gx.obe.struct.handler; + +import java.util.List; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.components.core.enumeration.EvaluationFactorEnum; +import com.gx.obe.struct.inters.IFactorClearBidContent; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; +import com.gx.obe.web.service.SupplierEvaluationFactorService; +import com.gx.obe.web.service.SupplierService; +import com.gx.obe.web.service.evaluation.EvaluationFactorService; + +public class FactorClearBidContentFactory { + + private SupplierService supplierService = new SupplierService(); + private EvaluationFactorService evaluationFactorService = new EvaluationFactorService(); + private SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + + private String tenderId; + private List<Supplier> supplierList; + private List<SupplierEvaluationFactor> supplierEvaluationFactorList; + + public FactorClearBidContentFactory(String tenderId) { + this.tenderId = tenderId; + this.supplierList = supplierService.getOpenBidSuccessSupplier(tenderId); + this.supplierEvaluationFactorList = supplierEvaluationFactorService.getEntityListByTenderId(tenderId); + } + + public IFactorClearBidContent create(String audit) { + List<EvaluationFactor> factorList = evaluationFactorService.getAllEvaluationFactorList(tenderId, audit); + return new IFactorClearBidContent() { + + @Override + public String getTableName() { + if (EvaluationFactorEnum.AUDIT_COMPLIANCE.equals(audit)) { + return "ç¬¦åˆæ€§æŒ‡æ ‡æ¸…æ ‡è¡¨"; + } + if (EvaluationFactorEnum.AUDIT_SCORE.equals(audit)) { + return "æ‰“åˆ†æŒ‡æ ‡æ¸…æ ‡è¡¨"; + } + return null; + } + + public String getFileName() { + if (EvaluationFactorEnum.AUDIT_COMPLIANCE.equals(audit)) { + return "æŒ‡æ ‡æ¸…æ ‡æ„è§-ç¬¦åˆæ€§.xlsx"; + } + if (EvaluationFactorEnum.AUDIT_SCORE.equals(audit)) { + return "æŒ‡æ ‡æ¸…æ ‡æ„è§-打分.xlsx"; + } + return null; + } + + public List<Supplier> getSupplierList() { + return supplierList; + } + + public List<EvaluationFactor> getFactorList() { + return factorList; + } + + public List<SupplierEvaluationFactor> getSupplierEvaluationFactorList() { + return supplierEvaluationFactorList; + } + + public String getContent(SupplierEvaluationFactor supplierEvaluationFactor) { + return supplierEvaluationFactor.getFactorResponse(); + } + }; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentHandler.java b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentHandler.java new file mode 100644 index 00000000..d52074f2 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentHandler.java @@ -0,0 +1,58 @@ +package com.gx.obe.struct.handler; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.struct.inters.IFactorClearBidContent; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; +import com.gx.obe.web.entity.tender.TenderProjectEntity; +import com.gx.obe.web.service.SupplierEvaluationFactorService; +import com.gx.obe.web.vo.FactorClearBidContent; + +public class FactorClearBidContentHandler implements IFactorClearBidContent { + + private final SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + + private final Optional<TenderProjectEntity> tenderProject; + + private final Optional<FactorClearBidContent> factorClearBidContent; + + public FactorClearBidContentHandler(TenderProjectEntity tenderProject) { + this.tenderProject = Optional.ofNullable(tenderProject); + this.factorClearBidContent = this.tenderProject.map(TenderProjectEntity::getId).map(supplierEvaluationFactorService::getScoreFactorClearBidContent); + } + + @Override + public String getTableName() { + return null; + } + + @Override + public String getFileName() { + return "å•†åŠ¡æŠ€æœ¯è¯„å®¡å› ç´ æ±‡æ€»è¡¨.xlsx"; + } + + @Override + public List<Supplier> getSupplierList() { + return factorClearBidContent.map(FactorClearBidContent::getSupplierList).orElseGet(ArrayList::new); + } + + @Override + public List<EvaluationFactor> getFactorList() { + return factorClearBidContent.map(FactorClearBidContent::getFactorList).orElseGet(ArrayList::new); + } + + @Override + public List<SupplierEvaluationFactor> getSupplierEvaluationFactorList() { + return factorClearBidContent.map(FactorClearBidContent::getSupplierEvaluationFactorList).orElseGet(ArrayList::new); + } + + @Override + public String getContent(SupplierEvaluationFactor supplierEvaluationFactor) { + return supplierEvaluationFactor.getOpinion(); + } + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentStepHandler.java b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentStepHandler.java new file mode 100644 index 00000000..b20dd016 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidContentStepHandler.java @@ -0,0 +1,86 @@ +package com.gx.obe.struct.handler; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.components.core.enumeration.EvaluationStepEnum; +import com.gx.obe.struct.enums.EvaluationFactorTypeEnum; +import com.gx.obe.struct.inters.IFactorClearBidContent; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; +import com.gx.obe.web.entity.evaluation.EvaluationStep; +import com.gx.obe.web.service.SupplierEvaluationFactorService; +import com.gx.obe.web.vo.FactorClearBidContent; + +public class FactorClearBidContentStepHandler implements IFactorClearBidContent { + + private final SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + + private final Optional<EvaluationStep> evaluationStep; + + private final Optional<FactorClearBidContent> factorClearBidContent; + + public FactorClearBidContentStepHandler(EvaluationStep evaluationStep) { + this.evaluationStep = Optional.ofNullable(evaluationStep); + this.factorClearBidContent = this.evaluationStep.map(EvaluationStep::getId).map(supplierEvaluationFactorService::getFactorClearBidContent); + } + + @Override + public String getTableName() { + Optional<EvaluationFactorTypeEnum> evaluationFactorTypeEnum = evaluationStep.map(t -> t.getEvaluationParamByKey(EvaluationStepEnum.EVALUATION_FACTOR_TYPE)).map(EvaluationFactorTypeEnum.MAP::get); + if (!evaluationFactorTypeEnum.isPresent()) { + return null; + } + switch (evaluationFactorTypeEnum.get()) { + case COMPLIANCE: + return "ç¬¦åˆæ€§æŒ‡æ ‡è¯„议表"; + case BUSINESS: + return "å•†åŠ¡æŒ‡æ ‡è¯„è®®è¡¨"; + case TECHNOLOGY: + return "æŠ€æœ¯æŒ‡æ ‡è¯„è®®è¡¨"; + default: + return null; + } + } + + @Override + public String getFileName() { + Optional<EvaluationFactorTypeEnum> evaluationFactorTypeEnum = evaluationStep.map(t -> t.getEvaluationParamByKey(EvaluationStepEnum.EVALUATION_FACTOR_TYPE)).map(EvaluationFactorTypeEnum.MAP::get); + if (!evaluationFactorTypeEnum.isPresent()) { + return null; + } + switch (evaluationFactorTypeEnum.get()) { + case COMPLIANCE: + return "评议æ„è§-" + "ç¬¦åˆæ€§" + ".xlsx"; + case BUSINESS: + return "评议æ„è§-商务" + ".xlsx"; + case TECHNOLOGY: + return"评议æ„è§-技术" + ".xlsx"; + default: + return null; + } + } + + @Override + public List<Supplier> getSupplierList() { + return factorClearBidContent.map(FactorClearBidContent::getSupplierList).orElseGet(ArrayList::new); + } + + @Override + public List<EvaluationFactor> getFactorList() { + return factorClearBidContent.map(FactorClearBidContent::getFactorList).orElseGet(ArrayList::new); + } + + @Override + public List<SupplierEvaluationFactor> getSupplierEvaluationFactorList() { + return factorClearBidContent.map(FactorClearBidContent::getSupplierEvaluationFactorList).orElseGet(ArrayList::new); + } + + @Override + public String getContent(SupplierEvaluationFactor supplierEvaluationFactor) { + return supplierEvaluationFactor.getOpinion(); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidFileHandler.java b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidFileHandler.java new file mode 100644 index 00000000..e215b937 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/handler/FactorClearBidFileHandler.java @@ -0,0 +1,84 @@ +package com.gx.obe.struct.handler; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.eclipse.swt.core.MessageDialog; +import org.eclipse.swt.core.utils.FileDialogUtils; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import com.gx.obe.common.file.utils.FileUtils; +import com.gx.obe.common.widget.shell.ProgressMessageDialog; +import com.gx.obe.components.core.enumeration.EvaluationFactorEnum; +import com.gx.obe.components.core.global.Global; +import com.gx.obe.util.utils.RuntimeUtils; +import com.gx.obe.util.utils.StringUtils; +import com.gx.obe.web.entity.tender.TenderProjectEntity; + +public class FactorClearBidFileHandler { + + private Shell parentShell; + private TenderProjectEntity tenderProject; + + public FactorClearBidFileHandler(Shell parentShell, TenderProjectEntity tenderProject) { + this.parentShell = parentShell; + this.tenderProject = tenderProject; + } + + public void export() { + String directorySavePath = FileDialogUtils.getDirectorySavePath("请选择导出目录", "[" + tenderProject.getTenderNo() + "]" + tenderProject.getTenderName()); + if (StringUtils.isEmpty(directorySavePath)) { + return; + } + + String saveDir = directorySavePath + "[" + FileUtils.filterFileName(tenderProject.getTenderNo()) + "]" + "æŒ‡æ ‡æ¸…æ ‡æ–‡ä»¶"; + + ProgressMessageDialog messageDialog = new ProgressMessageDialog(parentShell, false, -1, null); + messageDialog.setTitle("å¯¼å‡ºæŒ‡æ ‡æ¸…æ ‡æ–‡ä»¶"); + + BiConsumer<String, Integer> message = (msg, flag) -> Display.getDefault().syncExec(() -> messageDialog.message(msg, flag)); + Consumer<Boolean> finish = t -> Display.getDefault().syncExec(() -> messageDialog.finish(t)); + + new Thread(() -> { + message.accept("å¼€å§‹å¯¼å‡ºæŒ‡æ ‡æ¸…æ ‡æ–‡ä»¶ï¼", 0); + + try { + Map<String, Object> scoreDateMap = new HashMap<>(); + scoreDateMap.put("factorClearBidContent", new FactorClearBidContentFactory(tenderProject.getId()).create(EvaluationFactorEnum.AUDIT_SCORE)); + Global.EXCEL_REPORT.generate(tenderProject, "FactorClearBidContent.xlsx", saveDir, scoreDateMap).waitOrGet(); + } catch (Exception e1) { + message.accept("æ‰“åˆ†æ¸…æ ‡æ„è§è¡¨ç”Ÿæˆå¤±è´¥ï¼", -1); + } +// try { +// Global.EXCEL_REPORT.generate(tenderProject, "ProjectManagerPerformanceDataSet.xlsx", saveDir, null).waitOrGet(); +// } catch (Exception e1) { +// message.accept("项目ç»ç†ä¸šç»©è¡¨ç”Ÿæˆå¤±è´¥ï¼", -1); +// } +// try { +// Global.EXCEL_REPORT.generate(tenderProject, "EnterprisePerformanceDataSet.xlsx", saveDir, null).waitOrGet(); +// } catch (Exception e1) { +// message.accept("ä¼ä¸šä¸šç»©è¡¨ç”Ÿæˆå¤±è´¥ï¼", -1); +// } + + message.accept("完æˆå¯¼å‡ºæŒ‡æ ‡æ¸…æ ‡æ–‡ä»¶ï¼", 0); + + if (messageDialog.getErrorMessagesSize() != 0) { + finish.accept(false); + return; + } + + finish.accept(true); + Display.getDefault().syncExec(() -> { + if (MessageDialog.openConfirm(parentShell, "打开目录", "导出æˆåŠŸï¼Œæ˜¯å¦æ‰“开目录ï¼", new String[] { "打开", "å…³é—" })) { + System.out.println(saveDir); + RuntimeUtils.openDirector(saveDir); + } + }); + }).start(); + messageDialog.open(); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/handler/RelChapterTypeHandler.java b/com.gx.obe.struct/src/com/gx/obe/struct/handler/RelChapterTypeHandler.java new file mode 100644 index 00000000..357ec701 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/handler/RelChapterTypeHandler.java @@ -0,0 +1,42 @@ +package com.gx.obe.struct.handler; + +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class RelChapterTypeHandler { + + private final String relChapterType; + + private final String mark; + + private final boolean hasMark; + + private static final Set<String> SET = Stream.of("00", "01", "02").collect(Collectors.toSet()); + + public RelChapterTypeHandler(String relChapterType) { + Optional<String> mark = SET.stream().map("_"::concat).filter(relChapterType::endsWith).findAny(); + this.hasMark = mark.isPresent(); + if (this.hasMark) { + this.mark = mark.get().substring(1); + this.relChapterType = relChapterType.substring(0, relChapterType.length() - mark.get().length()); + } else { + this.mark = null; + this.relChapterType = relChapterType; + } + } + + public String getRelChapterType() { + return relChapterType; + } + + public String getMark() { + return mark; + } + + public boolean isHasMark() { + return hasMark; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/inters/IFactorClearBidContent.java b/com.gx.obe.struct/src/com/gx/obe/struct/inters/IFactorClearBidContent.java new file mode 100644 index 00000000..e7ca422e --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/inters/IFactorClearBidContent.java @@ -0,0 +1,23 @@ +package com.gx.obe.struct.inters; + +import java.util.List; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; + +public interface IFactorClearBidContent { + + String getTableName(); + + String getFileName(); + + List<Supplier> getSupplierList(); + + List<EvaluationFactor> getFactorList(); + + List<SupplierEvaluationFactor> getSupplierEvaluationFactorList(); + + String getContent(SupplierEvaluationFactor supplierEvaluationFactor); + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelData.java b/com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelData.java new file mode 100644 index 00000000..6a228063 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelData.java @@ -0,0 +1,25 @@ +package com.gx.obe.struct.inters; + +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.bind.view.Write; +import com.gx.obe.struct.beans.ModelData; + +public abstract class IModelData { + + protected final Prop<String> supplierId = new Prop<>(); + + protected final Prop<Integer> count = new Prop<>(); + + public IModelData() { + init(); + } + + protected abstract void init(); + + public abstract void refresh(ModelData modelData); + + public void setCountWrite(Write<Integer> countConsumer) { + count.bind(countConsumer); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelDataDetail.java b/com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelDataDetail.java new file mode 100644 index 00000000..2414b193 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/inters/IModelDataDetail.java @@ -0,0 +1,19 @@ +package com.gx.obe.struct.inters; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.swt.widgets.Composite; + +public interface IModelDataDetail { + + void refreshTitle(String string); + + void addBasicSubpage(Function<Composite, Composite> initSub); + + void addSubpage(String name, Function<Composite, Composite> initSub); + + <T> void addAttachmentSubpage(Consumer<BiConsumer<String, String>> supplierIdAndBusinessIdConsumer); + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/listener/CellDoubleClickListener.java b/com.gx.obe.struct/src/com/gx/obe/struct/listener/CellDoubleClickListener.java new file mode 100644 index 00000000..c67dbec5 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/listener/CellDoubleClickListener.java @@ -0,0 +1,8 @@ +package com.gx.obe.struct.listener; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; + +public interface CellDoubleClickListener { + void cellDoubleClicked(EvaluationFactor evaluationFactor, SupplierEvaluationFactor supplierEvaluationFactor); +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/listener/EditOpinionListener.java b/com.gx.obe.struct/src/com/gx/obe/struct/listener/EditOpinionListener.java new file mode 100644 index 00000000..1db83351 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/listener/EditOpinionListener.java @@ -0,0 +1,6 @@ +package com.gx.obe.struct.listener; + +public interface EditOpinionListener { + public void editOpinion(String opinion, String modifyReason); + public void cancle(); +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/listener/GoBackListener.java b/com.gx.obe.struct/src/com/gx/obe/struct/listener/GoBackListener.java new file mode 100644 index 00000000..48e45a58 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/listener/GoBackListener.java @@ -0,0 +1,5 @@ +package com.gx.obe.struct.listener; + +public interface GoBackListener { + void goBackAction(); +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/listener/ReturnListener.java b/com.gx.obe.struct/src/com/gx/obe/struct/listener/ReturnListener.java new file mode 100644 index 00000000..ca65233c --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/listener/ReturnListener.java @@ -0,0 +1,5 @@ +package com.gx.obe.struct.listener; + +public interface ReturnListener { + void returnAction(); +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/parse/BidFileIndexTreeXmlParse.java b/com.gx.obe.struct/src/com/gx/obe/struct/parse/BidFileIndexTreeXmlParse.java new file mode 100644 index 00000000..c9ebff21 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/parse/BidFileIndexTreeXmlParse.java @@ -0,0 +1,69 @@ +package com.gx.obe.struct.parse; + +import java.util.List; +import java.util.stream.Stream; + +import org.dom4j.Document; +import org.dom4j.Element; + +import com.gx.obe.util.utils.ObjectUtils; +import com.gx.obe.util.utils.XmlUtils; + +public class BidFileIndexTreeXmlParse { + + private static final String BID_FILE_INDEX_TREE = "BidFileIndexTree.xml"; + + private String rootNodeFileName; + private int pageNumInGenerateFile; + + private String bidFilePath; + private String relChapterType; + + public BidFileIndexTreeXmlParse(String bidFilePath, String relChapterType) { + this.bidFilePath = bidFilePath; + this.relChapterType = relChapterType; + init(); + } + + private void init() { + if (bidFilePath == null) { + return; + } + Document document = XmlUtils.getXmlDocument(bidFilePath + BID_FILE_INDEX_TREE); + if (document == null) { + return; + } + recursion(streamElement(document.getRootElement())); + } + + private boolean recursion(Stream<Element> stream) { + if (stream == null) return false; + return stream.anyMatch(e -> { + if (e.elementTextTrim("chapterType").equals(relChapterType)) { + pageNumInGenerateFile = ObjectUtils.getIntValue(e.elementTextTrim("pageNumInGenerateFile"), 0); +// if (e.elementTextTrim("isRootNode").equals("true")) rootNodeFileName = e.elementTextTrim("fileName"); + pageNumInGenerateFile = 1; + rootNodeFileName = e.elementTextTrim("fileName"); + return true; + } + boolean recursion = recursion(streamElement(e)); + if (recursion && e.elementTextTrim("isRootNode").equals("true")) rootNodeFileName = e.elementTextTrim("fileName"); + return recursion; + }); + } + + private Stream<Element> streamElement(Element element) { + List<?> list = element.elements("fileItem"); + if (list == null) return null; + return list.stream().map(t -> (Element) t); + } + + public String getRootNodeFilePath() { + return bidFilePath + rootNodeFileName; + } + + public int getPageNumInGenerateFile() { + return pageNumInGenerateFile; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/parse/SelfEvaluatesXmlParse.java b/com.gx.obe.struct/src/com/gx/obe/struct/parse/SelfEvaluatesXmlParse.java new file mode 100644 index 00000000..4e7c424f --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/parse/SelfEvaluatesXmlParse.java @@ -0,0 +1,138 @@ +package com.gx.obe.struct.parse; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.dom4j.Element; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.evaluation.struct.enumeration.StructBusinessTypeEnum; +import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.struct.beans.ParamValueDO; +import com.gx.obe.struct.beans.SelfEvalParamsDO; +import com.gx.obe.struct.value_list.CreditGrade; +import com.gx.obe.struct.value_list.Finance; +import com.gx.obe.struct.value_list.ParamValues; +import com.gx.obe.struct.value_list.Performance; +import com.gx.obe.util.element.ElementClass; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.web.service.SupplierEvaluationFactorService; + +/** + * @Description: SelfEvaluates.xmlæ–‡ä»¶è§£æž + * @author chenxw + */ +public class SelfEvaluatesXmlParse { + + private final SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + + private final String tenderId; + /** + * + * + */ + private final Map<String, Map<String, SupplierEvaluationFactor>> mapByFactorCodeBySupplierId; + + /** + * @author chenxw + * @param tenderId + */ + public SelfEvaluatesXmlParse(String tenderId) { + this.tenderId = tenderId; + this.mapByFactorCodeBySupplierId = initMapByFactorCodeBySupplierId(); + } + + /** + * @Description: åˆå§‹åŒ– + * @author chenxw + * @return + */ + private Map<String, Map<String, SupplierEvaluationFactor>> initMapByFactorCodeBySupplierId() { + List<SupplierEvaluationFactor> supplierEvaluationFactorList = supplierEvaluationFactorService.getEntityListByTenderId(tenderId); + if (CollectionUtils.isNull(supplierEvaluationFactorList)) return new HashMap<>(); + return supplierEvaluationFactorList.stream().collect(Collectors.groupingBy(SupplierEvaluationFactor::getSupplierId, Collectors.toMap(SupplierEvaluationFactor::getFactorCode, t -> t, (a, b) -> a))); + } + + /** + * @Description: è§£æž + * @author chenxw + * @param supplierId + * @param element + */ + public void parse(String supplierId, Element element) { + Map<String, SupplierEvaluationFactor> mapByFactorCode = mapByFactorCodeBySupplierId.computeIfAbsent(supplierId, $ -> new HashMap<>()); + List<?> elements = element.elements(); + elements.stream().map(t -> (Element) t).forEach(t -> { + SupplierEvaluationFactor supplierEvaluationFactor = mapByFactorCode.computeIfAbsent(t.elementTextTrim("evalFactorId"), evalFactorCode -> { + SupplierEvaluationFactor factor = new SupplierEvaluationFactor(); + factor.setTenderId(tenderId); + factor.setSupplierId(supplierId); + factor.setFactorCode(evalFactorCode); + getSelfItemData(factor, t); + return factor; + }); + String value = t.elementTextTrim("selfEvaluateValue"); + supplierEvaluationFactor.setOpinion(value); + supplierEvaluationFactor.setFactorResponse(value); + + Element paramValueListElement = t.element("paramValueList"); + if(null != paramValueListElement && paramValueListElement.elements().size() > 0) { + List<Element> paramValueElementList = paramValueListElement.elements(); + if(null != paramValueElementList && paramValueElementList.size() > 0) { + SelfEvalParamsDO selfEvalParamsDO = new SelfEvalParamsDO(); + + for(Element paramValueElement : paramValueElementList) { + ParamValueDO paramValueDO = new ParamValueDO(); + paramValueDO.setDataCode(paramValueElement.elementTextTrim("dataCode")); + paramValueDO.setDataType(paramValueElement.elementTextTrim("dataType")); + paramValueDO.setDataValue(paramValueElement.elementTextTrim("dataValue")); + selfEvalParamsDO.addParamValue(paramValueDO); + } + supplierEvaluationFactor.setParamValues(selfEvalParamsDO.toJson()); + } + } + + }); + } + private void getSelfItemData(SupplierEvaluationFactor factor, Element t) { + String relChapterType = t.elementTextTrim("relChapterType"); + Element valueList = t.element("valueList"); + if(null != valueList) { + // 主è¥åˆ©æ¶¦çއ + if(StructBusinessTypeEnum.EQ_PROFIT_RATIO.getKey().equals(relChapterType)) { + List<Finance> financeList= ElementClass.of(Finance.class).createList(valueList); + String financeListJsonStr = JsonUtil.jacksonObjectToStr(financeList); + factor.setFinance(financeListJsonStr); +// 供货业绩(物资) + }else if(StructBusinessTypeEnum.EQ_ACHIEVEMENTS.getKey().equals(relChapterType)) { + List<Performance> performanceList= ElementClass.of(Performance.class).createList(valueList); + String performanceListJsonStr = JsonUtil.jacksonObjectToStr(performanceList); + factor.setPerformance(performanceListJsonStr); +// 资信ç‰çº§ EQ_Qualification_ZXDJ + }else if(StructBusinessTypeEnum.EQ_QUALIFICATION_ZXDJ.getKey().equals(relChapterType)) { + List<CreditGrade> creditGradeList= ElementClass.of(CreditGrade.class).createList(valueList); + String creditGradeListJsonStr = JsonUtil.jacksonObjectToStr(creditGradeList); + factor.setCreditGrade(creditGradeListJsonStr); + }else { + List<ParamValues> paramValuesList= ElementClass.of(ParamValues.class).createList(valueList); + String paramValuesListJsonStr = JsonUtil.jacksonObjectToStr(paramValuesList); + factor.setParamValues(paramValuesListJsonStr); + } + } + } + + /** + * @Description: ä¿å˜ + * @author chenxw + * @return + */ + public boolean save() { + List<SupplierEvaluationFactor> supplierEvaluationFactorList = mapByFactorCodeBySupplierId.values().stream().map(Map::values).flatMap(Collection::stream).collect(Collectors.toList()); + if (supplierEvaluationFactorList.isEmpty()) return true; + return supplierEvaluationFactorService.batchSaveOrUpdate(supplierEvaluationFactorList, new String[] { "opinion", "factorResponse", "paramValues" }) > 0; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/AttachmentFileService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/AttachmentFileService.java new file mode 100644 index 00000000..1ad81b50 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/AttachmentFileService.java @@ -0,0 +1,30 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.AttachmentFile; +import com.gx.obe.web.utils.ObeHttpUtils; + +/** + * @Description: + * @author chenxw + */ +public class AttachmentFileService { + + private static final String URL = "obeAttachmentFile"; + + /** + * @Description: 获å–附件列表 + * @author chenxw + * @param businessId + * @return + */ + public List<AttachmentFile> getAttachmentFileList(String businessId) { + Map<String, Object> param = new HashMap<>(); + param.put("businessId", businessId); + return ObeHttpUtils.getList(URL.concat("/getAttachmentFileList"), param, AttachmentFile.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/BidderInfoService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/BidderInfoService.java new file mode 100644 index 00000000..bc6ad9b8 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/BidderInfoService.java @@ -0,0 +1,32 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.BidderBasicInfo; +import com.gx.obe.web.utils.ObeHttpUtils; + +/** + * @Description: + * @author chenxw + */ +public class BidderInfoService { + + private static final String URL = "obeBidderBasicInfo"; + + /** + * @Description: èŽ·å–æŠ•æ ‡äººåŸºæœ¬æƒ…å†µåˆ—è¡¨ + * @author chenxw + * @param tenderId + * @param modelDataId + * @return + */ + public List<BidderBasicInfo> getBidderBasicInfoList(String tenderId, String modelDataId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("modelDataId", modelDataId); + return ObeHttpUtils.getList(URL.concat("/getBidderBasicInfoList"), param, BidderBasicInfo.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/BusinessLicenseService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/BusinessLicenseService.java new file mode 100644 index 00000000..d3cc2035 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/BusinessLicenseService.java @@ -0,0 +1,28 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.BusinessLicense; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class BusinessLicenseService { + + private static final String URL = "obeBusinessLicense"; + + /** + * @Description: 获å–è¥ä¸šæ‰§ç…§åˆ—表 + * @author chenxw + * @param tenderId + * @param modelDataId + * @return + */ + public List<BusinessLicense> getBusinessLicenseList(String tenderId, String modelDataId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("modelDataId", modelDataId); + return ObeHttpUtils.getList(URL.concat("/getBusinessLicenseList"), param, BusinessLicense.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/CertificateService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/CertificateService.java new file mode 100644 index 00000000..cd73a6ab --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/CertificateService.java @@ -0,0 +1,30 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.Certificate; +import com.gx.obe.web.utils.ObeHttpUtils; + +/** + * @Description: + * @author chenxw + */ +public class CertificateService { + + private static final String URL = "obeCertificate"; + + /** + * @Description: 获å–è¯ä¹¦åˆ—表 + * @author chenxw + * @param projectLeaderId + * @return + */ + public List<Certificate> getCertificateList(String projectLeaderId) { + Map<String, Object> param = new HashMap<>(); + param.put("projectLeaderId", projectLeaderId); + return ObeHttpUtils.getList(URL.concat("/getCertificateList"), param, Certificate.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/EvaluationContentService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/EvaluationContentService.java new file mode 100644 index 00000000..e7a6adea --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/EvaluationContentService.java @@ -0,0 +1,76 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.StructDateInfo; +import com.gx.obe.web.entity.Result.RequestBody; +import com.gx.obe.web.entity.evaluation.EvaluationContent; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class EvaluationContentService { + + private static final String URL = "obeEvaluationContent"; + + /** + * @Description: 获å–评审内容列表 + * @author chenxw + * @param tenderId + * @return + */ + public List<EvaluationContent> getEvaluationContentList(String tenderId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + return ObeHttpUtils.getList(URL.concat("/getEvaluationContentList"), param, EvaluationContent.class); + } + + /** + * @Description: æ ¹æ®æŒ‡æ ‡ç¼–å·èŽ·å–评审内容列表 + * @author chenxw + * @param tenderId + * @param factorCode + * @return + */ + public List<EvaluationContent> getEvaluationContentListByFactorCode(String tenderId, String factorCode) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("factorCode", factorCode); + return ObeHttpUtils.getList(URL.concat("/getEvaluationContentListByFactorCode"), param, EvaluationContent.class); + } + + /** + * @Description: æ¸…ç©ºç»“æž„åŒ–ä¿¡æ¯æ•°æ® + * @author chenxw + * @param tenderId + * @return + */ + public boolean deleteStructDateInfo(String tenderId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + return ObeHttpUtils.getBoolean(URL.concat("/deleteStructDateInfo"), param); + } + + /** + * @Description: ä¿å˜ç»“æž„åŒ–ä¿¡æ¯æ•°æ® + * @author chenxw + * @param structDateInfo + */ + public boolean saveStructDateInfo(StructDateInfo structDateInfo) { + return ObeHttpUtils.post(URL.concat("/saveStructDateInfo"), structDateInfo); + } + + /** + * @Description: 清空并ä¿å˜ç»“æž„åŒ–ä¿¡æ¯æ•°æ® + * @author chenxw + * @param tenderId + * @param structDateInfo + * @return + */ + public boolean deleteOrSaveStructDateInfo(String tenderId, StructDateInfo structDateInfo) { + RequestBody<StructDateInfo> requestBody = new RequestBody<StructDateInfo>(structDateInfo); + requestBody.setParam("tenderId", tenderId); + return ObeHttpUtils.post(URL.concat("/deleteOrSaveStructDateInfo"), requestBody); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/FinanceService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/FinanceService.java new file mode 100644 index 00000000..1193a3c0 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/FinanceService.java @@ -0,0 +1,28 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.Finance; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class FinanceService { + + private static final String URL = "obeFinance"; + + /** + * @Description: 获å–财务状况列表 + * @author chenxw + * @param tenderId + * @param modelDataId + * @return + */ + public List<Finance> getFinanceList(String tenderId, String modelDataId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("modelDataId", modelDataId); + return ObeHttpUtils.getList(URL.concat("/getFinanceList"), param, Finance.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/ModelDataService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/ModelDataService.java new file mode 100644 index 00000000..eed44b05 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/ModelDataService.java @@ -0,0 +1,31 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.Map; + +import com.gx.obe.struct.beans.ModelData; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class ModelDataService { + + private static final String URL = "obeModelData"; + + /** + * @Description: 获å–å¯¹è±¡ç»“æž„åŒ–æ•°æ® + * @author chenxw + * @param tenderId + * @param supplierId + * @param relChapterType + * @param dataCode + * @return + */ + public ModelData getModelData(String tenderId, String supplierId, String relChapterType, String dataCode) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("supplierId", supplierId); + param.put("relChapterType", relChapterType); + param.put("dataCode", dataCode); + return ObeHttpUtils.getOne(URL.concat("/getModelData"), param, ModelData.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/PerformanceService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/PerformanceService.java new file mode 100644 index 00000000..c703388b --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/PerformanceService.java @@ -0,0 +1,28 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.Performance; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class PerformanceService { + + private static final String URL = "obePerformance"; + + /** + * @Description: 获å–业绩列表 + * @author chenxw + * @param tenderId + * @param modelDataId + * @return + */ + public List<Performance> getPerformanceList(String tenderId, String modelDataId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("modelDataId", modelDataId); + return ObeHttpUtils.getList(URL.concat("/getPerformanceList"), param, Performance.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/ProjectLeaderService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/ProjectLeaderService.java new file mode 100644 index 00000000..b46bca07 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/ProjectLeaderService.java @@ -0,0 +1,32 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.ProjectLeader; +import com.gx.obe.web.utils.ObeHttpUtils; + +/** + * @Description: + * @author chenxw + */ +public class ProjectLeaderService { + + private static final String URL = "obeProjectLeader"; + + /** + * @Description: 获å–项目负责人列表 + * @author chenxw + * @param tenderId + * @param modelDataId + * @return + */ + public List<ProjectLeader> getProjectLeaderList(String tenderId, String modelDataId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("modelDataId", modelDataId); + return ObeHttpUtils.getList(URL.concat("/getProjectLeaderList"), param, ProjectLeader.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/QualificationService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/QualificationService.java new file mode 100644 index 00000000..59c74e19 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/QualificationService.java @@ -0,0 +1,28 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.Qualification; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class QualificationService { + + private static final String URL = "obeQualification"; + + /** + * @Description: 获å–è¯ä¹¦åˆ—表 + * @author chenxw + * @param tenderId + * @param modelDataId + * @return + */ + public List<Qualification> getQualificationList(String tenderId, String modelDataId) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("modelDataId", modelDataId); + return ObeHttpUtils.getList(URL.concat("/getQualificationList"), param, Qualification.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/TemplateTableService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/TemplateTableService.java new file mode 100644 index 00000000..c20df27b --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/TemplateTableService.java @@ -0,0 +1,29 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.TemplateTable; +import com.gx.obe.web.utils.ObeHttpUtils; + +public class TemplateTableService { + + private static final String URL = "obeTemplateTable"; + + /** + * @Description: 获å–å°èŒƒæœ¬è¡¨æ ¼åˆ—表 + * @author chenxw + * @param tenderId + * @param factorId + * @return + */ + public List<TemplateTable> getTemplateTableList(String tenderId, String relChapterType, String dataCode) { + Map<String, Object> param = new HashMap<>(); + param.put("tenderId", tenderId); + param.put("relChapterType", relChapterType); + param.put("dataCode", dataCode); + return ObeHttpUtils.getList(URL.concat("/getTemplateTableList"), param, TemplateTable.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/service/WorkExperienceService.java b/com.gx.obe.struct/src/com/gx/obe/struct/service/WorkExperienceService.java new file mode 100644 index 00000000..a7c3679c --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/service/WorkExperienceService.java @@ -0,0 +1,30 @@ +package com.gx.obe.struct.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gx.obe.struct.beans.WorkExperience; +import com.gx.obe.web.utils.ObeHttpUtils; + +/** + * @Description: + * @author chenxw + */ +public class WorkExperienceService { + + private static final String URL = "obeWorkExperience"; + + /** + * @Description: 获å–工作ç»åŽ†åˆ—è¡¨ + * @author chenxw + * @param projectLeaderId + * @return + */ + public List<WorkExperience> getWorkExperienceList(String projectLeaderId) { + Map<String, Object> param = new HashMap<>(); + param.put("projectLeaderId", projectLeaderId); + return ObeHttpUtils.getList(URL.concat("/getWorkExperienceList"), param, WorkExperience.class); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/thread/MyThread.java b/com.gx.obe.struct/src/com/gx/obe/struct/thread/MyThread.java new file mode 100644 index 00000000..f5b3d60e --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/thread/MyThread.java @@ -0,0 +1,58 @@ +package com.gx.obe.struct.thread; + +import java.util.ArrayList; +import java.util.List; + +public abstract class MyThread implements Runnable{ + public String message; + public Thread thread; + + private boolean isStop = false; +// public MyThread(){ +// +// } +// public MyThread(Runnable runnable){ +// +// } + private List<MyThread> joinThread; + public void start(){ + thread = new Thread(this); + thread.start(); + } + + public void stop(){ + isStop = true; + thread = null; + } + + public void join(){ + if(null != thread){ + try { + thread.join(); + } catch (InterruptedException e) { + } + } + } + + public void addJoinThread(MyThread thread){ + if(null == joinThread){ + joinThread = new ArrayList<MyThread>(); + } + joinThread.add(thread); + } + + public void joinOtherThread(){ + if(null != joinThread){ + for(MyThread myRunnable : joinThread){ + myRunnable.join(); + } + } + } + public void setMessage(String message) { + this.message = message; + } + +// public static abstract class Runnable { +// public abstract void run(); +// } +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingStructThread.java b/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingStructThread.java new file mode 100644 index 00000000..aba867c3 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingStructThread.java @@ -0,0 +1,303 @@ +package com.gx.obe.struct.thread; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import org.dom4j.Element; + +import com.gx.obe.common.file.utils.BidFileUtils; +import com.gx.obe.common.widget.listener.ProgressMessageAdapter; +import com.gx.obe.common.widget.listener.ProgressMessageListener; +import com.gx.obe.components.core.Constants; +import com.gx.obe.components.core.enumeration.CommonEnum; +import com.gx.obe.struct.beans.ModelData; +import com.gx.obe.struct.beans.StructDateInfo; +import com.gx.obe.struct.enums.DataCategoryEnum; +import com.gx.obe.struct.enums.ModelDataClassEnum; +import com.gx.obe.struct.enums.ModelDataTypeEnum; +import com.gx.obe.struct.handler.RelChapterTypeHandler; +import com.gx.obe.struct.service.EvaluationContentService; +import com.gx.obe.struct.utils.ParsingStructXmlUtils; +import com.gx.obe.util.utils.UuidUtils; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.evaluation.EvaluationContent; +import com.gx.obe.web.entity.tender.TenderProjectEntity; +import com.gx.obe.web.service.SupplierService; + +/** + * @Description: è§£æžç»“构化数æ®çº¿ç¨‹ + * @author chenxw + */ +public class ParsingStructThread implements Runnable { + + private final EvaluationContentService evaluationContentService = new EvaluationContentService(); + private final SupplierService supplierService = new SupplierService(); + private final StructDateInfo structDateInfo = new StructDateInfo(); + private String tenderId; + private TenderProjectEntity tenderproject; + private ProgressMessageListener messageProgress; + /** + * @author chenxw + * @param tenderproject.getId() + * @param callBack + */ + public ParsingStructThread(TenderProjectEntity tenderproject, ProgressMessageListener messageProgress) { + this.tenderproject = tenderproject; + this.messageProgress = messageProgress; + } + + @Override + public void run() { + this.tenderId = tenderproject.getId(); + parsingStruct(); + messageProgress.finish(messageProgress.getErrorMessagesSize() == 0); + } + + /** + * @Description: è§£æžç»“æž„åŒ–æ•°æ® + * @author chenxw + */ + private void parsingStruct() { + //--------------------------------获å–供应商列表-------------------------------------------------- + + messageProgress.message("开始获å–获å–供应商列表...", 0); + Optional<List<Supplier>> supplierListQptional = Optional.ofNullable(supplierService.getOpenBidSuccessSupplier(tenderId)).filter(t -> !t.isEmpty()); + if (!supplierListQptional.isPresent()) { + messageProgress.message("供应商列表获å–失败!", -1); + return; + } + messageProgress.message("ä¾›åº”å•†åˆ—è¡¨èŽ·å–æˆåŠŸ!", 1); + + //--------------------------------è§£æžä¾›åº”商评议表数æ®-------------------------------------------------- + + ParsingSupplierSelfOpinionThread parsingSupplierSelfOpinionThread = new ParsingSupplierSelfOpinionThread(tenderproject, supplierListQptional.get(),new ProgressMessageAdapter () { + @Override + public void message(String message, int flag) { + messageProgress.message(message, flag); + } + + @Override + public void finish(boolean flag) { + } + }) ; + parsingSupplierSelfOpinionThread.start(); + parsingSupplierSelfOpinionThread.join(); + + //--------------------------------è§£æžä¾›åº”å•†æ ‡ä¹¦å®šä½æ•°æ®-------------------------------------------------- +// String isIntelligentScore = tenderproject.getEvaluationParamByKey("isIntelligentScore"); +// if(null != isIntelligentScore && CommonEnum.YES.equals(isIntelligentScore)) { +// } + ParsingSupplierRespItemThread parsingSupplierRespItemThread = new ParsingSupplierRespItemThread(tenderproject, supplierListQptional.get(),new ProgressMessageAdapter () { + @Override + public void message(String message, int flag) { + messageProgress.message(message, flag); + } + + @Override + public void finish(boolean flag) { + } + }) ; + parsingSupplierRespItemThread.start(); + parsingSupplierRespItemThread.join(); + + //--------------------------------获å–评审内容列表-------------------------------------------------- + +// messageProgress.message("开始获å–评审内容...", 0); + Optional<Map<String, Set<String>>> relChapterTypeListMapOptional = Optional.ofNullable(evaluationContentService.getEvaluationContentList(tenderId)).filter(t -> !t.isEmpty()).map(l -> { + return l.stream().collect(Collectors.groupingBy(EvaluationContent::getDataCategory, Collectors.mapping(EvaluationContent::getRelChapterType, Collectors.toSet()))); + }); + + Consumer<Set<String>> consumer = t -> { + t.add("CompletedAchievements"); + t.add("OngoingAchievements"); + }; + relChapterTypeListMapOptional.map(t -> t.get(DataCategoryEnum.TDI.getKey())).ifPresent(consumer); + relChapterTypeListMapOptional.map(t -> t.get(DataCategoryEnum.TT.getKey())).ifPresent(consumer); + if (!relChapterTypeListMapOptional.isPresent()) { +// messageProgress.message("未获å–åˆ°å·²ç»‘å®šæŒ‡æ ‡ç»“æž„åŒ–å†…å®¹ï¼", -1); + return; + } +// messageCallBack.callBackMsg("开始获å–评审内容ï¼"); +// messageCallBack.callBackMsg(true, "获å–评审内容æˆåŠŸï¼"); + + //--------------------------------è§£æžæŠ•æ ‡ç»“æž„åŒ–æ•°æ®-------------------------------------------------- + + messageProgress.message("开始解æžç»“æž„åŒ–æ ‡ä¹¦ç»“æž„...", 0); + try { + relChapterTypeListMapOptional.map(m -> m.get(DataCategoryEnum.TT.getKey())).map(Set::parallelStream).ifPresent(s -> { + s.forEach(t -> { + ParsingStructXmlUtils.resolverTemplateTable(tenderId, t).ifPresent(structDateInfo.getTemplateTableList()::addAll); + }); + }); + } catch (Exception e) { + messageProgress.message("è§£æžæ‹›æ ‡ç»“构化数æ®å¤±è´¥ï¼Œè¯·æ£€æŸ¥æ˜¯å¦ä¸‹è½½æ‹›æ ‡æ–‡ä»¶ï¼", -1); + System.out.println(e.getMessage()); + return; + } + messageProgress.message("ç»“æž„åŒ–æ ‡ä¹¦ç»“æž„è§£æžæˆåŠŸï¼", 1); + + //--------------------------------è§£æžæŠ•æ ‡ç»“æž„åŒ–æ•°æ®-------------------------------------------------- + + messageProgress.message("å¼€å§‹è§£æžæŠ•æ ‡ç»“æž„åŒ–æ•°æ®ï¼", 1); + try { +// supplierListQptional.get().parallelStream().forEach(t -> parsingSupplierBidFileStruct(t, relChapterTypeListMapOptional.get(), Constants.getBidFilePath(tenderId, t.getId()))); + supplierListQptional.get().stream().forEach(t -> { + messageProgress.message("æ£åœ¨è§£æž[" + t.getSupplierName() +"]结构化数æ®...", 0); + parsingSupplierBidFileStruct(t, relChapterTypeListMapOptional.get(), Constants.getBidFilePath(tenderId, t.getId())); + }); + } catch (Exception e) { + messageProgress.message("è§£æžæŠ•æ ‡ç»“æž„åŒ–æ•°æ®å¤±è´¥ï¼", -1); + System.out.println(e.getStackTrace()); + return; + } + messageProgress.message("è§£æžæŠ•æ ‡ç»“æž„åŒ–æ•°æ®æˆåŠŸï¼", 1); + + //--------------------------------ä¿å˜ç»“构化数æ®-------------------------------------------------- + + messageProgress.message("开始ä¿å˜ç»“构化数æ®ï¼", 0); + if (!evaluationContentService.deleteOrSaveStructDateInfo(tenderId, structDateInfo)) { + messageProgress.message("ä¿å˜ç»“构化数æ®å¤±è´¥ï¼", -1); + return; + } + messageProgress.message("ä¿å˜ç»“æž„åŒ–æ•°æ®æˆåŠŸï¼", 1); + + //--------------------------------end-------------------------------------------------- + + messageProgress.message( "è§£æžç»“构化数æ®ç»“æŸï¼", 0); + messageProgress.message("---------------------------------", 0); + } + + /** + * @Description: è§£æžå¯¹åº”ä¾›åº”å•†ç»“æž„åŒ–æ•°æ® + * @author chenxw + * @param supplier + * @param relChapterTypeSetMap + * @param bidFilePath + */ + private void parsingSupplierBidFileStruct(Supplier supplier, Map<String, Set<String>> relChapterTypeSetMap, String bidFilePath) { + //获å–BidFileIndexTree.xmlä¸fileItem列表 + System.out.println(supplier.getSupplierName()); + System.out.println(relChapterTypeSetMap); + ParsingStructXmlUtils.resolverBidFileIndexTree(bidFilePath).filter(t -> !t.isEmpty()).ifPresent(el -> { + //è§£æžå°èŒƒæœ¬è¡¨å•æ•°æ® + Optional.ofNullable(relChapterTypeSetMap.get(DataCategoryEnum.TDI.getKey())).ifPresent(l -> structDateInfo.getTemplateDataItemList().addAll(l.stream().map(t -> { + System.out.println("resolverObeTemplateDataItem"); + return ParsingStructXmlUtils.resolverObeTemplateDataItem(tenderId, supplier.getId(), t, el, bidFilePath); + }).filter(Optional::isPresent).map(Optional::get).flatMap(List::stream).collect(Collectors.toList()))); + //è§£æžå°èŒƒæœ¬è¡¨æ ¼æ•°æ® + System.out.println("resolverTemplateTable"); + Optional.ofNullable(relChapterTypeSetMap.get(DataCategoryEnum.TT.getKey())).ifPresent(l -> structDateInfo.getTemplateTableList().addAll(l.stream().map(t -> { + return ParsingStructXmlUtils.resolverTemplateTable(tenderId, supplier.getId(), t, el, bidFilePath); + }).filter(Optional::isPresent).map(Optional::get).flatMap(List::stream).collect(Collectors.toList()))); + //è§£æžå¯¹è±¡ç»“æž„åŒ–æ•°æ® + System.out.println("parsingModelData"); + Optional.ofNullable(relChapterTypeSetMap.get(DataCategoryEnum.MD.getKey())).ifPresent(l -> l.stream().forEach(t -> parsingModelData(t, supplier, el, bidFilePath))); + }); + } + + /** + * @Description: è§£æžå¯¹åº”è¯„å®¡å†…å®¹ç»“æž„åŒ–æ•°æ® + * @author chenxw + * @param evaluationContent + * @param supplier + * @param fileItemElementList + * @param bidFilePath + */ + private void parsingModelData(String relChapterType, Supplier supplier, List<Element> fileItemElementList, String bidFilePath) { + //获å–结构化数æ®xmlæ–‡ä»¶åœ°å€ + RelChapterTypeHandler handler = new RelChapterTypeHandler(relChapterType); + System.out.println(relChapterType); + Optional<ModelDataTypeEnum> modelDataTypeEnum = Optional.of(handler.getRelChapterType()).map(ModelDataTypeEnum.MAP::get); + + fileItemElementList.stream().filter(t -> { + return handler.getRelChapterType().equals(t.elementTextTrim("chapterType")); + }).findAny().map(this::getBidFileName).filter(Optional::isPresent).map(Optional::get).map(bidFilePath::concat).ifPresent(xmlFilePath -> { + + ModelData modelData = initModelData(supplier.getId(), modelDataTypeEnum.map(ModelDataTypeEnum.EQ_ProjectLeader::equals).orElse(false) ? handler.getRelChapterType() : relChapterType); + structDateInfo.getModelDataList().add(modelData); + System.out.println(handler.getMark()); + System.out.println(relChapterType); + modelDataTypeEnum.map(ModelDataTypeEnum::getClassEnum).ifPresent(t -> parsingModelDataDetail(t, modelData.getId(), xmlFilePath, handler.getMark())); + }); + } + + /** + * @Description: èŽ·å¾—æŠ•æ ‡æ–‡ä»¶æ–‡ä»¶å + * @author chenxw + * @param fileItem + * @param isEnc + * @return + */ + public Optional<String> getBidFileName(Element fileItemElement) { + Optional<Element> fileItem = Optional.ofNullable(fileItemElement); + return BidFileUtils.getBidFileName(fileItem.map(t -> { + return t.elementText("fileName"); + }).orElse(null), fileItem.map(t -> { + return t.elementText("fileId"); + }).orElse(null)); + } + + /** + * @Description: è§£æžå¯¹è±¡ç»“æž„åŒ–æ•°æ®æ˜Žç»† + * @author chenxw + * @param modelDataEnum + * @param modelDataId + * @param xmlFilePath + * @param string + */ + private void parsingModelDataDetail(ModelDataClassEnum modelDataEnum, String modelDataId, String xmlFilePath, String mark) { + System.out.println("parsingModelDataDetail"); + Consumer<ParsingStructXmlUtils.AttachmentFileOperation> consumer = t -> ParsingStructXmlUtils.resolverAttachmentFile(t).ifPresent(structDateInfo.getAttachmentFileList()::addAll); + switch (modelDataEnum) { + case BusinessLicense: + System.out.println("BusinessLicense"); + ParsingStructXmlUtils.resolverBusinessLicense(tenderId, modelDataId, xmlFilePath, consumer).ifPresent(structDateInfo.getBusinessLicenseList()::addAll); + break; + case BidderInfo: + System.out.println("BidderInfo"); + ParsingStructXmlUtils.resolverBidderBasicInfo(tenderId, modelDataId, xmlFilePath, consumer).ifPresent(structDateInfo.getBidderBasicInfoList()::addAll); + break; + case Finance: + System.out.println("Finance"); + ParsingStructXmlUtils.resolverFinance(tenderId, modelDataId, xmlFilePath, consumer).ifPresent(structDateInfo.getFinanceList()::addAll); + break; + case Performance: + System.out.println("Performance"); + ParsingStructXmlUtils.resolverPerformance(tenderId, modelDataId, xmlFilePath, consumer, mark).ifPresent(structDateInfo.getPerformanceList()::addAll); + break; + case ProjectLeader: + System.out.println("ProjectLeader"); + ParsingStructXmlUtils.resolverProjectLeader(tenderId, modelDataId, xmlFilePath, consumer).ifPresent(structDateInfo.getProjectLeaderList()::addAll); + break; + case Qualification: + System.out.println("Qualification"); + ParsingStructXmlUtils.resolverQualification(tenderId, modelDataId, xmlFilePath, consumer).ifPresent(structDateInfo.getQualificationList()::addAll); + break; + default: + break; + } + } + + /** + * @Description: åˆå§‹åŒ–å¯¹è±¡ç»“æž„åŒ–æ•°æ® + * @author chenxw + * @param supplierId + * @param evaluationContent + * @return + */ + private ModelData initModelData(String supplierId, String relChapterType) { + System.out.println("initModelData"); + ModelData modelData = new ModelData(); + modelData.setId(UuidUtils.getUUID()); + modelData.setTenderId(tenderId); + modelData.setSupplierId(supplierId); + modelData.setRelChapterType(relChapterType); + modelData.setDataCode(relChapterType); + return modelData; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierRespItemThread.java b/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierRespItemThread.java new file mode 100644 index 00000000..61ccf173 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierRespItemThread.java @@ -0,0 +1,129 @@ +package com.gx.obe.struct.thread; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.dom4j.Element; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.common.widget.listener.ProgressMessageListener; +import com.gx.obe.components.core.Constants; +import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.struct.beans.RespItemDO; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.util.utils.XmlUtils; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.tender.TenderProjectEntity; +import com.gx.obe.web.service.SupplierEvaluationFactorService; + +public class ParsingSupplierRespItemThread extends MyThread{ + + + + private TenderProjectEntity tenderproject; + private List<Supplier> supplierList; + private SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + private Map<String, Map<String, SupplierEvaluationFactor>> mapByFactorCodeBySupplierId; + private ProgressMessageListener messageProgress; + + public ParsingSupplierRespItemThread(TenderProjectEntity tenderproject, List<Supplier> supplierList, ProgressMessageListener messageProgress) { + this.tenderproject = tenderproject; + this.supplierList = supplierList; + this.messageProgress = messageProgress; + } + + public void run() { + messageProgress.message("æ£åœ¨è§£æžæ ‡ä¹¦å®šä½...", 0); + this.mapByFactorCodeBySupplierId = initMapByFactorCodeBySupplierId(); + int count = 0; + if(null != supplierList && supplierList.size() > 0) { + for(Supplier supplier : supplierList) { + if(parsingSupplierRespItem(supplier)) { + count ++; + } + } + } + messageProgress.message("æ ‡ä¹¦å®šä½è§£æžç»“æŸï¼", count > 0 ? 1 : -1); + messageProgress.finish(count > 0); + + } + + /** + * @Description: åˆå§‹åŒ– + * @author chenxw + * @return + */ + private Map<String, Map<String, SupplierEvaluationFactor>> initMapByFactorCodeBySupplierId() { + List<SupplierEvaluationFactor> supplierEvaluationFactorList = supplierEvaluationFactorService.getEntityListByTenderId(tenderproject.getId()); + if (CollectionUtils.isNull(supplierEvaluationFactorList)) return new HashMap<>(); + return supplierEvaluationFactorList.stream().collect(Collectors.groupingBy(SupplierEvaluationFactor::getSupplierId, Collectors.toMap(SupplierEvaluationFactor::getFactorCode, t -> t, (a, b) -> a))); + } + + /** + * @Description: è§£æž + * @author chenxw + * @param supplierId + * @param element + */ + public boolean parsingSupplierRespItem(Supplier supplier) { + messageProgress.message("æ£åœ¨è§£æž"+supplier.getSupplierName()+"æ ‡ä¹¦å®šä½...", 0); + File respItemFile = new File(Constants.getBidFilePath(tenderproject.getId(), supplier.getId()) + "RespItem.xml"); + if(respItemFile.exists()) { + Element element = XmlUtils.getXmlDocument(respItemFile.getAbsolutePath()).getRootElement(); + //TODO + List<?> elements = element.elements(); + List<RespItemDO> respItemDOList = new ArrayList<>(); + if(null != elements && elements.size() > 0) { + elements.stream().map(t -> (Element) t).forEach(t -> { + RespItemDO respItemDO = new RespItemDO(); + respItemDO.setEvalFactorId(t.attributeValue("evalFactorId")); + respItemDO.setFileId(t.attributeValue("fileId")); + respItemDO.setFileName(t.attributeValue("fileName")); + respItemDO.setPageNumber(t.elementTextTrim("pageNumber")); + respItemDO.setEndPageNumber(t.elementTextTrim("endPageNumber")); + respItemDO.setName(t.elementTextTrim("name")); + respItemDOList.add(respItemDO); + }); + } + Map<String, SupplierEvaluationFactor> mapByFactorCode = mapByFactorCodeBySupplierId.get(supplier.getId()); + Map<String, List<RespItemDO>> respItemMap = respItemDOList.stream().collect(Collectors.groupingBy(RespItemDO::getEvalFactorId)); + if(null != mapByFactorCode && null != respItemMap) { + for(String evalFactorId : respItemMap.keySet()) { + SupplierEvaluationFactor supplierEvaluationFactor = mapByFactorCode.get(evalFactorId); + if(null != supplierEvaluationFactor) { + supplierEvaluationFactor.setRespItemList(JsonUtil.jsonObjectToStr(respItemMap.get(evalFactorId))); + //é¡µç æ‹¼æŽ¥ + List<String> pageList = respItemMap.get(evalFactorId).stream().map(RespItemDO::getPage).collect(Collectors.toList()); + String pageNumber = StringUtils.join(pageList, "ã€"); + supplierEvaluationFactor.setParam("pageNumber", pageNumber); + } + } + } + }else { + messageProgress.message("未找到"+supplier.getSupplierName()+"æ ‡ä¹¦å®šä½ï¼Œè¯·å…ˆä¸‹è½½æ ‡ä¹¦æˆ–æ£€æŸ¥æ ‡ä¹¦ä¸æ˜¯å¦æä¾›äº†æ ‡ä¹¦å®šä½ï¼", -1); + return false; + } + + if(null != mapByFactorCodeBySupplierId.get(supplier.getId()) && mapByFactorCodeBySupplierId.get(supplier.getId()).values().size() > 0) { + + List<SupplierEvaluationFactor> supplierEvaluationFactorList = mapByFactorCodeBySupplierId.get(supplier.getId()).values().stream().collect(Collectors.toList()); + int count = supplierEvaluationFactorService.batchSaveOrUpdate(supplierEvaluationFactorList, new String[] { "respItemList", "computerParams"}); + if(count > 0) { + messageProgress.message(supplier.getSupplierName()+"æ ‡ä¹¦å®šä½è§£æžæˆåŠŸï¼", 1); + return true; + } + } + messageProgress.message(supplier.getSupplierName()+"æ ‡ä¹¦å®šä½è§£æžå¤±è´¥ï¼", -1); + return false; + } + + + + +} \ No newline at end of file diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierSelfOpinionThread.java b/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierSelfOpinionThread.java new file mode 100644 index 00000000..16d6733e --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/thread/ParsingSupplierSelfOpinionThread.java @@ -0,0 +1,170 @@ +package com.gx.obe.struct.thread; + +import java.io.File; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.dom4j.Element; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.common.widget.listener.ProgressMessageListener; +import com.gx.obe.components.core.Constants; +import com.gx.obe.evaluation.struct.enumeration.StructBusinessTypeEnum; +import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.struct.beans.ParamValueDO; +import com.gx.obe.struct.beans.SelfEvalParamsDO; +import com.gx.obe.struct.value_list.CreditGrade; +import com.gx.obe.struct.value_list.Finance; +import com.gx.obe.struct.value_list.ParamValues; +import com.gx.obe.struct.value_list.Performance; +import com.gx.obe.util.element.ElementClass; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.util.utils.XmlUtils; +import com.gx.obe.web.entity.Supplier; +import com.gx.obe.web.entity.tender.TenderProjectEntity; +import com.gx.obe.web.service.SupplierEvaluationFactorService; + +public class ParsingSupplierSelfOpinionThread extends MyThread{ + + + + private TenderProjectEntity tenderproject; + private List<Supplier> supplierList; + private SupplierEvaluationFactorService supplierEvaluationFactorService = new SupplierEvaluationFactorService(); + private Map<String, Map<String, SupplierEvaluationFactor>> mapByFactorCodeBySupplierId; + private ProgressMessageListener messageProgress; + + public ParsingSupplierSelfOpinionThread(TenderProjectEntity tenderproject, List<Supplier> supplierList, ProgressMessageListener messageProgress) { + this.tenderproject = tenderproject; + this.supplierList = supplierList; + this.messageProgress = messageProgress; + } + + public void run() { + messageProgress.message("æ£åœ¨è§£æžè‡ªæˆ‘评议...", 0); + this.mapByFactorCodeBySupplierId = initMapByFactorCodeBySupplierId(); + int count = 0; + if(null != supplierList && supplierList.size() > 0) { + for(Supplier supplier : supplierList) { + if(parsingSupplierSelfOpinion(supplier)) { + count ++; + } + } + } + messageProgress.message("自我评议解æžç»“æŸï¼", count > 0 ? 1 : -1); + messageProgress.finish(count > 0); + + } + + /** + * @Description: åˆå§‹åŒ– + * @author chenxw + * @return + */ + private Map<String, Map<String, SupplierEvaluationFactor>> initMapByFactorCodeBySupplierId() { + List<SupplierEvaluationFactor> supplierEvaluationFactorList = supplierEvaluationFactorService.getEntityListByTenderId(tenderproject.getId()); + if (CollectionUtils.isNull(supplierEvaluationFactorList)) return new HashMap<>(); + return supplierEvaluationFactorList.stream().collect(Collectors.groupingBy(SupplierEvaluationFactor::getSupplierId, Collectors.toMap(SupplierEvaluationFactor::getFactorCode, t -> t, (a, b) -> a))); + } + + /** + * @Description: è§£æž + * @author chenxw + * @param supplierId + * @param element + */ + public boolean parsingSupplierSelfOpinion(Supplier supplier) { + messageProgress.message("æ£åœ¨è§£æž"+supplier.getSupplierName()+"自评æ„è§...", 0); + File selfEvaluatesFile = new File(Constants.getBidFilePath(tenderproject.getId(), supplier.getId()) + "SelfEvaluates.xml"); + if(selfEvaluatesFile.exists()) { + Element element = XmlUtils.getXmlDocument(selfEvaluatesFile.getAbsolutePath()).getRootElement(); + Map<String, SupplierEvaluationFactor> mapByFactorCode = mapByFactorCodeBySupplierId.computeIfAbsent(supplier.getId(), $ -> new HashMap<>()); + List<?> elements = element.elements(); + elements.stream().map(t -> (Element) t).forEach(t -> { + SupplierEvaluationFactor supplierEvaluationFactor = mapByFactorCode.computeIfAbsent(t.elementTextTrim("evalFactorId"), evalFactorCode -> { + SupplierEvaluationFactor factor = new SupplierEvaluationFactor(); + factor.setTenderId(tenderproject.getId()); + factor.setSupplierId(supplier.getId()); + factor.setFactorCode(evalFactorCode); + getSelfItemData(factor, t); + return factor; + }); + String value = t.elementTextTrim("selfEvaluateValue"); + supplierEvaluationFactor.setOpinion(value); + supplierEvaluationFactor.setFactorResponse(value); + Element paramValueListElement = t.element("paramValueList"); + if(null != paramValueListElement && paramValueListElement.elements().size() > 0) { + List<Element> paramValueElementList = paramValueListElement.elements(); + if(null != paramValueElementList && paramValueElementList.size() > 0) { + SelfEvalParamsDO selfEvalParamsDO = new SelfEvalParamsDO(); + + for(Element paramValueElement : paramValueElementList) { + ParamValueDO paramValueDO = new ParamValueDO(); + paramValueDO.setDataCode(paramValueElement.elementTextTrim("dataCode")); + paramValueDO.setDataType(paramValueElement.elementTextTrim("dataType")); + paramValueDO.setDataValue(paramValueElement.elementTextTrim("dataValue")); + selfEvalParamsDO.addParamValue(paramValueDO); + } + supplierEvaluationFactor.setParamValues(selfEvalParamsDO.toJson()); + } + } + }); + }else { + messageProgress.message("未找到"+supplier.getSupplierName()+"自评æ„è§ï¼Œè¯·å…ˆä¸‹è½½æ ‡ä¹¦æˆ–æ£€æŸ¥æ ‡ä¹¦ä¸æ˜¯å¦æä¾›äº†è‡ªè¯„æ„è§ï¼", -1); + return false; + } + + if(null != mapByFactorCodeBySupplierId.get(supplier.getId()) && mapByFactorCodeBySupplierId.get(supplier.getId()).values().size() > 0) { + + List<SupplierEvaluationFactor> supplierEvaluationFactorList = mapByFactorCodeBySupplierId.get(supplier.getId()).values().stream().collect(Collectors.toList()); + int count = supplierEvaluationFactorService.batchSaveOrUpdate(supplierEvaluationFactorList, new String[] { "opinion", "factorResponse", "paramValues" }); + if(count > 0) { + messageProgress.message(supplier.getSupplierName()+"自评æ„è§è§£æžæˆåŠŸï¼", 1); + return true; + } + } + messageProgress.message(supplier.getSupplierName()+"自评æ„è§è§£æžå¤±è´¥ï¼", -1); + return false; + } + private void getSelfItemData(SupplierEvaluationFactor factor, Element t) { + String relChapterType = t.elementTextTrim("relChapterType"); + Element valueList = t.element("valueList"); + if(null != valueList) { + // 主è¥åˆ©æ¶¦çއ + if(StructBusinessTypeEnum.EQ_PROFIT_RATIO.getKey().equals(relChapterType)) { + List<Finance> financeList= ElementClass.of(Finance.class).createList(valueList); + String financeListJsonStr = JsonUtil.jacksonObjectToStr(financeList); + factor.setFinance(financeListJsonStr); +// 供货业绩(物资) + }else if(StructBusinessTypeEnum.EQ_ACHIEVEMENTS.getKey().equals(relChapterType)) { + List<Performance> performanceList= ElementClass.of(Performance.class).createList(valueList); + String performanceListJsonStr = JsonUtil.jacksonObjectToStr(performanceList); + factor.setPerformance(performanceListJsonStr); +// 资信ç‰çº§ EQ_Qualification_ZXDJ + }else if(StructBusinessTypeEnum.EQ_QUALIFICATION_ZXDJ.getKey().equals(relChapterType)) { + List<CreditGrade> creditGradeList= ElementClass.of(CreditGrade.class).createList(valueList); + String creditGradeListJsonStr = JsonUtil.jacksonObjectToStr(creditGradeList); + factor.setCreditGrade(creditGradeListJsonStr); + }else { + List<ParamValues> paramValuesList= ElementClass.of(ParamValues.class).createList(valueList); + String paramValuesListJsonStr = JsonUtil.jacksonObjectToStr(paramValuesList); + factor.setParamValues(paramValuesListJsonStr); + } + } + } + + /** + * @Description: ä¿å˜ + * @author chenxw + * @return + */ + public boolean save() { + List<SupplierEvaluationFactor> supplierEvaluationFactorList = mapByFactorCodeBySupplierId.values().stream().map(Map::values).flatMap(Collection::stream).collect(Collectors.toList()); + if (supplierEvaluationFactorList.isEmpty()) return true; + return supplierEvaluationFactorService.batchSaveOrUpdate(supplierEvaluationFactorList, new String[] { "opinion", "factorResponse" }) > 0; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/tree/EvaluationFactorTree.java b/com.gx.obe.struct/src/com/gx/obe/struct/tree/EvaluationFactorTree.java new file mode 100644 index 00000000..f1548e87 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/tree/EvaluationFactorTree.java @@ -0,0 +1,71 @@ +package com.gx.obe.struct.tree; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.gx.obe.business.entity.SupplierEvaluationFactor; +import com.gx.obe.component.tree.ITree; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.web.entity.evaluation.EvaluationFactor; + +public class EvaluationFactorTree implements ITree<EvaluationFactorTree> { + + private EvaluationFactor evaluationFactor; + private Map<String, SupplierEvaluationFactor> mapBySupplierId; + private Map<String, Map<String, SupplierEvaluationFactor>> mapBySupplierIdByFactorCode; + private Function<SupplierEvaluationFactor, String> mapper; + + public EvaluationFactorTree(EvaluationFactor evaluationFactor, Map<String, Map<String, SupplierEvaluationFactor>> mapBySupplierIdByFactorCode, Function<SupplierEvaluationFactor, String> mapper) { + this.evaluationFactor = Objects.requireNonNull(evaluationFactor); + this.mapBySupplierId = mapBySupplierIdByFactorCode.get(evaluationFactor.getFactorCode()); + this.mapBySupplierIdByFactorCode = mapBySupplierIdByFactorCode; + if("对应页ç ".equals(evaluationFactor.getFactorName())) { + mapper = SupplierEvaluationFactor::getPageNumber; + } + this.mapper = mapper; + } + + @Override + public ITree<EvaluationFactorTree> getRoot() { + if (evaluationFactor.getParentFactor() == null) { + return null; + } + return new EvaluationFactorTree(evaluationFactor.getParentFactor(), mapBySupplierIdByFactorCode, mapper); + } + + @Override + public List<EvaluationFactorTree> getITrees() { + if (CollectionUtils.isNull(evaluationFactor.getChildFactorList())) { + return null; + } + return evaluationFactor.getChildFactorList().stream().map(t -> new EvaluationFactorTree(t, mapBySupplierIdByFactorCode, mapper)).collect(Collectors.toList()); + } + + @Override + public String getName() { + return evaluationFactor.getFactorName(); + } + + @Override + public String getKey() { + return evaluationFactor.getId(); + } + + @Override + public String getValue(Object key) { + return Optional.ofNullable(mapBySupplierId).map(m -> m.get(key)).map(mapper).orElse(""); + } + + public EvaluationFactor getEvaluationFactor() { + return evaluationFactor; + } + + public SupplierEvaluationFactor getSupplierEvaluationFactorByKey(Object key) { + return mapBySupplierId.get(key); + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/utils/ElementUtils.java b/com.gx.obe.struct/src/com/gx/obe/struct/utils/ElementUtils.java new file mode 100644 index 00000000..caaed6f9 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/utils/ElementUtils.java @@ -0,0 +1,20 @@ +package com.gx.obe.struct.utils; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import org.dom4j.Element; + +public class ElementUtils { + + public static Function<Element, Stream<Element>> toStreamFun(String listName, String itemName) { + return e -> { + List<?> elements = Optional.ofNullable(e).map(t -> t.element(listName)).map(t -> t.elements(itemName)).orElse(null); + if (elements == null) return null; + return elements.stream().map(t -> (Element) t); + }; + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/utils/ParsingStructXmlUtils.java b/com.gx.obe.struct/src/com/gx/obe/struct/utils/ParsingStructXmlUtils.java new file mode 100644 index 00000000..f2a22263 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/utils/ParsingStructXmlUtils.java @@ -0,0 +1,813 @@ +package com.gx.obe.struct.utils; + +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.dom4j.Document; +import org.dom4j.Element; + +import com.gx.obe.bind.recursion.Recursions; +import com.gx.obe.common.file.utils.ParsingXmlUtils; +import com.gx.obe.components.core.Constants; +import com.gx.obe.http.json.JsonUtil; +import com.gx.obe.struct.beans.AttachmentFile; +import com.gx.obe.struct.beans.BidderBasicInfo; +import com.gx.obe.struct.beans.BusinessLicense; +import com.gx.obe.struct.beans.Certificate; +import com.gx.obe.struct.beans.Finance; +import com.gx.obe.struct.beans.Performance; +import com.gx.obe.struct.beans.ProjectLeader; +import com.gx.obe.struct.beans.Qualification; +import com.gx.obe.struct.beans.TemplateDataItem; +import com.gx.obe.struct.beans.TemplateTable; +import com.gx.obe.struct.beans.WorkExperience; +import com.gx.obe.util.utils.CollectionUtils; +import com.gx.obe.util.utils.ObjectUtils; +import com.gx.obe.util.utils.StringUtils; +import com.gx.obe.util.utils.UuidUtils; +import com.gx.obe.util.utils.XmlUtils; +import com.gx.obe.web.entity.evaluation.EvaluationContent; +import com.gx.utils.BusinessNowTimeUtils; + +/** + * @Description: è§£æžç»“构化xml文件工具类 + * @author chenxw + */ +public class ParsingStructXmlUtils { + + private static final String BID_FILE_INDEX_TREE = "BidFileIndexTree.xml"; + + private static final String TENDER_STRUCT = "TenderStruct.xml"; + + private ParsingStructXmlUtils() {} + + private static Stream<Element> streamElement(List<?> list) { + return list.stream().map(t -> (Element) t); + } + + /** + * @Description: è§£æžè¯„审内容 + * @author chenxw + * @param tenderId + * @param factorCode + * @param evaluationContentListElement + * @return + */ + public static Optional<List<EvaluationContent>> resolverEvaluationContent(String tenderId, String factorCode, Element evaluationContentListElement) { + return Optional.ofNullable(evaluationContentListElement).map(t -> t.elements("evaluationContent")).map(l -> { + return streamElement(l).map(ParsingStructXmlUtils::initEvaluationContent).peek(t -> { + t.setTenderId(tenderId); + t.setFactorCode(factorCode); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–评审内容 + * @author chenxw + * @param evaluationContentElement + * @return + */ + private static EvaluationContent initEvaluationContent(Element evaluationContentElement) { + EvaluationContent evaluationContent = new EvaluationContent(); + evaluationContent.setId(UuidUtils.getUUID()); + evaluationContent.setRelChapterType(evaluationContentElement.elementTextTrim("relChapterType")); + evaluationContent.setDataCategory(evaluationContentElement.elementTextTrim("dataCategory")); + evaluationContent.setDataCode(evaluationContentElement.elementTextTrim("dataCode")); + evaluationContent.setEvalRule(evaluationContentElement.elementTextTrim("evalRule")); + evaluationContent.setTenderStructName(evaluationContentElement.elementTextTrim("tenderStructName")); + evaluationContent.setEvalPointName(evaluationContentElement.elementTextTrim("evalPointName")); + try { + evaluationContent.setSortNo(Integer.valueOf(evaluationContentElement.elementTextTrim("Order"))); + } catch (Exception e) {} + return evaluationContent; + } + + /** + * @Description: è§£æžæŠ•æ ‡æ ‘å½¢ç´¢å¼•æ–‡ä»¶ + * @author chenxw + * @param tenderId + * @param supplierId + * @return + */ + public static Optional<List<Element>> resolverBidFileIndexTree(String bidFilePath) { + return Optional.ofNullable(bidFilePath).map(t -> { + return t.concat(BID_FILE_INDEX_TREE); + }).map(XmlUtils::getXmlDocument).map(Document::getRootElement).map(Element::elements).map(l -> { + return streamElement(l).map(t -> { + List<Element> list = streamElement(t.elements()).collect(Collectors.toList()); + resolverBidFileIndexTree(list); + return list; + }).flatMap(List::stream).collect(Collectors.toList()); + }); + } + + /** + * @Description: é€’å½’è§£æžæŠ•æ ‡æ ‘å½¢ç´¢å¼•æ–‡ä»¶ + * @author chenxw + * @param fileItemElementList + * @return + */ + private static void resolverBidFileIndexTree(List<Element> fileItemElementList) { + List<Element> childfileItemList = streamElement(fileItemElementList).flatMap(t -> streamElement(t.elements("fileItem"))).collect(Collectors.toList()); + if (childfileItemList.isEmpty()) { + return; + } + resolverBidFileIndexTree(childfileItemList); + childfileItemList.stream().forEach(t -> fileItemElementList.add((Element) t.clone())); + } + + /** + * @Description: è§£æžå°èŒƒæœ¬è¡¨æ ¼ + * @author chenxw + * @param tenderId + * @param supplierId + * @param relChapterType + * @param fileItemElementList + * @param bidFilePath + * @return + */ + public static Optional<List<TemplateTable>> resolverTemplateTable(String tenderId, String supplierId, String relChapterType, List<Element> fileItemElementList, String bidFilePath) { + if (StringUtils.isEmpty(tenderId) || StringUtils.isEmpty(supplierId) || StringUtils.isEmpty(relChapterType) || CollectionUtils.isNull(fileItemElementList)) { + return Optional.empty(); + } + return fileItemElementList.stream().filter(t -> { +// System.out.println(t.elementTextTrim("chapterType")); + return relChapterType.equals(t.elementTextTrim("chapterType")); + }).findAny().map(t -> t.element("tableList")).map(t -> t.elements("tableInfo")).map(l -> { + return streamElement(l).map(ParsingStructXmlUtils::initTemplateTable).peek(t -> { + t.setTenderId(tenderId); + t.setSupplierId(supplierId); + t.setRelChapterType(relChapterType); + if (Stream.of("CompletedAchievements", "OngoingAchievements").anyMatch(Predicate.isEqual(relChapterType))) { + t.setDataCode(relChapterType); + } + Optional.ofNullable(bidFilePath).map(p -> p.concat(t.getXmlPath())).map(ParsingXmlUtils::parsingTableXML).map(JsonUtil::jsonObjectToStr).ifPresent(t::setTableInfo); + }).collect(Collectors.toList()); + }); + } + + public static Optional<List<TemplateTable>> resolverTemplateTable(String tenderId, String relChapterType) { + String biddingFilePath = Constants.getBiddingFilePath(tenderId); + Document document = XmlUtils.getXmlDocument(biddingFilePath + TENDER_STRUCT); + System.out.println(); + if (document == null) { + throw new RuntimeException(); + } + List<?> elements = document.getRootElement().elements("chapter"); + if (elements == null) { + return Optional.empty(); + } + return Recursions.stream(ElementUtils.toStreamFun("chapterList", "chapter")).toStream(elements.stream().map(t -> (Element) t)) + .findAny(t -> t.elementText("relChapterType").equals(relChapterType)).map(ElementUtils.toStreamFun("tableList", "tableInfo")) + .map(s -> { + return s.map(ParsingStructXmlUtils::initTemplateTable).peek(t -> { + t.setTenderId(tenderId); + t.setSupplierId(Constants.BIDDING_ID); + t.setRelChapterType(relChapterType); + Optional.of(t).map(TemplateTable::getXmlPath).map(biddingFilePath::concat).map(ParsingXmlUtils::parsingTableXML).map(JsonUtil::jsonObjectToStr).ifPresent(t::setTableInfo); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–å°èŒƒæœ¬è¡¨æ ¼ + * @author chenxw + * @param templateTableElement + * @return + */ + private static TemplateTable initTemplateTable(Element templateTableElement) { + TemplateTable templateTable = new TemplateTable(); + String tableId = templateTableElement.elementTextTrim("tableId"); + templateTable.setId(StringUtils.isEmpty(tableId) ? UuidUtils.getUUID() : tableId); + templateTable.setDataCode(templateTableElement.elementTextTrim("bookMarkName")); + templateTable.setXmlPath(templateTableElement.elementTextTrim("xmlPath")); + templateTable.setTableName(templateTableElement.elementTextTrim("tableName")); + return templateTable; + } + + /** + * @Description: è§£æžå°èŒƒæœ¬è¡¨å•æ•°æ® + * @author chenxw + * @param tenderId + * @param supplierId + * @param relChapterType + * @param fileItemElementList + * @return + */ + public static Optional<List<TemplateDataItem>> resolverObeTemplateDataItem(String tenderId, String supplierId, String relChapterType, List<Element> fileItemElementList, String bidFilePath) { + if (StringUtils.isEmpty(tenderId) || StringUtils.isEmpty(supplierId) || StringUtils.isEmpty(relChapterType) || CollectionUtils.isNull(fileItemElementList)) { + return Optional.empty(); + } + return fileItemElementList.stream().filter(t -> { + return relChapterType.equals(t.elementTextTrim("chapterType")); + }).findAny().map(t -> { + return t.elementTextTrim("fileId"); + }).map(t -> { + return t.concat(Constants.XML); + }).map(t -> { + return bidFilePath.concat(t); + }).map(XmlUtils::getXmlDocument).map(Document::getRootElement).map(t -> t.elements("dataItem")).map(l -> { + return streamElement(l).map(ParsingStructXmlUtils::initTemplateDataItem).peek(t -> { + t.setTenderId(tenderId); + t.setSupplierId(supplierId); + t.setRelChapterType(relChapterType); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–å°èŒƒæœ¬è¡¨æ ¼ + * @author chenxw + * @param templateTableElement + * @return + */ + private static TemplateDataItem initTemplateDataItem(Element templateDataItemElement) { + TemplateDataItem templateDataItem = new TemplateDataItem(); + templateDataItem.setId(UuidUtils.getUUID()); + templateDataItem.setDataCode(templateDataItemElement.elementTextTrim("id")); + templateDataItem.setName(templateDataItemElement.elementTextTrim("name")); + templateDataItem.setValue(templateDataItemElement.elementTextTrim("value")); + templateDataItem.setType(templateDataItemElement.elementTextTrim("type")); + templateDataItem.setDataType(templateDataItemElement.elementTextTrim("dataType")); + templateDataItem.setUnit(templateDataItemElement.elementTextTrim("unit")); + return templateDataItem; + } + + /** + * @Description: è§£æžè¥ä¸šæ‰§ç…§ + * @author chenxw + * @param tenderId + * @param modelDataId + * @param xmlFilePath + * @param consumer + * @return + */ + public static Optional<List<BusinessLicense>> resolverBusinessLicense(String tenderId, String modelDataId, String xmlFilePath, Consumer<AttachmentFileOperation> consumer) { + return Optional.ofNullable(XmlUtils.getXmlDocument(xmlFilePath)).map(t -> t.getRootElement().elements("BusinessLicense")).map(l -> { + return streamElement(l).map(t -> { + BusinessLicense businessLicense = initBusinessLicense(t); + consumer.accept(new AttachmentFileOperation(tenderId, businessLicense.getId(), t.element("scanCertificate"))); + return businessLicense; + }).peek(t -> { + t.setTenderId(tenderId); + t.setModelDataId(modelDataId); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–è¥ä¸šæ‰§ç…§ + * @author chenxw + * @param businessLicenseElement + * @return + */ + private static BusinessLicense initBusinessLicense(Element businessLicenseElement) { + BusinessLicense businessLicense = new BusinessLicense(); + businessLicense.setId(UuidUtils.getUUID()); + businessLicense.setRegisterNumber(businessLicenseElement.elementTextTrim("registerNumber")); + businessLicense.setCompanyName(businessLicenseElement.elementTextTrim("companyName")); + businessLicense.setCompanyType(businessLicenseElement.elementTextTrim("companyType")); + businessLicense.setCompanyAddress(businessLicenseElement.elementTextTrim("companyAddress")); + businessLicense.setLegalRepresentative(businessLicenseElement.elementTextTrim("legalRepresentative")); + businessLicense.setRegisterCapital(businessLicenseElement.elementTextTrim("registerCapital")); + businessLicense.setEstablishDate(businessLicenseElement.elementTextTrim("establishDate")); + businessLicense.setBusnissTermStartDate(businessLicenseElement.elementTextTrim("busnissTermStartDate")); + businessLicense.setBusnissTermEndtDate(businessLicenseElement.elementTextTrim("busnissTermEndDate")); + businessLicense.setBusinessScope(businessLicenseElement.elementTextTrim("businessScope")); + businessLicense.setRegisterInstitution(businessLicenseElement.elementTextTrim("registerInstitution")); + businessLicense.setIsPerpetual(businessLicenseElement.elementTextTrim("isPerpetual")); + businessLicense.setIsInAreaEnterprises(businessLicenseElement.elementTextTrim("isInAreaEnterprises")); + return businessLicense; + } + + /** + * @Description: è§£æžè´¢åŠ¡æŠ¥è¡¨ + * @author chenxw + * @param tenderId + * @param modelDataId + * @param xmlFilePath + * @param consumer + * @return + */ + public static Optional<List<Finance>> resolverFinance(String tenderId, String modelDataId, String xmlFilePath, Consumer<AttachmentFileOperation> consumer) { + return Optional.ofNullable(XmlUtils.getXmlDocument(xmlFilePath)).map(t -> t.getRootElement().elements("Finance")).map(l -> { + return streamElement(l).map(t -> { + Finance finance = initFinance(t); + consumer.accept(new AttachmentFileOperation(tenderId, finance.getId(), t.element("scanFinance"))); + return finance; + }).peek(t -> { + t.setTenderId(tenderId); + t.setModelDataId(modelDataId); +// t.getBalanceSheet().setTenderId(tenderId); +// t.getBalanceSheet().setFinanceId(t.getId()); +// t.getProfitlossSheet().setTenderId(tenderId); +// t.getProfitlossSheet().setFinanceId(t.getId()); +// t.getCashSheet().setTenderId(tenderId); +// t.getCashSheet().setFinanceId(t.getId()); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–财务报表 + * @author chenxw + * @param financeElement + * @return + */ + private static Finance initFinance(Element financeElement) { + Finance finance = new Finance(); + finance.setId(UuidUtils.getUUID()); + finance.setAnnual(financeElement.elementTextTrim("annual")); +// finance.setRegisteredCapital(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("registeredCapital"))); + finance.setTotal(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("total"))); + finance.setProfitLossProfit(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("profitLossprofit"))); + finance.setOperatingIncome(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("operatingIncome"))); + finance.setLiabilitiesRate(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("liabilitiesRate"))); + finance.setCurrentAssets(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("currentAssets"))); + finance.setCurrentLiabilities(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("currentLiabilities"))); + finance.setCurrentRate(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("currentRate"))); + finance.setProfitRatio(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("profitRatio"))); + finance.setOperatingMargin(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("operatingMargin"))); + finance.setRetainedProfits(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("retainedProfits"))); + finance.setCompanyName(financeElement.elementTextTrim("companyName")); + finance.setNetWorth(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("netWorth"))); +// finance.setFixedAssets(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("fixedAssets"))); +// finance.setNetCashFlow(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("netCashFlow"))); +// finance.setReturnOnEquity(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("returnOnEquity"))); +// finance.setReturnOnTotalAsset(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("returnOnTotalAsset"))); + finance.setQuickRatio(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("quickRatio"))); + finance.setTotalliabilities(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("totalliabilities"))); + finance.setTotalcost(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("totalcost"))); + finance.setQuickassets(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("quickassets"))); + finance.setMainIncomeProfits(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("mainIncomeProfits"))); + finance.setPrimeOperatingRevenue(ObjectUtils.getObjBigDecimal(financeElement.elementTextTrim("primeOperatingRevenue"))); +// finance.setBalanceSheet(initBalanceSheet(financeElement.element("BalanceSheet"))); +// finance.setProfitlossSheet(initProfitlossSheet(financeElement.element("ProfitLossSheet"))); +// finance.setCashSheet(initCashSheet(financeElement.element("CashSheet"))); + return finance; + } + + /** + * @Description: åˆå§‹åŒ–资产负债表 + * @author chenxw + * @param balanceSheetElement + * @return + */ +// private static BalanceSheet initBalanceSheet(Element balanceSheetElement) { +// BalanceSheet balanceSheet = new BalanceSheet(); +// balanceSheet.setId(UuidUtils.getUUID()); +// balanceSheet.setBalanceTotal(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("balanceTotal"))); +// balanceSheet.setBalanceCecurrentAssets(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("balanceCecurrentAssets"))); +// balanceSheet.setInventory(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("inventory"))); +// balanceSheet.setReceivables(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("receivables"))); +// balanceSheet.setBadAssets(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("badAssets"))); +// balanceSheet.setBalanceTotalliabilities(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("balanceTotalliabilities"))); +// balanceSheet.setBalanceCurrentLiabilities(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("balanceCurrentLiabilities"))); +// balanceSheet.setOwnershipInterest(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("ownershipInterest"))); +// balanceSheet.setAbnormalIncrease(ObjectUtils.getObjBigDecimal(balanceSheetElement.elementTextTrim("abnormalIncrease"))); +// return balanceSheet; +// } + + /** + * @Description: åˆå§‹åŒ–æŸç›Šè¡¨ + * @author chenxw + * @param profitlossSheetElement + * @return + */ +// private static ProfitlossSheet initProfitlossSheet(Element profitlossSheetElement) { +// ProfitlossSheet profitlossSheet = new ProfitlossSheet(); +// profitlossSheet.setId(UuidUtils.getUUID()); +// profitlossSheet.setMainIncome(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("mainIncome"))); +// profitlossSheet.setMainCost(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("mainCost"))); +// profitlossSheet.setFinancialCost(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("financialCost"))); +// profitlossSheet.setOtherCosts(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("otherCosts"))); +// profitlossSheet.setDevelopmentAndTransferCosts(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("developmentAndTransferCosts"))); +// profitlossSheet.setProfitLossprofit(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("profitLossprofit"))); +// profitlossSheet.setProfitRetainedProfits(ObjectUtils.getObjBigDecimal(profitlossSheetElement.elementTextTrim("profitRetainedProfits"))); +// return profitlossSheet; +// } + + /** + * @Description: åˆå§‹åŒ–现金æµé‡è¡¨ + * @author chenxw + * @param cashSheetElement + * @return + */ +// private static CashSheet initCashSheet(Element cashSheetElement) { +// CashSheet cashSheet = new CashSheet(); +// cashSheet.setId(UuidUtils.getUUID()); +// cashSheet.setOperatingNetCashFlow(ObjectUtils.getObjBigDecimal(cashSheetElement.elementTextTrim("operatingNetCashFlow"))); +// return cashSheet; +// } + + /** + * @Description: è§£æžä¸šç»© + * @author chenxw + * @param tenderId + * @param modelDataId + * @param xmlFilePath + * @param consumer + * @param mark + * @return + */ + public static Optional<List<Performance>> resolverPerformance(String tenderId, String modelDataId, String xmlFilePath, Consumer<AttachmentFileOperation> consumer, String mark) { + return Optional.ofNullable(XmlUtils.getXmlDocument(xmlFilePath)).map(t -> t.getRootElement().elements("Performance")).map(l -> { + return streamElement(l).filter(t -> { + if(null != mark ) { + return mark.equals(t.elementTextTrim("status")); + }else { + return false; + } + }).map(t -> { + Performance performance = initPerformance(t); + consumer.accept(new AttachmentFileOperation(tenderId, performance.getId(), t.element("scanSingning"))); + return performance; + }).peek(t -> { + t.setTenderId(tenderId); + t.setModelDataId(modelDataId); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–业绩 + * @author chenxw + * @param performanceElement + * @return + */ + private static Performance initPerformance(Element performanceElement) { + Performance performance = new Performance(); + performance.setId(UuidUtils.getUUID()); + performance.setPurchasingUnit(performanceElement.elementTextTrim("purchasingUnit")); + performance.setPartner(performanceElement.elementTextTrim("partner")); + performance.setProjectName(performanceElement.elementTextTrim("projectName")); + performance.setSingningDate(performanceElement.elementTextTrim("singningDate")); + performance.setEndTime(performanceElement.elementTextTrim("endTime")); + performance.setSingningTotal(performanceElement.elementTextTrim("singningTotal")); + performance.setPurchaser(performanceElement.elementTextTrim("purchaser")); + performance.setPurchaserPhone(performanceElement.elementTextTrim("purchaserPhone")); + performance.setStatus(performanceElement.elementTextTrim("status")); + performance.setSupplierName(performanceElement.elementTextTrim("supplierName")); + performance.setProjectAddress(performanceElement.elementTextTrim("projectAddress")); + performance.setBuyerName(performanceElement.elementTextTrim("buyerName")); + performance.setBuyerAddress(performanceElement.elementTextTrim("buyerAddress")); + performance.setBuyerPhoneNumber(performanceElement.elementTextTrim("buyerPhoneNumber")); + performance.setStartTime(performanceElement.elementTextTrim("startTime")); + performance.setWorkUndertaken(performanceElement.elementTextTrim("workUndertaken")); + performance.setProjectQuantity(performanceElement.elementTextTrim("projectQuantity")); + performance.setProjectManager(performanceElement.elementTextTrim("projectManager")); + performance.setTechnicalDirector(performanceElement.elementTextTrim("technicalDirector")); + performance.setChiefSupervisionEngineer(performanceElement.elementTextTrim("chiefSupervisionEngineer")); + performance.setCsePhoneNumber(performanceElement.elementTextTrim("CSEPhoneNumber")); + performance.setProjectDesc(performanceElement.elementTextTrim("projectDesc")); + performance.setProjectRangeAndContent(performanceElement.elementTextTrim("projectRangeAndContent")); + performance.setSupplierWorkerCountmax(performanceElement.elementTextTrim("supplierWorkerCountMax")); + performance.setSupplierWorkerCountave(performanceElement.elementTextTrim("supplierWorkerCountAve")); + performance.setProjectDeviceResult(performanceElement.elementTextTrim("projectDeviceResult")); + performance.setBuyerLinkman(performanceElement.elementTextTrim("buyerLinkman")); + performance.setIsHavrAccessory(performanceElement.elementTextTrim("isHavrAccessory")); + performance.setIsOurCompanyProject(performanceElement.elementTextTrim("isOurCompanyProject")); + performance.setServiceScope(performanceElement.elementTextTrim("serviceScope")); + performance.setDeviceName(performanceElement.elementTextTrim("deviceName")); + performance.setDevicetypeSpecification(performanceElement.elementTextTrim("devicetypeSpecification")); + performance.setTotalCapacity(performanceElement.elementTextTrim("totalCapacity")); + performance.setNumber(performanceElement.elementTextTrim("number")); + performance.setContractTime(performanceElement.elementTextTrim("contractTime")); + performance.setCommissioningTime(performanceElement.elementTextTrim("commissioningTime")); + performance.setMemo(performanceElement.elementTextTrim("memo")); + performance.setProjectScale(performanceElement.elementTextTrim("projectScale")); + performance.setProfessionalNumber(performanceElement.elementTextTrim("professionalNumber")); + performance.setProfessionalWorkload(performanceElement.elementTextTrim("professionalWorkload")); + performance.setPartnerProfessionalWorkload(performanceElement.elementTextTrim("partnerProfessionalWorkload")); + performance.setSupervisionCcontent(performanceElement.elementTextTrim("supervisionCcontent")); + performance.setSupervisionResult(performanceElement.elementTextTrim("supervisionResult")); + performance.setKeyStaffProfessionalAndDuty(performanceElement.elementTextTrim("keyStaffProfessionalAndDuty")); + performance.setServiceDesc(performanceElement.elementTextTrim("serviceDesc")); + performance.setExecutionDate(performanceElement.elementTextTrim("serviceDesc")); + performance.setProjectScaleAndType(performanceElement.elementTextTrim("projectScaleAndType")); + performance.setDesignStage(performanceElement.elementTextTrim("designStage")); + performance.setDesignRange(performanceElement.elementTextTrim("designRange")); + performance.setCooperationWay(performanceElement.elementTextTrim("cooperationWay")); + performance.setContractExecuteCondition(performanceElement.elementTextTrim("contractExecuteCondition")); + return performance; + } + + /** + * @Description: è§£æžæŠ•æ ‡äººåŸºæœ¬æƒ…å†µ + * @author chenxw + * @param tenderId + * @param modelDataId + * @param xmlFilePath + * @return + */ + public static Optional<List<BidderBasicInfo>> resolverBidderBasicInfo(String tenderId, String modelDataId, String xmlFilePath, Consumer<AttachmentFileOperation> consumer) { + return Optional.ofNullable(XmlUtils.getXmlDocument(xmlFilePath)).map(t -> t.getRootElement().elements("bidderBasicInfo")).map(l -> { + return streamElement(l).map(t -> { + BidderBasicInfo bidderBasicInfo = initBidderBasicInfo(t); + consumer.accept(new AttachmentFileOperation(tenderId, bidderBasicInfo.getId(), t.element("scanCertificate"))); + return bidderBasicInfo; + }).peek(t -> { + t.setTenderId(tenderId); + t.setModelDataId(modelDataId); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–æŠ•æ ‡äººåŸºæœ¬æƒ…å†µ + * @author chenxw + * @param bidderBasicInfoElement + * @return + */ + private static BidderBasicInfo initBidderBasicInfo(Element bidderBasicInfoElement) { + BidderBasicInfo bidderBasicInfo = new BidderBasicInfo(); + bidderBasicInfo.setId(UuidUtils.getUUID()); + bidderBasicInfo.setCompanyName(bidderBasicInfoElement.elementTextTrim("companyName")); + bidderBasicInfo.setRegisterLocation(bidderBasicInfoElement.elementTextTrim("registerLocation")); + bidderBasicInfo.setPostalCode(bidderBasicInfoElement.elementTextTrim("postalCode")); + bidderBasicInfo.setLinkMan(bidderBasicInfoElement.elementTextTrim("linkMan")); + bidderBasicInfo.setLinkManPhone(bidderBasicInfoElement.elementTextTrim("linkManPhone")); + bidderBasicInfo.setLinkManFax(bidderBasicInfoElement.elementTextTrim("linkManFax")); + bidderBasicInfo.setLinkManWebsite(bidderBasicInfoElement.elementTextTrim("linkManWebSite")); + bidderBasicInfo.setOrgStructure(bidderBasicInfoElement.elementTextTrim("orgStructure")); + bidderBasicInfo.setLegalRepresentativeName(bidderBasicInfoElement.elementTextTrim("legalRepresentativeName")); + bidderBasicInfo.setLegalRepresentativeTitle(bidderBasicInfoElement.elementTextTrim("legalRepresentativeTitle")); + bidderBasicInfo.setLegalRepresentativePhone(bidderBasicInfoElement.elementTextTrim("legalRepresentativePhone")); + bidderBasicInfo.setTechnicalDirectorName(bidderBasicInfoElement.elementTextTrim("technicalDirectorName")); + bidderBasicInfo.setTechnicalDirectorTitle(bidderBasicInfoElement.elementTextTrim("technicalDirectorTitle")); + bidderBasicInfo.setTechnicalDirectorPhone(bidderBasicInfoElement.elementTextTrim("technicalDirectorPhone")); + bidderBasicInfo.setSetupTime(bidderBasicInfoElement.elementTextTrim("setupTime")); + bidderBasicInfo.setCompanyQualificationLevel(bidderBasicInfoElement.elementTextTrim("companyQualificationLevel")); + bidderBasicInfo.setRegisteredCapital(bidderBasicInfoElement.elementTextTrim("registeredCapital")); + bidderBasicInfo.setDepositBank(bidderBasicInfoElement.elementTextTrim("depositBank")); + bidderBasicInfo.setBussinessLicense(bidderBasicInfoElement.elementTextTrim("bussinessLicense")); + bidderBasicInfo.setBankAccount(bidderBasicInfoElement.elementTextTrim("bankAccount")); + bidderBasicInfo.setEmployeeNumber(bidderBasicInfoElement.elementTextTrim("employeeNumber")); + bidderBasicInfo.setPurchaserNumber(bidderBasicInfoElement.elementTextTrim("purchaserNumber")); + bidderBasicInfo.setSeniorProfessionalPostNumber(bidderBasicInfoElement.elementTextTrim("seniorProfessionalPostNumber")); + bidderBasicInfo.setMediumProfessionalPostNumber(bidderBasicInfoElement.elementTextTrim("mediumProfessionalPostNumber")); + bidderBasicInfo.setPrimaryProfessionalPostNumber(bidderBasicInfoElement.elementTextTrim("primaryProfessionalPostNumber")); + bidderBasicInfo.setArtisanNumber(bidderBasicInfoElement.elementTextTrim("artisanNumber")); + bidderBasicInfo.setBusinessScope(bidderBasicInfoElement.elementTextTrim("businessScope")); + bidderBasicInfo.setEnterpriseNature(bidderBasicInfoElement.elementTextTrim("enterpriseNature")); + bidderBasicInfo.setEquityStructure(bidderBasicInfoElement.elementTextTrim("equityStructure")); + bidderBasicInfo.setRelatedCompanyInfo(bidderBasicInfoElement.elementTextTrim("relatedCompanyInfo")); + bidderBasicInfo.setServiceAbility(bidderBasicInfoElement.elementTextTrim("serviceAbility")); + bidderBasicInfo.setPreInputDevice(bidderBasicInfoElement.elementTextTrim("preInputDevice")); + bidderBasicInfo.setMemo(bidderBasicInfoElement.elementTextTrim("memo")); + return bidderBasicInfo; + } + + /** + * @Description: è§£æžè®¤è¯è¯ä¹¦ + * @author chenxw + * @param tenderId + * @param modelDataId + * @param xmlFilePath + * @param consumer + * @return + */ + public static Optional<List<Qualification>> resolverQualification(String tenderId, String modelDataId, String xmlFilePath, Consumer<AttachmentFileOperation> consumer) { + return Optional.ofNullable(XmlUtils.getXmlDocument(xmlFilePath)).map(t -> t.getRootElement().elements("Qualification")).map(l -> { + return streamElement(l).map(t -> { + Qualification qualification = initQualification(t); + consumer.accept(new AttachmentFileOperation(tenderId, qualification.getId(), t.element("scanCertificate"))); + return qualification; + }).peek(t -> { + t.setTenderId(tenderId); + t.setModelDataId(modelDataId); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–认è¯è¯ä¹¦ + * @author chenxw + * @param qualificationElement + * @return + */ + private static Qualification initQualification(Element qualificationElement) { + Qualification qualification = new Qualification(); + qualification.setId(UuidUtils.getUUID()); + qualification.setCertificateName(qualificationElement.elementTextTrim("certificateName")); + qualification.setAwardProjectName(qualificationElement.elementTextTrim("awardProjectName")); + qualification.setCompanyName(qualificationElement.elementTextTrim("companyName")); + qualification.setAwardLevel(qualificationElement.elementTextTrim("awardLevel")); + qualification.setCertificateNumber(qualificationElement.elementTextTrim("certificateNumber")); + qualification.setIssueAuthority(qualificationElement.elementTextTrim("issueAuthority")); + qualification.setIssueDate(qualificationElement.elementTextTrim("issueDate")); + qualification.setPeriodValidity(qualificationElement.elementTextTrim("periodValidity")); + qualification.setProjectName(qualificationElement.elementTextTrim("projectName")); + return qualification; + } + + /** + * @Description: è§£æžé¡¹ç›®è´Ÿè´£äºº + * @author chenxw + * @param tenderId + * @param modelDataId + * @param xmlFilePath + * @param consumer + * @return + */ + public static Optional<List<ProjectLeader>> resolverProjectLeader(String tenderId, String modelDataId, String xmlFilePath, Consumer<AttachmentFileOperation> consumer) { + return Optional.ofNullable(XmlUtils.getXmlDocument(xmlFilePath)).map(t -> t.getRootElement().elements("projectLeader")).map(l -> { + return streamElement(l).map(t -> { + ProjectLeader projectLeader = initProjectLeader(t); + consumer.accept(new AttachmentFileOperation(tenderId, projectLeader.getId(), t.element("scanSingningList"))); + projectLeader.setCertificateList(resolverCertificate(tenderId, projectLeader.getId(), t.element("certificateList"), consumer)); + projectLeader.setWorkExperienceList(resolverWorkExperience(t.element("workExperienceList"), tenderId, projectLeader.getId())); + return projectLeader; + }).peek(t -> { + t.setTenderId(tenderId); + t.setModelDataId(modelDataId); + }).collect(Collectors.toList()); + }); + } + + /** + * @Description: åˆå§‹åŒ–项目负责人 + * @author chenxw + * @param qualificationElement + * @return + */ + private static ProjectLeader initProjectLeader(Element projectLeaderElement) { + ProjectLeader projectLeader = new ProjectLeader(); + projectLeader.setId(UuidUtils.getUUID()); + projectLeader.setCompanyName(projectLeaderElement.elementTextTrim("companyName")); + projectLeader.setLeaderName(projectLeaderElement.elementTextTrim("leaderName")); + projectLeader.setIdnumber(projectLeaderElement.elementTextTrim("idnumber")); + projectLeader.setAge(projectLeaderElement.elementTextTrim("age")); + projectLeader.setJobTitle(projectLeaderElement.elementTextTrim("jobTitle")); + projectLeader.setWorkExperience(projectLeaderElement.elementTextTrim("workExperience")); + projectLeader.setCurrentMajorExperience(projectLeaderElement.elementTextTrim("currentMajorExperience")); + projectLeader.setGraduateSchool(projectLeaderElement.elementTextTrim("graduateSchool")); + projectLeader.setGraduateMajor(projectLeaderElement.elementTextTrim("graduateMajor")); + projectLeader.setEducation(projectLeaderElement.elementTextTrim("education")); + projectLeader.setProfessionalTitle(projectLeaderElement.elementTextTrim("professionalTitle")); + projectLeader.setIsLeaderFlag(projectLeaderElement.elementTextTrim("isLeaderFlag")); + return projectLeader; + } + + /** + * @Description: è§£æžè¯ä¹¦ä¿¡æ¯ + * @author chenxw + * @param tenderId + * @param projectLeaderId + * @param certificateListElement + * @param consumer + * @return + */ + private static List<Certificate> resolverCertificate(String tenderId, String projectLeaderId, Element certificateListElement, Consumer<AttachmentFileOperation> consumer) { + return Optional.ofNullable(certificateListElement).map(t -> t.elements("projectLeaderCertificate")).map(l -> { + return streamElement(l).map(t -> { + Certificate certificate = initCertificate(t); + consumer.accept(new AttachmentFileOperation(tenderId, certificate.getId(), t.element("scanCertificate"), true)); + return certificate; + }).peek(t -> { + t.setTenderId(tenderId); + t.setProjectLeaderId(projectLeaderId); + }).collect(Collectors.toList()); + }).orElse(null); + } + + /** + * @Description: åˆå§‹åŒ–è¯ä¹¦ä¿¡æ¯ + * @author chenxw + * @param projectLeaderCertificateElement + * @return + */ + private static Certificate initCertificate(Element projectLeaderCertificateElement) { + Certificate certificate = new Certificate(); + certificate.setId(UuidUtils.getUUID()); + certificate.setCertificateNo(projectLeaderCertificateElement.elementTextTrim("certificateNo")); + certificate.setCertificateName(projectLeaderCertificateElement.elementTextTrim("certificateName")); + certificate.setCertificateLevel(projectLeaderCertificateElement.elementTextTrim("certificateLevel")); + certificate.setSortNo(Optional.ofNullable(projectLeaderCertificateElement.elementTextTrim("SortNo")).map(Integer::valueOf).orElse(Integer.MAX_VALUE)); + return certificate; + } + + /** + * @Description: è§£æžå·¥ä½œç»åŽ†åˆ—è¡¨ + * @author chenxw + * @param workExperienceListElement + * @param tenderId + * @param projectLeaderId + * @return + */ + private static List<WorkExperience> resolverWorkExperience( + Element workExperienceListElement, + String tenderId, + String projectLeaderId) { + return Optional.ofNullable(workExperienceListElement) + .map(Element::elements) + .map(l -> IntStream.range(0, l.size()) + .mapToObj(i -> initWorkExperience((Element) l.get(i), i)) + .peek(t -> { + t.setTenderId(tenderId); + t.setProjectLeaderId(projectLeaderId); + }) + .collect(Collectors.toList())) + .orElse(null); + } + + /** + * @Description: åˆå§‹åŒ–工作ç»åކ + * @author chenxw + * @param workExperienceElement + * @param + * @return + */ + private static WorkExperience initWorkExperience(Element workExperienceElement, int sortNo) { + return Optional.of(workExperienceElement).map(e -> { + WorkExperience workExperience = new WorkExperience(); + workExperience.setId(UuidUtils.getUUID()); + workExperience.setTime(e.elementTextTrim("time")); + workExperience.setProjectName(e.elementTextTrim("projectName")); + workExperience.setJobTitle(e.elementTextTrim("jobTitle")); + workExperience.setContractInfo(e.elementTextTrim("contractInfo")); + workExperience.setCapacity(e.elementTextTrim("capacity")); + workExperience.setBearWork(e.elementTextTrim("bearWork")); + workExperience.setSortNo(sortNo); + return workExperience; + }).get(); + } + + /** + * @Description: è§£æžé™„ä»¶ä¿¡æ¯ + * @author chenxw + * @param attachmentFileOperation + * @return + */ + public static Optional<List<AttachmentFile>> resolverAttachmentFile(AttachmentFileOperation attachmentFileOperation) { + System.out.println("resolverAttachmentFile"); + Optional<AttachmentFileOperation> attachmentFileOperationOptional = Optional.ofNullable(attachmentFileOperation); + Consumer<AttachmentFile> action = a -> { + attachmentFileOperationOptional.map(t -> t.tenderId).ifPresent(t -> a.setTenderId(t)); + attachmentFileOperationOptional.map(t -> t.businessId).ifPresent(t -> a.setBusinessId(t)); + }; + if (attachmentFileOperation.single) return attachmentFileOperationOptional.map(t -> t.element) + .map(e -> Stream.of(e).map(ParsingStructXmlUtils::initAttachmentFile).peek(action).collect(Collectors.toList())); + return attachmentFileOperationOptional.map(t -> t.element).map(t -> t.elements("attachmentFileWithSign")) + .map(l -> streamElement(l).map(ParsingStructXmlUtils::initAttachmentFile).peek(action).collect(Collectors.toList())); + } + + /** + * @Description: åˆå§‹åŒ–é™„ä»¶ä¿¡æ¯ + * @author chenxw + * @param attachmentFileWithSignElement + * @return + */ + private static AttachmentFile initAttachmentFile(Element attachmentFileWithSignElement) { + AttachmentFile attachmentFile = new AttachmentFile(); + attachmentFile.setId(UuidUtils.getUUID()); + attachmentFile.setCreateTime(BusinessNowTimeUtils.getNowDate()); + attachmentFile.setFileUrl(attachmentFileWithSignElement.elementTextTrim("DownloadUrl")); + attachmentFile.setFileName(attachmentFileWithSignElement.elementTextTrim("FileName")); + return attachmentFile; + } + + /** + * @Description: é™„ä»¶ä¿¡æ¯æ“作类 + * @author chenxw + */ + public static class AttachmentFileOperation { + + private final String tenderId; + private final String businessId; + private final Element element; + private final boolean single; + + /** + * @author chenxw + * @param tenderId + * @param businessId + * @param element + */ + public AttachmentFileOperation(String tenderId, String businessId, Element element) { + this(tenderId, businessId, element, false); + } + + /** + * @author chenxw + * @param tenderId + * @param businessId + * @param element + * @param single + */ + public AttachmentFileOperation(String tenderId, String businessId, Element element, boolean single) { + this.tenderId = tenderId; + this.businessId = businessId; + this.element = element; + this.single = single; + } + + } + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/CreditGrade.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/CreditGrade.java new file mode 100644 index 00000000..1eca7130 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/CreditGrade.java @@ -0,0 +1,43 @@ +package com.gx.obe.struct.value_list; + +import java.math.BigDecimal; + +/** + * @Description: EQ_Qualification_ZXDJ + * @author wangxiang + */ +public class CreditGrade { + + private String orgName; + + private String issueOrgName; + + private String grade; + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public String getIssueOrgName() { + return issueOrgName; + } + + public void setIssueOrgName(String issueOrgName) { + this.issueOrgName = issueOrgName; + } + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Finance.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Finance.java new file mode 100644 index 00000000..ae8b7f01 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Finance.java @@ -0,0 +1,42 @@ +package com.gx.obe.struct.value_list; + +import java.math.BigDecimal; + +/** + * @Description: EQ_ProfitRatio + * @author wangxiang + */ +public class Finance { + + private String orgName; + + private int annual; + + private BigDecimal value; + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public int getAnnual() { + return annual; + } + + public void setAnnual(int annual) { + this.annual = annual; + } + + public BigDecimal getValue() { + return value; + } + + public void setValue(BigDecimal value) { + this.value = value; + } + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Goods.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Goods.java new file mode 100644 index 00000000..0adb2d3e --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Goods.java @@ -0,0 +1,41 @@ +package com.gx.obe.struct.value_list; + +/** + * @Description: EQ_ProfitRatio + * @author wangxiang + */ +public class Goods { + + private String goodsName; + + private String goodsUnit; + + private int goodsQuantity; + + public String getGoodsName() { + return goodsName; + } + + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + + public String getGoodsUnit() { + return goodsUnit; + } + + public void setGoodsUnit(String goodsUnit) { + this.goodsUnit = goodsUnit; + } + + public int getGoodsQuantity() { + return goodsQuantity; + } + + public void setGoodsQuantity(int goodsQuantity) { + this.goodsQuantity = goodsQuantity; + } + + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValue.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValue.java new file mode 100644 index 00000000..51c2b233 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValue.java @@ -0,0 +1,31 @@ +package com.gx.obe.struct.value_list; + +/** + * @Description: + * @author wangxiang + */ +public class ParamValue { + + private String dataType; + + private String dataValue; + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValues.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValues.java new file mode 100644 index 00000000..e8eb17ce --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/ParamValues.java @@ -0,0 +1,23 @@ +package com.gx.obe.struct.value_list; + +import java.util.List; + +/** + * @Description: + * @author wangxiang + */ +public class ParamValues { + + private List<ParamValue> paramValueList; + + public List<ParamValue> getParamValueList() { + return paramValueList; + } + + public void setParamValueList(List<ParamValue> paramValueList) { + this.paramValueList = paramValueList; + } + + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Performance.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Performance.java new file mode 100644 index 00000000..8fe56725 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/Performance.java @@ -0,0 +1,43 @@ +package com.gx.obe.struct.value_list; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @Description: EQ_Achievements + * @author wangxiang + */ +public class Performance { + + private String orgName; + + private int performanceCount; + + private List<SimilarProduct> similarProductList; + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public int getPerformanceCount() { + return performanceCount; + } + + public void setPerformanceCount(int performanceCount) { + this.performanceCount = performanceCount; + } + + public List<SimilarProduct> getSimilarProductList() { + return similarProductList; + } + + public void setSimilarProductList(List<SimilarProduct> similarProductList) { + this.similarProductList = similarProductList; + } + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/value_list/SimilarProduct.java b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/SimilarProduct.java new file mode 100644 index 00000000..58215492 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/value_list/SimilarProduct.java @@ -0,0 +1,64 @@ +package com.gx.obe.struct.value_list; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @Description: EQ_ProfitRatio + * @author wangxiang + */ +public class SimilarProduct { + + private String id; + + private String productName; + + private String productUnit; + + private int baseCount; + + private List<Goods> goodList; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getProductUnit() { + return productUnit; + } + + public void setProductUnit(String productUnit) { + this.productUnit = productUnit; + } + + public int getBaseCount() { + return baseCount; + } + + public void setBaseCount(int baseCount) { + this.baseCount = baseCount; + } + + public List<Goods> getGoodList() { + return goodList; + } + + public void setGoodList(List<Goods> goodList) { + this.goodList = goodList; + } + + + +} diff --git a/com.gx.obe.struct/src/com/gx/obe/struct/widget/TabButton.java b/com.gx.obe.struct/src/com/gx/obe/struct/widget/TabButton.java new file mode 100644 index 00000000..bc812c94 --- /dev/null +++ b/com.gx.obe.struct/src/com/gx/obe/struct/widget/TabButton.java @@ -0,0 +1,68 @@ +package com.gx.obe.struct.widget; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +import com.gx.obe.bind.prop.Prop; +import com.gx.obe.bind.recursion.Recursions; +import com.gx.obe.component.handler.ISelection; +import com.swtdesigner.SWTResourceManager; + +public class TabButton extends Composite implements ISelection { + + private Prop<Boolean> selection = new Prop<>(false); + + private Prop<String> text = new Prop<>(); + + public TabButton(Composite parent) { + super(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginTop = 5; + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + setLayout(gridLayout); + + Composite composite = new Composite(this, SWT.NONE); + composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + GridLayout gl_composite = new GridLayout(1, false); + gl_composite.marginWidth = 30; + gl_composite.marginHeight = 0; + composite.setLayout(gl_composite); + + Label lblNewLabel = new Label(composite, SWT.NONE); + lblNewLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + lblNewLabel.setFont(SWTResourceManager.getFont("Microsoft YaHei UI", 10, SWT.BOLD)); + text.bind(lblNewLabel::setText); + selection.bindExe(t -> lblNewLabel.setForeground(t ? SWTResourceManager.getColor(2, 71, 191) : SWTResourceManager.getColor(0, 0, 0))); + + Label label = new Label(this, SWT.NONE); + GridData gd_label = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_label.heightHint = 2; + label.setLayoutData(gd_label); + selection.bindExe(t -> label.setBackground(t ? SWTResourceManager.getColor(2, 71, 191) : SWTResourceManager.getColor(SWT.COLOR_WHITE))); + } + + @Override + public void setText(String text) { + this.text.set(text); + } + + @Override + public void setSelection(boolean selection) { + this.selection.set(selection); + } + + @Override + public void addMouseListener(MouseListener mouseListener) { + Recursions.array((Control c) -> c instanceof Composite ? ((Composite) c).getChildren() : null).toStream(this.getChildren()).forEach(c -> c.addMouseListener(mouseListener)); + } + + @Override + protected void checkSubclass() {} + +} -- 2.24.1