From e6d25972906e87cc086148041402c69317712823 Mon Sep 17 00:00:00 2001 From: Gavin Baumanis Date: Wed, 19 Aug 2026 15:47:07 +1000 Subject: [PATCH 1/2] Release 11.0.0.1: Java 11 Jakarta HI B2B client, searchIHI parity, and Java SE versioning. Align Maven version and docs with 11.0.0.1 / java-11 release line; pair with hi-wsdl 11.0.0.1. --- .cursor/rules/ascii-source.mdc | 22 + .cursor/rules/documentation-standards.mdc | 20 +- .cursor/rules/hi-b2b-project.mdc | 51 +- .cursor/rules/multi-branch-worktrees.mdc | 22 +- .cursor/rules/worktrees.mdc | 8 +- .github/workflows/ci.yml | 24 +- .gitignore | 5 +- .vscode/settings.json | 9 +- AGENTS.md | 5 +- CHANGELOG.md | 121 +-- CLIENT-FEATURES.md | 217 +++++ CONTRIBUTING.md | 98 ++- LICENSE.md | 4 +- MAINTAINERS.md | 433 +++++++-- README.md | 81 +- SECURITY.md | 15 +- WSDL-CLIENT-PURPOSES.md | 106 +++ build.bat | 3 + build.sh | 5 +- local.properties.example | 73 +- pom.xml | 826 +++++++++++++++--- scripts/wsdl-codegen-config.xml | 24 + .../gov/nehta/common/utils/ArgumentUtils.java | 68 ++ .../common/security/KeystoreUtil.java | 238 +++++ .../security/SimpleCertificateValidator.java | 62 ++ .../vendorlibrary/hi/client/BaseClient_3.java | 40 +- .../hi/client/BaseClient_30.java | 152 ---- .../vendorlibrary/hi/client/ClientBase.java | 26 +- .../hi/client/wrapped/ProductType.java | 15 + .../hi/client/wrapped/QualifiedId.java | 15 + .../hi/handler/message/HIHeaderHandler.java | 41 +- .../handler/security/HISecurityHandler.java | 37 +- .../hpii/ProviderIndividualBatchSearch.java | 15 + ...iderManageTdsProviderIndividualClient.java | 178 ++++ ...iderSearchForProviderIndividualClient.java | 10 +- ...IProviderDirectoryForIndividualClient.java | 10 +- ...iderSearchTdsProviderIndividualClient.java | 178 ++++ ...ForProviderIndividualBatchAsyncClient.java | 17 +- ...roviderAdministrativeIndividualClient.java | 10 +- ...derManageProviderDirectoryEntryClient.java | 10 +- ...viderManageProviderOrganisationClient.java | 10 +- .../hpio/ProviderOrganisationBatchSearch.java | 15 + ...derReadAdministrativeIndividualClient.java | 10 +- ...roviderReadProviderOrganisationClient.java | 10 +- ...erSearchForProviderOrganisationClient.java | 10 +- ...roviderDirectoryForOrganisationClient.java | 36 +- ...rProviderOrganisationBatchAsyncClient.java | 17 +- .../ConsumerCreateProvisionalIHIClient.java | 237 +++++ .../ConsumerCreateUnverifiedIHIClient.java | 237 +++++ .../ihi/ConsumerCreateVerifiedIHIClient.java | 237 +++++ .../ConsumerMergeProvisionalIHIClient.java | 237 +++++ .../ihi/ConsumerNotifyDuplicateIHIClient.java | 237 +++++ .../ihi/ConsumerNotifyReplicaIHIClient.java | 237 +++++ .../ConsumerResolveProvisionalIHIClient.java | 238 +++++ .../ConsumerSearchIHIBatchAsyncClient.java | 380 ++++++++ .../ihi/ConsumerSearchIHIBatchSyncClient.java | 15 +- .../hi/ihi/ConsumerSearchIHIClient.java | 122 ++- .../hi/ihi/ConsumerUpdateIHIClient.java | 237 +++++ .../ConsumerUpdateProvisionalIHIClient.java | 237 +++++ .../vendorlibrary/hi/ihi/SearchBatch.java | 76 +- .../ReadReferenceDataClient.java | 10 +- .../hi/wsdl/HiWsdlArtifactRoot.java | 29 +- .../nehta/vendorlibrary/ws/TimeUtility.java | 148 ++++ .../ws/WebServiceClientUtil.java | 103 ++- .../ws/handler/LoggingHandler.java | 104 +++ .../xmldsig/CanonicalizationMethodType.java | 117 +++ .../org/w3/xmldsig/DSAKeyValueType.java | 235 +++++ .../org/w3/xmldsig/DigestMethodType.java | 119 +++ .../org/w3/xmldsig/KeyInfoType.java | 150 ++++ .../org/w3/xmldsig/KeyValueType.java | 100 +++ .../org/w3/xmldsig/ManifestType.java | 119 +++ .../org/w3/xmldsig/ObjectFactory.java | 567 ++++++++++++ .../org/w3/xmldsig/ObjectType.java | 179 ++++ .../org/w3/xmldsig/PGPDataType.java | 113 +++ .../org/w3/xmldsig/RSAKeyValueType.java | 101 +++ .../org/w3/xmldsig/ReferenceType.java | 222 +++++ .../org/w3/xmldsig/RetrievalMethodType.java | 135 +++ .../org/w3/xmldsig/SPKIDataType.java | 91 ++ .../org/w3/xmldsig/SignatureMethodType.java | 123 +++ .../w3/xmldsig/SignaturePropertiesType.java | 119 +++ .../org/w3/xmldsig/SignaturePropertyType.java | 152 ++++ .../org/w3/xmldsig/SignatureType.java | 203 +++++ .../org/w3/xmldsig/SignatureValueType.java | 107 +++ .../org/w3/xmldsig/SignedInfoType.java | 175 ++++ .../org/w3/xmldsig/TransformType.java | 124 +++ .../org/w3/xmldsig/TransformsType.java | 84 ++ .../org/w3/xmldsig/X509DataType.java | 108 +++ .../org/w3/xmldsig/X509IssuerSerialType.java | 106 +++ .../org/w3/xmldsig/package-info.java | 11 + ...onsumerSearchIHIBatchSyncClientSample.java | 8 +- .../sample/ConsumerSearchIHIClientSample.java | 8 +- ...rAdministrativeIndividualClientSample.java | 10 +- ...ageProviderDirectoryEntryClientSample.java | 10 +- ...anageProviderOrganisationClientSample.java | 10 +- ...dAdministrativeIndividualClientSample.java | 12 +- ...rReadProviderOrganisationClientSample.java | 14 +- ...derDirectoryForIndividualClientSample.java | 8 +- ...rDirectoryForOrganisationClientSample.java | 8 +- .../sample/ReadReferenceDataClientSample.java | 8 +- src/sample/resources/README.md | 9 + src/sample/resources/build.properties | 7 +- src/sample/resources/build.xml | 6 +- .../security/HISecurityHandlerTest.java | 27 +- ...ManageTdsProviderIndividualClientTest.java | 78 ++ ...earchForProviderIndividualClientTest.java} | 148 ++-- ...viderDirectoryForIndividualClientTest.java | 12 +- ...SearchTdsProviderIndividualClientTest.java | 78 ++ ...oviderIndividualBatchAsyncClientTest.java} | 125 ++- ...roviderManageDirectoryEntryClientTest.java | 81 +- .../ProviderManageOrganisationClientTest.java | 82 +- ...derAdministrativeIndividualClientTest.java | 106 +++ .../ProviderReadAdminIndiviualClientTest.java | 34 +- .../ProviderReadOrganisationClientTest.java | 33 +- ...archForProviderOrganisationClientTest.java | 93 ++ ...derDirectoryForOrganisationClientTest.java | 12 +- .../ProviderSearchOrganisationBatchAsync.java | 73 -- ...viderOrganisationBatchAsyncClientTest.java | 179 ++++ ...onsumerCreateProvisionalIHIClientTest.java | 78 ++ ...ConsumerCreateUnverifiedIHIClientTest.java | 78 ++ .../ConsumerCreateVerifiedIHIClientTest.java | 78 ++ ...ConsumerMergeProvisionalIHIClientTest.java | 78 ++ .../ConsumerNotifyDuplicateIHIClientTest.java | 78 ++ .../ConsumerNotifyReplicaIHIClientTest.java | 78 ++ ...nsumerResolveProvisionalIHIClientTest.java | 78 ++ ...ConsumerSearchIHIBatchAsyncClientTest.java | 229 +++++ .../ConsumerSearchIHIBatchSyncClientTest.java | 38 +- ...rSearchIHIClientArgumentValidatorTest.java | 38 + .../hi/ihi/ConsumerSearchIHIClientTest.java | 112 ++- .../hi/ihi/ConsumerUpdateIHIClientTest.java | 78 ++ ...onsumerUpdateProvisionalIHIClientTest.java | 78 ++ .../ReadReferenceDataClientTest.java | 12 +- .../hi/test/config/TestConfiguration.java | 5 +- .../unittests/HiWsdlArtifactSmokeTest.java | 19 + .../hi/test/utils/HPIOHPIITestConstants.java | 8 +- .../hi/test/utils/IHITestConstants.java | 167 +--- .../test/utils/JdbcTransactionTestRule.java | 75 ++ .../utils/JdbcTransactionTestRuleTest.java | 86 ++ .../hi/test/utils/ReflectionFieldSetter.java | 44 - .../hi/test/utils/TestConstants.java | 179 ++-- .../hi/test/utils/TestReflect.java | 40 + .../hi/test/utils/TestSslSupport.java | 189 ++++ .../wsdl/HiRequestElementOrderParityTest.java | 164 ++++ .../hi/wsdl/HiWsdlArtifactRootTest.java | 158 +++- .../vendorlibrary/ws/TimeUtilityTest.java | 23 +- wsdls/CHANGELOG.md | 16 + wsdls/LICENSE.md | 23 + wsdls/README.md | 72 ++ wsdls/build.properties | 4 +- wsdls/build.xml | 4 +- wsdls/ee4j-jaxws-lib-pom.xml | 3 +- wsdls/license.txt | 28 - wsdls/local-lib/metro-2.3/webservices-api.jar | Bin 201290 -> 0 bytes .../metro-2.3/webservices-extra-api.jar | Bin 82672 -> 0 bytes .../local-lib/metro-2.3/webservices-extra.jar | Bin 827092 -> 0 bytes wsdls/local-lib/metro-2.3/webservices-rt.jar | Bin 14830691 -> 0 bytes .../local-lib/metro-2.3/webservices-tools.jar | Bin 2918366 -> 0 bytes wsdls/local-lib/metro-2.3/wstx-services.war | Bin 52663 -> 0 bytes wsdls/readme.txt | 118 --- wsdls/release_notes.txt | 18 - wsdls/src/sample/resources/build.properties | 5 +- wsdls/src/sample/resources/build.xml | 14 +- wsdls/src/sample/resources/buildInterface.xml | 2 +- wsdls/xml/documents/README.md | 7 + ...rative Individual Details - FINAL v9.0.pdf | Bin 648941 -> 0 bytes ...d Provider Organisation Details - v7.0.pdf | Bin 685432 -> 0 bytes ...search-for-provider-individual-details.pdf | Bin 915045 -> 0 bytes ...arch-for-provider-organisation-details.pdf | Bin 465654 -> 0 bytes wsdls/xml/schema/README.md | 13 +- wsdls/xml/wsdl/README.md | 14 +- 169 files changed, 12314 insertions(+), 1677 deletions(-) create mode 100644 .cursor/rules/ascii-source.mdc create mode 100644 CLIENT-FEATURES.md create mode 100644 WSDL-CLIENT-PURPOSES.md create mode 100644 scripts/wsdl-codegen-config.xml create mode 100644 src/main/java/au/gov/nehta/common/utils/ArgumentUtils.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/common/security/KeystoreUtil.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/common/security/SimpleCertificateValidator.java delete mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_30.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClient.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/ws/TimeUtility.java create mode 100644 src/main/java/au/gov/nehta/vendorlibrary/ws/handler/LoggingHandler.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/CanonicalizationMethodType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/DSAKeyValueType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/DigestMethodType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/KeyInfoType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/KeyValueType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/ManifestType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/ObjectFactory.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/ObjectType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/PGPDataType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/RSAKeyValueType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/ReferenceType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/RetrievalMethodType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SPKIDataType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SignatureMethodType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SignaturePropertiesType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SignaturePropertyType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SignatureType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SignatureValueType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/SignedInfoType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/TransformType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/TransformsType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/X509DataType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/X509IssuerSerialType.java create mode 100644 src/main/java/hi_override/org/w3/xmldsig/package-info.java create mode 100644 src/sample/resources/README.md create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClientTest.java rename src/test/java/au/gov/nehta/vendorlibrary/hi/{hpio/ProviderSearchClientTest.java => hpii/ProviderSearchForProviderIndividualClientTest.java} (64%) create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClientTest.java rename src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/{ProviderSearchIHIBatchAsync.java => SearchForProviderIndividualBatchAsyncClientTest.java} (60%) create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClientTest.java delete mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchOrganisationBatchAsync.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClientTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/test/unittests/HiWsdlArtifactSmokeTest.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRule.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRuleTest.java delete mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/ReflectionFieldSetter.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestReflect.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestSslSupport.java create mode 100644 src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiRequestElementOrderParityTest.java create mode 100644 wsdls/CHANGELOG.md create mode 100644 wsdls/LICENSE.md create mode 100644 wsdls/README.md delete mode 100644 wsdls/license.txt delete mode 100644 wsdls/local-lib/metro-2.3/webservices-api.jar delete mode 100644 wsdls/local-lib/metro-2.3/webservices-extra-api.jar delete mode 100644 wsdls/local-lib/metro-2.3/webservices-extra.jar delete mode 100644 wsdls/local-lib/metro-2.3/webservices-rt.jar delete mode 100644 wsdls/local-lib/metro-2.3/webservices-tools.jar delete mode 100644 wsdls/local-lib/metro-2.3/wstx-services.war delete mode 100644 wsdls/readme.txt delete mode 100644 wsdls/release_notes.txt create mode 100644 wsdls/xml/documents/README.md delete mode 100644 wsdls/xml/documents/TECH.SIS.HI.15 - Read Provider or Administrative Individual Details - FINAL v9.0.pdf delete mode 100644 wsdls/xml/documents/TECH.SIS.HI.16 - Read Provider Organisation Details - v7.0.pdf delete mode 100644 wsdls/xml/documents/tech-sis-hi-31-search-for-provider-individual-details.pdf delete mode 100644 wsdls/xml/documents/tech-sis-hi-32-search-for-provider-organisation-details.pdf diff --git a/.cursor/rules/ascii-source.mdc b/.cursor/rules/ascii-source.mdc new file mode 100644 index 0000000..ad837c1 --- /dev/null +++ b/.cursor/rules/ascii-source.mdc @@ -0,0 +1,22 @@ +--- +description: Tracked source and docs must be ASCII only +alwaysApply: true +--- + +# ASCII source + +Every file you **add or edit** must be **ASCII only** (bytes 0x00-0x7F). Scan touched paths before finishing. + +Replace: + +| Non-ASCII | ASCII | +| ------------------ | ----------- | +| em/en dash, minus | `-` | +| ellipsis | `...` | +| curly quotes | `'` / `"` | +| arrows | `->` / `<-` | +| non-breaking space | space | + +Do not introduce Unicode symbols, emoji, or locale punctuation in code, comments, XML, or docs. + +WSDL/XSD copied from the licensed toolkit may contain non-ASCII. Do not add more. Prefer ASCII in files you author. diff --git a/.cursor/rules/documentation-standards.mdc b/.cursor/rules/documentation-standards.mdc index 1aae57e..c756526 100644 --- a/.cursor/rules/documentation-standards.mdc +++ b/.cursor/rules/documentation-standards.mdc @@ -1,5 +1,5 @@ --- -description: Documentation and build scripts — implementor-first, Maven Central default, no secrets +description: Documentation and build scripts - implementor-first, Maven Central default, no secrets alwaysApply: true --- @@ -10,13 +10,13 @@ Applies when writing or editing **README**, **CONTRIBUTING**, integrator guides, ## Priority: implementors - Primary audience: developers **consuming** published Maven artifacts. -- Contributor/maintainer workflow lives in **CONTRIBUTING.md**, **MAINTAINERS.md**, or labelled subsections — not mixed into the integrator main flow. -- Do not duplicate agent workflow in README or CONTRIBUTING (**AGENTS.md** → `.cursor/rules/`). +- Contributor/maintainer workflow lives in **CONTRIBUTING.md**, **MAINTAINERS.md**, or labelled subsections - not mixed into the integrator main flow. +- Do not duplicate agent workflow in README or CONTRIBUTING (**AGENTS.md** -> `.cursor/rules/`). ## Default narrative: Maven Central -- Write as if **released** coordinates are on Maven Central (no SNAPSHOT, sibling-repo checkout, or `-P…` profiles in the main integrator path). -- Use **version numbers** in integrator docs — not Git branch names. +- Write as if **released** coordinates are on Maven Central (no SNAPSHOT, sibling-repo checkout, or `-P...` profiles in the main integrator path). +- Use **version numbers** in integrator docs - not Git branch names. - SNAPSHOT installs, optional Maven profiles, licensed WSDL for source builds, and sibling `mvn install` belong under **Local development** / **Local builds** only. ## Structure @@ -30,8 +30,8 @@ Applies when writing or editing **README**, **CONTRIBUTING**, integrator guides, ## Paths - **Relative paths only** (e.g. `wsdls/xml`, `./certs//`, `pom.xml` beside repo root). -- **Never** hardcode machine paths (`C:\…`, `/Users/…`, `~/`, worktree folders) in tracked docs. -- Override only when strictly required to remove ambiguity — say why. +- **Never** hardcode machine paths (`C:\...`, `/Users/...`, `~/`, worktree folders) in tracked docs. +- Override only when strictly required to remove ambiguity - say why. ## Current state only @@ -39,12 +39,16 @@ Applies when writing or editing **README**, **CONTRIBUTING**, integrator guides, - Describe **what is true now**; omit "removed", "used to", and repo archaeology in integrator material. - **CHANGELOG** entries: current release capabilities; avoid branch names and migration essays in new notes. -## Secrets — MUST NOT +## Secrets - MUST NOT - **Never** put real or plausible **passwords**, **tokens**, **API keys**, **private keys**, or **keystore passphrases** in tracked files (code, comments, examples, docs). - Use placeholders (``), empty values in `.example` files, or "from your registration pack". - See **SECURITY.md**. +## ASCII source + +All tracked files you add or change must be **ASCII only**. See **`ascii-source.mdc`**. + ## Override These rules may be overridden **only when necessary** to clear ambiguity (e.g. maintainer branch mapping in **MAINTAINERS.md** or `.cursor/rules/`, clearly labelled maintainer-only). diff --git a/.cursor/rules/hi-b2b-project.mdc b/.cursor/rules/hi-b2b-project.mdc index e41cf59..8cda911 100644 --- a/.cursor/rules/hi-b2b-project.mdc +++ b/.cursor/rules/hi-b2b-project.mdc @@ -5,32 +5,61 @@ alwaysApply: true # hi-b2b-client-java -Healthcare Identifiers (HI) B2B facade client — **not** MHR/PCEHR. +Healthcare Identifiers (HI) B2B facade client - **not** MHR/PCEHR. -## Release lines (integrator docs use Maven Central versions only) +## Documentation + +Follow **`documentation-standards.mdc`**. Integrator docs use **version numbers** - not Git branch names. + +The **first number** of the Maven version is the **Java SE** target. **`hi-b2b-client`** and **`hi-wsdl`** always share the **same** version. | Version | Java | APIs | Facades | | ------- | ---- | ---- | ------- | -| **1.6.3** | 8 | javax | **14** | -| **1.6.5** | 11 | Jakarta | **14** | -| **1.7.0** | 11 | Jakarta | **26** (full MCA) | +| **8.0.0.1** | 8 | **javax** | **14** (standard HI B2B) | +| **11.0.0.1** | 11 | **Jakarta** | **26** (full MCA) | +| **17.0.0.1** | 17 | **Jakarta** | **26** (full MCA) | +| **21.0.0.1** | 21 | **Jakarta** | **26** (full MCA) | +| **24.0.0.1** | 24 | **Jakarta** | **26** (full MCA) | + +**Git branch mapping (maintainers only - never in integrator docs):** + +| Version | Official Git branch | +| ------- | ------------------- | +| **8.0.0.1** | `java-8` | +| **11.0.0.1** | `java-11` | +| **17.0.0.1** | `java-17` | +| **21.0.0.1** | `java-21` | +| **24.0.0.1** | `java-24` | -**This checkout:** **`1.6.3-SNAPSHOT`** — **`au.gov.nehta:hi-wsdl`** from Maven Central (or matching **`mvn install`** for SNAPSHOT), Java **8** / **`javax.*`**. +## This 11.0.0.1 line + +**`11.0.0.1-SNAPSHOT`**: Java **11**, **Jakarta**, **26** facades, in-repo **`wsimport`** when building from source (licensed tree at **`wsdls/xml/`**), or **`-Phi-wsdl-artifact`** with **`au.gov.nehta:hi-wsdl`** at **`${project.version}`**. See **MAINTAINERS.md**. ## Build from source -- JDK **8**: `mvn -B "-Dgpg.skip=true" clean verify` -- **Local / unpublished:** install **`hi-wsdl`** at **`${project.version}`** then **`verify`** — see **`CONTRIBUTING.md`** -- **`jaxws-rt` 2.3.7** +- JDK **11**: `mvn -B "-Dgpg.skip=true" clean verify` (quote `-D` on PowerShell). Licensed **`wsdls/xml/`** required unless **`-Phi-wsdl-artifact`**. +- **Local / unpublished:** install matching **`hi-wsdl`** then **`-Phi-wsdl-artifact verify`** - see **`CONTRIBUTING.md`** +- **`jaxws-rt` 4.0.4** - Default Surefire: offline tests; **`-Pintegration`** for mutual-TLS ## Consumer Search IHI - `basicSearch` requires **IHI number**; demographics-only = `detailedSearch`. +- Messages `searchIHI`: `electronicCommunication` before `dateOfBirth`. +- Interface `searchIHI`: optional `electronicCommunication` before `dateOfBirth`; unstructured address before international. + +## vs hi-wsdl-java + +| | **hi-wsdl-java** | **hi-b2b-client-java** | +|---|---|---| +| Delivers | WSDL on classpath + generated types | Facade clients, TLS, signing | +| Artifact | `hi-wsdl` | `hi-b2b-client` | + +Align **`hi-wsdl`** and **`hi-b2b-client`** at the **same version** per release line (**8.0.0.1** with **8.0.0.1**, **11.0.0.1** with **11.0.0.1**, and so on). ## Doc split - **`documentation-standards.mdc`**: implementor-first, Maven Central default, local/OS sections, relative paths, no secrets -- **`README.md`**: integrators (Maven Central default) +- **`README.md`**, **`CLIENT-FEATURES.md`**: integrators (Maven Central default) - **`CONTRIBUTING.md`**: build from source, local SNAPSHOT, OS wrappers -- **`MAINTAINERS.md`**: POM / dependency internals +- **`MAINTAINERS.md`**: POM / wsimport internals diff --git a/.cursor/rules/multi-branch-worktrees.mdc b/.cursor/rules/multi-branch-worktrees.mdc index 8671bc9..aa0018b 100644 --- a/.cursor/rules/multi-branch-worktrees.mdc +++ b/.cursor/rules/multi-branch-worktrees.mdc @@ -3,13 +3,13 @@ description: Use git worktree when editing multiple branches of the same reposit alwaysApply: true --- -# Multi-branch work — use git worktree +# Multi-branch work - use git worktree -When a task requires **changes on two or more branches of the same Git repository**, use **`git worktree`** — do **not** hop branches with `git checkout` while carrying uncommitted edits or stashes. +When a task requires **changes on two or more branches of the same Git repository**, use **`git worktree`** - do **not** hop branches with `git checkout` while carrying uncommitted edits or stashes. ## When this applies -- Same-repo edits across release lines (e.g. `java-8-javax`, `java-11-jakarta`, `master`) +- Same-repo edits across release lines (e.g. `java-8`, `java-11`) - Applying the same fix to several branches before commit - Comparing or building two branches side by side @@ -22,7 +22,7 @@ When a task requires **changes on two or more branches of the same Git repositor ## Workflow 1. **Primary clone** stays on the main working branch; do not stash-and-hop to edit other branches. -2. **Add a worktree per extra branch** (paths are local — never commit them to tracked docs): +2. **Add a worktree per extra branch** (paths are local - never commit them to tracked docs): ```bash git worktree add ../- @@ -34,18 +34,12 @@ When a task requires **changes on two or more branches of the same Git repositor ## Do not - `git checkout` other branches with uncommitted changes (Git will block or force stash churn). -- Stash the same files across multiple branch switches — causes merge conflicts on `stash pop`. +- Stash the same files across multiple branch switches - causes merge conflicts on `stash pop`. - Put worktree directory paths in README, CONTRIBUTING, or other tracked docs (see repo **`worktrees.mdc`** / **`documentation-standards.mdc`**). ## Example (maintainer-local paths only) ```bash -# In hi-wsdl-java primary clone (on java-11-jakarta-full-wsdl) -git worktree add ../hi-wsdl-java-java-8-javax java-8-javax -git worktree add ../hi-wsdl-java-java-11-jakarta java-11-jakarta - -# Apply edits in each ../hi-wsdl-java-* folder; commit per branch -# When finished: -git worktree remove ../hi-wsdl-java-java-8-javax -git worktree remove ../hi-wsdl-java-java-11-jakarta -``` \ No newline at end of file +git worktree add java-8 +git worktree add java-11 +``` diff --git a/.cursor/rules/worktrees.mdc b/.cursor/rules/worktrees.mdc index 07f208a..7b37e7f 100644 --- a/.cursor/rules/worktrees.mdc +++ b/.cursor/rules/worktrees.mdc @@ -13,7 +13,7 @@ Follow **`documentation-standards.mdc`** (implementor-first, Maven Central defau | Doc | Audience | Use | | --- | -------- | --- | -| **README**, integrator guides | Implementors | **Maven version** (`1.7.0`), Central coordinates, runtime config | +| **README**, integrator guides | Implementors | **Maven version** (`11.0.0.1`), Central coordinates, runtime config | | **CONTRIBUTING** | Contributors | Build from source, **Local builds**, OS-specific steps | | **MAINTAINERS**, **`.cursor/rules/`** | Maintainers | POM/wsimport internals; **branch mapping** only when labelled maintainer-only | @@ -21,13 +21,13 @@ Integrator docs: **version numbers**, not Git branch names. Local/SNAPSHOT/profi ## Do not put in tracked docs -- Hardcoded worktree or machine paths (`wt/`, `C:\…`, `/Users/…`, `~/`, `this worktree`, `primary clone`) +- Hardcoded worktree or machine paths (`wt/`, `C:\...`, `/Users/...`, `~/`, `this worktree`, `primary clone`) - References to **`wt/README.md`** or other local-only layout files -- “Open folder X to switch branches” — IDE/local workflow, not repo documentation +- "Open folder X to switch branches" - IDE/local workflow, not repo documentation ## Allowed (maintainer-only, when labelled) -- **Git branch mapping** table (version → branch) in **MAINTAINERS.md** or agent rules +- **Git branch mapping** table (version -> branch) in **MAINTAINERS.md** or agent rules - Generic worktree example only: `git worktree add ` (placeholder **``**, never a committed example) - Optional **untracked** local notes outside the repo diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4afeb91..cf0c055 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,14 +1,17 @@ -# Runs default unit tests + Javadoc/sources attach (verify), then compiles sample sources. +# Default unit tests + Javadoc/sources (verify), then sample profile compile. +# Full wsimport verify when licensed HI WSDL is present under wsdls/xml/. +# Without licensed tree: validate only (public CI) or -Phi-wsdl-artifact locally (see CONTRIBUTING.md). name: CI + on: push: + branches: [ java-11 ] pull_request: + branches: [ java-11 ] permissions: contents: read -# Plain mvn keeps contributor ~/.m2/settings.xml behaviour; this line does not require a project settings.xml. - jobs: verify: runs-on: ubuntu-latest @@ -17,9 +20,14 @@ jobs: - uses: actions/setup-java@v5 with: distribution: temurin - java-version: 8 + java-version: "11" cache: maven - - name: Maven verify - run: mvn -B -Dgpg.skip=true clean verify - - name: Compile sample sources (sample profile) - run: mvn -B -Psample -Dgpg.skip=true -DskipTests=true clean compile + - name: Maven verify (when licensed WSDL present) + run: | + if [ -f wsdls/xml/wsdl/consumer/20100731/HI_ConsumerSearchIHI-3.0.wsdl ]; then + mvn -B -Dgpg.skip=true clean verify + mvn -B -Psample -Dgpg.skip=true -DskipTests=true clean compile + else + echo "Licensed HI WSDL not in tree; running validate only (expected on public GitHub CI)." + mvn -B -Dgpg.skip=true validate + fi diff --git a/.gitignore b/.gitignore index bf43e18..a608620 100644 --- a/.gitignore +++ b/.gitignore @@ -37,10 +37,13 @@ wsdls/target/ wsdls/dist/ wsdls/lib/ -# Licensed HI WSDL/XSD bundle: not redistributed in this Git repository (see wsdls/readme.txt, +# Licensed HI WSDL/XSD bundle: not redistributed in this Git repository (see wsdls/README.md, # README.md -> Licensed WSDL and XSD). The build resolves hi.wsdl.tree.root (default wsdls/xml). # Bindings under wsdls/xml/binding/ stay tracked (they are project-authored fragments). /wsdls/xml/wsdl/* !/wsdls/xml/wsdl/README.md /wsdls/xml/schema/* !/wsdls/xml/schema/README.md +/wsdls/xml/documents/* +!/wsdls/xml/documents/README.md +libs/* diff --git a/.vscode/settings.json b/.vscode/settings.json index d31822a..eee1093 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,7 @@ { - "java.configuration.updateBuildConfiguration": "automatic", - "files.eol": "\n" -} \ No newline at end of file + "java.import.maven.enabled": true, + "java.configuration.updateBuildConfiguration": "automatic", + "[java]": { + "editor.defaultFormatter": "redhat.java" + } +} diff --git a/AGENTS.md b/AGENTS.md index 8c6f9b8..758755a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,9 +4,10 @@ Rules: `.cursor/rules/*.mdc`. Do not duplicate in README or CONTRIBUTING. | Concern | Rule | |---------|------| +| ASCII only in authored files | `ascii-source.mdc` | | Documentation and build scripts (implementor-first, Central, local, OS, paths, no secrets) | `documentation-standards.mdc` | -| HI scope, WSDL, build, Java 8 / javax | `hi-b2b-project.mdc` | +| HI scope, WSDL, build, Java 11 / Jakarta | `hi-b2b-project.mdc` | | Worktrees local only; versions in integrator docs | `worktrees.mdc` | -| Multi-branch edits in one repo — use worktree, not checkout/stash | `multi-branch-worktrees.mdc` | +| Multi-branch edits in one repo - use worktree, not checkout/stash | `multi-branch-worktrees.mdc` | Contributors (humans): README, CONTRIBUTING, MAINTAINERS, SECURITY. diff --git a/CHANGELOG.md b/CHANGELOG.md index 48755c7..85d4db3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,68 +1,85 @@ # Change Log/Revision History -= 1.6.3-SNAPSHOT = += 11.0.0.1 = ====== -Changes not yet assigned to a numbered release; **`pom.xml`** **``** is **`1.6.3-SNAPSHOT`** until release **1.6.3** is tagged. - -- Root license file renamed to **`LICENSE.md`** (Apache 2.0 canonical text plus ADHA production disclaimer); references updated from **`LICENSE.txt`**. -- **`hi-wsdl`** at **`hi.wsdl.version`** = **`${project.version}`** (SNAPSHOT locally; GA **`1.6.3`** pair on Maven Central); **`javax.*`** / Java **8** bytecode in generated types; default lifecycle does not run **`wsimport`**. Batch Search IHI types use **`au.net.electronichealth.ns.hi.xsd.consumermessages.*`** packages from **`hi-wsdl`**; tests use **`String`** country codes (no **`CountryType`** enum on this stub line). -- Java **8** (`maven.compiler.release` **8**) / **`javax.*`** application and generated types; JAX-WS runtime **`com.sun.xml.ws:jaxws-rt`** **2.3.7** with Metro default transitive API JARs (EE4J Maven coordinates; **`javax.*`** packages). No **`jaxws-rt`** exclusions or extra SOAP API dependencies in this **`pom.xml`** except **`webservices-rt`** excluded from **`common-library`**. -- Default **`skipTests`** **false**; Surefire runs **`TimeUtilityTest`**, **`TestConfigurationTest`**, and **`HiWsdlArtifactRootTest`** unless skipped; **`-Pintegration`** runs **`**/*Test.java`** with **`hi.require.live.config`** (mutual-TLS; requires **`local.properties`** / **`HI_*`**). Offline **`TimeUtilityTest`** matches **`TimeUtility`** from **`common-library`** at **`nehta.lib.version`**. -- Removed unused direct **`au.gov.nehta:smi-common-utils`**; added explicit **`au.gov.nehta:smi-xsp`** at **`nehta.lib.version`** for **`ArgumentUtils`** / **`CertificateValidator`** clarity. Removed **`jaxb-api`**, **`bcpkix-jdk15on`**, and **`spring-test`**; tests use **`ReflectionFieldSetter`** instead of Spring for field injection. -- Public **`au.gov.nehta.vendorlibrary.hi.*`** client surface matches the **`hi-wsdl`** artifact at **`hi.wsdl.version`** (no extra facade types such as async helpers or custom policy validators in this line). -- Documentation and CI: default **`mvn -B -Dgpg.skip=true clean verify`** (no project **`settings.xml`**; keeps contributor Maven user settings (mirrors)). **`settings.xml.example`** is optional; documents **`hi-wsdl-tree`** / **`mvn -s`** tradeoff. **`build.*`** match CI; optional **`MVN_SETTINGS`**. **README** / **CONTRIBUTING** updated accordingly. **README** prioritises library integrators; **MAINTAINERS.md** has **`target/`** cleanup; **CONTRIBUTING** has line-ending guidance. -- **Runtime WSDL tree:** **`au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot`** resolves **`HI_WSDL_ARTIFACT_ROOT`** (env, **`local.properties`**, system property, or **`setRoot(Path)`**). **`au.gov.nehta.vendorlibrary.ws.WebServiceClientUtil`** in this artifact replaces **`common-library`**'s util for **`javax.xml.ws`** clients and consults **`HiWsdlArtifactRoot`** before the classpath. **`local.properties.example`** documents **`HI_WSDL_ARTIFACT_ROOT`**; **`fat-jar`** shading excludes **`WebServiceClientUtil.class`** from **`common-library`**. -- **`fat-jar`:** **`maven-shade-plugin`** filters (**`module-info.class`**, versioned **`module-info.class`**, dependency **`META-INF/MANIFEST.MF`**, **`META-INF/hk2-locator/default`** on **`ha-api`**) plus **`ApacheLicenseResourceTransformer`** and **`ApacheNoticeResourceTransformer`**. Shading also excludes duplicate **`ArgumentUtils`** from **`smi-xsp`** and **`common-library`** where this artifact supplies **`WebServiceClientUtil`** / **`ArgumentUtils`**. Overlapping activation implementation and API JARs may still log duplicate **`javax.activation`** class warnings at shade time; see **MAINTAINERS** if you need a stricter merge strategy. -- **Build:** **`maven-source-plugin`** **`jar-no-fork`** avoids forking **`generate-sources`** when attaching **`-sources`**. **`maven-clean-plugin`** **`retryOnError`** and **`force`**. **`wsdls/ee4j-jaxws-lib-pom.xml`** **`maven-dependency-plugin`** **3.10.0**. **README** / **MAINTAINERS** clarify **`jakarta.*`** Maven coordinates vs **`javax.*`** packages for **`jaxws-rt`** **2.3.x**. **`.cursor/rules/java-maven-defaults.mdc`** documents Java **8** vs **11** release-line stacks. **`maven-javadoc-plugin`** **3.12.0** uses **`jar`** (no **`jar-no-fork`** goal in this plugin line). - -## 1.6.2 - -- Fixed HI WSDL reference and updated WS library. - -## 1.6.1 - -- Maven build with Central dependencies. -- Removed references to obsolete libraries. - -## 1.6.0 +- Maven **`au.gov.nehta:hi-b2b-client`** **11.0.0.1** (Java **11** / **Jakarta**, **26** facade clients, full MCA). Pair with **`hi-wsdl`** **11.0.0.1**. The first number of both Maven versions is the targeted Java SE version. +- Messages `searchIHI`: `electronicCommunication` before `dateOfBirth` (international address before unstructured) so Consumer Search IHI (including batch) request XML matches the HI Service message schema. +- Interface `searchIHI`: optional `electronicCommunication` before `dateOfBirth` and `australianUnstructuredStreetAddress` before `internationalAddress` on **`HI_ConsumerSearchIHIInterface-3.0`**. +- For in-repo `wsimport`, keep that particle order in licensed `SearchIHIMessages.xsd` (see `wsdls/README.md`). With `-Phi-wsdl-artifact`, use matching **`au.gov.nehta:hi-wsdl`** **11.0.0.1**. +- **Tests:** **`HiRequestElementOrderParityTest`** asserts JAXB `propOrder` for Messages/Interface `searchIHI`, batch `SearchIHIRequestType`, HI31/HI33 `searchForProviderIndividual`, and TDS search `providerIndividual`. +- Consumer Search IHI: **`australianUnstructuredStreetAddressSearch`** (suburb, state, postcode required). Structured Australian street search requires **`streetType`** when **`streetNumber`** is set; structured and unstructured addresses are mutually exclusive. + += 1.7.0 = +====== +- Java **11**, Jakarta XML Web Services / JAXB (**`jaxws-rt` 4.x**). **26** full MCA facade clients over licensed **`HI_*`** WSDLs. +- In-repo **`wsimport`** (26 executions) with build-time root **`hi.wsdl.tree.root`** (default **`wsdls/xml`**). Optional profile **`hi-wsdl-artifact`** skips codegen when **`au.gov.nehta:hi-wsdl`** is on the classpath. Published JAR excludes **`*.wsdl`**; runtime WSDL via **`HiWsdlArtifactRoot`** / **`HI_WSDL_ARTIFACT_ROOT`**. +- Optional **`fat-jar`** profile and **`build.* shaded`** produce classifier **`all`** uber-JAR. +- Default Surefire runs offline unit tests; **`-Pintegration`** for mutual-TLS against cert endpoints with **`local.properties`** / **`HI_*`**. -- Added Provider Read Provider Organisation client. -- Added Provider Read Provider Administrative Individual client. -- Added Provider Manage Provider Organisation client. -- Added Provider Manage Provider Directory client. -- Added Provider Manage Provider Administrative Individual client. += 1.6.2 = +====== +- Fixed HI WSDL ref and updated WS library -## 1.5.0 += 1.6.1 = +====== +- Converted to Maven build with Maven dependencies. +- Cleaned up references to out-of-date libraries. -- **`smi-xsp`**: `CertificateVerifier` refactored to **`CertificateValidator`** (older **`CertificateVerifier`** remains usable when loaded from **nehta-vendorlibrary-java-common** **1.1.0**). -- **`common-library`** **1.1.0** updated for **`CertificateValidator`** integration. -- Default **`CertificateValidator`** is no longer a null implementation; it performs basic validation (time and trust). -- **HISecurityHandler** no longer assigns **`xml:id`** on signed elements (handled by **xsp-api**); **`xml:id`** values are no longer prefixed with **`ts_`**, **`data_`**, etc. -- Clients accept an optional **`CertificateValidator`** for signed SOAP responses; when **`null`**, clients still validate signing certificate validity dates. += 1.6.0 = +====== +- Added Provider Read Provider Organisation client +- Added Provider Read Provider Administrative Individual client +- Added Provider Manage Provider Organisation client +- Added Provider Manage Provider Directory client +- Added Provider Manage Provider Administrative Individual client -## 1.4.1 -- **common-library** updated to **1.0.4**. -- Client interfaces use **`ProductType`** instead of **`Holder`**. -- Wrapped XML types for **`ProductType`** and **`QualifiedId`** for reuse across clients; new constructors and **`QualifiedId`** overloads on request methods. += 1.5.0 = +====== +- updated nehta-smi-xsp-1.2.0.jar - this includes a refactored CertificateVerifier, + renamed to CertificateValidator the older CertificateVerifier will continue to work if used from + nehta-vendorlibrary-java-common-1.1.0. -## 1.4.0 +- updated nehta-vendorlibrary-java-common-1.1.0 to accommodate changes in xsp and new CertificateValidator +- changed the default CertificateValidator from the Null impl to one that does basic validations, time and trust +- HISecurity Handler no longer assigns its own xml:id to signed elements, this is left to xsp-api now. + as a result, xml:id's are no longer prefixed with 'ts_' 'data_' etc. -- WSDL **1.4.0** with **`xmldsig`** override (**`hi_override`** package) for downstream clients. -- Clients expose the underlying port via **`getPort()`**. -- TLS configuration for **`com.sun.xml.internal.ws`** and **`com.sun.xml.ws`**. -- **`ConsumerSearchIHIBatchSyncClient.BatchSearch`** is no longer an inner type (**`BatchSearch`** is a top-level class). +- Clients now accept an optional CertificateValidator that will be applied by the HI security handler when processing + signed SOAP responses, if a null validator is supplied the client will still check the validity dates of the + certificate used to sign the response SOAP message. -## 1.3.1 += 1.4.1 = +====== +- updated Nehta common lib jar to 1.0.4 +- changed client interface to use ProductType instead of Holder +- Added wrapped xml types for ProductType and QualifiedId for better reuse between clients +- Added new constructors to clients to accept the new wrapped xml types +- Added overloaded request methods that accept a QualifiedId, so the current user can be supplied per request. -- JAX-WS **> 2.1** support; **``** header removed before signing (Medicare does not support it). -- JAX-WS runtime updated to **2.3** / **2.2.8** line. += 1.4.0 = +====== +- change to wsdl v.1.4.0 which overrode xmldsig (hi_override package) for downstream clients +- change to all clients to expose the underlying web service port via client.getPort() +- change to all clients to configure com.sun.xml.internal.ws as well as com.sun.xml.ws for TLS +- ConsumerSearchIHIBatchSyncClient.BatchSearch is no longer an inner type. ie: BatchSearch batch = new BatchSearch() -## 1.3.0 += 1.3.1 = +====== +- Added support for JAX-WS > 2.1 + Medicare does not support , therefore this header is removed before signing. +- JAX-WS reference implementation stack updated to 2.3 / JAX-WS 2.2.8 -- **`ProviderSearchForProviderOrganisationClient`** -- **`ProviderSearchForProviderIndividualClient`** += 1.3.0 = +====== +- Support Services: + 1. ProviderSearchForProviderOrganisationClient + 2. ProviderSearchForProviderIndividualClient -## 1.2.0 -- CSP organisation acting on behalf of organisation for **`ProviderSearchHIProviderDirectoryForIndividualClient`**, **`ProviderSearchHIProviderDirectoryForOrganisationClient`**, and **`ReadReferenceDataClient`**. += 1.2.0 = +====== +- Support for CSP organisation acting on behalf of organisation for: + 1. ProviderSearchHIProviderDirectoryForIndividualClient + 2. ProviderSearchHIProviderDirectoryForOrganisationClient + 3. ReadReferenceDataClient diff --git a/CLIENT-FEATURES.md b/CLIENT-FEATURES.md new file mode 100644 index 0000000..fcfcf8c --- /dev/null +++ b/CLIENT-FEATURES.md @@ -0,0 +1,217 @@ +# HI B2B Client - feature overview + +Broad list of what you can do with **`au.gov.nehta:hi-b2b-client`**: typed Java facades over Australia's **Healthcare Identifiers (HI) Service** (SOAP/JAX-WS). Operation details and field rules are in ADHA specs and Javadoc; this document maps **library surface -> capability**. + +**Audience:** integrators choosing APIs for **`11.0.0.1`** (**26** facade classes). Setup (Maven Central dependency, keystores, endpoints) is in **`README.md`**. + +Smaller release line **`8.0.0.1`** exposes **14** standard HI B2B facades only - see **`README.md`** Versioning table before assuming a class exists in your version. + +--- + +## What the library gives you + +| Capability | How | +| ---------- | --- | +| Call HI SOAP operations from Java | One facade class per WSDL service (see tables below) | +| Mutual TLS to HI endpoints | Pass `SSLSocketFactory` (often from PKCS#12 via `KeystoreUtil`) | +| Sign outbound SOAP; verify inbound | `HISecurityHandler` on every facade (`ClientBase`) | +| HI SOAP headers (product, user, org, timestamps) | `HIHeaderHandler` + constructors on `BaseClient_3` | +| Resolve licensed WSDL/XSD at runtime | `HiWsdlArtifactRoot` (env, system property, `local.properties`, or `setRoot`) | +| Optional SOAP message logging | `LoggingHandler` | +| Request payload guardrails | Per-operation `ArgumentValidator` / `SearchBatch` before SOAP | +| Per-call user identity override | Many clients expose overloads with `QualifiedId` per request | +| Example wiring | `src/sample/java/.../hi/sample/*` (not on default classpath) | + +You still need ADHA/Services Australia **registration**, **certificates**, **product metadata (PCIN)**, and **endpoint URLs** for live calls. + +--- + +## Individual Healthcare Identifier (IHI) + +Package: `au.gov.nehta.vendorlibrary.hi.ihi`. + +### Search (single request) + +**`ConsumerSearchIHIClient`** - find/validate an individual's IHI. Client methods enforce which `SearchIHI` fields may be set. + +| Method | Typical use | +| ------ | ----------- | +| `basicSearch` | Lookup by **IHI number** (+ demographics) | +| `basicMedicareSearch` | Lookup by **Medicare card number** (+ demographics) | +| `basicDvaSearch` | Lookup by **DVA file number** (+ demographics) | +| `detailedSearch` | **Demographics only** (no IHI, Medicare, DVA, or address blocks) | +| `australianPostalAddressSearch` | Demographics + Australian postal address | +| `australianStreetAddressSearch` | Demographics + Australian street address | +| `internationalAddressSearch` | Demographics + international address | + +Common mandatory demographics: family name, date of birth, sex (given name optional). **`basicSearch` requires an IHI number**; demographics-only lookup must use **`detailedSearch`**, not `basicSearch`. + +### Search (batch) + +| Class | What you can do | +| ----- | ---------------- | +| **`ConsumerSearchIHIBatchSyncClient`** | Submit many IHI searches in **one synchronous** batch (`batchSearch` + `SearchBatch` helper) | +| **`ConsumerSearchIHIBatchAsyncClient`** | **Submit** batch (`submitSearchIHIBatch`), **poll status** (`getSearchIHIBatchStatus`), **retrieve results** (`retrieveSearchIHIBatch`), **delete** batch (`deleteSearchIHIBatch`) | + +`SearchBatch` supports the same search shapes as sync batch (basic, Medicare, DVA, detailed, address variants) with the same field rules as single search. + +### Create, update, merge, resolve (lifecycle) + +| Class | Operation (SOAP) | Purpose (high level) | +| ----- | ------------------ | --------------------- | +| **`ConsumerCreateProvisionalIHIClient`** | Create provisional IHI | Allocate provisional identifier | +| **`ConsumerUpdateProvisionalIHIClient`** | Update provisional IHI | Change provisional record | +| **`ConsumerMergeProvisionalIHIClient`** | Merge provisional IHI | Combine provisional with existing IHI | +| **`ConsumerResolveProvisionalIHIClient`** | Resolve provisional IHI | Finalise provisional -> active IHI | +| **`ConsumerCreateUnverifiedIHIClient`** | Create unverified IHI | Create unverified identifier | +| **`ConsumerCreateVerifiedIHIClient`** | Create verified IHI | Create verified identifier | +| **`ConsumerUpdateIHIClient`** | Update IHI | Update active IHI demographics/details | + +### Notifications to HI Service + +| Class | Operation | Purpose (high level) | +| ----- | --------- | --------------------- | +| **`ConsumerNotifyDuplicateIHIClient`** | Notify duplicate IHI | Report duplicate IHI situation | +| **`ConsumerNotifyReplicaIHIClient`** | Notify replica IHI | Report replica IHI situation | + +Exact payloads and business rules are defined by HI Service specifications, not this library. + +--- + +## Healthcare Provider Identifier - Individual (HPI-I) + +Package: `au.gov.nehta.vendorlibrary.hi.hpii`. + +| Class | Methods / capability | +| ----- | -------------------- | +| **`ProviderSearchForProviderIndividualClient`** | `identifierSearch`, `demographicSearch` - find provider individuals in HI | +| **`ProviderSearchHIProviderDirectoryForIndividualClient`** | `identifierSearch`, `demographicSearch` - search **HI Provider Directory** for individuals | +| **`SearchForProviderIndividualBatchAsyncClient`** | `submitSearch`, `retrieveSearch` - **async batch** provider-individual search | +| **`ProviderSearchTdsProviderIndividualClient`** | `searchTdsProviderIndividual` - search **TDS** (terminated/deactivated) provider individuals | +| **`ProviderManageTdsProviderIndividualClient`** | `manageTdsProviderIndividual` - manage TDS provider individual records | + +--- + +## Healthcare Provider Identifier - Organisation (HPI-O) + +Package: `au.gov.nehta.vendorlibrary.hi.hpio`. + +### Search and directory + +| Class | Methods / capability | +| ----- | -------------------- | +| **`ProviderSearchForProviderOrganisationClient`** | `identifierSearch` - find organisations by identifier | +| **`ProviderSearchHIProviderDirectoryForOrganisationClient`** | `identifierSearch`, `demographicSearch` - HI Provider Directory for organisations | +| **`SearchForProviderOrganisationBatchAsyncClient`** | `submitSearch`, `retrieveSearch` - async batch organisation search | + +### Read + +| Class | Operation | Purpose (high level) | +| ----- | --------- | --------------------- | +| **`ProviderReadProviderOrganisationClient`** | `readProvider` | Read organisation (HPI-O) details | +| **`ProviderReadAdministrativeIndividualClient`** | `readProviderAdministrativeIndividual` | Read administrative individual linked to provider context | + +### Manage (mutating operations) + +Payloads use HI "manage" request types (create/update/deactivate etc. per spec). Facades pass them through after optional validation. + +| Class | Operation | +| ----- | --------- | +| **`ProviderManageProviderOrganisationClient`** | `manageProviderOrganisation` | +| **`ProviderManageProviderDirectoryEntryClient`** | `manageProviderDirectoryEntry` | +| **`ProviderManageProviderAdministrativeIndividualClient`** | `manageProviderAdministrativeIndividual` | + +--- + +## Reference data + +Package: `au.gov.nehta.vendorlibrary.hi.readreferencedata`. + +| Class | Capability | +| ----- | ---------- | +| **`ReadReferenceDataClient`** | `readReferenceData` - fetch current allowed code lists from HI (e.g. provider type, speciality, organisation type, organisation service, operating system). Request lists **element names**; response returns acceptable values. | + +--- + +## Cross-cutting integration patterns + +### Constructing any facade + +Typical constructor inputs: + +- HI **endpoint URL** (cert vs production from registration) +- **`SSLSocketFactory`** for mutual TLS +- **Signing** private key + X.509 certificate (SOAP XML signature) +- **Product** header (`ProductType` / wrapped variant) - PCIN +- **Qualified user ID** (and sometimes **organisation qualified ID** for contracted service providers) +- Optional **`CertificateValidator`** for inbound signature trust + +### Security and transport stack + +- TLS client authentication via your socket factory +- Outbound signing of SOAP body and required header elements; inbound signature verification +- Stripping of `wsa:FaultTo` on outbound messages (Medicare/HI interoperability) +- Optional omission of HPI-O CSP header when no organisation qualified ID is configured + +### WSDL and generated types + +- Published JAR does **not** include licensed WSDL/XSD; you supply the ADHA bundle at runtime (`wsdl/` + `schema/` under one root). See **`README.md`** and **`wsdls/README.md`**. +- JAXB/JAX-WS types for requests/responses are generated at library build time from that bundle; your app uses those types in method arguments. + +### Helpers in other packages + +| Area | Examples | +| ---- | -------- | +| `au.gov.nehta.vendorlibrary.common.security` | `KeystoreUtil` - load keys/certs for TLS and signing | +| `au.gov.nehta.vendorlibrary.ws` | `WebServiceClientUtil`, `TimeUtility` | +| `au.gov.nehta.vendorlibrary.hi.wsdl` | `HiWsdlArtifactRoot` | +| `au.gov.nehta.vendorlibrary.hi.client.wrapped` | Wrapped `QualifiedId`, `ProductType` for simpler construction | + +### Errors + +Service faults surface as generated **`StandardErrorMsg`** (and related) types from the HI WSDL; handle in application code like any SOAP fault. + +--- + +## Learning and verification + +| Resource | Content | +| -------- | ------- | +| **`README.md`** | Dependency, WSDL root, config keys, search IHI rules summary | +| **`src/sample/java`** | Runnable-style examples for search IHI, batch sync, reference data, directory search, read/manage org | +| **Javadoc** | Attached to releases on Maven Central | +| **`CONTRIBUTING.md`** | Build, offline vs `-Pintegration` tests | +| **ADHA implementer portal** | Registration, certificates, authoritative operation specs | + +--- + +## Quick index - all facade classes (`11.0.0.1`) + +| # | Class | +| - | ----- | +| 1 | `ConsumerSearchIHIClient` | +| 2 | `ConsumerSearchIHIBatchSyncClient` | +| 3 | `ConsumerSearchIHIBatchAsyncClient` | +| 4 | `ConsumerCreateProvisionalIHIClient` | +| 5 | `ConsumerUpdateProvisionalIHIClient` | +| 6 | `ConsumerMergeProvisionalIHIClient` | +| 7 | `ConsumerResolveProvisionalIHIClient` | +| 8 | `ConsumerCreateUnverifiedIHIClient` | +| 9 | `ConsumerCreateVerifiedIHIClient` | +| 10 | `ConsumerUpdateIHIClient` | +| 11 | `ConsumerNotifyDuplicateIHIClient` | +| 12 | `ConsumerNotifyReplicaIHIClient` | +| 13 | `ProviderSearchForProviderIndividualClient` | +| 14 | `ProviderSearchHIProviderDirectoryForIndividualClient` | +| 15 | `SearchForProviderIndividualBatchAsyncClient` | +| 16 | `ProviderSearchTdsProviderIndividualClient` | +| 17 | `ProviderManageTdsProviderIndividualClient` | +| 18 | `ProviderSearchForProviderOrganisationClient` | +| 19 | `ProviderSearchHIProviderDirectoryForOrganisationClient` | +| 20 | `SearchForProviderOrganisationBatchAsyncClient` | +| 21 | `ProviderReadProviderOrganisationClient` | +| 22 | `ProviderReadAdministrativeIndividualClient` | +| 23 | `ProviderManageProviderOrganisationClient` | +| 24 | `ProviderManageProviderDirectoryEntryClient` | +| 25 | `ProviderManageProviderAdministrativeIndividualClient` | +| 26 | `ReadReferenceDataClient` | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc4416f..338ac42 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,19 +1,23 @@ # Contributing -**Audience:** developers building, testing, or changing **this repository**. Library integrators should use **`README.md`** and published Javadoc on Maven Central. +**Audience:** developers building, testing, or changing **this repository**. Library integrators should use **`README.md`**, **`CLIENT-FEATURES.md`**, and published Javadoc on Maven Central. --- ## Prerequisites -- **JDK 8+** with **`JAVA_HOME`** set (see **`maven.compiler.release`** in **`pom.xml`**). +- **JDK 11+** with **`JAVA_HOME`** set (see **`maven.compiler.release`** in **`pom.xml`**). - **Maven 3.6+** on **`PATH`**. Dependencies resolve from **[Maven Central](https://central.sonatype.com/)** unless you are doing a **local build** (below). +## Versioning + +The **first number** of the Maven version is the **Java SE** version that line targets. **`hi-b2b-client`** and **`hi-wsdl`** always share the **same** version (**11.0.0.1** with **11.0.0.1** on this line). **11.0.0.1** and later use **Jakarta** and **26** facades; **8.0.0.1** uses **`javax`** and **14** facades. See **`README.md`**. + --- -## Build from source +## Build from source (published dependencies) From the repository root (directory containing **`pom.xml`**): @@ -21,9 +25,15 @@ From the repository root (directory containing **`pom.xml`**): mvn -B "-Dgpg.skip=true" clean verify ``` -This line (**`1.6.3`**) compiles against **`au.gov.nehta:hi-wsdl`** — it does **not** run **`wsimport`**. +This line (**`11.0.0.1`**) runs **26** **`wsimport`** executions against the licensed WSDL tree. Install the ADHA bundle under **`wsdls/xml/`** so **`wsdls/xml/wsdl/`** and **`wsdls/xml/schema/`** exist. See **`wsdls/README.md`**. + +**Build-time WSDL root:** property **`hi.wsdl.tree.root`** (default **`wsdls/xml`**). Overrides: **`-Dhi.wsdl.tree.root=...`**, environment **`HI_WSDL_TREE_ROOT`**, or the profile in **`settings.xml.example`**. **`HI_WSDL_ARTIFACT_ROOT`** is runtime-only and is **not** read by Maven. Details: **`MAINTAINERS.md`**. -Optional faster local **`verify`** without the Javadoc JAR: **`mvn -B -Pdev-javadoc-off -Dgpg.skip=true clean verify`**. +Skip tests: + +```text +mvn -B "-Dgpg.skip=true" clean package "-DskipTests=true" +``` | Goal | Command | | ---- | ------- | @@ -31,10 +41,13 @@ Optional faster local **`verify`** without the Javadoc JAR: **`mvn -B -Pdev-java | Full mutual-TLS tests | `mvn -B "-Dgpg.skip=true" -Pintegration clean test` | | Sample sources | `mvn -B -Psample -DskipTests=true clean compile` | | Install to local Maven repository | `mvn clean install` | -| Shaded JAR (classifier **`all`**) | `mvn -B -Pfat-jar -Dgpg.skip=true clean verify` | + +Default Surefire **``** (see **`pom.xml`**): **`TimeUtilityTest`**, **`TestConfigurationTest`**, **`JdbcTransactionTestRuleTest`**, **`HiWsdlArtifactRootTest`**, **`HiWsdlArtifactSmokeTest`**, **`HiRequestElementOrderParityTest`**, **`ConsumerSearchIHIClientArgumentValidatorTest`**. ### Build wrappers (by operating system) +All wrappers run from the repository root and invoke **`mvn -B -Dgpg.skip=true clean verify`**. + | OS | Command | Optional fat JAR | | ---- | ------- | ---------------- | | **Windows (PowerShell)** | `.\build.ps1` | `.\build.ps1 -Shaded` | @@ -43,40 +56,89 @@ Optional faster local **`verify`** without the Javadoc JAR: **`mvn -B -Pdev-java Set environment variable **`MVN_SETTINGS`** to pass **`-s`** to Maven (path to your Maven user settings file). +Maven uses your normal user settings (mirrors, servers) unless **`MVN_SETTINGS`** is set. + --- ## Local builds (unpublished artifacts) -When co-developing with **`hi-wsdl-java`**, install matching **`au.gov.nehta:hi-wsdl`** at **`${project.version}`** before **`verify`** here: +Use this section when you do **not** have the licensed WSDL tree locally, or when you are co-developing with an unpublished **`hi-wsdl`** types JAR. + +### Skip wsimport: `hi-wsdl` artifact profile + +When **`au.gov.nehta:hi-wsdl`** matching **`${project.version}`** is available (Maven Central or **`mvn install`** from a sibling **`hi-wsdl`** source tree), skip in-repo **`wsimport`**. Pair **11.0.0.1** with **`hi-wsdl`** **11.0.0.1** (**8.0.0.1** with **8.0.0.1** on the Java 8 line): ```text -# hi-wsdl (same SNAPSHOT or GA as this pom.xml) -mvn -B "-Dgpg.skip=true" clean install +mvn -B -Phi-wsdl-artifact "-Dgpg.skip=true" clean verify +``` -# hi-b2b-client (this repository) -mvn -B "-Dgpg.skip=true" clean verify +This sets **`hi.wsdl.codegen.skip=true`**, adds the **`hi-wsdl`** compile dependency, and skips in-repo **`wsimport`**. Do **not** combine **`hi-wsdl`** on the classpath with a fresh **`wsimport`** output from this repository in the same build. + +Install the types library locally when it is not yet on Central: + +```text +# From hi-wsdl source tree (same version as this pom.xml) +mvn -B "-Dgpg.skip=true" clean install ``` -Integrators using GA versions from Maven Central do not need a sibling checkout. Maintainer notes: **MAINTAINERS.md**. +Then run **`verify`** here with **`-Phi-wsdl-artifact`**. + +### SNAPSHOT coordinates + +To build and install this project as a SNAPSHOT for another local project, use the version in **`pom.xml`** and **`mvn install`**. Downstream POMs must reference that exact SNAPSHOT version until a release is published to Maven Central. --- ## Integration tests and `local.properties` -Copy **`local.properties.example`** to **`local.properties`** (gitignored) and configure **`HI_*`** keys for **`-Pintegration`** tests. See **`SECURITY.md`**. +1. Copy **`local.properties.example`** to **`local.properties`** (gitignored). +2. Set **`HI_WSDL_ARTIFACT_ROOT`** to your licensed tree (often **`./wsdls/xml`**). +3. Add ADHA test certificates under **`certs/`** (gitignored) or use **`src/test/resources/keystore.jks`** for offline tests only. +4. Fill **`HI_KEYSTORE_*`**, **`HI_KEY_ALIAS_*`**, **`HI_TRUSTSTORE_*`**, endpoints, and registration IDs from your pack. + +**Resolution order** for each **`HI_*`** key in tests: environment variable, then **`local.properties`**, then compiled defaults in **`TestConstants`** / **`IHITestConstants`**. + +**PKCS#12:** point **`HI_KEYSTORE_PATH`** at **`fac_sign.p12`** from your registration pack; passwords come from the pack (do not commit them). List aliases: + +```text +keytool -list -storetype PKCS12 -keystore "certs//fac_sign.p12" -storepass +``` + +**JKS conversion (optional):** + +```text +keytool -importkeystore -srckeystore "certs//fac_sign.p12" -srcstoretype PKCS12 -srcstorepass -destkeystore config/hi-test-keystore.jks -deststoretype JKS -deststorepass changeit -destkeypass changeit -noprompt +``` + +Then set **`HI_KEYSTORE_TYPE=JKS`** and **`HI_KEYSTORE_PATH=./config/hi-test-keystore.jks`**. **`config/`** is gitignored. + +**Smoke test against cert server** (with **`local.properties`** configured): + +```text +mvn -B "-Dgpg.skip=true" -Pintegration "-Dtest=ConsumerSearchIHIClientTest#basicSearchAgainstMedicare" test +``` + +--- + +## CI + +**`.github/workflows/ci.yml`**: runs on official branch **`java-11`**. Full **`verify`** when licensed WSDL is present under **`wsdls/xml/`**; otherwise **`validate`** only (expected on public GitHub without licensed files). Local alternative without the tree: **`-Phi-wsdl-artifact`** after installing matching **`hi-wsdl`**. --- ## Repository hygiene -- **Do not commit:** **`local.properties`**, populated **`settings.xml`** with secrets, keystores, passwords, or production HI URLs. +- **Do not commit:** **`local.properties`**, populated **`settings.xml`** with secrets, keystores, passwords, tokens, or production HI URLs. See **`SECURITY.md`**. - **Line endings:** LF per **`.gitattributes`**. On Windows: **`git config core.autocrlf false`** in this clone before committing. -- **Internals:** **MAINTAINERS.md**. +- **Focused commits;** match existing style. +- **POM, `wsimport`, and dependency layout:** **`MAINTAINERS.md`**. --- ## `target/` locks +If **`mvn clean`** or **`wsimport`** cannot delete **`target/`**, close IDE Java language servers, antivirus scanners, or other processes holding files. **`maven-clean-plugin`** uses **`force`** and **`retryOnError`**. + **Windows** (from repository root): ```text @@ -90,3 +152,9 @@ rmdir /s /q target chmod -R u+w target rm -rf target ``` + +--- + +## Copyright + +Copyright 2011 NEHTA. Copyright 2021-2026 ADHA. Apache License 2.0 - see **`LICENSE.md`**. diff --git a/LICENSE.md b/LICENSE.md index e0b6ebd..b9d57ad 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -# HI B2B Client Java — licensing +# HI B2B Client Java - licensing Copyright 2011 National E-Health Transition Authority Ltd (NEHTA). Copyright 2021-2026 Australian Digital Health Agency (ADHA) and contributors. @@ -219,7 +219,7 @@ limitations under the License. --- -## Additional terms — Australian Digital Health Agency Production Disclaimer +## Additional terms - Australian Digital Health Agency Production Disclaimer The Australian Digital Health Agency (as Licensor) grants You a licence to this Product subject to the terms of the Apache Licence (version 2.0), a copy of which is available at , and the following terms. diff --git a/MAINTAINERS.md b/MAINTAINERS.md index e801451..e444046 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,132 +1,415 @@ -# Maintainer notes +# Maintainer guide (hi-b2b-client-java) -**Audience:** people changing the build, dependency coordinates, tests, or WSDL layout - not library integrators. Integrators should use **README.md**, published Javadoc, and **`pom.xml`** coordinates. +Audience: maintainers changing the build, WSDL layout, dependency coordinates, generated +types, client facades, or tests. Integrators use README.md and published Javadoc. +Contributors start with CONTRIBUTING.md. -## Release lines +This document uses relative paths from the project root (the directory that contains +pom.xml). -| Version | Java | APIs | `Service` stubs | -| ------- | ---- | ---- | ----------------- | -| **1.6.3** | 8 | **`javax.xml.ws`**, **`javax.xml.bind`** | **14** (standard HI B2B) | -| **1.6.5** | 11 | **Jakarta** XML WS / Bind | **14** (standard HI B2B) | -| **1.7.0** | 11 | **Jakarta** XML WS / Bind | **26** (full MCA) | +--- -**Git branch mapping (maintainers / checkout only — do not use in integrator docs):** +## Versioning -| Version | Git branch | -| ------- | ---------- | -| **1.6.3** | `java-8-javax` | -| **1.6.5** | `java-11-jakarta` | -| **1.7.0** | `java-11-jakarta-full-wsdl` | +The **first number** of the Maven version is the **Java SE** version that line targets. **`hi-b2b-client`** and **`hi-wsdl`** always share the **same** version (same SNAPSHOT or GA) on a given line. -**`master`** is frozen and must stay in sync with **`origin/master`** — do not edit; use **`git worktree`** locally (**`CONTRIBUTING.md`**). +| Maven version | Java SE | +| ------------- | ------- | +| **8.0.0.1** | **8** | +| **11.0.0.1** | **11** | +| **17.0.0.1** | **17** | +| **21.0.0.1** | **21** | +| **24.0.0.1** | **24** | -**This checkout:** **`1.6.3-SNAPSHOT`** (**`1.6.3`** release line). +**Documentation convention:** README, CONTRIBUTING, CHANGELOG, and integrator-facing text use **version numbers only** - never Git branch names. -## Release scope (`1.6.3`) +| Version | Java | APIs | Facade clients | +| ------- | ---- | ---- | -------------- | +| **8.0.0.1** | 8 | **`javax.xml.ws`**, **`javax.xml.bind`** | **14** (standard HI B2B) | +| **11.0.0.1** | 11 | **Jakarta** XML WS / Bind | **26** (full MCA) | +| **17.0.0.1** | 17 | **Jakarta** XML WS / Bind | **26** (full MCA) | +| **21.0.0.1** | 21 | **Jakarta** XML WS / Bind | **26** (full MCA) | +| **24.0.0.1** | 24 | **Jakarta** XML WS / Bind | **26** (full MCA) | -- **Goal:** Java **8** bytecode (`maven.compiler.release` **8**) with **`javax.xml.ws`** / JAXB usage in application code; SOAP types **`au.net.electronichealth.*`** come from **`au.gov.nehta:hi-wsdl`** on the classpath ( **`hi.wsdl.version`** ). The default lifecycle does **not** run **`wsimport`** in this artifact. -- **`wsdls/`** is optional reference and Ant **`wsimport`** material (see **`wsdls/readme.txt`**), not required to compile this library. +**Git branch mapping (maintainers / checkout only - do not use in integrator docs):** -## Contributors vs release publisher (`pom.xml`) +| Version | Official Git branch | +| ------- | ------------------- | +| **8.0.0.1** | `java-8` | +| **11.0.0.1** | `java-11` | +| **17.0.0.1** | `java-17` | +| **21.0.0.1** | `java-21` | +| **24.0.0.1** | `java-24` | -**Contributors (PRs, ordinary commits):** Do not change **``** (stay on **`-SNAPSHOT`** unless the maintainer requests a bump), **``**, or **`distributionManagement`**. Leave **`maven-gpg-plugin`** **`skip`** **`true`** so default **`mvn verify`** does not require a signing key. Record user-visible work under **`CHANGELOG.md`** in the **`= =`** block that matches **`pom.xml`** **``**. +**`hi-wsdl-java`** uses the **same branch names** and the **same Maven version** on each pair (`hi-wsdl` **11.0.0.1** on `java-11` with **`hi-b2b-client`** **11.0.0.1**, and so on). Artifact ids stay **`hi-wsdl`** and **`hi-b2b-client`**; the version distinguishes the Java SE line. -**Release publisher:** In the release change set: set **``** to the GA coordinate (no **`-SNAPSHOT`**); set **``** to the Git tag you will publish (match existing tag naming). Move **`CHANGELOG.md`** bullets from the snapshot section into a new **`= =`** section; add a fresh **`-SNAPSHOT`** block for the next development cycle. Deploy via Sonatype Central Portal (**`central-publishing-maven-plugin`**; copy **`settings.xml.example`** → **`settings.xml`**, server id **`central`**). See **Release** below. +On a given branch, **do not change the first number** of **``**. Next GA on **`java-11`** is **`11.0.0.2`** (then **`11.0.0.2-SNAPSHOT`**), not **`17.x`**. A new Java SE target is a **new branch**, not a bump on this one. -## Release +**This checkout (`11.0.0.1-SNAPSHOT`):** Java **11**, **26** facades, **Jakarta**, in-repo **`wsimport`**. Stack, Surefire includes, and **`.github/workflows/ci.yml`** (branch **`java-11`**, JDK **11**) below apply to **this line only**. Other branches keep their own **`pom.xml`**, CI branch filter, and JDK. **`hi-b2b-client`** **11.0.0.1** uses **`hi-wsdl`** at the **same version**. -Publishing uses **`central-publishing-maven-plugin`** (Sonatype Central Portal). Copy **`settings.xml.example`** → **`settings.xml`**, server id **`central`**. +--- -**Parallel release lines (maintainers only):** each Git branch publishes a **different Maven version** — integrators choose by coordinate, not branch name. +## 1. What this artifact is -| Branch | Java | HI client / WSDL version | Facades | -| ------ | ---- | ------------------------ | ------- | -| **`java-8-javax`** → **`master`** | 8 / javax | **1.6.3** | 14 | -| **`java-11-jakarta`** | 11 / Jakarta | **1.6.5** | 14 | -| **`java-11-jakarta-full-wsdl`** | 11 / Jakarta | **1.7.0** | 26 | +Maven coordinates: au.gov.nehta:hi-b2b-client -Release **`hi-wsdl`** and **`hi-b2b-client`** at the **same GA version** on the matching branch pair before integrators upgrade. +Java library for Australia's Healthcare Identifiers (HI) B2B SOAP services (IHI, HPI-I, +HPI-O). It is separate from the My Health Record (MHR / PCEHR) client in the sibling +mhr-b2b-client-java repository. Applications that need both depend on two JARs. -### SNAPSHOT or manual GA +Published artifact: compiled facades and helpers only. Licensed HI WSDL/XSD is never +packaged in the JAR (maven-jar-plugin excludes *.wsdl). Runtime callers must supply the +WSDL tree (see section 6). -1. Update **CHANGELOG.md** (and **`pom.xml`** / SCM **``** for manual GA). -2. **`mvn -B "-Prelease" clean verify`** -3. **`mvn -B "-Prelease" deploy`** +--- -Git/SCM settings for **`maven-release-plugin`** live in **`pom.xml`** properties (**`scm.repo.url`**, **`release.*`**). Tags default to **`{artifactId}-{version}`** (e.g. **`hi-b2b-client-1.7.0`**). +## 2. Repository layout -### Automated GA (`maven-release-plugin`) +| Path | Role | +| ---- | ---- | +| pom.xml | Build, wsimport executions, profiles, dependency versions | +| src/main/java/au/gov/nehta/vendorlibrary/hi/ | Public HI client facades and handlers | +| src/main/java/au/gov/nehta/vendorlibrary/ws/ | Shared JAX-WS helpers (WebServiceClientUtil, handlers) | +| src/main/java/au/gov/nehta/vendorlibrary/hi/wsdl/ | HiWsdlArtifactRoot (runtime WSDL resolution) | +| src/main/java/hi_override/org/w3/xmldsig/ | Hand-maintained XML-DSig types (override generated) | +| src/sample/java/ | Sample programs (sample profile only) | +| src/test/java/ | Unit and integration tests | +| src/test/resources/ | Test keystores (placeholders), JDBC fixtures | +| wsdls/xml/ | Default location for licensed WSDL/XSD (not in Git; see wsdls/README.md) | +| wsdls/xml/binding/ | JAX-WS/JAXB binding fragments shipped with the repo | +| target/generated-sources/wsimport/ | Merged wsimport output (build only) | +| local.properties.example | Template for runtime and integration-test configuration | +| settings.xml.example | Optional Maven settings: **hi-wsdl-tree** profile and commented Central Portal deploy credentials | +| build.ps1, build.sh, build.bat | Thin wrappers around mvn clean verify | -Run on the **target branch** with a **clean** working tree. The plugin commits version bumps, creates the release tag, deploys from the tag checkout, bumps to the next **`-SNAPSHOT`**, and **pushes branch + tag** (**`pushChanges`** / **`remoteTagging`** in **`pom.xml`**). Git remote credentials (SSH or HTTPS) must work non-interactively. +Branch model: **`11.0.0.1`**, Git **`java-11`**, full MCA, in-repo **`wsimport`**. JDK 11, Jakarta XML Web Services (**`jaxws-rt` 4.x**). -```text -mvn -B "-Prelease" release:prepare release:perform -DreleaseVersion=1.7.0 -DdevelopmentVersion=1.7.1-SNAPSHOT -Dtag=hi-b2b-client-1.7.0 +--- + +## 3. Client library design + +### 3.1 Layering + +``` + Application + | + au.gov.nehta.vendorlibrary.hi.*Client (facade: one class per HI WSDL operation set) + | + BaseClient_3 extends ClientBase + | + Generated JAX-WS Service / Port types (au.net.electronichealth.*) + | + WebServiceClientUtil + HiWsdlArtifactRoot (port creation, WSDL URL, TLS) + | + JAX-WS RI (jaxws-rt) over HTTPS mutual TLS ``` -Replace versions and **`-Dtag`** for the branch you are on (**`hi-wsdl-1.6.5`**, **`hi-b2b-client-1.6.3`**, etc.). Omit **`-D…`** only if you accept interactive prompts. +- **ClientBase** holds the JAX-WS port, SSLSocketFactory, signing key/certificate, + CertificateValidator, and LoggingHandler. +- **BaseClient_3** wires HIHeaderHandler and HISecurityHandler (WS-Security signing via + smi-xsp), attaches the handler chain, and exposes the port to subclasses. +- Each **facade** (for example ConsumerSearchIHIClient) maps domain-friendly methods to + generated port operations and HI header types. -**After success:** confirm the artifact on Central; repeat on the paired types/client repo. No extra Git steps unless push failed (then **`git push origin `** and **`git push origin `**). +Package layout under au.gov.nehta.vendorlibrary.hi: -**`-Dgpg.skip=false`** is equivalent to **`-Prelease`** for signing. +| Package | Clients | +| ------- | ------- | +| ihi/ | Consumer IHI search, batch, create, update, merge, notify, resolve | +| hpii/ | Provider individual search, directory, TDS, batch async | +| hpio/ | Provider organisation search, manage, read, directory, batch async | +| readreferencedata/ | ReadReferenceDataClient | -## Changelog and releases +There are 26 wsimport executions and a matching set of facade classes (one primary WSDL +each). The MCA tree under wsdls/xml/wsdl can contain more WSDLs than this JAR exposes; +adding wsimport plus a public facade is a deliberate release change. -**`CHANGELOG.md`** uses **`= version =`** section headers. Match the snapshot header to **`pom.xml`** **``** until the publisher cuts GA. +### 3.2 Runtime requirements (integrator view; relevant when changing facades) + +Every call expects the application to provide: + +- HTTPS endpoint URL (per operation) +- SSLSocketFactory for mutual TLS +- X509 certificate and private key for SOAP message signing +- CertificateValidator (smi-xsp) for verifying inbound signatures +- HI message headers (product, user, organisation context) via generated types + +WSDL resolution at runtime uses HiWsdlArtifactRoot (not Maven hi.wsdl.tree.root). See +section 6. + +### 3.3 Compile/runtime dependencies (published JAR) + +| Dependency | Purpose | +| ---------- | ------- | +| au.gov.nehta:smi-xsp | XML-DSig, certificate validation, HI security utilities | +| com.sun.xml.ws:jaxws-rt | Jakarta XML Web Services reference implementation | + +Test-only: junit, h2 (JDBC test rule). Groovy is build-time only (gmavenplus-plugin). + +--- + +## 4. Build process design + +### 4.1 Goals + +1. Generate Jakarta JAX-WS/JAXB types from licensed HI WSDL under hi.wsdl.tree.root. +2. Merge per-WSDL outputs into one compile source tree without duplicate types. +3. Compile hand-written facades plus generated types into hi-b2b-client.jar. +4. Exclude WSDL from the published JAR. +5. Default test run: offline unit tests only; full mutual-TLS suite via -Pintegration. + +### 4.2 Lifecycle (Maven phases) + +``` +initialize + gmavenplus: configure-hi-wsdl-tree-root -> sets hi.wsdl.tree.root + enforcer: require-licensed-wsdl-tree -> sentinel WSDL must exist (unless skip) + +generate-sources + gmavenplus: clean-wsimport-codegen -> optional wipe when hi.wsdl.codegen.clean=true + jaxws-maven-plugin: 26 x wsimport -> target/generated-sources/wsimport-parts// + +process-sources + gmavenplus: merge-and-strip-wsimport -> target/generated-sources/wsimport/ + build-helper: add-wsimport-source + +compile / test / package + compiler, surefire, jar (WSDL excluded), optional gpg/javadoc/source attachments +``` + +**Merge rule:** Groovy script copies each wsimport-parts subtree into +target/generated-sources/wsimport/; first file wins on name clash. Then removes +wsimport-parts paths from compile source roots. + +**Stale detection:** Each wsimport execution has its own staleFile under target/jaxws/. + +### 4.3 Key Maven properties (pom.xml) + +| Property | Default / role | +| -------- | -------------- | +| maven.compiler.release | 11 | +| jaxws.rt.version | jaxws-rt and jaxws-tools version (4.0.4) | +| jaxws.maven.plugin.version | jaxws-maven-plugin (4.0.2 on JDK 11; 4.0.3+ may need JDK 17 to run wsimport) | +| groovy.version | gmavenplus-plugin script runtime only | +| hi.wsdl.codegen.skip | false; true skips wsimport and enforcer | +| hi.wsdl.codegen.clean | false; true deletes prior wsimport output before codegen | +| hi.wsdl.tree.root | Build-time WSDL root; resolved in initialize (see section 6) | +| maven.shade.plugin.version | fat-jar profile | +| skipTests | false; default surefire includes are offline tests only | + +### 4.4 wsimport configuration + +- Plugin: com.sun.xml.ws:jaxws-maven-plugin (not legacy Metro webservices-rt). +- xnocompile true, extension true, -XautoNameResolution. +- vmArg -Djavax.xml.accessExternalSchema=all for schema resolution. +- WSDL paths under ${hi.wsdl.tree.root}/wsdl/... per execution in pom.xml. +- Optional binding files under wsdls/xml/binding/ where configured. + +### 4.5 Profiles + +| Profile | Effect | +| ------- | ------ | +| integration | Surefire runs **/*Test.java (needs local.properties / HI_* and certs) | +| sample | Adds src/sample/java at generate-sources | +| fat-jar | maven-shade-plugin produces hi-b2b-client-*-all.jar with runtime deps shaded | + +Build wrappers (build.ps1 etc.): mvn -B -Dgpg.skip=true clean verify; pass shaded for +fat-jar. + +### 4.6 Optional Ant under wsdls/ + +Default build is Maven-only. Legacy Ant under wsdls/ expects EE4J jars copied to +wsdls/local-lib/ee4j-jaxws-from-maven/ via wsdls/ee4j-jaxws-lib-pom.xml. Keep +ee4j.jaxws.version aligned with jaxws.rt.version if you use Ant. + +--- + +## 5. External inputs and local configuration + +Nothing in this section belongs in Git when populated. + +### 5.1 Licensed WSDL tree (build time) + +**Property:** hi.wsdl.tree.root + +**Layout:** immediate children wsdl/ and schema/ (same layout as wsdls/xml/ after +extracting the ADHA vendor bundle). See wsdls/README.md for download and inventory. + +**Resolution order (first match):** -## Java / JAX stack (`pom.xml` properties) +1. -Dhi.wsdl.tree.root=... +2. Environment variable HI_WSDL_TREE_ROOT +3. hi.wsdl.tree.root from an active Maven settings.xml profile +4. Default: wsdls/xml -- **`maven.compiler.release` 8** - bytecode and language level for Java 8 consumers. -- **`ee4j.jaxws.version`** - **`com.sun.xml.ws:jaxws-rt`** on **Maven Central** (**2.3.7** is the last **2.3.x** for this branch). Transitive API JARs may use **`jakarta.*`** **groupId** coordinates while still exposing **`javax.*`** packages - do not exclude them from **`jaxws-rt`** in consumer POMs. This project only excludes **`webservices-rt`** from **`common-library`** (old stack conflict with **`jaxws-rt`**). -- **`hi.wsdl.version`** — **`${project.version}`** (same SNAPSHOT or GA as **`hi-b2b-client`**); **`mvn install`** in **`hi-wsdl-java`** before unpublished **`verify`**; coordinate GA releases with **`hi-wsdl-java`**. -- **`nehta.lib.version`** - **`au.gov.nehta:common-library`** and explicit **`au.gov.nehta:smi-xsp`** ( **`smi-common-utils`** removed; **`ArgumentUtils`** and **`CertificateValidator`** come from **`smi-xsp`** / **`common-library`** transitives). +Maven never reads HI_WSDL_ARTIFACT_ROOT. -## Fast builds +**Skip codegen:** -Dhi.wsdl.codegen.skip=true (compile still needs an existing +target/generated-sources/wsimport from a prior full build). -Defaults in **`pom.xml`**: **`maven-source-plugin`** **`jar-no-fork`**, **`maven-javadoc-plugin`** **`jar`** attach (**`maven-javadoc-plugin` 3.12.0** has no **`jar-no-fork`** goal), **`verbose`** **`false`**, **`detectOfflineLinks`** **`false`**, **`maven-compiler-plugin`** **`proc`** **`none`**, **`maven-enforcer-plugin`** **`requireMavenVersion`** **3.6.3+**, **`maven-clean-plugin`** **`retryOnError`** / **`force`**. JaCoCo is **not** bound to the default lifecycle; use **`-Pcoverage`** for **`prepare-agent`** and the **`verify`** report. Optional **`-Pdev-javadoc-off`** skips the Javadoc JAR for faster local **`verify`**. **`fat-jar`** shading drops duplicate **`ArgumentUtils`** from **`smi-xsp`** and **`WebServiceClientUtil`** / **`ArgumentUtils`** from **`common-library`** where this artifact provides its own copies. +### 5.2 Licensed WSDL tree (runtime and integration tests) -## Optional `wsdls/` Ant + `wsimport` +**Class:** au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot -Optional Ant targets under **`wsdls/build.xml`** need a directory of JAX-WS tool/runtime JARs (same coordinates as the root **`pom.xml`**). Populate **`wsdls/local-lib/ee4j-jaxws-from-maven/`** from Central (gitignored) using **`wsdls/ee4j-jaxws-lib-pom.xml`** when present. +**Key:** HI_WSDL_ARTIFACT_ROOT -Keep **`ee4j.jaxws.version`** in **`wsdls/ee4j-jaxws-lib-pom.xml`** aligned with **`ee4j.jaxws.version`** in the repository root **`pom.xml`**. +**Layout:** same wsdl/ and schema/ as build tree. -## `hi-wsdl` vs `wsdls/` +**Resolution order:** -- Generated SOAP types (`au.net.electronichealth.*`) come from **`au.gov.nehta:hi-wsdl`** at **`hi.wsdl.version`**. **`mvn compile`** does not require a populated **`wsdls/xml/wsdl`** tree. -- **`wsdls/`** holds WSDL/XSD material for reference, diffing, and optional codegen. Inventory and layout are described in **`wsdls/readme.txt`**. +1. HiWsdlArtifactRoot.setRoot(Path) +2. Environment HI_WSDL_ARTIFACT_ROOT +3. HI_WSDL_ARTIFACT_ROOT in local.properties (JVM user.dir) +4. System property -DHI_WSDL_ARTIFACT_ROOT=... -## Maven settings (`settings.xml`) +WebServiceClientUtil resolves @WebServiceClient wsdlLocation filenames by searching under +wsdl/ beneath that root. -**`settings.xml.example`** (tracked) defines optional profile **`hi-wsdl-tree`** for parity with other branches. **CI** ( **`.github/workflows/ci.yml`** ) does **not** copy it to a project **`settings.xml`**; use plain **`mvn`** so contributor Maven user settings apply. Root **`build.*`** may pass **`-s`** only when **`MVN_SETTINGS`** is set. +### 5.3 local.properties -## Integration tests (`-Pintegration`) +Copy local.properties.example to local.properties beside the JVM working directory +(typically project root when running tests). -The **`integration`** Maven profile widens Surefire to **`**/*Test.java`** and sets **`hi.require.live.config=true`**. Use with **`local.properties`** / **`HI_*`** when running mutual-TLS tests locally or in CI. +Used for: -## Cleaning `target/` +- HI_WSDL_ARTIFACT_ROOT (runtime WSDL path; often ./wsdls/xml in a checkout) +- HI_KEYSTORE_*, HI_KEY_ALIAS_*, HI_TRUSTSTORE_* (mutual TLS and signing for + -Pintegration tests) +- HI_MEDICARE_ENDPOINT_BASE and per-service endpoint overrides +- HI_USER_*, HI_VENDOR_*, HI_HPIO_* qualified identifiers for test messages +- HI_PRODUCT_* strings -If **`mvn clean`** or codegen cannot delete **`target/`** (locked files, read-only flags, antivirus, IDE indexers, or cloud-sync folders), close processes that hold the directory, then remove **`target/`** manually. +**Test resolution order** (TestConfiguration): environment variable overrides +local.properties overrides compiled default in test constants. -### Windows +Gitignored: local.properties, certs/, populated keystores, config/ with secrets. -From the repository root, clear read-only flags then delete the folder, for example: +### 5.4 settings.xml -`attrib -R target /S /D` +Copy **`settings.xml.example`** to **`settings.xml`** at the repository root (or merge profiles and **``** into your Maven user settings file). The **`hi-wsdl-tree`** profile sets **`hi.wsdl.tree.root`** for builds that rely on a settings file. For **`mvn deploy`**, uncomment the **`central`** server block (server id must match **`pom.xml`**). -Then delete the **`target`** directory in File Explorer or with your shell. +Treat populated settings.xml like local.properties: do not commit secrets or machine-only +paths. Optional env MVN_SETTINGS points build scripts at a settings file. -### macOS and Linux +### 5.5 Test keystores -From the repository root: +src/test/resources/keystore.jks and truststore.jks are placeholders for offline tests. +Integration tests should use PKCS#12 or JKS material from your ADHA registration pack +under certs/ (gitignored) via local.properties paths. -`chmod -R u+w target && rm -rf target` +--- + +## 6. Tests (maintainer view) + +| Command | Scope | +| ------- | ----- | +| mvn -B "-Dgpg.skip=true" test | Default offline unit tests (see pom.xml surefire includes) | +| mvn -B "-Dgpg.skip=true" -Pintegration test | All *Test.java; requires HI network, local.properties, certs | + +Default includes: TimeUtilityTest, TestConfigurationTest, JdbcTransactionTestRuleTest, +HiWsdlArtifactRootTest, HiWsdlArtifactSmokeTest, HiRequestElementOrderParityTest, +ConsumerSearchIHIClientArgumentValidatorTest. + +HiWsdlArtifactRootTest can skip reading local.properties when HI_WSDL_ARTIFACT_ROOT is +set in the environment. + +After mvn clean, run a full compile before relying on -Dhi.wsdl.codegen.skip=true. + +--- + +## 7. Common maintainer tasks + +**Add a new HI WSDL and facade** + +1. Confirm WSDL exists under ${hi.wsdl.tree.root}. +2. Add a jaxws-maven-plugin execution in pom.xml (destDir, sourceDestDir, wsdlDirectory, + wsdlFiles, wsdlLocation). +3. Add the execution id to the merge names list in gmavenplus merge-and-strip-wsimport. +4. Implement facade under au.gov.nehta.vendorlibrary.hi extending BaseClient_3. +5. Add integration test and/or argument validator unit test as appropriate. + +**Bump jaxws-rt** + +1. Update jaxws.rt.version in pom.xml. +2. Full mvn clean verify with licensed tree present. +3. If using wsdls/ Ant helper, align wsdls/ee4j-jaxws-lib-pom.xml. + +**Refresh licensed WSDL from ADHA** + +1. Extract vendor bundle into wsdls/xml (or your hi.wsdl.tree.root). +2. mvn clean verify; fix binding or merge clashes if wsimport fails. +3. Re-run -Pintegration when endpoints and certs are configured. + +**target/ locked on Windows** + +Close IDE Java language server and antivirus holders. maven-clean-plugin uses force and +retryOnError. See CONTRIBUTING.md for manual delete steps. + +--- + +## 8. Sibling project alignment + +Keep **`hi.wsdl.version`** at **`${project.version}`** so **`hi-b2b-client`** **11.0.0.1** consumes **`hi-wsdl`** **11.0.0.1** (and **8.0.0.1** with **8.0.0.1** on the Java 8 line). Align **`jaxws-rt`**, **`jaxws-maven-plugin`**, and **`jaxb-xjc`** with **hi-wsdl-java** on the same line. + +Keep plugin and shared dependency versions aligned with mhr-b2b-client-java where both +use the same stack (jaxws-rt, jaxws-maven-plugin, gmavenplus, surefire, compiler, shade). +MHR ships PCEHR WSDL in Git; HI does not ship HI WSDL in Git. + +--- + +## Release + +Publishing uses **`central-publishing-maven-plugin`** (Sonatype Central Portal). Copy **`settings.xml.example`** -> **`settings.xml`**, server id **`central`**. + +**Parallel release lines (maintainers only):** each Git branch publishes a **different Maven version** - integrators choose by coordinate, not branch name. The first number of that version is the targeted Java SE version. Run **`release:prepare` / `release:perform`** (or manual deploy) **on that branch** (not detached HEAD). + +| Branch (both repos) | Java | `hi-wsdl` / `hi-b2b-client` | Facades | +| ------------------- | ---- | --------------------------- | ------- | +| **`java-8`** | 8 / javax | **8.0.0.1** | 14 | +| **`java-11`** | 11 / Jakarta | **11.0.0.1** | 26 | +| **`java-17`** | 17 / Jakarta | **17.0.0.1** | 26 | +| **`java-21`** | 21 / Jakarta | **21.0.0.1** | 26 | +| **`java-24`** | 24 / Jakarta | **24.0.0.1** | 26 | + +**Order:** publish **`hi-wsdl-java`** first (same branch and GA), then this repo. Client **`verify`** / **`release:perform`** needs **`hi-wsdl`** at that GA on Central (or a prior local **`mvn install`**). Do not reverse the order. + +**`-DdevelopmentVersion`:** keep the same first number as **`-DreleaseVersion`** (example on this line: **`11.0.0.1`** then **`11.0.0.2-SNAPSHOT`**). + +### SNAPSHOT or manual GA + +1. Update **CHANGELOG.md** (and **`pom.xml`** / SCM **``** for manual GA). +2. **`mvn -B "-Prelease" clean verify`** +3. **`mvn -B "-Prelease" deploy`** + +Git/SCM settings for **`maven-release-plugin`** live in **`pom.xml`** properties (**`scm.repo.url`**, **`release.*`**). Tags default to **`{artifactId}-{version}`** (e.g. **`hi-b2b-client-11.0.0.1`**). + +### Automated GA (`maven-release-plugin`) + +Run on the **target branch** with a **clean** working tree. The plugin commits version bumps, creates the release tag, deploys from the tag checkout, bumps to the next **`-SNAPSHOT`**, and **pushes branch + tag** (**`pushChanges`** / **`remoteTagging`** in **`pom.xml`**). Git remote credentials (SSH or HTTPS) must work non-interactively. + +```text +mvn -B "-Prelease" release:prepare release:perform -DreleaseVersion=11.0.0.1 -DdevelopmentVersion=11.0.0.2-SNAPSHOT -Dtag=hi-b2b-client-11.0.0.1 +``` + +Replace **`-DreleaseVersion`**, **`-DdevelopmentVersion`**, and **`-Dtag`** for the branch you are on (same first number; e.g. **`hi-wsdl-11.0.0.1`** / **`hi-b2b-client-11.0.0.1`** on **`java-11`**). Omit **`-D...`** only if you accept interactive prompts. + +**After success:** confirm **`hi-wsdl`** GA on Central, then this artifact. No extra Git steps unless push failed; then from the release branch: + +`git push origin java-11` (or **`java-8`**, **`java-17`**, **`java-21`**, **`java-24`**) and **`git push origin `**. + +**`-Dgpg.skip=false`** is equivalent to **`-Prelease`** for signing. + +## Changelog and releases + +**`CHANGELOG.md`** uses **`= version =`** section headers. Match the snapshot header to **`pom.xml`** **``** until the publisher cuts GA. -Avoid relying on build trees inside folders that are continuously synced by desktop sync tools if deletes are flaky. +## New Java SE line -## Facade surface vs WSDL inventory +When adding a line (e.g. Java **25**): create **`java-25`** on **both** **`hi-wsdl-java`** and **`hi-b2b-client-java`** from the nearest existing line; set **``** first number to **25** (e.g. **`25.0.0.1-SNAPSHOT`**); set **`maven.compiler.release`**, JAX-WS coordinates, CI **`java-version`** / branch filter, and docs to that line. Do not retarget an existing branch. -Some binding WSDLs under **`wsdls/`** may describe operations whose generated types are not present in a given **`hi-wsdl`** JAR. Those operations are not exposed as **`au.gov.nehta.vendorlibrary.hi.*`** clients until **`hi-wsdl`** (or an alternate codegen path) supplies the SEI types. +--- ## Copyright -Copyright 2011 NEHTA. Copyright 2021-2026 ADHA (Australian Digital Health Agency). Licensed under the Apache License, Version 2.0 - see **LICENSE.md**. +Copyright 2011 NEHTA. Copyright 2021-2026 ADHA (Australian Digital Health Agency). +Licensed under the Apache License, Version 2.0. See LICENSE.md. diff --git a/README.md b/README.md index 6653158..5b91896 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ Maven library for Australia's **Healthcare Identifiers (HI) Service** over **JAX Traffic uses **HTTPS with mutual TLS** and **signed** SOAP. You need ADHA / Services Australia **registration**, test or production **certificates**, and **endpoint URLs** before live calls succeed. +Registration: https://implementer.digitalhealth.gov.au/resources/hi-service-registration-and-certificates + --- ## Terms @@ -17,63 +19,71 @@ Traffic uses **HTTPS with mutual TLS** and **signed** SOAP. You need ADHA / Serv | IHI | Individual Healthcare Identifier. | | HPI-I | Healthcare Provider Identifier - Individual. | | HPI-O | Healthcare Provider Identifier - Organisation. | -| NEHTA | Historical agency name; package namespaces may still use `nehta`. | - -Registration: https://implementer.digitalhealth.gov.au/resources/hi-service-registration-and-certificates +| NEHTA | Name used in Java package namespaces (`nehta`). | --- ## Dependency -Add the artifact from [Maven Central](https://central.sonatype.com/). Use a **``** that matches your JDK and API stack (see **Release lines**). +Add the artifact from [Maven Central](https://central.sonatype.com/). Use a **``** that matches your JDK (see **Versioning**). ```xml au.gov.nehta hi-b2b-client - 1.6.3 + 11.0.0.1 ``` -**This line (`1.6.3`):** Java **8**, **`javax.xml.ws`** / **`javax.xml.bind`**, **14** standard HI B2B facade clients. Add **`com.sun.xml.ws:jaxws-rt`** **2.3.7** at runtime in your application. +**This line (`11.0.0.1`):** Java **11**, **Jakarta** XML WS / Bind, **26** full MCA facade clients. Transitive runtime includes **`com.sun.xml.ws:jaxws-rt`** (Jakarta). No separate JDK SOAP install is required. Pair with **`au.gov.nehta:hi-wsdl`** **`11.0.0.1`**. + +SOAP application code uses **`jakarta.xml.ws`**, **`jakarta.xml.bind`**, and related Jakarta APIs. Java SE types such as **`javax.net.ssl`** and **`javax.xml.datatype.XMLGregorianCalendar`** are unchanged. --- -## Release lines +## Versioning -| Version | Java | APIs | Facade clients | -| ------- | ---- | ---- | -------------- | -| **1.6.3** | 8 | **`javax.xml.ws`**, **`javax.xml.bind`** | **14** (standard HI B2B) | -| **1.6.5** | 11 | **Jakarta** XML WS / Bind | **14** (standard HI B2B) | -| **1.7.0** | 11 | **Jakarta** XML WS / Bind | **26** (full MCA) | +The **first number** of the Maven version is the **Java SE** version that line targets. **`hi-b2b-client`** and **`hi-wsdl`** always use the **same** version on a given line (same SNAPSHOT or GA). + +| Maven version | Java SE | APIs | Facade clients | +| ------------- | ------- | ---- | -------------- | +| **8.0.0.1** | **8** | **`javax.xml.ws`**, **`javax.xml.bind`** | **14** (standard HI B2B) | +| **11.0.0.1** | **11** | **Jakarta** XML WS / Bind | **26** (full MCA) | +| **17.0.0.1** | **17** | **Jakarta** XML WS / Bind | **26** (full MCA) | +| **21.0.0.1** | **21** | **Jakarta** XML WS / Bind | **26** (full MCA) | +| **24.0.0.1** | **24** | **Jakarta** XML WS / Bind | **26** (full MCA) | + +Pick the coordinate that matches your JDK. Do not mix **`hi-b2b-client`** and **`hi-wsdl`** versions. All published versions are on **[Maven Central](https://central.sonatype.com/)**. + +--- -All published versions are on **[Maven Central](https://central.sonatype.com/)**. +## Note -SOAP application code on **`1.6.3`** uses **`javax.xml.ws`**, **`javax.xml.bind`**, and related **`javax`** APIs. SOAP types come from **`au.gov.nehta:hi-wsdl`** at the same version when both artifacts are on the classpath. +The **11.0.0.1** line uses **Jakarta** and exposes all **26** facades (full MCA). **8.0.0.1** is **`javax`** with **14** facades (standard HI B2B only). --- ## Licensed WSDL and XSD (runtime) -The published JAR does **not** contain HI WSDL or XSD files. You must obtain the ADHA/Services Australia bundle under your licence and make it available at runtime. +The published JAR does **not** contain HI WSDL or XSD files. Obtain the ADHA/Services Australia bundle under your licence and make it available at runtime. -1. Download from https://healthsoftware.humanservices.gov.au/claiming/ext-vnd/ (see **`wsdls/readme.txt`**). -2. Install so one directory has **immediate** children **`wsdl/`** and **`schema/`** (lowercase). +1. Download from https://healthsoftware.humanservices.gov.au/claiming/ext-vnd/ (layout details: **`wsdls/README.md`**). +2. Install so one directory has **immediate** children **`wsdl/`** and **`schema/`** (lowercase; case-sensitive on some hosts). -Point the library at that directory using **`au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot`**. Resolution order (first match wins): +Point the library at that directory with **`au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot`**. Resolution order (first match wins): 1. **`HiWsdlArtifactRoot.setRoot(Path)`** 2. Environment variable **`HI_WSDL_ARTIFACT_ROOT`** -3. Key **`HI_WSDL_ARTIFACT_ROOT`** in **`local.properties`** in the JVM **working directory** (`user.dir`) -4. JVM system property **`-DHI_WSDL_ARTIFACT_ROOT=...`** +3. JVM system property **`-DHI_WSDL_ARTIFACT_ROOT=...`** +4. Key **`HI_WSDL_ARTIFACT_ROOT`** in a **`local.properties`** file in the JVM working directory (**`user.dir`**), if present Optional: place WSDL on the application classpath under your licence (fallback when no root is configured). -**`hi.wsdl.tree.root`** and **`HI_WSDL_TREE_ROOT`** are used only when **building this project from source**; they are not read at runtime. See **`CONTRIBUTING.md`** and **`wsdls/readme.txt`**. +See **`wsdls/README.md`** for property names and directory layout. --- -## What you configure in your application +## Application configuration Construct a facade client (for example **`ConsumerSearchIHIClient`**) with: @@ -85,13 +95,13 @@ Construct a facade client (for example **`ConsumerSearchIHIClient`**) with: | Product / vendor / user qualified IDs | Values issued for your software product. | | WSDL root | As above (`HiWsdlArtifactRoot` or equivalent). | -Load keystores, truststores, and identifiers from your platform (secrets manager, environment, or config files). Do not commit credentials to source control (**`SECURITY.md`**). +Load keystores, truststores, and identifiers from your platform (secrets manager, environment, or configuration files). Do not commit credentials to source control (**`SECURITY.md`**). -Keystore paths in **`.properties`** files: prefer forward slashes (`./config/keystore.jks`). +Use **forward slashes** in filesystem paths inside property files (for example `./config/keystore.jks`) so the same values work on Windows, macOS, and Linux. -### Optional `local.properties` keys +### Configuration keys (optional) -If **`local.properties`** exists in **`user.dir`**, the library reads **`HI_WSDL_ARTIFACT_ROOT`** from it (see **`local.properties.example`**). The same property names are used by **this repository's** integration tests when you build from a checkout (**`CONTRIBUTING.md`**); your production app may use different configuration. +If you use a **`local.properties`** file in **`user.dir`**, the library reads **`HI_WSDL_ARTIFACT_ROOT`** and related keys documented in **`local.properties.example`** (template for integrators and for this repository's tests). | Key | Purpose | | --- | --- | @@ -104,22 +114,22 @@ If **`local.properties`** exists in **`user.dir`**, the library reads **`HI_WSDL | **`HI_MEDICARE_ENDPOINT_BASE`** | SOAP base URL (cert environment example in **`local.properties.example`**). | | **`HI_USER_*`**, **`HI_VENDOR_*`**, **`HI_HPIO_*`**, **`HI_PRODUCT_*`** | Registration metadata. | -Copy **`local.properties.example`** to **`local.properties`**, fill in values, and keep **`local.properties`** out of Git. +Your production application may use environment variables or a secrets store instead of **`local.properties`**. --- ## Client classes -Package base: **`au.gov.nehta.vendorlibrary.hi`**. This artifact line (**1.6.3**) exposes **14** standard HI B2B facade classes. Full MCA coverage (**26** stubs) is version **1.7.0**. +Package base: **`au.gov.nehta.vendorlibrary.hi`**. Version **11.0.0.1** exposes **26** facade classes: | Area | Classes | | ---- | ------- | -| **IHI** (`ihi`) | `ConsumerSearchIHIClient`, `ConsumerSearchIHIBatchSyncClient` | -| **HPI-I** (`hpii`) | `ProviderSearchForProviderIndividualClient`, `ProviderSearchHIProviderDirectoryForIndividualClient`, `SearchForProviderIndividualBatchAsyncClient` | +| **IHI** (`ihi`) | `ConsumerSearchIHIClient`, `ConsumerSearchIHIBatchSyncClient`, `ConsumerSearchIHIBatchAsyncClient`, `ConsumerCreateProvisionalIHIClient`, `ConsumerMergeProvisionalIHIClient`, `ConsumerUpdateProvisionalIHIClient`, `ConsumerCreateUnverifiedIHIClient`, `ConsumerResolveProvisionalIHIClient`, `ConsumerNotifyDuplicateIHIClient`, `ConsumerNotifyReplicaIHIClient`, `ConsumerUpdateIHIClient`, `ConsumerCreateVerifiedIHIClient` | +| **HPI-I** (`hpii`) | `ProviderSearchForProviderIndividualClient`, `ProviderSearchHIProviderDirectoryForIndividualClient`, `SearchForProviderIndividualBatchAsyncClient`, `ProviderManageTdsProviderIndividualClient`, `ProviderSearchTdsProviderIndividualClient` | | **HPI-O** (`hpio`) | `ProviderSearchForProviderOrganisationClient`, `ProviderSearchHIProviderDirectoryForOrganisationClient`, `SearchForProviderOrganisationBatchAsyncClient`, `ProviderReadProviderOrganisationClient`, `ProviderReadAdministrativeIndividualClient`, `ProviderManageProviderOrganisationClient`, `ProviderManageProviderDirectoryEntryClient`, `ProviderManageProviderAdministrativeIndividualClient` | | **Reference data** | `ReadReferenceDataClient` | -Samples under **`src/sample/java`** (`...hi.sample`) are not on the default classpath; see **`CONTRIBUTING.md`** to compile them from a source checkout. +Published Javadoc is attached to releases on Maven Central. --- @@ -134,7 +144,7 @@ Samples under **`src/sample/java`** (`...hi.sample`) are not on the default clas | **`basicMedicareSearch`** | Medicare card number | **IHI number**, DVA, address blocks | | **`basicDvaSearch`** | DVA file number | **IHI number**, Medicare, address blocks | -Address searches (`australianPostalAddressSearch`, `australianStreetAddressSearch`, `internationalAddressSearch`) also require **`ihiNumber`** to be unset. Use **`detailedSearch`** for demographics-only lookup, not **`basicSearch`**. +Address searches (`australianPostalAddressSearch`, `australianStreetAddressSearch`, `australianUnstructuredStreetAddressSearch`, `internationalAddressSearch`) also require **`ihiNumber`** to be unset. Structured Australian street search requires **`streetType`** when **`streetNumber`** is set, and must not include an unstructured address. Use **`detailedSearch`** for demographics-only lookup, not **`basicSearch`**. Batch sync/async clients apply the same rules in **`SearchBatch.ArgumentValidator`**. @@ -142,13 +152,12 @@ Batch sync/async clients apply the same rules in **`SearchBatch.ArgumentValidato ## Further reading -| Document | Content | -| -------- | ------- | -| **`wsdls/readme.txt`** | WSDL download, layout, runtime property names | +| Document | Audience | +| -------- | -------- | +| **`wsdls/README.md`** | Licensed WSDL/XSD layout and runtime properties | | **`SECURITY.md`** | Secrets and reporting | | **`CONTRIBUTING.md`** | Building or changing this repository from source | | **`MAINTAINERS.md`** | Release and build internals | -| Javadoc | Attached to releases on Maven Central | --- diff --git a/SECURITY.md b/SECURITY.md index d66cbf2..ccc155d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,12 +1,19 @@ # Security +## If you integrate this library + +Do **not** embed mutual-TLS private keys, keystore passwords, or production HI URLs in source control in **your** application. Load secrets from your platform's vault, environment, or secure configuration. The **`local.properties`** pattern in this repository applies only to **this repository's** tests (see **`local.properties.example`**). + ## Reporting issues -Report security-sensitive findings through your organisation's usual channel for **ADHA / AuDigitalHealth** repositories (do not open a public issue with exploit details before it is triaged). +For **security vulnerabilities in this library** (not routine support): + +1. Prefer **GitHub private vulnerability reporting** for this repository if it is enabled (**Security** tab -> **Report a vulnerability**). +2. Otherwise use your organisation's usual channel for **ADHA / AuDigitalHealth** repositories. Do **not** post exploit details, live credentials, or production URLs in a **public issue** before triage. ## This repository - **Do not commit secrets to git.** That includes passwords, API tokens, private keys, real mutual-TLS keystores, production or staging HI endpoint URLs with embedded credentials, and Services Australia / vendor registration material - even inside comments, test fixtures, sample code, or documentation that is tracked in this repository. -- **`local.properties`** is gitignored. Never commit real HI credentials, keystores, or vendor registration material. -- **`settings.xml`** (copy of **`settings.xml.example`**) is gitignored when placed at the repository root; do not commit machine-specific **`hi.wsdl.tree.root`** or credentials there. -- **`src/test/resources/`** paths such as **`keystore.jks`** / **`truststore.jks`** appear in **`local.properties.example`** and test constants; they are **not** committed when absent. Create keystores locally or point **`HI_*`** at your registration material. Do not commit real keystores or production keys. In **`local.properties`** and similar Java property files, prefer **forward slashes** in filesystem paths so the same values work on **Windows**, **macOS**, and **Linux**. +- **Licensed HI WSDL/XSD** (see **README.md**, **CONTRIBUTING.md**, and **wsdls/README.md**) are required at **`hi.wsdl.tree.root`** (default **`wsdls/xml`** next to **`pom.xml`**) to build from source. The published **`hi-b2b-client`** JAR does **not** include **`*.wsdl`**. If your organisation or vendor terms treat those files as non-public, do not push them to a public repository; install them on build agents or developer machines from an approved channel instead. +- **Local configuration templates:** **`settings.xml.example`** (Maven user settings; **`hi.wsdl.tree.root`**) and **`local.properties.example`** (runtime / test configuration; **`HI_WSDL_ARTIFACT_ROOT`** plus other **`HI_*`** keys) are tracked in Git as **templates**. Copy them to **`settings.xml`** and **`local.properties`** respectively, fill in your values, and keep the copies **local-only**. **`local.properties`** is gitignored; treat **`settings.xml`** the same way. **Never** commit the populated copies, real HI credentials, keystores, or vendor registration material to this repository or any other source control repository - public or private. See **`wsdls/README.md`** -> **Template files**. +- **`src/test/resources/*.jks`** and **`src/sample/resources/*.jks`** in this tree are **test / sample placeholders** with documented defaults (see **`local.properties.example`** and **`README.md`**). Do not use them for production endpoints or production keys. diff --git a/WSDL-CLIENT-PURPOSES.md b/WSDL-CLIENT-PURPOSES.md new file mode 100644 index 0000000..1e0d5d6 --- /dev/null +++ b/WSDL-CLIENT-PURPOSES.md @@ -0,0 +1,106 @@ +# WSDL functionality by client purpose (HI vs myHR) + +Cross-repo reference for **Healthcare Identifiers (HI)** and **My Health Record (PCEHR / myHR)** B2B SOAP contracts. These are separate national services: different WSDL trees, different Maven artifacts, and no shared SOAP operations. + +| | **hi-b2b-client-java** | **mhr-b2b-client-java** | +|---|---|---| +| **National service** | Healthcare Identifiers (HI) Service | My Health Record (PCEHR / myHR) B2B | +| **WSDL prefix** | `HI_*` (Medicare Australia (MCA) licensed bundle) | `B2B_*` under `wsdls/src/main/resources/wsdl/External/` | +| **Identifiers handled** | IHI, HPI-I, HPI-O | Individual myHR record (IHI as context in headers, not managed here) | +| **Typical use** | Look up / validate / manage healthcare identifiers | Access record, register consumer, upload/retrieve documents, read views | +| **Service WSDLs codegen'd** | **26** (+ paired `*Interface` WSDLs in licensed bundle) | **12** `B2B_*` services | +| **Facade classes** | **26** in **`11.0.0.1`**; **14** in **`8.0.0.1`** | +| **Maven artifact** | `au.gov.nehta:hi-b2b-client` | `au.gov.nehta:mhr-b2b-client` | + +Apps needing both depend on **two libraries**. HI-only detail: **`CLIENT-FEATURES.md`** in this repo. MHR third-party scope: **`ADHA-THIRD-PARTY-SCOPE.md`** in `mhr-b2b-client-java`. Three-client matrix: **`WSDL-CLIENT-PURPOSES.md`** in `myhr-b2b-client-java`. + +--- + +## HI (`hi-b2b-client-java`) - MCA `HI_*` WSDL + +Grouped by **client purpose**. WSDL filenames in the licensed bundle include version suffixes (e.g. `HI_ConsumerSearchIHI-3.0.wsdl`); logical names below omit versions. + +| Purpose | WSDL service | What it does | Java facade | In **`8.0.0.1`** (14 facades) | +|---|---|---|---|:---:| +| **IHI - search** | `HI_ConsumerSearchIHI` | Find/validate an individual's IHI (by IHI, Medicare, DVA, or demographics) | `ConsumerSearchIHIClient` | Yes | +| **IHI - batch search** | `HI_ConsumerSearchIHIBatchSync` | Synchronous batch IHI search | `ConsumerSearchIHIBatchSyncClient` | Yes | +| **IHI - batch search** | `HI_ConsumerSearchIHIBatchAsync` | Submit/retrieve async batch IHI search | `ConsumerSearchIHIBatchAsyncClient` | **`11.0.0.1` only** | +| **IHI - create** | `HI_ConsumerCreateProvisionalIHI` | Create provisional IHI | `ConsumerCreateProvisionalIHIClient` | **`11.0.0.1` only** | +| **IHI - update** | `HI_ConsumerUpdateProvisionalIHI` | Update provisional IHI | `ConsumerUpdateProvisionalIHIClient` | **`11.0.0.1` only** | +| **IHI - merge** | `HI_ConsumerMergeProvisionalIHI` | Merge provisional IHIs | `ConsumerMergeProvisionalIHIClient` | **`11.0.0.1` only** | +| **IHI - resolve** | `HI_ConsumerResolveProvisionalIHI` | Resolve provisional IHI | `ConsumerResolveProvisionalIHIClient` | **`11.0.0.1` only** | +| **IHI - create** | `HI_ConsumerCreateUnverifiedIHI` | Create unverified IHI | `ConsumerCreateUnverifiedIHIClient` | **`11.0.0.1` only** | +| **IHI - create** | `HI_ConsumerCreateVerifiedIHI` | Create verified IHI | `ConsumerCreateVerifiedIHIClient` | **`11.0.0.1` only** | +| **IHI - update** | `HI_ConsumerUpdateIHI` | Update IHI details | `ConsumerUpdateIHIClient` | **`11.0.0.1` only** | +| **IHI - notify** | `HI_ConsumerNotifyDuplicateIHI` | Notify duplicate IHI | `ConsumerNotifyDuplicateIHIClient` | **`11.0.0.1` only** | +| **IHI - notify** | `HI_ConsumerNotifyReplicaIHI` | Notify replica IHI | `ConsumerNotifyReplicaIHIClient` | **`11.0.0.1` only** | +| **HPI-I - search** | `HI_ProviderSearchForProviderIndividual` | Search provider individual (HPI-I) | `ProviderSearchForProviderIndividualClient` | Yes | +| **HPI-I - directory search** | `HI_ProviderSearchHIProviderDirectoryForIndividual` | Search HI provider directory for individual | `ProviderSearchHIProviderDirectoryForIndividualClient` | Yes | +| **HPI-I - batch search** | `HI_ProviderBatchAsyncSearchForProviderIndividual` | Async batch search for provider individual | `SearchForProviderIndividualBatchAsyncClient` | Yes | +| **HPI-I - TDS search** | `HI_ProviderSearchTdsProviderIndividual` | Search TDS provider individual | `ProviderSearchTdsProviderIndividualClient` | **`11.0.0.1` only** | +| **HPI-I - TDS manage** | `HI_ProviderManageTdsProviderIndividual` | Manage TDS provider individual | `ProviderManageTdsProviderIndividualClient` | **`11.0.0.1` only** | +| **HPI-O - search** | `HI_ProviderSearchForProviderOrganisation` | Search provider organisation (HPI-O) | `ProviderSearchForProviderOrganisationClient` | Yes | +| **HPI-O - directory search** | `HI_ProviderSearchHIProviderDirectoryForOrganisation` | Search HI provider directory for organisation | `ProviderSearchHIProviderDirectoryForOrganisationClient` | Yes | +| **HPI-O - batch search** | `HI_ProviderBatchAsyncSearchForProviderOrganisation` | Async batch search for organisation | `SearchForProviderOrganisationBatchAsyncClient` | Yes | +| **HPI-O - read** | `HI_ProviderReadProviderOrganisation` | Read provider organisation details | `ProviderReadProviderOrganisationClient` | Yes | +| **HPI-O - read** | `HI_ProviderReadProviderAdministrativeIndividual` | Read administrative individual | `ProviderReadAdministrativeIndividualClient` | Yes | +| **HPI-O - manage** | `HI_ProviderManageProviderOrganisation` | Manage provider organisation | `ProviderManageProviderOrganisationClient` | Yes | +| **HPI-O - manage** | `HI_ProviderManageProviderDirectoryEntry` | Manage provider directory entry | `ProviderManageProviderDirectoryEntryClient` | Yes | +| **HPI-O - manage** | `HI_ProviderManageProviderAdministrativeIndividual` | Manage administrative individual | `ProviderManageProviderAdministrativeIndividualClient` | Yes | +| **Reference data** | `HI_ProviderReadReferenceData` | Read HI reference data (codes, lists) | `ReadReferenceDataClient` | Yes | + +**Notes** + +- Each service WSDL has a paired `*Interface` WSDL in the licensed bundle; facades bind to the service WSDL. +- **`11.0.0.1`** exposes all **26** rows above. **`8.0.0.1`** exposes the rows marked **Yes** in the last column only. + +--- + +## myHR / PCEHR (`mhr-b2b-client-java`) - `B2B_*` WSDL + +Grouped by **client purpose**. All **12** WSDLs are codegen'd from `wsdls/src/main/resources/wsdl/External/`; **15** facade classes wrap them. + +| Purpose | WSDL | SOAP / functional capability | Java facade(s) | +|---|---|---|---| +| **Record access** | `B2B_PCEHRProfile` | Check whether a myHR exists for an individual | `DoesPCEHRExistClient` | +| **Record access** | `B2B_PCEHRProfile` | Gain access to a consumer's myHR (incl. access code flow) | `GainPCEHRAccessClient` | +| **Registration** | `B2B_RegisterPCEHR` | Register a consumer for myHR | `RegisterPCEHRClient` | +| **Document exchange - registry** | `B2B_DocumentRegistry` | Register document metadata (XDS.b); also used to **list** documents in the record | `UploadDocumentMetadataClient`, `GetDocumentListClient` | +| **Document exchange - repository** | `B2B_DocumentRepository` | Upload document content (Provide & Register, **MTOM**) | `UploadDocumentClient` | +| **Document exchange - repository** | `B2B_DocumentRepository` | Retrieve document content (Retrieve Document Set) | `GetDocumentClient` | +| **Document exchange - removal** | `B2B_RemoveDocument` | Remove a document from the record | `RemoveDocumentClient` | +| **Clinical / record views** | `B2B_GetView` | Third-party view types (7): health record overview, Medicare overview, pathology, diagnostic imaging, observations, prescriptions/dispenses, health check schedule - see **`ADHA-THIRD-PARTY-SCOPE.md`** in `mhr-b2b-client-java` | `GetViewClient` | +| **Record views - individual** | `B2B_GetIndividualDetailsView` | Individual details held in myHR | `GetIndividualDetailsViewClient` | +| **Record views - representatives** | `B2B_GetRepresentativeList` | List authorised representatives | `GetRepresentativeListClient` | +| **Record views - audit** | `B2B_GetAuditView` | Audit trail view | `GetAuditViewClient` | +| **Record views - change history** | `B2B_GetChangeHistoryView` | Change history view | `GetChangeHistoryViewClient` | +| **Templates - read** | `B2B_GetTemplate` | Fetch a document template | `GetTemplateClient` | +| **Templates - search** | `B2B_SearchTemplate` | Search available templates | `SearchTemplateClient` | + +**Notes** + +- Document flows use **IHE XDS.b** (`DocumentRegistry` / `DocumentRepository`) plus PCEHR-specific remove/register/view WSDLs. +- `GetViewClient` is one facade over **`B2B_GetView`** with typed overloads for each supported view type (see **`ADHA-THIRD-PARTY-SCOPE.md`** in `mhr-b2b-client-java`). + +--- + +## Side-by-side: what each library is for + +| Client purpose | HI (`hi-b2b-client`) | myHR (`mhr-b2b-client`) | +|---|---|---| +| **Person identifier lookup / validation** | Yes - IHI search & lifecycle | No (uses IHI as record key only) | +| **Provider person (HPI-I)** | Search, directory, batch, TDS | No | +| **Provider organisation (HPI-O)** | Search, read, manage org/directory/admin | No | +| **Reference / code lists** | `ReadReferenceData` | No | +| **Consumer myHR registration** | No | `RegisterPCEHRClient` | +| **Check / open myHR access** | No | `DoesPCEHRExist`, `GainPCEHRAccess` | +| **Upload / download clinical documents** | No | XDS registry + repository (+ MTOM upload) | +| **Remove documents from myHR** | No | `RemoveDocumentClient` | +| **Clinical summaries & record views** | No | Multiple `Get*View` clients | +| **Document templates** | No | `GetTemplate`, `SearchTemplate` | + +--- + +## Typical integration flow + +Many myHR B2B calls require an **IHI** (and often HPI-I / HPI-O) in SOAP headers. That identifier is usually obtained via **`hi-b2b-client`**, then passed into **`mhr-b2b-client`** facades - two artifacts, one application workflow. diff --git a/build.bat b/build.bat index dbcc2a8..271037d 100644 --- a/build.bat +++ b/build.bat @@ -1,4 +1,7 @@ @echo off +REM Build from source: mvn clean verify from repository root. +REM WSDL tree override: HI_WSDL_TREE_ROOT or -Dhi.wsdl.tree.root=... (see CONTRIBUTING.md). +REM Optional: set MVN_SETTINGS to path to Maven user settings file (-s). setlocal set "P=" if /i "%~1"=="shaded" set "P=-Pfat-jar " diff --git a/build.sh b/build.sh index e46918c..8334fc0 100644 --- a/build.sh +++ b/build.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash -# Build from source: mvn clean verify from repository root. Override WSDL tree with -# HI_WSDL_TREE_ROOT or -Dhi.wsdl.tree.root=... (see CONTRIBUTING.md). Optional: MVN_SETTINGS for -s. +# Build from source: mvn clean verify from repository root. +# WSDL tree override: HI_WSDL_TREE_ROOT or -Dhi.wsdl.tree.root=... (see CONTRIBUTING.md). +# Optional: MVN_SETTINGS=path/to/settings.xml set -euo pipefail cd "$(dirname "$0")" extra=() diff --git a/local.properties.example b/local.properties.example index 45eb865..a3d2944 100644 --- a/local.properties.example +++ b/local.properties.example @@ -1,107 +1,50 @@ # Copyright 2011 NEHTA; Copyright 2021-2026 ADHA. Apache-2.0 - see LICENSE.md. # -# Copy to "local.properties" in the project root (next to pom.xml) and fill in values. -# For Maven, also copy settings.xml.example -> settings.xml if you use mvn -s settings.xml (see CONTRIBUTING.md). - -# "local.properties" is gitignored - never commit it. - -# - -# These keys configure the INTEGRATION TESTS in this repo: paths to keystores, - -# passwords, SOAP endpoint URLs, and product/vendor identifiers for Australia's - -# Healthcare Identifiers (HI) SOAP services. You need ADHA/Services Australia - -# vendor registration to obtain real values - see README.md. - -# - -# Java Properties format: key=value (one per line). UTF-8. Escape : and = in values with \. - -# Use forward slashes in filesystem paths (e.g. HI_KEYSTORE_PATH) so the same file works on Windows, macOS, and Linux. - -# Same names can be set as environment variables; if both are set, env wins. - -# See README.md -> "Build and test". - -# - -# --- HI WSDL / XSD tree (runtime; hi-b2b-client reads this via HiWsdlArtifactRoot) --- - -# Directory whose immediate children include lowercase wsdl/ and schema/ (Services Australia bundle layout). -# Same key as environment variable and JVM system property. Not used by the Maven compile classpath (hi-wsdl from Central). +# Copy to local.properties beside the JVM working directory (gitignored). +# Used by HiWsdlArtifactRoot (HI_WSDL_ARTIFACT_ROOT) and by this repo's integration tests. +# See README.md (runtime) and CONTRIBUTING.md (building and testing this repository). HI_WSDL_ARTIFACT_ROOT=./wsdls/xml -# - -# --- Keystore (TLS client cert + often SOAP signing key) --- - HI_KEYSTORE_TYPE=JKS - HI_KEYSTORE_PATH=./src/test/resources/keystore.jks - HI_KEYSTORE_PASSWORD= - HI_KEY_PASSWORD= -# Private key entry alias inside the keystore (IHI tests vs HPI-I/HPI-O tests may differ): +# PKCS12 from your ADHA registration pack (see CONTRIBUTING.md): +# HI_KEYSTORE_TYPE=PKCS12 +# HI_KEYSTORE_PATH=./certs//fac_sign.p12 +# HI_KEYSTORE_PASSWORD= +# HI_KEY_PASSWORD= HI_KEY_ALIAS_MEDICARE= - HI_KEY_ALIAS_MEDICARE_IHI= - HI_KEY_ALIAS_MEDICARE_HPIO= - HI_KEY_ALIAS_MEDICARE_CSP= - HI_KEY_ALIAS_DRP= -# - -# --- Truststore (CA certs so the JVM trusts the HI service HTTPS server) --- - HI_TRUSTSTORE_TYPE=JKS - HI_TRUSTSTORE_PATH=./src/test/resources/truststore.jks - HI_TRUSTSTORE_PASSWORD= -# - -# --- Service endpoints (SOAP base / DRP-style URLs in tests - replace per your registration) --- - HI_MEDICARE_ENDPOINT_BASE=https://www5.medicareaustralia.gov.au/cert/soap/services/ HI_DRP_IHI_SEARCH_ENDPOINT_URL= - HI_DRP_HPII_SEARCH_ENDPOINT_URL= - HI_DRP_HPIO_SEARCH_ENDPOINT_URL= -# - -# --- Product / vendor identifiers (as issued for your software product) --- - HI_USER_QUALIFIER= - HI_USER_QUALIFIED_ID= HI_VENDOR_QUALIFIER= - HI_VENDOR_QUALIFIED_ID= HI_HPIO_QUALIFIER= - HI_HPIO_QUALIFIED_ID= HI_NEHTA_HPIO_QUALIFIER= - HI_NEHTA_HPIO_QUALIFIED_ID= HI_PRODUCT_NAME= - HI_PRODUCT_VERSION= - HI_PRODUCT_PLATFORM= diff --git a/pom.xml b/pom.xml index eff1047..149034f 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ au.gov.nehta hi-b2b-client - 1.6.4-SNAPSHOT + 11.0.0.1-SNAPSHOT HI B2B client Example client implementations of Healthcare Identifiers (HI) service https://github.com/AuDigitalHealth/hi-b2b-client-java @@ -17,7 +17,7 @@ Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0.txt + http://www.apache.org/licenses/LICENSE-2.0.txt repo @@ -27,8 +27,8 @@ Admin Open Source admin.opensource@digitalhealth.gov.au Australian Digital Health Agency - https://www.digitalhealth.gov.au/ - https://www.digitalhealth.gov.au/ + www.digitalhealth.gov.au + www.digitalhealth.gov.au Admin @@ -43,15 +43,6 @@ ${scm.tag} - - GitHub - https://github.com/AuDigitalHealth/hi-b2b-client-java/issues - - - GitHub Actions - https://github.com/AuDigitalHealth/hi-b2b-client-java/actions - - central @@ -64,7 +55,7 @@ - 8 + 11 UTF-8 ${encoding} ${encoding} @@ -72,6 +63,10 @@ ${encoding} false true + 3.1.4 + 3.3.1 + 0.9.0 + 3.2.8 https://github.com/AuDigitalHealth/hi-b2b-client-java.git HEAD @@ -83,63 +78,45 @@ true true [maven-release-plugin] - - 2.3.7 - 4.13.2 - 3.5.0 - 3.15.0 - 3.5.5 - 3.12.0 - 3.4.0 - 3.1.4 - 3.3.1 - 0.9.0 - 3.6.1 - 3.2.8 - 0.8.14 - 1.2.1 - 1.2.1 - 3.6.2 - + + 4.0.4 + 4.0.2 + + 4.0.9 + + 4.0.32 + + false + + ${project.basedir}/wsdls/xml + ${project.version} - 3.5.0 - 3.6.2 - - -Xmx1024m - + 3.6.2 + - - au.gov.nehta - common-library - ${nehta.lib.version} - - - com.sun.xml.ws - webservices-rt - - - au.gov.nehta smi-xsp - ${nehta.xsp.lib.version} + 1.2.1 + com.sun.xml.ws jaxws-rt - ${ee4j.jaxws.version} - - - au.gov.nehta - hi-wsdl - ${hi.wsdl.version} + ${jaxws.rt.version} junit junit - ${junit.version} + 4.13.2 + test + + + com.h2database + h2 + 2.2.224 test @@ -149,13 +126,57 @@ org.apache.maven.plugins maven-clean-plugin - ${plugin.clean.version} + 3.5.0 true false true + + org.apache.maven.plugins + maven-enforcer-plugin + 3.6.2 + + + enforce-build-tooling + validate + enforce + + + + [3.6.3,) + + + + com.sun.xml.ws:webservices-rt + com.sun.xml.ws:webservices-api + javax.xml.ws:* + javax.xml.bind:* + + Use Eclipse EE4J jaxws-rt, not legacy Metro / javax JAX-WS. + + + + + + require-licensed-wsdl-tree + initialize + enforce + + ${hi.wsdl.codegen.skip} + + + + ${hi.wsdl.tree.root}/wsdl/consumer/20100731/HI_ConsumerSearchIHI-3.0.wsdl + + This build requires the licensed HI WSDL/XSD tree under hi.wsdl.tree.root (directory containing wsdl/ and schema/). Resolution order: -Dhi.wsdl.tree.root, env HI_WSDL_TREE_ROOT, hi.wsdl.tree.root from an active Maven user-settings profile, else default ${project.basedir}/wsdls/xml. (HI_WSDL_ARTIFACT_ROOT is runtime-only.) Use -Phi-wsdl-artifact to skip wsimport and use au.gov.nehta:hi-wsdl instead (Maven Central or mvn install). + + + + + + org.apache.maven.plugins maven-gpg-plugin @@ -165,7 +186,7 @@ - sign-artifacts + sign-artefacts verify sign @@ -176,13 +197,15 @@ org.apache.maven.plugins maven-javadoc-plugin - ${plugin.javadoc.version} + 3.12.0 false + true + false none false ${encoding} - 8 + ${maven.compiler.release} @@ -196,7 +219,7 @@ org.apache.maven.plugins maven-source-plugin - ${plugin.source.version} + 3.4.0 attach-sources @@ -224,42 +247,22 @@ true - - org.apache.maven.plugins - maven-enforcer-plugin - ${plugin.enforcer.version} - - - enforce-build-tooling - - enforce - - - - - [3.6.3,) - - - - - - maven-surefire-plugin - ${plugin.surefire.version} + 3.5.5 ${skipTests} UTF-8 true - ${argLine} - - fromSurefireEnv - + -Xmx1024m **/TimeUtilityTest.java **/TestConfigurationTest.java + **/JdbcTransactionTestRuleTest.java **/HiWsdlArtifactRootTest.java + **/HiWsdlArtifactSmokeTest.java + **/HiRequestElementOrderParityTest.java **/ConsumerSearchIHIClientArgumentValidatorTest.java @@ -282,14 +285,11 @@ maven-compiler-plugin - ${plugin.compiler.version} + 3.15.0 ${maven.compiler.release} ${project.build.sourceEncoding} none - - -Xlint:unchecked - true lines,vars,source true @@ -299,13 +299,549 @@ org.apache.maven.plugins maven-jar-plugin - ${plugin.jar.version} + 3.4.2 + **/*.wsdl + + org.codehaus.gmavenplus + gmavenplus-plugin + 4.3.1 + + + purge-wsimport-when-artifact + initialize + execute + + + + + + + + configure-hi-wsdl-tree-root + initialize + execute + + ${hi.wsdl.codegen.skip} + + + + + + + merge-and-strip-wsimport + process-sources + execute + + ${hi.wsdl.codegen.skip} + + + + + + + + + org.apache.groovy + groovy + ${groovy.version} + runtime + + + org.apache.groovy + groovy-ant + ${groovy.version} + runtime + + + + + com.sun.xml.ws + jaxws-maven-plugin + ${jaxws.maven.plugin.version} + + + com.sun.xml.ws + jaxws-tools + ${jaxws.rt.version} + + + org.glassfish.jaxb + jaxb-xjc + ${jaxb.xjc.version} + + + + ${hi.wsdl.codegen.skip} + true + true + true + ${project.build.sourceEncoding} + + -XautoNameResolution + + + + -Djavax.xml.accessExternalSchema=all + -Djava.io.tmpdir=${project.build.directory}/jaxws/tmp + + + + + wsimport-consumer-search-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-search-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-search-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-search-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100731 + HI_ConsumerSearchIHI-3.0.wsdl + HI_ConsumerSearchIHI-3.0.wsdl + + + + wsimport-consumer-search-ihi-batch-sync + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-search-ihi-batch-sync + ${project.build.directory}/jaxws/stale-wsimport-consumer-search-ihi-batch-sync + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-search-ihi-batch-sync + ${hi.wsdl.tree.root}/wsdl/consumer/20100731 + HI_ConsumerSearchIHIBatchSync-3.0.wsdl + HI_ConsumerSearchIHIBatchSync-3.0.wsdl + + + + wsimport-provider-batch-async-individual + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-batch-async-individual + ${project.build.directory}/jaxws/stale-wsimport-provider-batch-async-individual + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-batch-async-individual + ${hi.wsdl.tree.root}/wsdl/provider/20130622 + HI_ProviderBatchAsyncSearchForProviderIndividual-5.1.0.wsdl + HI_ProviderBatchAsyncSearchForProviderIndividual-5.1.0.wsdl + + + + wsimport-provider-batch-async-organisation + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-batch-async-organisation + ${project.build.directory}/jaxws/stale-wsimport-provider-batch-async-organisation + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-batch-async-organisation + ${hi.wsdl.tree.root}/wsdl/provider/20130622 + HI_ProviderBatchAsyncSearchForProviderOrganisation-5.1.0.wsdl + HI_ProviderBatchAsyncSearchForProviderOrganisation-5.1.0.wsdl + + + + wsimport-provider-search-individual + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-search-individual + ${project.build.directory}/jaxws/stale-wsimport-provider-search-individual + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-search-individual + ${hi.wsdl.tree.root}/wsdl/provider/20130401 + HI_ProviderSearchForProviderIndividual-5.0.0.wsdl + HI_ProviderSearchForProviderIndividual-5.0.0.wsdl + + + + wsimport-provider-search-organisation + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-search-organisation + ${project.build.directory}/jaxws/stale-wsimport-provider-search-organisation + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-search-organisation + ${hi.wsdl.tree.root}/wsdl/provider/20130401 + HI_ProviderSearchForProviderOrganisation-5.0.0.wsdl + HI_ProviderSearchForProviderOrganisation-5.0.0.wsdl + + + + wsimport-provider-manage-org + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-manage-org + ${project.build.directory}/jaxws/stale-wsimport-provider-manage-org + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-manage-org + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderManageProviderOrganisation-3.2.0.wsdl + HI_ProviderManageProviderOrganisation-3.2.0.wsdl + + + + wsimport-provider-manage-directory-entry + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-manage-directory-entry + ${project.build.directory}/jaxws/stale-wsimport-provider-manage-directory-entry + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-manage-directory-entry + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderManageProviderDirectoryEntry-3.2.0.wsdl + HI_ProviderManageProviderDirectoryEntry-3.2.0.wsdl + + + + wsimport-provider-hpio-directory + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-hpio-directory + ${project.build.directory}/jaxws/stale-wsimport-provider-hpio-directory + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-hpio-directory + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderSearchHIProviderDirectoryForOrganisation-3.2.0.wsdl + HI_ProviderSearchHIProviderDirectoryForOrganisation-3.2.0.wsdl + + + + wsimport-provider-read-reference-data + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-read-reference-data + ${project.build.directory}/jaxws/stale-wsimport-provider-read-reference-data + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-read-reference-data + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderReadReferenceData-3.2.0.wsdl + HI_ProviderReadReferenceData-3.2.0.wsdl + + + + wsimport-provider-read-org + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-read-org + ${project.build.directory}/jaxws/stale-wsimport-provider-read-org + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-read-org + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderReadProviderOrganisation-3.2.0.wsdl + HI_ProviderReadProviderOrganisation-3.2.0.wsdl + + + + wsimport-provider-manage-admin-individual + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-manage-admin-individual + ${project.build.directory}/jaxws/stale-wsimport-provider-manage-admin-individual + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-manage-admin-individual + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderManageProviderAdministrativeIndividual-3.2.0.wsdl + HI_ProviderManageProviderAdministrativeIndividual-3.2.0.wsdl + + + + wsimport-provider-read-admin-individual + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-read-admin-individual + ${project.build.directory}/jaxws/stale-wsimport-provider-read-admin-individual + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-read-admin-individual + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderReadProviderAdministrativeIndividual-3.2.0.wsdl + HI_ProviderReadProviderAdministrativeIndividual-3.2.0.wsdl + + + + wsimport-provider-hpii-directory + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-hpii-directory + ${project.build.directory}/jaxws/stale-wsimport-provider-hpii-directory + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-hpii-directory + ${hi.wsdl.tree.root}/wsdl/provider/20100930 + HI_ProviderSearchHIProviderDirectoryForIndividual-3.2.0.wsdl + HI_ProviderSearchHIProviderDirectoryForIndividual-3.2.0.wsdl + + + + wsimport-consumer-search-ihi-batch-async + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-search-ihi-batch-async + ${project.build.directory}/jaxws/stale-wsimport-consumer-search-ihi-batch-async + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-search-ihi-batch-async + ${hi.wsdl.tree.root}/wsdl/consumer/20100731 + HI_ConsumerSearchIHIBatchAsync-3.0.wsdl + HI_ConsumerSearchIHIBatchAsync-3.0.wsdl + + + + wsimport-consumer-create-provisional-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-create-provisional-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-create-provisional-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-create-provisional-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100731 + HI_ConsumerCreateProvisionalIHI-3.0.wsdl + HI_ConsumerCreateProvisionalIHI-3.0.wsdl + + + + wsimport-consumer-merge-provisional-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-merge-provisional-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-merge-provisional-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-merge-provisional-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100731 + HI_ConsumerMergeProvisionalIHI-3.0.wsdl + HI_ConsumerMergeProvisionalIHI-3.0.wsdl + + + + wsimport-consumer-update-provisional-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-update-provisional-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-update-provisional-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-update-provisional-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100731 + HI_ConsumerUpdateProvisionalIHI-3.0.wsdl + HI_ConsumerUpdateProvisionalIHI-3.0.wsdl + + + + wsimport-consumer-create-unverified-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-create-unverified-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-create-unverified-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-create-unverified-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100821 + HI_ConsumerCreateUnverifiedIHI-3.0.2.wsdl + HI_ConsumerCreateUnverifiedIHI-3.0.2.wsdl + + + + wsimport-consumer-resolve-provisional-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-resolve-provisional-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-resolve-provisional-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-resolve-provisional-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100821 + HI_ConsumerResolveProvisionalIHI-3.0.2.wsdl + HI_ConsumerResolveProvisionalIHI-3.0.2.wsdl + + + + wsimport-consumer-notify-duplicate-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-notify-duplicate-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-notify-duplicate-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-notify-duplicate-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100930 + HI_ConsumerNotifyDuplicateIHI-3.2.0.wsdl + HI_ConsumerNotifyDuplicateIHI-3.2.0.wsdl + + + + wsimport-consumer-notify-replica-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-notify-replica-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-notify-replica-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-notify-replica-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100930 + HI_ConsumerNotifyReplicaIHI-3.2.0.wsdl + HI_ConsumerNotifyReplicaIHI-3.2.0.wsdl + + + + wsimport-consumer-update-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-update-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-update-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-update-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20100930 + HI_ConsumerUpdateIHI-3.2.0.wsdl + HI_ConsumerUpdateIHI-3.2.0.wsdl + + + + wsimport-consumer-create-verified-ihi + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-consumer-create-verified-ihi + ${project.build.directory}/jaxws/stale-wsimport-consumer-create-verified-ihi + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-consumer-create-verified-ihi + ${hi.wsdl.tree.root}/wsdl/consumer/20111201 + HI_ConsumerCreateVerifiedIHI-4.0.0.wsdl + HI_ConsumerCreateVerifiedIHI-4.0.0.wsdl + + + + wsimport-provider-manage-tds-provider-individual + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-manage-tds-provider-individual + ${project.build.directory}/jaxws/stale-wsimport-provider-manage-tds-provider-individual + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-manage-tds-provider-individual + ${hi.wsdl.tree.root}/wsdl/provider/20130622 + HI_ProviderManageTdsProviderIndividual-5.1.0.wsdl + HI_ProviderManageTdsProviderIndividual-5.1.0.wsdl + + + + wsimport-provider-search-tds-provider-individual + wsimport + + ${project.build.directory}/jaxws/dest/wsimport-provider-search-tds-provider-individual + ${project.build.directory}/jaxws/stale-wsimport-provider-search-tds-provider-individual + ${project.build.directory}/generated-sources/wsimport-parts/wsimport-provider-search-tds-provider-individual + ${hi.wsdl.tree.root}/wsdl/provider/20130622 + HI_ProviderSearchTdsProviderIndividual-5.1.0.wsdl + HI_ProviderSearchTdsProviderIndividual-5.1.0.wsdl + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.6.1 + + + add-wsimport-source + process-sources + add-source + + + ${project.build.directory}/generated-sources/wsimport + + + + + @@ -322,43 +858,14 @@ true - - coverage - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - jacoco-prepare-agent - - prepare-agent - - - - jacoco-report - verify - - report - - - - - - - integration + org.apache.maven.plugins maven-surefire-plugin - - true - **/*Test.java @@ -374,17 +881,15 @@ org.codehaus.mojo build-helper-maven-plugin - ${plugin.build.helper.version} + 3.6.1 add-sample-sources generate-sources - - add-source - + add-source - src/sample/java + ${project.basedir}/src/sample/java @@ -393,7 +898,6 @@ - fat-jar @@ -421,7 +925,6 @@ META-INF/*.DSA META-INF/*.RSA module-info.class - META-INF/versions/*/module-info.class META-INF/MANIFEST.MF @@ -431,13 +934,6 @@ META-INF/hk2-locator/default - - au.gov.nehta:common-library - - au/gov/nehta/common/utils/ArgumentUtils.class - au/gov/nehta/vendorlibrary/ws/WebServiceClientUtil.class - - au.gov.nehta:smi-xsp @@ -459,6 +955,66 @@ + + + hi-wsdl-artifact + + true + + + + au.gov.nehta + hi-wsdl + ${hi.wsdl.version} + + + + + + com.sun.xml.ws + jaxws-maven-plugin + + wsimport-consumer-search-ihinone + wsimport-consumer-search-ihi-batch-syncnone + wsimport-provider-batch-async-individualnone + wsimport-provider-batch-async-organisationnone + wsimport-provider-search-individualnone + wsimport-provider-search-organisationnone + wsimport-provider-manage-orgnone + wsimport-provider-manage-directory-entrynone + wsimport-provider-hpio-directorynone + wsimport-provider-read-reference-datanone + wsimport-provider-read-orgnone + wsimport-provider-manage-admin-individualnone + wsimport-provider-read-admin-individualnone + wsimport-provider-hpii-directorynone + wsimport-consumer-search-ihi-batch-asyncnone + wsimport-consumer-create-provisional-ihinone + wsimport-consumer-merge-provisional-ihinone + wsimport-consumer-update-provisional-ihinone + wsimport-consumer-create-unverified-ihinone + wsimport-consumer-resolve-provisional-ihinone + wsimport-consumer-notify-duplicate-ihinone + wsimport-consumer-notify-replica-ihinone + wsimport-consumer-update-ihinone + wsimport-consumer-create-verified-ihinone + wsimport-provider-manage-tds-provider-individualnone + wsimport-provider-search-tds-provider-individualnone + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-wsimport-source + none + + + + + + diff --git a/scripts/wsdl-codegen-config.xml b/scripts/wsdl-codegen-config.xml new file mode 100644 index 0000000..f9b6868 --- /dev/null +++ b/scripts/wsdl-codegen-config.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/au/gov/nehta/common/utils/ArgumentUtils.java b/src/main/java/au/gov/nehta/common/utils/ArgumentUtils.java new file mode 100644 index 0000000..c7031c7 --- /dev/null +++ b/src/main/java/au/gov/nehta/common/utils/ArgumentUtils.java @@ -0,0 +1,68 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.common.utils; + +import java.util.Collection; + +public final class ArgumentUtils { + + private ArgumentUtils() { + } + + public static void checkNotNull(Object value, String message) { + if (value == null) { + if (message != null && message.indexOf(' ') < 0) { + throw new IllegalArgumentException(message + " cannot be null."); + } + throw new IllegalArgumentException(message); + } + } + + public static void checkNotNull(boolean condition, String message) { + if (!condition) { + throw new IllegalArgumentException(message); + } + } + + public static void checkNotNullNorBlank(String value, String fieldName) { + if (value == null) { + throw new IllegalArgumentException(fieldName + " cannot be null."); + } + if (value.trim().isEmpty()) { + throw new IllegalArgumentException(fieldName + " cannot be a blank string."); + } + } + + public static boolean isNullOrBlank(String value) { + return value == null || value.trim().isEmpty(); + } + + public static void checkMaxLength(String value, int maxLength, String fieldName) { + if (value != null && value.length() > maxLength) { + throw new IllegalArgumentException(fieldName + " exceeds maximum length of " + maxLength); + } + } + + public static void checkNotNullNorEmpty(Collection collection, String message) { + if (collection == null || collection.isEmpty()) { + throw new IllegalArgumentException(message); + } + } + + public static boolean isNullOrEmpty(Collection collection) { + return collection == null || collection.isEmpty(); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/common/security/KeystoreUtil.java b/src/main/java/au/gov/nehta/vendorlibrary/common/security/KeystoreUtil.java new file mode 100644 index 0000000..8214378 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/common/security/KeystoreUtil.java @@ -0,0 +1,238 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.common.security; + +import au.gov.nehta.common.utils.ArgumentUtils; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509KeyManager; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; +import java.security.GeneralSecurityException; +import java.security.Key; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.Principal; +import java.security.PrivateKey; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.logging.Logger; + +public final class KeystoreUtil { + + private static final Logger LOG = Logger.getLogger(KeystoreUtil.class.getName()); + + private KeystoreUtil() { + } + + public static KeyStore loadKeyStore(final String keystoreType, final String keystorePassword, + final String keystorePathname) throws GeneralSecurityException { + KeyStore keystore; + InputStream in = null; + ArgumentUtils.checkNotNullNorBlank(keystoreType, "keystoreType"); + ArgumentUtils.checkNotNullNorBlank(keystorePassword, "keystorePassword"); + ArgumentUtils.checkNotNullNorBlank(keystorePathname, "keystorePathname"); + try { + keystore = KeyStore.getInstance(keystoreType); + + File store = new File(keystorePathname); + if (store.exists()) { + in = new FileInputStream(keystorePathname); + } else { + in = null; + } + + keystore.load(in, keystorePassword.toCharArray()); + if (in != null) { + in.close(); + in = null; + } else { + throw new FileNotFoundException("File not found " + keystorePathname); + } + LOG.info("Keystore " + keystorePathname + " loaded"); + } catch (KeyStoreException e) { + throw new GeneralSecurityException("getInstance(" + keystoreType + ") error", e); + } catch (FileNotFoundException ex) { + throw new GeneralSecurityException("Couldn't find truststore " + keystorePathname, ex); + } catch (IOException | NoSuchAlgorithmException ex) { + throw new GeneralSecurityException(ex.getMessage(), ex); + } catch (CertificateException ex) { + throw new GeneralSecurityException("Certificate error", ex); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException ex) { + throw new GeneralSecurityException(ex.getMessage(), ex); + } + } + return keystore; + } + + public static X509Certificate getSigningCertificate(final String keystoreType, final String keystorePassword, + final String keystorePathname, final String certificateAlias) + throws GeneralSecurityException { + KeyStore localKeystore = KeystoreUtil.loadKeyStore(keystoreType, + keystorePassword, keystorePathname); + return getSigningCertificate(localKeystore, certificateAlias); + } + + public static X509Certificate getSigningCertificate(final KeyStore keystore, final String certificateAlias) + throws GeneralSecurityException { + ArgumentUtils.checkNotNull(keystore, "keystore"); + ArgumentUtils.checkNotNullNorBlank(certificateAlias, "certificateAlias"); + try { + Certificate certificate = keystore.getCertificate(certificateAlias); + return (certificate != null) ? (X509Certificate) certificate : null; + } catch (KeyStoreException e) { + throw new GeneralSecurityException(e); + } + } + + public static PrivateKey getSigningPrivateKey(final String keystoreType, final String keystorePassword, + final String keystorePathname, final String privateKeyAlias) + throws GeneralSecurityException { + KeyStore localKeystore = KeystoreUtil.loadKeyStore(keystoreType, + keystorePassword, keystorePathname); + return getSigningPrivateKey(localKeystore, keystorePassword, privateKeyAlias); + } + + public static PrivateKey getSigningPrivateKey(final KeyStore keystore, final String keystorePassword, + final String privateKeyAlias) + throws GeneralSecurityException { + ArgumentUtils.checkNotNull(keystore, "keystore"); + ArgumentUtils.checkNotNullNorBlank(privateKeyAlias, "privateKeyAlias"); + ArgumentUtils.checkNotNullNorBlank(keystorePassword, "keystorePassword"); + ArgumentUtils.checkNotNull(keystore.containsAlias(privateKeyAlias), "keystore.containsAlias(privateKeyAlias)"); + try { + Key key = keystore.getKey(privateKeyAlias, keystorePassword + .toCharArray()); + return (key != null) ? ((PrivateKey) key) : null; + } catch (KeyStoreException | UnrecoverableKeyException | NoSuchAlgorithmException e) { + throw new GeneralSecurityException(e); + } + } + + public static SSLSocketFactory getSslSocketFactory(String privateKeyStoreType, + String privateKeyStoreFile, + String privateKeyStorePassword, + String privateKeyPassword, + String privateKeyAlias, + String trustStoreType, + String trustStoreFile, + String trustStorePassword) + throws GeneralSecurityException { + + KeyStore privateKeyStore = loadKeyStore(privateKeyStoreType, privateKeyStorePassword, privateKeyStoreFile); + KeyStore trustStore = loadKeyStore(trustStoreType, trustStorePassword, trustStoreFile); + + checkPrivateKey(privateKeyStore, privateKeyPassword.toCharArray(), privateKeyAlias); + + final KeyManagerFactory kmFactory = KeyManagerFactory.getInstance( + KeyManagerFactory.getDefaultAlgorithm()); + kmFactory.init(privateKeyStore, privateKeyPassword.toCharArray()); + final KeyManager[] keyManagers = kmFactory.getKeyManagers(); + for (int i = 0; i < keyManagers.length; i++) { + if (keyManagers[i] instanceof X509KeyManager) { + keyManagers[i] = new AliasForcingX509KeyManager((X509KeyManager) keyManagers[i], privateKeyAlias); + } + } + + final TrustManagerFactory tmFactory = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + tmFactory.init(trustStore); + final TrustManager[] trustManagers = tmFactory.getTrustManagers(); + + final SSLContext context = SSLContext.getInstance("TLS"); + + context.init(keyManagers, trustManagers, null); + + return context.getSocketFactory(); + } + + private static void checkPrivateKey(final KeyStore keyStore, final char[] keyPassword, final String keyAlias) + throws GeneralSecurityException { + if (!keyStore.containsAlias(keyAlias)) { + final String errorMsg = "The SSLSocketFactory keystore doesn't have key alias '" + keyAlias + "'."; + throw new GeneralSecurityException(errorMsg); + } + + if (!keyStore.isKeyEntry(keyAlias)) { + final String errorMsg = "The SSLSocketFactory keystore doesn't have a private key for alias '" + keyAlias + "'."; + throw new GeneralSecurityException(errorMsg); + } + + try { + keyStore.getKey(keyAlias, keyPassword); + } catch (final UnrecoverableKeyException e) { + final String errorMsg = "Couldn't recover the private key in the SSLSocketFactory keystore." + + " The most likely reason is that the key password is wrong."; + throw new GeneralSecurityException(errorMsg, e); + } + } + + private static class AliasForcingX509KeyManager implements X509KeyManager { + + private final X509KeyManager baseKM; + private final String keyAlias; + + public AliasForcingX509KeyManager(final X509KeyManager keyManager, final String keyAlias) { + this.baseKM = keyManager; + this.keyAlias = keyAlias; + } + + public String chooseClientAlias(final String[] keyType, + final Principal[] issuers, + final Socket socket) { + return this.keyAlias; + } + + public String chooseServerAlias(final String keyType, + final Principal[] issuers, + final Socket socket) { + return this.baseKM.chooseServerAlias(keyType, issuers, socket); + } + + public X509Certificate[] getCertificateChain(final String alias) { + return this.baseKM.getCertificateChain(alias); + } + + public String[] getClientAliases(final String keyType, final Principal[] issuers) { + return this.baseKM.getClientAliases(keyType, issuers); + } + + public PrivateKey getPrivateKey(final String alias) { + return this.baseKM.getPrivateKey(alias); + } + + public String[] getServerAliases(final String keyType, final Principal[] issuers) { + return this.baseKM.getServerAliases(keyType, issuers); + } + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/common/security/SimpleCertificateValidator.java b/src/main/java/au/gov/nehta/vendorlibrary/common/security/SimpleCertificateValidator.java new file mode 100644 index 0000000..24657d1 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/common/security/SimpleCertificateValidator.java @@ -0,0 +1,62 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.common.security; + +import au.gov.nehta.xsp.CertificateValidationException; +import au.gov.nehta.xsp.CertificateValidator; +import au.gov.nehta.xsp.XspException; + +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.cert.X509Certificate; + +public class SimpleCertificateValidator implements CertificateValidator { + + private final KeyStore truststore; + + public SimpleCertificateValidator(KeyStore truststore) { + this.truststore = truststore; + } + + @Override + public void validate(X509Certificate cert) throws CertificateValidationException, XspException { + try { + cert.checkValidity(); + isTrustedCertificate(cert); + } catch (Exception ex) { + throw new XspException(ex.getMessage(), ex); + } + } + + private boolean isTrustedCertificate(X509Certificate cert) throws KeyStoreException { + + if (truststore == null) { + return true; + } + + boolean trusted = false; + + if (cert != null) { + String alias = truststore.getCertificateAlias(cert); + + if (alias != null) { + trusted = true; + } + } + + return trusted; + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_3.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_3.java index e2c63ce..f382b01 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_3.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_3.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.client; import au.gov.nehta.common.utils.ArgumentUtils; @@ -11,8 +26,8 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Service; -import javax.xml.ws.handler.Handler; +import jakarta.xml.ws.Service; +import jakarta.xml.ws.handler.Handler; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.ArrayList; @@ -20,27 +35,21 @@ /** - * A Base implementation of the client wrapper that allows access to the - * WS Port for the XXXXX._3 series of classes + * Base client wrapper for HI SOAP ports whose generated types live in the {@code _3} + * package namespace (Common Core Elements 3.0 and related WSDL bindings). * * @author NeHTA */ public class BaseClient_3 extends ClientBase { - /** - * The user Qualified ID associated with this use of the ProviderSearchHIProviderDirectoryForOrganisation service - */ + /** Qualified identifier for the individual (user) on whose behalf requests are made. */ protected final QualifiedId individualQualifiedId; - /** - * The organisation Qualified ID associated with this use of the ProviderSearchHIProviderDirectoryForOrganisation service - */ + /** Optional organisation qualified identifier when the call is scoped to an organisation. */ protected final QualifiedId organisationQualifiedId; - /** - * The Product details associated with this use of the ProviderSearchHIProviderDirectoryForIndividual service - */ + /** Product and version metadata sent on each HI request. */ protected final ProductType productHeader; public BaseClient_3( @@ -62,7 +71,7 @@ public BaseClient_3( ArgumentUtils.checkNotNull(individualQualifiedId, "individualQualifiedId"); ArgumentUtils.checkNotNull(productHeader, "productHeader"); ArgumentUtils.checkNotNull(signingPrivateKey, "signingPrivateKey"); - ArgumentUtils.checkNotNull(signingCertificate, "signingPrivateKey"); + ArgumentUtils.checkNotNull(signingCertificate, "signingCertificate"); ArgumentUtils.checkNotNull(sslSocketFactory, "sslSocketFactory"); // supply an optional certificate Validator @@ -114,7 +123,7 @@ public BaseClient_3( ArgumentUtils.checkNotNullNorBlank(serviceEndpoint, "serviceEndpoint"); ArgumentUtils.checkNotNull(productHeader, "productHeader"); ArgumentUtils.checkNotNull(signingPrivateKey, "signingPrivateKey"); - ArgumentUtils.checkNotNull(signingCertificate, "signingPrivateKey"); + ArgumentUtils.checkNotNull(signingCertificate, "signingCertificate"); ArgumentUtils.checkNotNull(sslSocketFactory, "sslSocketFactory"); @@ -176,6 +185,7 @@ protected boolean hasNoOrganisationQualifiedId() { return organisationQualifiedId == null; } + /** Ensures {@link #individualQualifiedId} was supplied; used by operations that require a user qualified ID. */ protected void checkUserID() { if (this.individualQualifiedId == null) throw new IllegalArgumentException(QUALIFIED_ID_MISSING); } diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_30.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_30.java deleted file mode 100644 index 934e759..0000000 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/BaseClient_30.java +++ /dev/null @@ -1,152 +0,0 @@ -package au.gov.nehta.vendorlibrary.hi.client; - -/** - * A Base implementation of the client wrapper that allows access to the - * WS Port for the XXXXX._30 series of classes - * - * @author NeHTA - * @deprecated - */ -public class BaseClient_30 extends ClientBase { - - @Override - protected boolean hasNoOrganisationQualifiedId() { - // TODO Auto-generated method stub - return false; - } - - /* - *//** - * The user Qualified ID associated with this use of the ProviderSearchHIProviderDirectoryForOrganisation service - *//* - protected final QualifiedId individualQualifiedId; - - *//** - * The organisation Qualified ID associated with this use of the ProviderSearchHIProviderDirectoryForOrganisation service - *//* - protected final QualifiedId organisationQualifiedId; - - - *//** - * The Product details associated with this use of the ProviderSearchHIProviderDirectoryForIndividual service - *//* - protected final ProductType productHeader; - - public BaseClient_30( - final Class portClass, - final Class serviceClass, - final QualifiedId individualQualifiedId, - final QualifiedId organisationQualifiedId, - final ProductType productHeader, - final PrivateKey signingPrivateKey, - final X509Certificate signingCertificate, - final SSLSocketFactory sslSocketFactory, - final String serviceEndpoint - ) { - - ArgumentUtils.checkNotNull(serviceClass, "serviceClass"); - ArgumentUtils.checkNotNull(portClass, "portClass"); - ArgumentUtils.checkNotNullNorBlank(serviceEndpoint, "serviceEndpoint"); - ArgumentUtils.checkNotNull(individualQualifiedId, "individualQualifiedId"); - ArgumentUtils.checkNotNull(productHeader, "productHeader"); - ArgumentUtils.checkNotNull(signingPrivateKey, "signingPrivateKey"); - ArgumentUtils.checkNotNull(signingCertificate, "signingPrivateKey"); - ArgumentUtils.checkNotNull(sslSocketFactory, "sslSocketFactory"); - - this.productHeader = productHeader; - this.organisationQualifiedId=organisationQualifiedId; - this.individualQualifiedId=individualQualifiedId; - this.signingPrivateKey = signingPrivateKey; - this.signingCertificate = signingCertificate; - this.sslSocketFactory = sslSocketFactory; - this.loggingHandler = new LoggingHandler(true); //Set true to dump the SOAP message to the default logger. - - @SuppressWarnings("rawtypes") - List handlerChain = new ArrayList(); - handlerChain.add(loggingHandler); - - this.port =(T) WebServiceClientUtil.getPort( - portClass, - serviceClass, - sslSocketFactory, - handlerChain); - - configureEndpoint(this.port, serviceEndpoint); - } - - *//** - * An alternate base class that takes the wrapped version of XML bound objects - *//* - public BaseClient_30( - final Class portClass, - final Class serviceClass, - final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, - final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, - final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, - final PrivateKey signingPrivateKey, - final X509Certificate signingCertificate, - final SSLSocketFactory sslSocketFactory, - final String serviceEndpoint - ) { - - ArgumentUtils.checkNotNull(serviceClass, "serviceClass"); - ArgumentUtils.checkNotNull(portClass, "portClass"); - ArgumentUtils.checkNotNullNorBlank(serviceEndpoint, "serviceEndpoint"); - ArgumentUtils.checkNotNull(productHeader, "productHeader"); - ArgumentUtils.checkNotNull(signingPrivateKey, "signingPrivateKey"); - ArgumentUtils.checkNotNull(signingCertificate, "signingPrivateKey"); - ArgumentUtils.checkNotNull(sslSocketFactory, "sslSocketFactory"); - - this.productHeader = productHeader.as30Type(); - - if(organisationQualifiedId!= null){ - this.organisationQualifiedId=organisationQualifiedId.as30Type(); - }else{ - this.organisationQualifiedId=null; - } - - if(individualQualifiedId != null){ - this.individualQualifiedId=individualQualifiedId.as30Type(); - }else{ - this.individualQualifiedId=null; - } - this.signingPrivateKey = signingPrivateKey; - this.signingCertificate = signingCertificate; - this.sslSocketFactory = sslSocketFactory; - this.loggingHandler = new LoggingHandler(true); //Set true to dump the SOAP message to the default logger. - - @SuppressWarnings("rawtypes") - List handlerChain = new ArrayList(); - handlerChain.add(loggingHandler); - - this.port =(T) WebServiceClientUtil.getPort( - portClass, - serviceClass, - sslSocketFactory, - handlerChain); - - configureEndpoint(this.port, serviceEndpoint); - } - - *//** - * Returns the current - * {@link au.net.electronichealth.ns.hi.common.commoncoreelements._3_0.TimestampType} - * - * @return {@link au.net.electronichealth.ns.hi.common.commoncoreelements._3_0.TimestampType} - * instance with current as created time. - *//* - protected TimestampType getTimestampHeader() { - TimestampType timestampHeader = new TimestampType(); - timestampHeader.setCreated(TimeUtility.nowXMLGregorianCalendar()); - return timestampHeader; - } - - @Override - protected boolean hasNoOrganisationQualifiedId() { - return organisationQualifiedId == null; - } - - protected void checkUserID() { - if(this.individualQualifiedId == null) throw new IllegalArgumentException(QUALIFIED_ID_MISSING); - }*/ -} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/ClientBase.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/ClientBase.java index 7b46a54..0185fad 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/ClientBase.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/ClientBase.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.client; import java.security.PrivateKey; @@ -7,9 +22,9 @@ import java.util.Map; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Binding; -import javax.xml.ws.BindingProvider; -import javax.xml.ws.handler.Handler; +import jakarta.xml.ws.Binding; +import jakarta.xml.ws.BindingProvider; +import jakarta.xml.ws.handler.Handler; import au.gov.nehta.vendorlibrary.hi.handler.message.HIHeaderHandler; import au.gov.nehta.vendorlibrary.hi.handler.security.HISecurityHandler; @@ -19,7 +34,7 @@ public abstract class ClientBase { /** - * The JAX-WS service port for web service operations. + * The Jakarta XML Web Services port for SOAP operations. */ protected T port; /** @@ -43,7 +58,7 @@ public abstract class ClientBase { protected static final String SSL_SOCKET_FACTORY_INTERNAL = "com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory"; /** - * SSL socket factory class name for {@code com.sun.xml.ws:jaxws-rt} (use with {@link #SSL_SOCKET_FACTORY_INTERNAL}). + * SSL socket factory class name for the EE4J XML-WS stack ({@code com.sun.xml.ws}) on the classpath. */ protected static final String SSL_SOCKET_FACTORY = "com.sun.xml.ws.transport.https.client.SSLSocketFactory"; @@ -166,6 +181,7 @@ public final String getLastSoapRequest() { } } + /** @return {@code true} if {@code s} is {@code null} or has length zero */ public static boolean isEmpty(String s) { return s == null || s.length() == 0; } diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/ProductType.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/ProductType.java index 996730b..6233ea2 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/ProductType.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/ProductType.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.client.wrapped; /** diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/QualifiedId.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/QualifiedId.java index 30f79c1..729db9f 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/QualifiedId.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/client/wrapped/QualifiedId.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.client.wrapped; public class QualifiedId { diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/message/HIHeaderHandler.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/message/HIHeaderHandler.java index b745c3c..90c5f3b 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/message/HIHeaderHandler.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/message/HIHeaderHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.handler.message; import java.util.ArrayList; @@ -5,12 +20,12 @@ import java.util.Set; import javax.xml.namespace.QName; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPHeader; -import javax.xml.soap.SOAPMessage; -import javax.xml.ws.handler.MessageContext; -import javax.xml.ws.handler.soap.SOAPHandler; -import javax.xml.ws.handler.soap.SOAPMessageContext; +import jakarta.xml.soap.SOAPException; +import jakarta.xml.soap.SOAPHeader; +import jakarta.xml.soap.SOAPMessage; +import jakarta.xml.ws.handler.MessageContext; +import jakarta.xml.ws.handler.soap.SOAPHandler; +import jakarta.xml.ws.handler.soap.SOAPMessageContext; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -24,9 +39,8 @@ public class HIHeaderHandler implements SOAPHandler { */ public static final String HPIO_CSP_HEADER_ELEMENT_NAME = "hpio"; - /** - * FaultTo header name. Medicare cannot handle a {@code wsa:FaultTo} element in the outbound - * message, so it is stripped before signing. + /* FaultTo header name. Medicare cannot handle FaultTo: + * so we strip it from the outbound messages before signing. */ public static final String FAULT_TO_HEADER_ELEMENT_NAME = "FaultTo"; @@ -51,7 +65,7 @@ public HIHeaderHandler(List headerNames) { * * @param context the incoming / outgoing soap message context * @return true Always returns true. - * @see javax.xml.ws.handler.Handler#handleMessage(javax.xml.ws.handler.MessageContext) + * @see jakarta.xml.ws.handler.Handler#handleMessage(jakarta.xml.ws.handler.MessageContext) */ public final boolean handleMessage(final SOAPMessageContext context) { Boolean isOutgoing = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); @@ -106,7 +120,7 @@ private void removeSoapHeaders(SOAPMessageContext context) { * * @param context the incoming / outgoing soap message context * @return true if the handle signature check is successful. - * @see javax.xml.ws.handler.Handler#handleFault(javax.xml.ws.handler.MessageContext) + * @see jakarta.xml.ws.handler.Handler#handleFault(jakarta.xml.ws.handler.MessageContext) */ public final boolean handleFault(final SOAPMessageContext context) { return false; @@ -115,7 +129,7 @@ public final boolean handleFault(final SOAPMessageContext context) { /** * Does nothing returns null.
* - * @return @see javax.xml.ws.handler.soap.SOAPHandler#getHeaders() + * @return @see jakarta.xml.ws.handler.soap.SOAPHandler#getHeaders() */ public final Set getHeaders() { return null; @@ -126,8 +140,7 @@ public final Set getHeaders() { * Not utilised for dumping SOAP message. * * @param context the message context - * @see javax.xml.ws.handler.Handler close() javax.xml.ws.handler . - * MessageContext) + * @see jakarta.xml.ws.handler.Handler#close(jakarta.xml.ws.handler.MessageContext) */ public void close(final MessageContext context) { // Do nothing diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandler.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandler.java index 3e80287..83374d8 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandler.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandler.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -22,10 +24,10 @@ import javax.security.auth.x500.X500PrivateCredential; import javax.xml.namespace.QName; -import javax.xml.soap.*; -import javax.xml.ws.handler.MessageContext; -import javax.xml.ws.handler.soap.SOAPHandler; -import javax.xml.ws.handler.soap.SOAPMessageContext; +import jakarta.xml.soap.*; +import jakarta.xml.ws.handler.MessageContext; +import jakarta.xml.ws.handler.soap.SOAPHandler; +import jakarta.xml.ws.handler.soap.SOAPMessageContext; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.Arrays; @@ -108,7 +110,7 @@ public HISecurityHandler(X509Certificate x509Certificate, PrivateKey privateKey, * * @param context the incoming / outgoing soap message context * @return true Always returns true. - * @see javax.xml.ws.handler.Handler#handleMessage(javax.xml.ws.handler.MessageContext) + * @see jakarta.xml.ws.handler.Handler#handleMessage(jakarta.xml.ws.handler.MessageContext) */ public final boolean handleMessage(final SOAPMessageContext context) { Boolean isOutgoing = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); @@ -126,7 +128,7 @@ public final boolean handleMessage(final SOAPMessageContext context) { * * @param context the incoming / outgoing soap message context * @return true if the handle signature check is successful. - * @see javax.xml.ws.handler.Handler#handleFault(javax.xml.ws.handler.MessageContext) + * @see jakarta.xml.ws.handler.Handler#handleFault(jakarta.xml.ws.handler.MessageContext) */ public final boolean handleFault(final SOAPMessageContext context) { if (!(Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { @@ -141,7 +143,7 @@ public final boolean handleFault(final SOAPMessageContext context) { * Ignore processing of SOAP header as the primary intention is just to * 'Dump' the SOAP message * - * @return @see javax.xml.ws.handler.soap.SOAPHandler#getHeaders() + * @return @see jakarta.xml.ws.handler.soap.SOAPHandler#getHeaders() */ public final Set getHeaders() { return null; @@ -151,7 +153,7 @@ public final Set getHeaders() { * Does nothing
* Not utilised for dumping SOAP message. * - * @param context @see javax.xml.ws.handler.Handler#close(javax.xml.ws.handler.MessageContext) + * @param context @see jakarta.xml.ws.handler.Handler#close(jakarta.xml.ws.handler.MessageContext) */ public void close(final MessageContext context) { //Do nothing @@ -159,11 +161,12 @@ public void close(final MessageContext context) { /** * Signs the SOAP message parts matching the Medicare UHI specification.
- * The JAX-WS client runtime can strip the SOAP body {@code Id} attribute; a workaround has been - * introduced to remove the WSS Security Tube from the tubeline assembly for TLS-based services.
+ * The Jakarta XML Web Services runtime removes the SOAP body attribute {@code Id}. A workaround has been + * introduced to remove WSS Security Tube from the Tubeline Assembly for TLS + * based service
* - * @param context of type {@link javax.xml.ws.handler.soap.SOAPMessageContext} (Mandatory) - * returns {@link javax.xml.ws.handler.soap.SOAPMessageContext} with the signed SOAP element + * @param context of type {@link jakarta.xml.ws.handler.soap.SOAPMessageContext} (Mandatory) + * returns {@link jakarta.xml.ws.handler.soap.SOAPMessageContext} with the signed SOAP element */ private void signBodyAndSOAPHeaders(final SOAPMessageContext context) { ArgumentUtils.checkNotNull(context, "context"); @@ -291,9 +294,9 @@ private static void removeXMLNS(final Element elem) { } /** - * Verifies the signature value of the provided {@link javax.xml.ws.handler.soap.SOAPMessageContext}. + * Verifies the signature value of the provided {@link jakarta.xml.ws.handler.soap.SOAPMessageContext}. * - * @param context the MCA Inbound {@link javax.xml.ws.handler.soap.SOAPMessageContext} + * @param context the MCA Inbound {@link jakarta.xml.ws.handler.soap.SOAPMessageContext} */ private void extractElementsAndVerifyingSignature(final SOAPMessageContext context) { SOAPMessageContext localContext = context; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderIndividualBatchSearch.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderIndividualBatchSearch.java index d0d8696..1b12f75 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderIndividualBatchSearch.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderIndividualBatchSearch.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpii; import au.gov.nehta.common.utils.ArgumentUtils; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClient.java new file mode 100644 index 0000000..bfc6033 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClient.java @@ -0,0 +1,178 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpii; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.providermanagetdsproviderindividual._5_1.ManageTdsProviderIndividual; +import au.net.electronichealth.ns.hi.svc.providermanagetdsproviderindividual._5_1.ManageTdsProviderIndividualResponse; +import au.net.electronichealth.ns.hi.svc.providermanagetdsproviderindividual._5_1.ProviderManageTdsProviderIndividualPortType; +import au.net.electronichealth.ns.hi.svc.providermanagetdsproviderindividual._5_1.ProviderManageTdsProviderIndividualService; +import au.net.electronichealth.ns.hi.svc.providermanagetdsproviderindividual._5_1.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Provider Manage TDS Provider Individual client. + * This class may be used to connect to the Medicare HI Service for Provider Manage TDS Provider Individual (5.1.0) operations. + */ +public class ProviderManageTdsProviderIndividualClient extends BaseClient_3 { + + /** + * Constructor which creates a new ProviderManageTdsProviderIndividualClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ProviderManageTdsProviderIndividual service (Mandatory) + * @param productHeader The product header data for connecting to the ProviderManageTdsProviderIndividual service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ProviderManageTdsProviderIndividualClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ProviderManageTdsProviderIndividualClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ProviderManageTdsProviderIndividual service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ProviderManageTdsProviderIndividual service (Optional) + * @param productHeader The product header data for connecting to the ProviderManageTdsProviderIndividual service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ProviderManageTdsProviderIndividualClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ProviderManageTdsProviderIndividualPortType.class, + ProviderManageTdsProviderIndividualService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ProviderManageTdsProviderIndividualClient using the wrapped version of the product type with an endpoint and an SSL Socket Factory. + * This type constructed client assumes the individual qualified user id will be supplied per request + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ProviderManageTdsProviderIndividual service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ProviderManageTdsProviderIndividualClient( + String serviceEndpoint, + au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + PrivateKey signingPrivateKey, + X509Certificate signingCertificate, + SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ProviderManageTdsProviderIndividualPortType.class, + ProviderManageTdsProviderIndividualService.class, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Executes a Manage TDS Provider Individual request. + * + * @param request the ManageTdsProviderIndividual request body + * @return the response from the ProviderManageTdsProviderIndividual service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final ManageTdsProviderIndividualResponse manageTdsProviderIndividual(ManageTdsProviderIndividual request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().manageTdsProviderIndividual( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId); + } + + /** + * Executes a Manage TDS Provider Individual request. + * + * @param request the ManageTdsProviderIndividual request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ProviderManageTdsProviderIndividual service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final ManageTdsProviderIndividualResponse manageTdsProviderIndividual( + ManageTdsProviderIndividual request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().manageTdsProviderIndividual( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type()); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClient.java index e114f15..d816642 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClient.java index 486e5c0..00f7fdd 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -24,7 +26,7 @@ import au.net.electronichealth.ns.hi.xsd.providercore.address._3_2.InternationalAddressCriteriaType; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClient.java new file mode 100644 index 0000000..767c6f8 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClient.java @@ -0,0 +1,178 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpii; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.providersearchtdsproviderindividual._5_1.ProviderSearchTdsProviderIndividualPortType; +import au.net.electronichealth.ns.hi.svc.providersearchtdsproviderindividual._5_1.ProviderSearchTdsProviderIndividualService; +import au.net.electronichealth.ns.hi.svc.providersearchtdsproviderindividual._5_1.SearchTdsProviderIndividual; +import au.net.electronichealth.ns.hi.svc.providersearchtdsproviderindividual._5_1.SearchTdsProviderIndividualResponse; +import au.net.electronichealth.ns.hi.svc.providersearchtdsproviderindividual._5_1.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Provider Search TDS Provider Individual client. + * This class may be used to connect to the Medicare HI Service for Provider Search TDS Provider Individual (5.1.0) operations. + */ +public class ProviderSearchTdsProviderIndividualClient extends BaseClient_3 { + + /** + * Constructor which creates a new ProviderSearchTdsProviderIndividualClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ProviderSearchTdsProviderIndividual service (Mandatory) + * @param productHeader The product header data for connecting to the ProviderSearchTdsProviderIndividual service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ProviderSearchTdsProviderIndividualClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ProviderSearchTdsProviderIndividualClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ProviderSearchTdsProviderIndividual service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ProviderSearchTdsProviderIndividual service (Optional) + * @param productHeader The product header data for connecting to the ProviderSearchTdsProviderIndividual service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ProviderSearchTdsProviderIndividualClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ProviderSearchTdsProviderIndividualPortType.class, + ProviderSearchTdsProviderIndividualService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ProviderSearchTdsProviderIndividualClient using the wrapped version of the product type with an endpoint and an SSL Socket Factory. + * This type constructed client assumes the individual qualified user id will be supplied per request + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ProviderSearchTdsProviderIndividual service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ProviderSearchTdsProviderIndividualClient( + String serviceEndpoint, + au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + PrivateKey signingPrivateKey, + X509Certificate signingCertificate, + SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ProviderSearchTdsProviderIndividualPortType.class, + ProviderSearchTdsProviderIndividualService.class, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Executes a Search TDS Provider Individual request. + * + * @param request the SearchTdsProviderIndividual request body + * @return the response from the ProviderSearchTdsProviderIndividual service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final SearchTdsProviderIndividualResponse searchTdsProviderIndividual(SearchTdsProviderIndividual request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().searchTdsProviderIndividual( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId); + } + + /** + * Executes a Search TDS Provider Individual request. + * + * @param request the SearchTdsProviderIndividual request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ProviderSearchTdsProviderIndividual service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final SearchTdsProviderIndividualResponse searchTdsProviderIndividual( + SearchTdsProviderIndividual request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().searchTdsProviderIndividual( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type()); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClient.java index 915e08b..653c548 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -22,7 +24,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; @@ -139,6 +141,7 @@ public SearchForProviderIndividualBatchAsyncClient( */ public SubmitSearchForProviderIndividualResponse submitSearch(ProviderIndividualBatchSearch request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); checkUserID(); submitSearchCheck(request.getSearchRequest()); Holder signatureHeader = null; @@ -164,7 +167,8 @@ public SubmitSearchForProviderIndividualResponse submitSearch(ProviderIndividual public SubmitSearchForProviderIndividualResponse submitSearch(ProviderIndividualBatchSearch request, au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { - + ArgumentUtils.checkNotNull(request, "request"); + ArgumentUtils.checkNotNull(individualId, "individualId"); submitSearchCheck(request.getSearchRequest()); Holder signatureHeader = null; Holder productHolder = new Holder<>(productHeader); @@ -189,6 +193,8 @@ public SubmitSearchForProviderIndividualResponse submitSearch(ProviderIndividual public RetrieveSearchForProviderIndividualResponse retrieveSearch(RetrieveSearchForProviderIndividual request, au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId ) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + ArgumentUtils.checkNotNull(individualId, "individualId"); retrieveSearchCheck(request); Holder signatureHeader = null; Holder productHolder = new Holder<>(productHeader); @@ -210,6 +216,7 @@ public RetrieveSearchForProviderIndividualResponse retrieveSearch(RetrieveSearch * @throws StandardErrorMsg if the Web Service call fails. */ public RetrieveSearchForProviderIndividualResponse retrieveSearch(RetrieveSearchForProviderIndividual request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); checkUserID(); retrieveSearchCheck(request); Holder signatureHeader = null; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClient.java index 1b91dcb..154fb7c 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderDirectoryEntryClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderDirectoryEntryClient.java index b1ae3fd..10c22e2 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderDirectoryEntryClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderDirectoryEntryClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderOrganisationClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderOrganisationClient.java index 6c97e9e..a6929c4 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderOrganisationClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderOrganisationClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderOrganisationBatchSearch.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderOrganisationBatchSearch.java index f91d0fe..0c34324 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderOrganisationBatchSearch.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderOrganisationBatchSearch.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpio; import au.gov.nehta.common.utils.ArgumentUtils; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdministrativeIndividualClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdministrativeIndividualClient.java index f5c362d..c9374da 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdministrativeIndividualClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdministrativeIndividualClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadProviderOrganisationClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadProviderOrganisationClient.java index b4adb4f..40280ee 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadProviderOrganisationClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadProviderOrganisationClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClient.java index 0812ac7..4c8f110 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClient.java index bde8b3f..ebe1f52 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -24,7 +26,7 @@ import au.net.electronichealth.ns.hi.xsd.providercore.address._3_2.InternationalAddressCriteriaType; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; @@ -41,7 +43,7 @@ public class ProviderSearchHIProviderDirectoryForOrganisationClient extends Base private ArgumentValidator argumentValidator = new ArgumentValidator(); /** - * Constructor which creates a new ProviderSearchHIProviderDirectoryForIndividual Client with an endpoint and an SSL Socket Factory. + * Constructor which creates a new ProviderSearchHIProviderDirectoryForOrganisation client with an endpoint and an SSL Socket Factory. * * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) * @param individualQualifiedId The qualified user ID for connecting to the ProviderSearchHIProviderDirectoryForOrganisation service (Mandatory) @@ -69,7 +71,7 @@ public ProviderSearchHIProviderDirectoryForOrganisationClient(final String servi } /** - * Constructor which creates a new ProviderSearchHIProviderDirectoryForIndividual Client with an endpoint and an SSL Socket Factory, with + * Constructor which creates a new ProviderSearchHIProviderDirectoryForOrganisation client with an endpoint and an SSL Socket Factory, with * the optional contracted service providers HPI-O organisation qualified ID set. * * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) @@ -105,7 +107,7 @@ public ProviderSearchHIProviderDirectoryForOrganisationClient(final String servi } /** - * Constructor which creates a new ProviderSearchHIProviderDirectoryForIndividual Client with an endpoint and an SSL Socket Factory. + * Constructor which creates a new ProviderSearchHIProviderDirectoryForOrganisation client with an endpoint and an SSL Socket Factory. * This is an overloaded constructor for the generic qualified id and product types. * * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) @@ -134,7 +136,7 @@ public ProviderSearchHIProviderDirectoryForOrganisationClient(final String servi } /** - * Constructor which creates a new ProviderSearchHIProviderDirectoryForIndividual Client with an endpoint and an SSL Socket Factory, with + * Constructor which creates a new ProviderSearchHIProviderDirectoryForOrganisation client with an endpoint and an SSL Socket Factory, with * the optional contracted service providers HPI-O organisation qualified ID set. * * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) @@ -172,7 +174,7 @@ public ProviderSearchHIProviderDirectoryForOrganisationClient(final String servi } /** - * Constructor which creates a new ProviderSearchHIProviderDirectoryForIndividual Client with an endpoint and an SSL Socket Factory. + * Constructor which creates a new ProviderSearchHIProviderDirectoryForOrganisation client with an endpoint and an SSL Socket Factory. * This is an overloaded constructor for the generic qualified id and product types. * * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) @@ -201,11 +203,11 @@ public ProviderSearchHIProviderDirectoryForOrganisationClient(final String servi /** * Executes an Identifier HPI-O search. * - * @param request the SearchHIProviderDirectoryForIndividual request object containing the following mandatory fields: + * @param request the SearchHIProviderDirectoryForOrganisation request object containing the following mandatory fields: * HPI-O * and the following optional fields: * Link Search Type - * @return the response from the SearchHIProviderDirectoryForIndividual service + * @return the response from the SearchHIProviderDirectoryForOrganisation service * @throws StandardErrorMsg if the Web Service call fails. */ public final SearchHIProviderDirectoryForOrganisationResponse identifierSearch(SearchHIProviderDirectoryForOrganisation request) @@ -226,11 +228,11 @@ public final SearchHIProviderDirectoryForOrganisationResponse identifierSearch(S /** * Executes a Demographic HPI-O search. * - * @param request the SearchHIProviderDirectoryForIndividual request object containing the following mandatory fields: + * @param request the SearchHIProviderDirectoryForOrganisation request object containing the following mandatory fields: * Name * and the following optional fields: * Either "Australian Address Criteria" OR "International Address Criteria" but not both. - * @return the response from the SearchHIProviderDirectoryForIndividual service + * @return the response from the SearchHIProviderDirectoryForOrganisation service * @throws StandardErrorMsg if the Web Service call fails. */ public final SearchHIProviderDirectoryForOrganisationResponse demographicSearch(SearchHIProviderDirectoryForOrganisation request) throws StandardErrorMsg { @@ -250,12 +252,12 @@ public final SearchHIProviderDirectoryForOrganisationResponse demographicSearch( /** * Executes an Identifier HPI-O search. * - * @param request the SearchHIProviderDirectoryForIndividual request object containing the following mandatory fields: + * @param request the SearchHIProviderDirectoryForOrganisation request object containing the following mandatory fields: * HPI-O * and the following optional fields: * Link Search Type * @param individualId the qualified user id of the user making the request - * @return the response from the SearchHIProviderDirectoryForIndividual service + * @return the response from the SearchHIProviderDirectoryForOrganisation service * @throws StandardErrorMsg if the Web Service call fails. */ public final SearchHIProviderDirectoryForOrganisationResponse identifierSearch(SearchHIProviderDirectoryForOrganisation request, @@ -277,12 +279,12 @@ public final SearchHIProviderDirectoryForOrganisationResponse identifierSearch(S /** * Executes a Demographic HPI-O search. * - * @param request the SearchHIProviderDirectoryForIndividual request object containing the following mandatory fields: + * @param request the SearchHIProviderDirectoryForOrganisation request object containing the following mandatory fields: * Name * and the following optional fields: * Either "Australian Address Criteria" OR "International Address Criteria" but not both. * @param individualId the qualified user id of the user making the request - * @return the response from the SearchHIProviderDirectoryForIndividual service + * @return the response from the SearchHIProviderDirectoryForOrganisation service * @throws StandardErrorMsg if the Web Service call fails. */ public final SearchHIProviderDirectoryForOrganisationResponse demographicSearch(SearchHIProviderDirectoryForOrganisation request, diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClient.java index d0ac8e3..e40920c 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,7 +25,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; @@ -138,6 +140,7 @@ public SearchForProviderOrganisationBatchAsyncClient(String serviceEndpoint, */ public SubmitSearchForProviderOrganisationResponse submitSearch(ProviderOrganisationBatchSearch request) throws au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); checkUserID(); submitSearchCheck(request.getSearchRequest()); Holder signatureHeader = null; @@ -163,7 +166,8 @@ public SubmitSearchForProviderOrganisationResponse submitSearch(ProviderOrganisa public SubmitSearchForProviderOrganisationResponse submitSearch(ProviderOrganisationBatchSearch request, au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { - + ArgumentUtils.checkNotNull(request, "request"); + ArgumentUtils.checkNotNull(individualId, "individualId"); submitSearchCheck(request.getSearchRequest()); Holder signatureHeader = null; Holder productHolder = new Holder<>(productHeader); @@ -188,6 +192,8 @@ public SubmitSearchForProviderOrganisationResponse submitSearch(ProviderOrganisa public RetrieveSearchForProviderOrganisationResponse retrieveSearch(RetrieveSearchForProviderOrganisation request, au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId ) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + ArgumentUtils.checkNotNull(individualId, "individualId"); retrieveSearchCheck(request); Holder signatureHeader = null; Holder productHolder = new Holder<>(productHeader); @@ -209,6 +215,7 @@ public RetrieveSearchForProviderOrganisationResponse retrieveSearch(RetrieveSear * @throws StandardErrorMsg if the Web Service call fails. */ public RetrieveSearchForProviderOrganisationResponse retrieveSearch(RetrieveSearchForProviderOrganisation request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); checkUserID(); retrieveSearchCheck(request); Holder signatureHeader = null; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClient.java new file mode 100644 index 0000000..a384c4a --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumercreateprovisionalihi._3.ConsumerCreateProvisionalIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumercreateprovisionalihi._3.ConsumerCreateProvisionalIHIService; +import au.net.electronichealth.ns.hi.svc.consumercreateprovisionalihi._3.CreateProvisionalIHI; +import au.net.electronichealth.ns.hi.svc.consumercreateprovisionalihi._3.CreateProvisionalIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumercreateprovisionalihi._3.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) create provisional client. + * This class may be used to connect to the Medicare HI Service for Consumer Create Provisional IHI (3.0) operations. + */ +public class ConsumerCreateProvisionalIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerCreateProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerCreateProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerCreateProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerCreateProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerCreateProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerCreateProvisionalIHIPortType.class, + ConsumerCreateProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerCreateProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerCreateProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerCreateProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerCreateProvisionalIHIPortType.class, + ConsumerCreateProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerCreateProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerCreateProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerCreateProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerCreateProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Create Provisional IHI request. + * + * @param request the CreateProvisionalIHI request body + * @return the response from the ConsumerCreateProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final CreateProvisionalIHIResponse createProvisionalIHI(CreateProvisionalIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().createProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Create Provisional IHI request. + * + * @param request the CreateProvisionalIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerCreateProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final CreateProvisionalIHIResponse createProvisionalIHI( + CreateProvisionalIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().createProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClient.java new file mode 100644 index 0000000..2d23323 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumercreateunverifiedihi._3_0.ConsumerCreateUnverifiedIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumercreateunverifiedihi._3_0.ConsumerCreateUnverifiedIHIService; +import au.net.electronichealth.ns.hi.svc.consumercreateunverifiedihi._3_0.CreateUnverifiedIHI; +import au.net.electronichealth.ns.hi.svc.consumercreateunverifiedihi._3_0.CreateUnverifiedIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumercreateunverifiedihi._3_0.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) create unverified client. + * This class may be used to connect to the Medicare HI Service for Consumer Create Unverified IHI (3.0.2) operations. + */ +public class ConsumerCreateUnverifiedIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerCreateUnverifiedIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerCreateUnverifiedIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerCreateUnverifiedIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerCreateUnverifiedIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerCreateUnverifiedIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerCreateUnverifiedIHIPortType.class, + ConsumerCreateUnverifiedIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerCreateUnverifiedIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerCreateUnverifiedIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerCreateUnverifiedIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerCreateUnverifiedIHIPortType.class, + ConsumerCreateUnverifiedIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerCreateUnverifiedIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerCreateUnverifiedIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerCreateUnverifiedIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateUnverifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerCreateUnverifiedIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Create Unverified IHI request. + * + * @param request the CreateUnverifiedIHI request body + * @return the response from the ConsumerCreateUnverifiedIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final CreateUnverifiedIHIResponse createUnverifiedIHI(CreateUnverifiedIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().createUnverifiedIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Create Unverified IHI request. + * + * @param request the CreateUnverifiedIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerCreateUnverifiedIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final CreateUnverifiedIHIResponse createUnverifiedIHI( + CreateUnverifiedIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().createUnverifiedIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClient.java new file mode 100644 index 0000000..2300ee4 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumercreateverifiedihi._4_0.ConsumerCreateVerifiedIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumercreateverifiedihi._4_0.ConsumerCreateVerifiedIHIService; +import au.net.electronichealth.ns.hi.svc.consumercreateverifiedihi._4_0.CreateVerifiedIHI; +import au.net.electronichealth.ns.hi.svc.consumercreateverifiedihi._4_0.CreateVerifiedIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumercreateverifiedihi._4_0.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) create verified client. + * This class may be used to connect to the Medicare HI Service for Consumer Create Verified IHI (4.0.0) operations. + */ +public class ConsumerCreateVerifiedIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerCreateVerifiedIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerCreateVerifiedIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerCreateVerifiedIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerCreateVerifiedIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerCreateVerifiedIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerCreateVerifiedIHIPortType.class, + ConsumerCreateVerifiedIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerCreateVerifiedIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerCreateVerifiedIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerCreateVerifiedIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerCreateVerifiedIHIPortType.class, + ConsumerCreateVerifiedIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerCreateVerifiedIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerCreateVerifiedIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerCreateVerifiedIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerCreateVerifiedIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerCreateVerifiedIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Create Verified IHI request. + * + * @param request the CreateVerifiedIHI request body + * @return the response from the ConsumerCreateVerifiedIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final CreateVerifiedIHIResponse createVerifiedIHI(CreateVerifiedIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().createVerifiedIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Create Verified IHI request. + * + * @param request the CreateVerifiedIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerCreateVerifiedIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final CreateVerifiedIHIResponse createVerifiedIHI( + CreateVerifiedIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().createVerifiedIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClient.java new file mode 100644 index 0000000..330077f --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumermergeprovisionalihi._3.ConsumerMergeProvisionalIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumermergeprovisionalihi._3.ConsumerMergeProvisionalIHIService; +import au.net.electronichealth.ns.hi.svc.consumermergeprovisionalihi._3.MergeProvisionalIHI; +import au.net.electronichealth.ns.hi.svc.consumermergeprovisionalihi._3.MergeProvisionalIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumermergeprovisionalihi._3.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) merge provisional client. + * This class may be used to connect to the Medicare HI Service for Consumer Merge Provisional IHI (3.0) operations. + */ +public class ConsumerMergeProvisionalIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerMergeProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerMergeProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerMergeProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerMergeProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerMergeProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerMergeProvisionalIHIPortType.class, + ConsumerMergeProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerMergeProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerMergeProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerMergeProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerMergeProvisionalIHIPortType.class, + ConsumerMergeProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerMergeProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerMergeProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerMergeProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerMergeProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerMergeProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Merge Provisional IHI request. + * + * @param request the MergeProvisionalIHI request body + * @return the response from the ConsumerMergeProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final MergeProvisionalIHIResponse mergeProvisionalIHI(MergeProvisionalIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().mergeProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Merge Provisional IHI request. + * + * @param request the MergeProvisionalIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerMergeProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final MergeProvisionalIHIResponse mergeProvisionalIHI( + MergeProvisionalIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().mergeProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClient.java new file mode 100644 index 0000000..fb7aa5b --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumernotifyduplicateihi._3_2.ConsumerNotifyDuplicateIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumernotifyduplicateihi._3_2.ConsumerNotifyDuplicateIHIService; +import au.net.electronichealth.ns.hi.svc.consumernotifyduplicateihi._3_2.NotifyDuplicateIHI; +import au.net.electronichealth.ns.hi.svc.consumernotifyduplicateihi._3_2.NotifyDuplicateIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumernotifyduplicateihi._3_2.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) notify duplicate client. + * This class may be used to connect to the Medicare HI Service for Consumer Notify Duplicate IHI (3.2.0) operations. + */ +public class ConsumerNotifyDuplicateIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerNotifyDuplicateIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerNotifyDuplicateIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerNotifyDuplicateIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerNotifyDuplicateIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerNotifyDuplicateIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerNotifyDuplicateIHIPortType.class, + ConsumerNotifyDuplicateIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerNotifyDuplicateIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerNotifyDuplicateIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerNotifyDuplicateIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerNotifyDuplicateIHIPortType.class, + ConsumerNotifyDuplicateIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerNotifyDuplicateIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerNotifyDuplicateIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerNotifyDuplicateIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerNotifyDuplicateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerNotifyDuplicateIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Notify Duplicate IHI request. + * + * @param request the NotifyDuplicateIHI request body + * @return the response from the ConsumerNotifyDuplicateIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final NotifyDuplicateIHIResponse notifyDuplicateIHI(NotifyDuplicateIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().notifyDuplicateIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Notify Duplicate IHI request. + * + * @param request the NotifyDuplicateIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerNotifyDuplicateIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final NotifyDuplicateIHIResponse notifyDuplicateIHI( + NotifyDuplicateIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().notifyDuplicateIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClient.java new file mode 100644 index 0000000..e776adf --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumernotifyreplicaihi._3_2.ConsumerNotifyReplicaIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumernotifyreplicaihi._3_2.ConsumerNotifyReplicaIHIService; +import au.net.electronichealth.ns.hi.svc.consumernotifyreplicaihi._3_2.NotifyReplicaIHI; +import au.net.electronichealth.ns.hi.svc.consumernotifyreplicaihi._3_2.NotifyReplicaIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumernotifyreplicaihi._3_2.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) notify replica client. + * This class may be used to connect to the Medicare HI Service for Consumer Notify Replica IHI (3.2.0) operations. + */ +public class ConsumerNotifyReplicaIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerNotifyReplicaIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerNotifyReplicaIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerNotifyReplicaIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerNotifyReplicaIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerNotifyReplicaIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerNotifyReplicaIHIPortType.class, + ConsumerNotifyReplicaIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerNotifyReplicaIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerNotifyReplicaIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerNotifyReplicaIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerNotifyReplicaIHIPortType.class, + ConsumerNotifyReplicaIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerNotifyReplicaIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerNotifyReplicaIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerNotifyReplicaIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerNotifyReplicaIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerNotifyReplicaIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Notify Replica IHI request. + * + * @param request the NotifyReplicaIHI request body + * @return the response from the ConsumerNotifyReplicaIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final NotifyReplicaIHIResponse notifyReplicaIHI(NotifyReplicaIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().notifyReplicaIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Notify Replica IHI request. + * + * @param request the NotifyReplicaIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerNotifyReplicaIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final NotifyReplicaIHIResponse notifyReplicaIHI( + NotifyReplicaIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().notifyReplicaIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClient.java new file mode 100644 index 0000000..1229e77 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClient.java @@ -0,0 +1,238 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumerresolveprovisionalihi._3_0.ConsumerResolveProvisionalIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumerresolveprovisionalihi._3_0.ConsumerResolveProvisionalIHIService; +import au.net.electronichealth.ns.hi.svc.consumerresolveprovisionalihi._3_0.ResolveProvisionalIHI; +import au.net.electronichealth.ns.hi.svc.consumerresolveprovisionalihi._3_0.ResolveProvisionalIHIResponse; +import au.net.electronichealth.ns.hi.svc.consumerresolveprovisionalihi._3_0.StandardErrorMsg; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) resolve provisional client. + * This class may be used to connect to the Medicare HI Service for Consumer Resolve Provisional IHI (3.0.2) operations. + */ +public class ConsumerResolveProvisionalIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerResolveProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerResolveProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerResolveProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerResolveProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerResolveProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerResolveProvisionalIHIPortType.class, + ConsumerResolveProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerResolveProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerResolveProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerResolveProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerResolveProvisionalIHIPortType.class, + ConsumerResolveProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerResolveProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerResolveProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerResolveProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerResolveProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerResolveProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes a Resolve Provisional IHI request. + * + * @param request the ResolveProvisionalIHI request body + * @return the response from the ConsumerResolveProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final ResolveProvisionalIHIResponse resolveProvisionalIHI(ResolveProvisionalIHI request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().resolveProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes a Resolve Provisional IHI request. + * + * @param request the ResolveProvisionalIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerResolveProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final ResolveProvisionalIHIResponse resolveProvisionalIHI( + ResolveProvisionalIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().resolveProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClient.java new file mode 100644 index 0000000..942577d --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClient.java @@ -0,0 +1,380 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.ConsumerSearchIHIBatchAsyncPortType; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.ConsumerSearchIHIBatchAsyncService; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.DeleteSearchIHIBatch; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.DeleteSearchIHIBatchResponse; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.GetSearchIHIBatchStatus; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.GetSearchIHIBatchStatusResponse; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.RetrieveSearchIHIBatch; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.RetrieveSearchIHIBatchResponse; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.StandardErrorMsg; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.SubmitSearchIHIBatch; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.SubmitSearchIHIBatchResponse; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) batch search client for + * asynchronous batch operations. + * This class may be used to connect to the Medicare HI Service for Consumer Search IHI Batch Async (3.0) operations. + */ +public class ConsumerSearchIHIBatchAsyncClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerSearchIHIBatchAsyncClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerSearchIHIBatchAsyncClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerSearchIHIBatchAsyncClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerSearchIHIBatchAsync service (Optional) + * @param productHeader The product header data for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerSearchIHIBatchAsyncClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerSearchIHIBatchAsyncPortType.class, + ConsumerSearchIHIBatchAsyncService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerSearchIHIBatchAsyncClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerSearchIHIBatchAsync service (Optional) + * @param productHeader The product header data for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerSearchIHIBatchAsyncClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerSearchIHIBatchAsyncPortType.class, + ConsumerSearchIHIBatchAsyncService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerSearchIHIBatchAsyncClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerSearchIHIBatchAsyncClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerSearchIHIBatchAsyncClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerSearchIHIBatchAsync service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerSearchIHIBatchAsyncClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Submits an asynchronous IHI batch search. + * + * @param request the SubmitSearchIHIBatch request body + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final SubmitSearchIHIBatchResponse submitSearchIHIBatch(SubmitSearchIHIBatch request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().submitSearchIHIBatch( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Submits an asynchronous IHI batch search. + * + * @param request the SubmitSearchIHIBatch request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final SubmitSearchIHIBatchResponse submitSearchIHIBatch( + SubmitSearchIHIBatch request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().submitSearchIHIBatch( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } + + /** + * Retrieves results for an asynchronous IHI batch search. + * + * @param request the RetrieveSearchIHIBatch request body + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final RetrieveSearchIHIBatchResponse retrieveSearchIHIBatch(RetrieveSearchIHIBatch request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().retrieveSearchIHIBatch( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Retrieves results for an asynchronous IHI batch search. + * + * @param request the RetrieveSearchIHIBatch request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final RetrieveSearchIHIBatchResponse retrieveSearchIHIBatch( + RetrieveSearchIHIBatch request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().retrieveSearchIHIBatch( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } + + /** + * Returns the status of an asynchronous IHI batch search. + * + * @param request the GetSearchIHIBatchStatus request body + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final GetSearchIHIBatchStatusResponse getSearchIHIBatchStatus(GetSearchIHIBatchStatus request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().getSearchIHIBatchStatus( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Returns the status of an asynchronous IHI batch search. + * + * @param request the GetSearchIHIBatchStatus request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final GetSearchIHIBatchStatusResponse getSearchIHIBatchStatus( + GetSearchIHIBatchStatus request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().getSearchIHIBatchStatus( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } + + /** + * Deletes an asynchronous IHI batch search. + * + * @param request the DeleteSearchIHIBatch request body + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final DeleteSearchIHIBatchResponse deleteSearchIHIBatch(DeleteSearchIHIBatch request) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().deleteSearchIHIBatch( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Deletes an asynchronous IHI batch search. + * + * @param request the DeleteSearchIHIBatch request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerSearchIHIBatchAsync service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final DeleteSearchIHIBatchResponse deleteSearchIHIBatch( + DeleteSearchIHIBatch request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().deleteSearchIHIBatch( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClient.java index 1b448d3..abeeef9 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -13,6 +15,7 @@ */ package au.gov.nehta.vendorlibrary.hi.ihi; +import au.gov.nehta.common.utils.ArgumentUtils; import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; import au.gov.nehta.xsp.CertificateValidator; import au.net.electronichealth.ns.hi.svc.consumersearchihibatchsyncrequest._3.ConsumerSearchIHIBatchSyncPortType; @@ -25,7 +28,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; @@ -198,6 +201,7 @@ private ConsumerSearchIHIBatchSyncClient(final String serviceEndpoint, * @throws StandardErrorMsg if the Web Service call fails. */ public final SearchIHIBatchResponse batchSearch(SearchBatch request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); checkUserID(); TimestampType timestampHeader = getTimestampHeader(); Holder signatureHeader = null; @@ -222,7 +226,8 @@ public final SearchIHIBatchResponse batchSearch(SearchBatch request) throws Stan */ public final SearchIHIBatchResponse batchSearch(SearchBatch request, au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { - + ArgumentUtils.checkNotNull(request, "request"); + ArgumentUtils.checkNotNull(individualId, "individualId"); TimestampType timestampHeader = getTimestampHeader(); Holder signatureHeader = null; Holder productHolder = new Holder<>(productHeader); diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClient.java index dce1d60..b2d75e3 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -23,11 +25,12 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianPostalAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianStreetAddressType; +import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianUnstructuredStreetAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.InternationalAddressType; import javax.net.ssl.SSLSocketFactory; import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; @@ -343,6 +346,38 @@ public final SearchIHIResponse australianStreetAddressSearch(SearchIHI request) ); } + /** + * Executes an Australian Unstructured Street Address ConsumerSearchIHI search. + * + * @param request the SearchIHI request object containing the following mandatory fields: + * Family Name + * Date of Birth + * Sex + * Australian Unstructured Street Address: Suburb + * Australian Unstructured Street Address: State + * Australian Unstructured Street Address: Post Code + * and the following optional fields + * Given Name + * Address Line One + * Address Line Two + * @return the response from the ConsumerSearchIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final SearchIHIResponse australianUnstructuredStreetAddressSearch(SearchIHI request) throws StandardErrorMsg { + checkUserID(); + argumentValidator.australianUnstructuredStreetAddressSearchCheck(request); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().searchIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId + ); + } + /** * Executes an International Address ConsumerSearchIHI search. * @@ -560,6 +595,41 @@ public final SearchIHIResponse australianStreetAddressSearch(SearchIHI request, ); } + /** + * Executes an Australian Unstructured Street Address ConsumerSearchIHI search. + * + * @param request the SearchIHI request object containing the following mandatory fields: + * Family Name + * Date of Birth + * Sex + * Australian Unstructured Street Address: Suburb + * Australian Unstructured Street Address: State + * Australian Unstructured Street Address: Post Code + * and the following optional fields + * Given Name + * Address Line One + * Address Line Two + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerSearchIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final SearchIHIResponse australianUnstructuredStreetAddressSearch(SearchIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) + throws StandardErrorMsg { + + argumentValidator.australianUnstructuredStreetAddressSearchCheck(request); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().searchIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId + ); + } + /** * Executes an International Address ConsumerSearchIHI search. * @@ -622,6 +692,7 @@ public final void basicSearchCheck(final SearchIHI request) { ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); ensureNull(request.getDvaFileNumber(), "DVA File Number"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getMedicareCardNumber(), "Medicare Card Number"); @@ -641,6 +712,7 @@ public final void basicMedicareSearchCheck(final SearchIHI request) { ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); ensureNull(request.getDvaFileNumber(), "DVA File Number"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -660,6 +732,7 @@ public final void basicDvaSearchCheck(final SearchIHI request) { ensureNull(request.getMedicareCardNumber(), "Medicare Card Number"); ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -678,6 +751,7 @@ public final void detailedSearchCheck(final SearchIHI request) { ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getDvaFileNumber(), "DVA File Name"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -707,6 +781,7 @@ public final void australianPostalAddressSearchCheck(final SearchIHI request) { ArgumentUtils.checkNotNullNorBlank(australianPostalAddress.getSuburb(), "Suburb"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); australianAddressNullChecks(request); } @@ -735,10 +810,34 @@ public final void australianStreetAddressSearchCheck(final SearchIHI request) { ArgumentUtils.checkNotNull(request.getAustralianStreetAddress().getLevelGroup().getLevelType(), "Level Type"); } + if (australianStreetAddress.getStreetNumber() != null) { + ArgumentUtils.checkNotNull(australianStreetAddress.getStreetType(), "Street Type"); + } + ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); australianAddressNullChecks(request); } + /** + * Checks that only the correct parameters for an Australian Unstructured Street address search are set. + * + * @param request the search request object containing the parameters to be checked. + */ + public final void australianUnstructuredStreetAddressSearchCheck(final SearchIHI request) { + checkCommonMandatoryParameters(request); + + AustralianUnstructuredStreetAddressType unstructuredAddress = request.getAustralianUnstructuredStreetAddress(); + ArgumentUtils.checkNotNull(unstructuredAddress, "Australian Unstructured Street Address"); + ArgumentUtils.checkNotNullNorBlank(unstructuredAddress.getSuburb(), "Suburb"); + ArgumentUtils.checkNotNull(unstructuredAddress.getState(), "State"); + ArgumentUtils.checkNotNullNorBlank(unstructuredAddress.getPostcode(), "Post Code"); + ensureExactStringLength(unstructuredAddress.getPostcode(), AUSTRALIAN_POSTCODE_LENGTH, "Post Code"); + + ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); + ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + searchCriteriaNullChecks(request); + } + /** * Checks that only the correct parameters for an International address search are set. * @@ -758,17 +857,18 @@ public final void internationalAddressSearchCheck(final SearchIHI request) { ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getDvaFileNumber(), "DVA File Name"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getIhiNumber(), "IHI Number"); } /** - * Verifies that various non-Australian Address fields are null. + * Verifies that identifier and non-address search fields are null. * * @param request the search request object containing the parameters to be checked. */ - private void australianAddressNullChecks(SearchIHI request) { + private void searchCriteriaNullChecks(SearchIHI request) { ensureNull(request.getMedicareCardNumber(), "Medicare Card Number"); ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getDvaFileNumber(), "DVA File Name"); @@ -777,6 +877,16 @@ private void australianAddressNullChecks(SearchIHI request) { ensureNull(request.getIhiNumber(), "IHI Number"); } + /** + * Verifies that various non-Australian Address fields are null for structured address searches. + * + * @param request the search request object containing the parameters to be checked. + */ + private void australianAddressNullChecks(SearchIHI request) { + searchCriteriaNullChecks(request); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); + } + /** * Checks that the following mandatory parameters are set correctly: * Family Name diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClient.java new file mode 100644 index 0000000..caa48aa --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumerupdateihi._3_2.ConsumerUpdateIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumerupdateihi._3_2.ConsumerUpdateIHIService; +import au.net.electronichealth.ns.hi.svc.consumerupdateihi._3_2.StandardErrorMsg; +import au.net.electronichealth.ns.hi.svc.consumerupdateihi._3_2.UpdateIHI; +import au.net.electronichealth.ns.hi.svc.consumerupdateihi._3_2.UpdateIHIResponse; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) update client. + * This class may be used to connect to the Medicare HI Service for Consumer Update IHI (3.2.0) operations. + */ +public class ConsumerUpdateIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerUpdateIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerUpdateIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerUpdateIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerUpdateIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerUpdateIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerUpdateIHIPortType.class, + ConsumerUpdateIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerUpdateIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerUpdateIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerUpdateIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerUpdateIHIPortType.class, + ConsumerUpdateIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerUpdateIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerUpdateIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerUpdateIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerUpdateIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerUpdateIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes an Update IHI request. + * + * @param request the UpdateIHI request body + * @return the response from the ConsumerUpdateIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final UpdateIHIResponse updateIHI(UpdateIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().updateIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes an Update IHI request. + * + * @param request the UpdateIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerUpdateIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final UpdateIHIResponse updateIHI(UpdateIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) + throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().updateIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClient.java new file mode 100644 index 0000000..b5c3b5a --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClient.java @@ -0,0 +1,237 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.common.utils.ArgumentUtils; +import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; +import au.gov.nehta.xsp.CertificateValidator; +import au.net.electronichealth.ns.hi.svc.consumerupdateprovisionalihi._3.ConsumerUpdateProvisionalIHIPortType; +import au.net.electronichealth.ns.hi.svc.consumerupdateprovisionalihi._3.StandardErrorMsg; +import au.net.electronichealth.ns.hi.svc.consumerupdateprovisionalihi._3.UpdateProvisionalIHIService; +import au.net.electronichealth.ns.hi.svc.consumerupdateprovisionalihi._3.UpdateProvisionalIHI; +import au.net.electronichealth.ns.hi.svc.consumerupdateprovisionalihi._3.UpdateProvisionalIHIResponse; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; +import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.SignatureContainerType; +import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; + +import javax.net.ssl.SSLSocketFactory; +import jakarta.xml.ws.Holder; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; + +/** + * An implementation of a Healthcare Identifiers (HI) Individual Healthcare Identifier (IHI) update provisional client. + * This class may be used to connect to the Medicare HI Service for Consumer Update Provisional IHI (3.0) operations. + */ +public class ConsumerUpdateProvisionalIHIClient extends BaseClient_3 { + + /** + * Constructor which creates a new ConsumerUpdateProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + */ + public ConsumerUpdateProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerUpdateProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerUpdateProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerUpdateProvisionalIHIClient(final String serviceEndpoint, + final QualifiedId individualQualifiedId, + final QualifiedId organisationQualifiedId, + final ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerUpdateProvisionalIHIPortType.class, + UpdateProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerUpdateProvisionalIHIClient with an endpoint and an SSL Socket Factory, with + * the optional contracted service providers HPI-O organisation qualified ID set. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param organisationQualifiedId The qualified organisation ID for connecting to the ConsumerUpdateProvisionalIHI service (Optional) + * @param productHeader The product header data for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider (Mandatory) + * @param certificateValidator (optional) a user supplied validator to authenticate the response certificate. + */ + public ConsumerUpdateProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId organisationQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory, + CertificateValidator certificateValidator) { + + super(ConsumerUpdateProvisionalIHIPortType.class, + UpdateProvisionalIHIService.class, + individualQualifiedId, + organisationQualifiedId, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + serviceEndpoint, + certificateValidator + ); + } + + /** + * Constructor which creates a new ConsumerUpdateProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * This is an overloaded constructor for the generic qualified id and product types. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerUpdateProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + null, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Constructor which creates a new ConsumerUpdateProvisionalIHIClient with an endpoint and an SSL Socket Factory. + * + * @param serviceEndpoint the Web Service endpoint for the Medicare HI Service interface (Mandatory) + * @param individualQualifiedId The qualified user ID for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param productHeader The product header data for connecting to the ConsumerUpdateProvisionalIHI service (Mandatory) + * @param signingPrivateKey The private key to be used for signing (Mandatory) + * @param signingCertificate The certificate to be used for signing (Mandatory) + * @param sslSocketFactory the SSL Socket Factory to be used when connecting to the Web Service provider + */ + public ConsumerUpdateProvisionalIHIClient(final String serviceEndpoint, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualQualifiedId, + final au.gov.nehta.vendorlibrary.hi.client.wrapped.ProductType productHeader, + final PrivateKey signingPrivateKey, + final X509Certificate signingCertificate, + final SSLSocketFactory sslSocketFactory) { + this( + serviceEndpoint, + individualQualifiedId, + null, + productHeader, + signingPrivateKey, + signingCertificate, + sslSocketFactory, + null + ); + } + + /** + * Executes an Update Provisional IHI request. + * + * @param request the UpdateProvisionalIHI request body + * @return the response from the ConsumerUpdateProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final UpdateProvisionalIHIResponse updateProvisionalIHI(UpdateProvisionalIHI request) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + checkUserID(); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().updateProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + this.individualQualifiedId, + this.organisationQualifiedId); + } + + /** + * Executes an Update Provisional IHI request. + * + * @param request the UpdateProvisionalIHI request body + * @param individualId the qualified user id of the user making the request + * @return the response from the ConsumerUpdateProvisionalIHI service + * @throws StandardErrorMsg if the Web Service call fails. + */ + public final UpdateProvisionalIHIResponse updateProvisionalIHI( + UpdateProvisionalIHI request, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId individualId) throws StandardErrorMsg { + ArgumentUtils.checkNotNull(request, "request"); + Holder signatureHeader = null; + Holder productHolder = new Holder<>(productHeader); + return getPort().updateProvisionalIHI( + request, + productHolder, + getTimestampHeader(), + signatureHeader, + individualId.as3Type(), + this.organisationQualifiedId); + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/SearchBatch.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/SearchBatch.java index 47ff317..c8d0a56 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/SearchBatch.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/ihi/SearchBatch.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.ihi; import au.gov.nehta.common.utils.ArgumentUtils; @@ -6,6 +21,7 @@ import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SexType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianPostalAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianStreetAddressType; +import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianUnstructuredStreetAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.InternationalAddressType; import au.net.electronichealth.ns.hi.xsd.consumermessages.searchihibatch._3.SearchIHIRequestType; @@ -125,6 +141,22 @@ public final void addAustralianStreetAddressSearch(SearchIHIRequestType search) this.searches.add(search); } + /** + * Validates an Australian Unstructured Street Address search and adds it to the batch if + * successful. + * + * @param search the search object containing the following mandatory fields: + * Family Name Date of Birth Sex Australian Unstructured Street Address: + * Suburb Australian Unstructured Street Address: State Australian Unstructured + * Street Address: Post Code and the following optional fields Given Name + * Address Line One Address Line Two + */ + public final void addAustralianUnstructuredStreetAddressSearch(SearchIHIRequestType search) { + this.argumentValidator.australianUnstructuredStreetAddressSearchCheck(search.getSearchIHI()); + this.validateRequestIdentifier(search.getRequestIdentifier()); + this.searches.add(search); + } + /** * Validates a Australian Street Address search and adds it to the batch if * successful. @@ -185,6 +217,7 @@ public final void basicSearchCheck(final SearchIHI request) { ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); ensureNull(request.getDvaFileNumber(), "DVA File Number"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getMedicareCardNumber(), "Medicare Card Number"); @@ -204,6 +237,7 @@ public final void basicMedicareSearchCheck(final SearchIHI request) { ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); ensureNull(request.getDvaFileNumber(), "DVA File Number"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -223,6 +257,7 @@ public final void basicDvaSearchCheck(final SearchIHI request) { ensureNull(request.getMedicareCardNumber(), "Medicare Card Number"); ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -241,6 +276,7 @@ public final void detailedSearchCheck(final SearchIHI request) { ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getDvaFileNumber(), "DVA File Name"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getInternationalAddress(), "International Address"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -270,6 +306,7 @@ public final void australianPostalAddressSearchCheck(final SearchIHI request) { ArgumentUtils.checkNotNullNorBlank(australianPostalAddress.getSuburb(), "Suburb"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); australianAddressNullChecks(request); } @@ -298,10 +335,34 @@ public final void australianStreetAddressSearchCheck(final SearchIHI request) { ArgumentUtils.checkNotNull(request.getAustralianStreetAddress().getLevelGroup().getLevelType(), "Level Type"); } + if (australianStreetAddress.getStreetNumber() != null) { + ArgumentUtils.checkNotNull(australianStreetAddress.getStreetType(), "Street Type"); + } + ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); australianAddressNullChecks(request); } + /** + * Checks that only the correct parameters for an Australian Unstructured Street address search are set. + * + * @param request the search request object containing the parameters to be checked. + */ + public final void australianUnstructuredStreetAddressSearchCheck(final SearchIHI request) { + checkCommonMandatoryParameters(request); + + AustralianUnstructuredStreetAddressType unstructuredAddress = request.getAustralianUnstructuredStreetAddress(); + ArgumentUtils.checkNotNull(unstructuredAddress, "Australian Unstructured Street Address"); + ArgumentUtils.checkNotNullNorBlank(unstructuredAddress.getSuburb(), "Suburb"); + ArgumentUtils.checkNotNull(unstructuredAddress.getState(), "State"); + ArgumentUtils.checkNotNullNorBlank(unstructuredAddress.getPostcode(), "Post Code"); + ensureExactStringLength(unstructuredAddress.getPostcode(), AUSTRALIAN_POSTCODE_LENGTH, "Post Code"); + + ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); + ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + searchCriteriaNullChecks(request); + } + /** * Checks that only the correct parameters for an International address search are set. * @@ -321,6 +382,7 @@ public final void internationalAddressSearchCheck(final SearchIHI request) { ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getDvaFileNumber(), "DVA File Name"); ensureNull(request.getAustralianStreetAddress(), "Australian Street Address"); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); ensureNull(request.getAustralianPostalAddress(), "Australian Postal Address"); ensureNull(request.getHistory(), "History"); ensureNull(request.getIhiNumber(), "IHI Number"); @@ -328,11 +390,11 @@ public final void internationalAddressSearchCheck(final SearchIHI request) { /** - * Verifies that various non-Australian Address fields are null. + * Verifies that identifier and non-address search fields are null. * * @param request the search request object containing the parameters to be checked. */ - private void australianAddressNullChecks(SearchIHI request) { + private void searchCriteriaNullChecks(SearchIHI request) { ensureNull(request.getMedicareCardNumber(), "Medicare Card Number"); ensureNull(request.getMedicareIRN(), "Medicare IRN"); ensureNull(request.getDvaFileNumber(), "DVA File Name"); @@ -341,6 +403,16 @@ private void australianAddressNullChecks(SearchIHI request) { ensureNull(request.getIhiNumber(), "IHI Number"); } + /** + * Verifies that various non-Australian Address fields are null for structured address searches. + * + * @param request the search request object containing the parameters to be checked. + */ + private void australianAddressNullChecks(SearchIHI request) { + searchCriteriaNullChecks(request); + ensureNull(request.getAustralianUnstructuredStreetAddress(), "Australian Unstructured Street Address"); + } + /** * Checks that the following mandatory parameters are set correctly: * Family Name diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClient.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClient.java index 09b1ee6..15b67dc 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClient.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClient.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -24,7 +26,7 @@ import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import javax.net.ssl.SSLSocketFactory; -import javax.xml.ws.Holder; +import jakarta.xml.ws.Holder; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.List; diff --git a/src/main/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRoot.java b/src/main/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRoot.java index 49c01e1..3277d21 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRoot.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRoot.java @@ -43,11 +43,16 @@ * local configuration without restarting the JVM before first class load. Finally, the JVM system * property {@code HI_WSDL_ARTIFACT_ROOT}. *

- * Maven builds of this checkout use {@code hi.wsdl.tree.root} from {@code settings.xml} (see - * {@code settings.xml.example}); the Maven build does not read {@code HI_WSDL_ARTIFACT_ROOT}. + * Maven resolves {@code hi.wsdl.tree.root} from the POM default, {@code -Dhi.wsdl.tree.root}, + * {@code HI_WSDL_TREE_ROOT}, or the effective user settings for that invocation; the build does not + * read {@code HI_WSDL_ARTIFACT_ROOT}. See README.md (runtime) and CONTRIBUTING.md / wsdls/README.md (build). */ public final class HiWsdlArtifactRoot { + /** + * Environment variable, {@code local.properties} key, and system property name for the + * directory that contains {@code wsdl/} and {@code schema/}. + */ public static final String HI_WSDL_ARTIFACT_ROOT = "HI_WSDL_ARTIFACT_ROOT"; private static final AtomicReference CONFIGURED = new AtomicReference<>(); @@ -86,10 +91,20 @@ private static String readHiWsdlArtifactRootFromLocalPropertiesFile() { private HiWsdlArtifactRoot() { } + /** + * Sets the artifact root for this JVM, overriding environment, {@code local.properties}, and + * system property. Pass {@code null} to clear a programmatic value so those sources are used + * again. + */ public static void setRoot(Path root) { CONFIGURED.set(root); } + /** + * @return explicit {@link #setRoot(Path)} value, else non-blank env {@code HI_WSDL_ARTIFACT_ROOT}, + * else the same key in {@code local.properties} (working directory), else non-blank + * system property, else {@code null} + */ public static Path getRootOrNull() { Path p = CONFIGURED.get(); if (p != null) { @@ -110,6 +125,14 @@ public static Path getRootOrNull() { return null; } + /** + * Locates a WSDL file under the configured artifact root. + * + * @param wsdlLocation value from {@code @WebServiceClient#wsdlLocation()} (typically a bare + * {@code *.wsdl} filename) + * @return a {@code file:} URL to an existing file, or {@code null} if there is no root, no + * {@code wsdl/} directory, or no matching file + */ public static URL findWsdlUrl(String wsdlLocation) { if (wsdlLocation == null || wsdlLocation.isEmpty()) { return null; @@ -146,7 +169,7 @@ public static URL findWsdlUrl(String wsdlLocation) { } return hit.get().toUri().toURL(); } - } catch (IOException e) { + } catch (java.io.IOException e) { return null; } } diff --git a/src/main/java/au/gov/nehta/vendorlibrary/ws/TimeUtility.java b/src/main/java/au/gov/nehta/vendorlibrary/ws/TimeUtility.java new file mode 100644 index 0000000..484d6c5 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/ws/TimeUtility.java @@ -0,0 +1,148 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.ws; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeConstants; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.logging.Level; +import java.util.logging.Logger; + +public final class TimeUtility { + + public static final String DATE_FORMAT_NOW = "yyyyMMdd HH:mm:ss"; + public static final String DATE_FORMAT_NOW_REGX = "^([0-9]{4})([0-1][0-9])" + + "([0-3][0-9])\\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$"; + public static final String DATE_FORMAT = "yyyyMMdd"; + public static final String DATE_FORMAT_REGX = "^(19|20)\\d\\d(0[1-9]|1[012])" + + "(0[1-9]|[12][0-9]|3[01])$"; + public static final String COMPACT_DATE_TIME_FORMAT = "yyyyMMddHHmmss"; + public static final int DATE_TIME_LENGTH = COMPACT_DATE_TIME_FORMAT.length(); + private static final Logger LOGGER = Logger.getLogger(TimeUtility.class.getName()); + + private TimeUtility() { + } + + public static XMLGregorianCalendar getXMLGregorianDateTime( + final String date) { + if (date == null) { + throw new IllegalArgumentException("date must not be null"); + } + try { + if (date.matches(DATE_FORMAT_NOW_REGX)) { + XMLGregorianCalendar cal = DatatypeFactory.newInstance() + .newXMLGregorianCalendar(new GregorianCalendar()); + SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_NOW); + Date simpleDate = format.parse(date); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(simpleDate); + + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DAY_OF_MONTH); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int min = calendar.get(Calendar.MINUTE); + int second = calendar.get(Calendar.SECOND); + + cal.setDay(day); + cal.setYear(year); + cal.setMonth(month + 1); + cal.setHour(hour); + cal.setMinute(min); + cal.setSecond(second); + return cal; + } + } catch (DatatypeConfigurationException | ParseException ex) { + throw new IllegalArgumentException("Incorrect date format" + + date + ". Must be set in " + DATE_FORMAT + " format", ex); + } + throw new IllegalArgumentException("Incorrect date format" + + date + ". Must be set in " + + DATE_FORMAT + " format"); + } + + public static XMLGregorianCalendar getXMLGregorianDate(final String date) { + if (date == null) { + throw new IllegalArgumentException("date must not be null"); + } + try { + XMLGregorianCalendar cal = DatatypeFactory.newInstance() + .newXMLGregorianCalendar(new GregorianCalendar()); + if (date.matches(DATE_FORMAT_REGX)) { + + SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); + Calendar calendar = Calendar.getInstance(); + + Date simpleDate = format.parse(date); + + calendar.setTime(simpleDate); + + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DAY_OF_MONTH); + + cal.setDay(day); + cal.setYear(year); + cal.setMonth(month + 1); + + cal.setTimezone(DatatypeConstants.FIELD_UNDEFINED); + return cal; + } + } catch (ParseException | DatatypeConfigurationException ex) { + throw new IllegalArgumentException("Incorrect date format" + + date + ". Must be set in " + DATE_FORMAT + " format", ex); + } + throw new IllegalArgumentException("Incorrect date format " + + date + ". Must be set in " + DATE_FORMAT + " format"); + } + + public static String now() { + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); + return sdf.format(cal.getTime()); + } + + public static Date nowDate() { + Calendar cal = Calendar.getInstance(); + return cal.getTime(); + } + + public static String getDateAsYYYYMMDD(final Date date) { + String dateTime = null; + if (date != null) { + SimpleDateFormat dateformatYYYYMMDD = new SimpleDateFormat( + TimeUtility.DATE_FORMAT); + dateTime = dateformatYYYYMMDD.format(date); + } + return dateTime; + } + + public static XMLGregorianCalendar nowXMLGregorianCalendar() { + try { + return DatatypeFactory.newInstance() + .newXMLGregorianCalendar(new GregorianCalendar()); + } catch (DatatypeConfigurationException ex) { + LOGGER.log(Level.SEVERE, null, ex); + } + return null; + } +} diff --git a/src/main/java/au/gov/nehta/vendorlibrary/ws/WebServiceClientUtil.java b/src/main/java/au/gov/nehta/vendorlibrary/ws/WebServiceClientUtil.java index bf33cdd..ebd8498 100644 --- a/src/main/java/au/gov/nehta/vendorlibrary/ws/WebServiceClientUtil.java +++ b/src/main/java/au/gov/nehta/vendorlibrary/ws/WebServiceClientUtil.java @@ -17,15 +17,18 @@ import au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot; -import javax.net.SocketFactory; import javax.xml.namespace.QName; -import javax.xml.ws.BindingProvider; -import javax.xml.ws.Service; -import javax.xml.ws.WebServiceClient; -import javax.xml.ws.WebServiceException; -import javax.xml.ws.handler.Handler; -import javax.xml.ws.soap.AddressingFeature; +import jakarta.xml.ws.BindingProvider; +import jakarta.xml.ws.Service; +import jakarta.xml.ws.WebServiceClient; +import jakarta.xml.ws.handler.Handler; +import jakarta.xml.ws.soap.AddressingFeature; + +import javax.net.SocketFactory; +import jakarta.xml.ws.WebServiceException; + +import java.lang.reflect.Constructor; import java.net.URL; import java.util.List; import java.util.Map; @@ -40,12 +43,11 @@ public final class WebServiceClientUtil { private WebServiceClientUtil() { } - public static T getPort( - Class serviceInterface, - Class serviceClass, - SocketFactory sslSocketFactory, - String endpoint, - List handlerChain) { + public static T getPort(java.lang.Class serviceInterface, + java.lang.Class serviceClass, + SocketFactory sslSocketFactory, + String endpoint, + List handlerChain) { T port = getPort(serviceInterface, serviceClass, sslSocketFactory, endpoint); addHandlerChain(port, handlerChain); @@ -53,14 +55,13 @@ public static T getPort( return port; } - public static T getPort( - Class serviceInterface, - Class serviceClass, - SocketFactory sslSocketFactory, - String endpoint) { + public static T getPort(java.lang.Class serviceInterface, + java.lang.Class serviceClass, + SocketFactory sslSocketFactory, + String endpoint) { WebServiceClient annotation = serviceClass.getAnnotation(WebServiceClient.class); String wsdlFileLoc = annotation.wsdlLocation(); - Service service = getService(annotation, wsdlFileLoc); + Service service = createGeneratedService(serviceClass, annotation, wsdlFileLoc); T port = service.getPort(serviceInterface); configurePortWithEndpoint(port, endpoint); configurePortWithSslSocketFactory(port, sslSocketFactory); @@ -68,16 +69,15 @@ public static T getPort( return port; } - public static T getPort( - Class serviceInterface, - Class serviceClass, - SocketFactory sslSocketFactory, - String endpoint, - List handlerChain, - boolean addressingFeature) { + public static T getPort(java.lang.Class serviceInterface, + java.lang.Class serviceClass, + SocketFactory sslSocketFactory, + String endpoint, + List handlerChain, + boolean addressingFeature) { WebServiceClient annotation = serviceClass.getAnnotation(WebServiceClient.class); String wsdlFileLoc = annotation.wsdlLocation(); - Service service = getService(annotation, wsdlFileLoc); + Service service = createGeneratedService(serviceClass, annotation, wsdlFileLoc); T port = service.getPort(serviceInterface, new AddressingFeature(addressingFeature)); configurePortWithEndpoint(port, endpoint); configurePortWithSslSocketFactory(port, sslSocketFactory); @@ -86,11 +86,10 @@ public static T getPort( return port; } - public static T getPort( - Class serviceInterface, - Class serviceClass, - SocketFactory sslSocketFactory, - List handlerChain) { + public static T getPort(java.lang.Class serviceInterface, + java.lang.Class serviceClass, + SocketFactory sslSocketFactory, + List handlerChain) { T port = getPort(serviceInterface, serviceClass, sslSocketFactory); addHandlerChain(port, handlerChain); @@ -98,30 +97,44 @@ public static T getPort( return port; } - public static T getPort( - Class serviceInterface, - Class serviceClass, - SocketFactory sslSocketFactory) { + public static T getPort(java.lang.Class serviceInterface, + java.lang.Class serviceClass, + SocketFactory sslSocketFactory) { WebServiceClient annotation = serviceClass.getAnnotation(WebServiceClient.class); String wsdlFileLoc = annotation.wsdlLocation(); - Service service = getService(annotation, wsdlFileLoc); + Service service = createGeneratedService(serviceClass, annotation, wsdlFileLoc); T port = service.getPort(serviceInterface); configurePortWithSslSocketFactory(port, sslSocketFactory); return port; } - private static Service getService(WebServiceClient annotation, String wsdlFileLoc) { + /** + * Uses the {@code wsimport}-generated {@link Service} subclass so WSDL metadata (ports, bindings) is available to + * the runtime; {@link Service#create(URL, QName)} alone does not attach that metadata. + */ + private static Service createGeneratedService( + Class serviceClass, + WebServiceClient annotation, + String wsdlFileLoc) { + final URL wsdlURL = retrieveWsdlUrl(wsdlFileLoc); if (wsdlURL == null) { throw new WebServiceException( - "WSDL not found: " + wsdlFileLoc + ". Set " + HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT + "WSDL not found: " + wsdlFileLoc + " (for " + serviceClass.getName() + "). " + + "Set " + HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT + " (environment, local.properties in the working directory, or JVM system property) " - + "to the directory containing wsdl/ and schema/, call " + HiWsdlArtifactRoot.class.getName() - + ".setRoot(Path), or place the WSDL on the classpath; see README.md."); + + "to the directory containing wsdl/ and schema/, call " + + HiWsdlArtifactRoot.class.getName() + ".setRoot(Path), or place the WSDL on the classpath; " + + "see README.md."); } final QName serviceQName = new QName(annotation.targetNamespace(), annotation.name()); - return Service.create(wsdlURL, serviceQName); + try { + Constructor ctor = serviceClass.getConstructor(URL.class, QName.class); + return ctor.newInstance(wsdlURL, serviceQName); + } catch (ReflectiveOperationException e) { + throw new WebServiceException("Cannot instantiate generated service " + serviceClass.getName(), e); + } } private static URL retrieveWsdlUrl(String filePath) { @@ -141,7 +154,8 @@ private static URL retrieveWsdlUrl(String filePath) { return result; } - private static void configurePortWithSslSocketFactory(final Object servicePort, final SocketFactory sslSocketFactory) { + private static void configurePortWithSslSocketFactory(final Object servicePort, + final SocketFactory sslSocketFactory) { final BindingProvider bindingProvider = (BindingProvider) servicePort; final Map requestContext = bindingProvider.getRequestContext(); @@ -149,7 +163,8 @@ private static void configurePortWithSslSocketFactory(final Object servicePort, requestContext.put(INTERNAL_REQUEST_CONTEXT_SSL_SOCKET_FACTORY_PROPERTY_NAME, sslSocketFactory); } - private static void configurePortWithEndpoint(final Object servicePort, final String endpoint) { + private static void configurePortWithEndpoint(final Object servicePort, + final String endpoint) { final BindingProvider bindingProvider = (BindingProvider) servicePort; final Map requestContext = bindingProvider.getRequestContext(); diff --git a/src/main/java/au/gov/nehta/vendorlibrary/ws/handler/LoggingHandler.java b/src/main/java/au/gov/nehta/vendorlibrary/ws/handler/LoggingHandler.java new file mode 100644 index 0000000..f8bd158 --- /dev/null +++ b/src/main/java/au/gov/nehta/vendorlibrary/ws/handler/LoggingHandler.java @@ -0,0 +1,104 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.ws.handler; + +import com.sun.xml.ws.api.handler.MessageHandler; +import com.sun.xml.ws.api.handler.MessageHandlerContext; +import com.sun.xml.ws.api.message.Message; +import com.sun.xml.ws.api.streaming.XMLStreamWriterFactory; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import jakarta.xml.ws.handler.MessageContext; + +import java.io.ByteArrayOutputStream; +import java.util.Set; +import java.util.logging.Logger; + +public final class LoggingHandler implements MessageHandler { + + public static final String EMPTY = ""; + public static final String ENCODING = "utf-8"; + private static final Logger LOG = Logger.getLogger(LoggingHandler.class.getName()); + private String lastSoapRequest; + private String lastSoapResponse; + private boolean dump; + + public LoggingHandler(boolean dump) { + this.dump = dump; + } + + public String getLastSoapResponse() { + return lastSoapResponse; + } + + public String getLastSoapRequest() { + return lastSoapRequest; + } + + public boolean handleMessage(final MessageHandlerContext context) { + logSOAPMessage(context); + return true; + } + + public boolean handleFault(final MessageHandlerContext context) { + logSOAPMessage(context); + return true; + } + + private void logSOAPMessage(final MessageHandlerContext context) { + boolean outgoing = (Boolean) context + .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); + if (outgoing) { + lastSoapRequest = getSoapAsString(context); + if (dump) { + LOG.info("Outgoing" + lastSoapRequest); + } + } else { + lastSoapResponse = getSoapAsString(context); + if (dump) { + LOG.info("Incoming" + lastSoapResponse); + } + } + } + + private String getSoapAsString(MessageHandlerContext mhc) { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + Message m = mhc.getMessage().copy(); + + XMLStreamWriter writer = XMLStreamWriterFactory.create(baos); + String soap = ""; + try { + m.writeTo(writer); + soap = baos.toString(ENCODING); + + } catch (XMLStreamException | java.io.UnsupportedEncodingException e) { + LOG.severe("Error logging soap message: " + e.getMessage()); + } + + return soap; + } + + public Set getHeaders() { + return null; + } + + public void close(final MessageContext context) { + } +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/CanonicalizationMethodType.java b/src/main/java/hi_override/org/w3/xmldsig/CanonicalizationMethodType.java new file mode 100644 index 0000000..e9d8871 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/CanonicalizationMethodType.java @@ -0,0 +1,117 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for CanonicalizationMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CanonicalizationMethodType", propOrder = { + "content" +}) +public class CanonicalizationMethodType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/DSAKeyValueType.java b/src/main/java/hi_override/org/w3/xmldsig/DSAKeyValueType.java new file mode 100644 index 0000000..8e7ea8f --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/DSAKeyValueType.java @@ -0,0 +1,235 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for DSAKeyValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *           
+ *           
+ *         
+ *         
+ *         
+ *         
+ *         
+ *           
+ *           
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "DSAKeyValueType", propOrder = { + "p", + "q", + "g", + "y", + "j", + "seed", + "pgenCounter" +}) +public class DSAKeyValueType { + + @XmlElement(name = "P") + protected byte[] p; + @XmlElement(name = "Q") + protected byte[] q; + @XmlElement(name = "G") + protected byte[] g; + @XmlElement(name = "Y", required = true) + protected byte[] y; + @XmlElement(name = "J") + protected byte[] j; + @XmlElement(name = "Seed") + protected byte[] seed; + @XmlElement(name = "PgenCounter") + protected byte[] pgenCounter; + + /** + * Gets the value of the p property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getP() { + return p; + } + + /** + * Sets the value of the p property. + * + * @param value + * allowed object is + * byte[] + */ + public void setP(byte[] value) { + this.p = value; + } + + /** + * Gets the value of the q property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getQ() { + return q; + } + + /** + * Sets the value of the q property. + * + * @param value + * allowed object is + * byte[] + */ + public void setQ(byte[] value) { + this.q = value; + } + + /** + * Gets the value of the g property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getG() { + return g; + } + + /** + * Sets the value of the g property. + * + * @param value + * allowed object is + * byte[] + */ + public void setG(byte[] value) { + this.g = value; + } + + /** + * Gets the value of the y property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getY() { + return y; + } + + /** + * Sets the value of the y property. + * + * @param value + * allowed object is + * byte[] + */ + public void setY(byte[] value) { + this.y = value; + } + + /** + * Gets the value of the j property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getJ() { + return j; + } + + /** + * Sets the value of the j property. + * + * @param value + * allowed object is + * byte[] + */ + public void setJ(byte[] value) { + this.j = value; + } + + /** + * Gets the value of the seed property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getSeed() { + return seed; + } + + /** + * Sets the value of the seed property. + * + * @param value + * allowed object is + * byte[] + */ + public void setSeed(byte[] value) { + this.seed = value; + } + + /** + * Gets the value of the pgenCounter property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getPgenCounter() { + return pgenCounter; + } + + /** + * Sets the value of the pgenCounter property. + * + * @param value + * allowed object is + * byte[] + */ + public void setPgenCounter(byte[] value) { + this.pgenCounter = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/DigestMethodType.java b/src/main/java/hi_override/org/w3/xmldsig/DigestMethodType.java new file mode 100644 index 0000000..a72d898 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/DigestMethodType.java @@ -0,0 +1,119 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for DigestMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "DigestMethodType", propOrder = { + "content" +}) +public class DigestMethodType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link Element } + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/KeyInfoType.java b/src/main/java/hi_override/org/w3/xmldsig/KeyInfoType.java new file mode 100644 index 0000000..8c86467 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/KeyInfoType.java @@ -0,0 +1,150 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlElementRefs; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for KeyInfoType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *         
+ *         
+ *         
+ *         
+ *         
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "KeyInfoType", propOrder = { + "content" +}) +public class KeyInfoType { + + @XmlElementRefs({ + @XmlElementRef(name = "KeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "MgmtData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "PGPData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "KeyName", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "RetrievalMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "SPKIData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509Data", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link KeyValueType }{@code >} + * {@link String } + * {@link Element } + * {@link Object } + * {@link JAXBElement }{@code <}{@link String }{@code >} + * {@link JAXBElement }{@code <}{@link PGPDataType }{@code >} + * {@link JAXBElement }{@code <}{@link String }{@code >} + * {@link JAXBElement }{@code <}{@link RetrievalMethodType }{@code >} + * {@link JAXBElement }{@code <}{@link SPKIDataType }{@code >} + * {@link JAXBElement }{@code <}{@link X509DataType }{@code >} + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/KeyValueType.java b/src/main/java/hi_override/org/w3/xmldsig/KeyValueType.java new file mode 100644 index 0000000..9822635 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/KeyValueType.java @@ -0,0 +1,100 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlElementRefs; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for KeyValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "KeyValueType", propOrder = { + "content" +}) +public class KeyValueType { + + @XmlElementRefs({ + @XmlElementRef(name = "RSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "DSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link Element } + * {@link Object } + * {@link JAXBElement }{@code <}{@link RSAKeyValueType }{@code >} + * {@link JAXBElement }{@code <}{@link DSAKeyValueType }{@code >} + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/ManifestType.java b/src/main/java/hi_override/org/w3/xmldsig/ManifestType.java new file mode 100644 index 0000000..44ff308 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/ManifestType.java @@ -0,0 +1,119 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for ManifestType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ManifestType", propOrder = { + "reference" +}) +public class ManifestType { + + @XmlElement(name = "Reference", required = true) + protected List reference; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the reference property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the reference property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getReference().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link ReferenceType } + * + * + */ + public List getReference() { + if (reference == null) { + reference = new ArrayList(); + } + return this.reference; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/ObjectFactory.java b/src/main/java/hi_override/org/w3/xmldsig/ObjectFactory.java new file mode 100644 index 0000000..04695cf --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/ObjectFactory.java @@ -0,0 +1,567 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.math.BigInteger; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlElementDecl; +import jakarta.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the hi_override.org.w3.xmldsig package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _PGPData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPData"); + private final static QName _SPKIData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SPKIData"); + private final static QName _RetrievalMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "RetrievalMethod"); + private final static QName _CanonicalizationMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "CanonicalizationMethod"); + private final static QName _SignatureProperty_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureProperty"); + private final static QName _Manifest_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Manifest"); + private final static QName _Transforms_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Transforms"); + private final static QName _SignatureMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureMethod"); + private final static QName _KeyInfo_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyInfo"); + private final static QName _DigestMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DigestMethod"); + private final static QName _MgmtData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "MgmtData"); + private final static QName _Reference_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Reference"); + private final static QName _RSAKeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "RSAKeyValue"); + private final static QName _Signature_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Signature"); + private final static QName _DSAKeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DSAKeyValue"); + private final static QName _SignedInfo_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignedInfo"); + private final static QName _Object_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Object"); + private final static QName _SignatureValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureValue"); + private final static QName _Transform_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Transform"); + private final static QName _X509Data_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509Data"); + private final static QName _DigestValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DigestValue"); + private final static QName _SignatureProperties_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureProperties"); + private final static QName _KeyName_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyName"); + private final static QName _KeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyValue"); + private final static QName _SignatureMethodTypeHMACOutputLength_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "HMACOutputLength"); + private final static QName _PGPDataTypePGPKeyID_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPKeyID"); + private final static QName _PGPDataTypePGPKeyPacket_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPKeyPacket"); + private final static QName _TransformTypeXPath_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "XPath"); + private final static QName _SPKIDataTypeSPKISexp_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SPKISexp"); + private final static QName _X509DataTypeX509IssuerSerial_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509IssuerSerial"); + private final static QName _X509DataTypeX509Certificate_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509Certificate"); + private final static QName _X509DataTypeX509SKI_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509SKI"); + private final static QName _X509DataTypeX509SubjectName_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509SubjectName"); + private final static QName _X509DataTypeX509CRL_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509CRL"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: hi_override.org.w3.xmldsig + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link KeyInfoType } + * + */ + public KeyInfoType createKeyInfoType() { + return new KeyInfoType(); + } + + /** + * Create an instance of {@link SignedInfoType } + * + */ + public SignedInfoType createSignedInfoType() { + return new SignedInfoType(); + } + + /** + * Create an instance of {@link RetrievalMethodType } + * + */ + public RetrievalMethodType createRetrievalMethodType() { + return new RetrievalMethodType(); + } + + /** + * Create an instance of {@link DigestMethodType } + * + */ + public DigestMethodType createDigestMethodType() { + return new DigestMethodType(); + } + + /** + * Create an instance of {@link SignatureMethodType } + * + */ + public SignatureMethodType createSignatureMethodType() { + return new SignatureMethodType(); + } + + /** + * Create an instance of {@link SPKIDataType } + * + */ + public SPKIDataType createSPKIDataType() { + return new SPKIDataType(); + } + + /** + * Create an instance of {@link X509DataType } + * + */ + public X509DataType createX509DataType() { + return new X509DataType(); + } + + /** + * Create an instance of {@link PGPDataType } + * + */ + public PGPDataType createPGPDataType() { + return new PGPDataType(); + } + + /** + * Create an instance of {@link SignatureType } + * + */ + public SignatureType createSignatureType() { + return new SignatureType(); + } + + /** + * Create an instance of {@link DSAKeyValueType } + * + */ + public DSAKeyValueType createDSAKeyValueType() { + return new DSAKeyValueType(); + } + + /** + * Create an instance of {@link ManifestType } + * + */ + public ManifestType createManifestType() { + return new ManifestType(); + } + + /** + * Create an instance of {@link SignatureValueType } + * + */ + public SignatureValueType createSignatureValueType() { + return new SignatureValueType(); + } + + /** + * Create an instance of {@link TransformsType } + * + */ + public TransformsType createTransformsType() { + return new TransformsType(); + } + + /** + * Create an instance of {@link RSAKeyValueType } + * + */ + public RSAKeyValueType createRSAKeyValueType() { + return new RSAKeyValueType(); + } + + /** + * Create an instance of {@link TransformType } + * + */ + public TransformType createTransformType() { + return new TransformType(); + } + + /** + * Create an instance of {@link SignaturePropertyType } + * + */ + public SignaturePropertyType createSignaturePropertyType() { + return new SignaturePropertyType(); + } + + /** + * Create an instance of {@link KeyValueType } + * + */ + public KeyValueType createKeyValueType() { + return new KeyValueType(); + } + + /** + * Create an instance of {@link ReferenceType } + * + */ + public ReferenceType createReferenceType() { + return new ReferenceType(); + } + + /** + * Create an instance of {@link CanonicalizationMethodType } + * + */ + public CanonicalizationMethodType createCanonicalizationMethodType() { + return new CanonicalizationMethodType(); + } + + /** + * Create an instance of {@link SignaturePropertiesType } + * + */ + public SignaturePropertiesType createSignaturePropertiesType() { + return new SignaturePropertiesType(); + } + + /** + * Create an instance of {@link ObjectType } + * + */ + public ObjectType createObjectType() { + return new ObjectType(); + } + + /** + * Create an instance of {@link X509IssuerSerialType } + * + */ + public X509IssuerSerialType createX509IssuerSerialType() { + return new X509IssuerSerialType(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link PGPDataType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPData") + public JAXBElement createPGPData(PGPDataType value) { + return new JAXBElement(_PGPData_QNAME, PGPDataType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SPKIDataType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SPKIData") + public JAXBElement createSPKIData(SPKIDataType value) { + return new JAXBElement(_SPKIData_QNAME, SPKIDataType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link RetrievalMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "RetrievalMethod") + public JAXBElement createRetrievalMethod(RetrievalMethodType value) { + return new JAXBElement(_RetrievalMethod_QNAME, RetrievalMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CanonicalizationMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "CanonicalizationMethod") + public JAXBElement createCanonicalizationMethod(CanonicalizationMethodType value) { + return new JAXBElement(_CanonicalizationMethod_QNAME, CanonicalizationMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignaturePropertyType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureProperty") + public JAXBElement createSignatureProperty(SignaturePropertyType value) { + return new JAXBElement(_SignatureProperty_QNAME, SignaturePropertyType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ManifestType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Manifest") + public JAXBElement createManifest(ManifestType value) { + return new JAXBElement(_Manifest_QNAME, ManifestType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link TransformsType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Transforms") + public JAXBElement createTransforms(TransformsType value) { + return new JAXBElement(_Transforms_QNAME, TransformsType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignatureMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureMethod") + public JAXBElement createSignatureMethod(SignatureMethodType value) { + return new JAXBElement(_SignatureMethod_QNAME, SignatureMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyInfo") + public JAXBElement createKeyInfo(KeyInfoType value) { + return new JAXBElement(_KeyInfo_QNAME, KeyInfoType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link DigestMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DigestMethod") + public JAXBElement createDigestMethod(DigestMethodType value) { + return new JAXBElement(_DigestMethod_QNAME, DigestMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "MgmtData") + public JAXBElement createMgmtData(String value) { + return new JAXBElement(_MgmtData_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Reference") + public JAXBElement createReference(ReferenceType value) { + return new JAXBElement(_Reference_QNAME, ReferenceType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link RSAKeyValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "RSAKeyValue") + public JAXBElement createRSAKeyValue(RSAKeyValueType value) { + return new JAXBElement(_RSAKeyValue_QNAME, RSAKeyValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignatureType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Signature") + public JAXBElement createSignature(SignatureType value) { + return new JAXBElement(_Signature_QNAME, SignatureType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link DSAKeyValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DSAKeyValue") + public JAXBElement createDSAKeyValue(DSAKeyValueType value) { + return new JAXBElement(_DSAKeyValue_QNAME, DSAKeyValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignedInfoType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignedInfo") + public JAXBElement createSignedInfo(SignedInfoType value) { + return new JAXBElement(_SignedInfo_QNAME, SignedInfoType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ObjectType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Object") + public JAXBElement createObject(ObjectType value) { + return new JAXBElement(_Object_QNAME, ObjectType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignatureValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureValue") + public JAXBElement createSignatureValue(SignatureValueType value) { + return new JAXBElement(_SignatureValue_QNAME, SignatureValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link TransformType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Transform") + public JAXBElement createTransform(TransformType value) { + return new JAXBElement(_Transform_QNAME, TransformType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link X509DataType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509Data") + public JAXBElement createX509Data(X509DataType value) { + return new JAXBElement(_X509Data_QNAME, X509DataType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DigestValue") + public JAXBElement createDigestValue(byte[] value) { + return new JAXBElement(_DigestValue_QNAME, byte[].class, null, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignaturePropertiesType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureProperties") + public JAXBElement createSignatureProperties(SignaturePropertiesType value) { + return new JAXBElement(_SignatureProperties_QNAME, SignaturePropertiesType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyName") + public JAXBElement createKeyName(String value) { + return new JAXBElement(_KeyName_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link KeyValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyValue") + public JAXBElement createKeyValue(KeyValueType value) { + return new JAXBElement(_KeyValue_QNAME, KeyValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link BigInteger }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "HMACOutputLength", scope = SignatureMethodType.class) + public JAXBElement createSignatureMethodTypeHMACOutputLength(BigInteger value) { + return new JAXBElement(_SignatureMethodTypeHMACOutputLength_QNAME, BigInteger.class, SignatureMethodType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPKeyID", scope = PGPDataType.class) + public JAXBElement createPGPDataTypePGPKeyID(byte[] value) { + return new JAXBElement(_PGPDataTypePGPKeyID_QNAME, byte[].class, PGPDataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPKeyPacket", scope = PGPDataType.class) + public JAXBElement createPGPDataTypePGPKeyPacket(byte[] value) { + return new JAXBElement(_PGPDataTypePGPKeyPacket_QNAME, byte[].class, PGPDataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "XPath", scope = TransformType.class) + public JAXBElement createTransformTypeXPath(String value) { + return new JAXBElement(_TransformTypeXPath_QNAME, String.class, TransformType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SPKISexp", scope = SPKIDataType.class) + public JAXBElement createSPKIDataTypeSPKISexp(byte[] value) { + return new JAXBElement(_SPKIDataTypeSPKISexp_QNAME, byte[].class, SPKIDataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link X509IssuerSerialType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509IssuerSerial", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509IssuerSerial(X509IssuerSerialType value) { + return new JAXBElement(_X509DataTypeX509IssuerSerial_QNAME, X509IssuerSerialType.class, X509DataType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509Certificate", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509Certificate(byte[] value) { + return new JAXBElement(_X509DataTypeX509Certificate_QNAME, byte[].class, X509DataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509SKI", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509SKI(byte[] value) { + return new JAXBElement(_X509DataTypeX509SKI_QNAME, byte[].class, X509DataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509SubjectName", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509SubjectName(String value) { + return new JAXBElement(_X509DataTypeX509SubjectName_QNAME, String.class, X509DataType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509CRL", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509CRL(byte[] value) { + return new JAXBElement(_X509DataTypeX509CRL_QNAME, byte[].class, X509DataType.class, ((byte[]) value)); + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/ObjectType.java b/src/main/java/hi_override/org/w3/xmldsig/ObjectType.java new file mode 100644 index 0000000..e47adbc --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/ObjectType.java @@ -0,0 +1,179 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for ObjectType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ObjectType", propOrder = { + "content" +}) +public class ObjectType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + @XmlAttribute(name = "MimeType") + protected String mimeType; + @XmlAttribute(name = "Encoding") + @XmlSchemaType(name = "anyURI") + protected String encoding; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link Element } + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + + /** + * Gets the value of the mimeType property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMimeType() { + return mimeType; + } + + /** + * Sets the value of the mimeType property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMimeType(String value) { + this.mimeType = value; + } + + /** + * Gets the value of the encoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEncoding() { + return encoding; + } + + /** + * Sets the value of the encoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEncoding(String value) { + this.encoding = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/PGPDataType.java b/src/main/java/hi_override/org/w3/xmldsig/PGPDataType.java new file mode 100644 index 0000000..f1e2a83 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/PGPDataType.java @@ -0,0 +1,113 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlElementRefs; +import jakarta.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for PGPDataType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *           
+ *           
+ *           
+ *         
+ *         
+ *           
+ *           
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "PGPDataType", propOrder = { + "content" +}) +public class PGPDataType { + + @XmlElementRefs({ + @XmlElementRef(name = "PGPKeyID", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "PGPKeyPacket", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlAnyElement(lax = true) + protected List content; + + /** + * Gets the rest of the content model. + * + *

+ * You are getting this "catch-all" property because of the following reason: + * The field name "PGPKeyPacket" is used by two different parts of a schema. See: + * line 219 of file:/C:/alex/co/HI/xml/schema/w3c/xmldsig-core-schema.xsd + * line 214 of file:/C:/alex/co/HI/xml/schema/w3c/xmldsig-core-schema.xsd + *

+ * To get rid of this property, apply a property customization to one + * of both of the following declarations to change their names: + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Element } + * {@link Object } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/RSAKeyValueType.java b/src/main/java/hi_override/org/w3/xmldsig/RSAKeyValueType.java new file mode 100644 index 0000000..48e3fb2 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/RSAKeyValueType.java @@ -0,0 +1,101 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for RSAKeyValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "RSAKeyValueType", propOrder = { + "modulus", + "exponent" +}) +public class RSAKeyValueType { + + @XmlElement(name = "Modulus", required = true) + protected byte[] modulus; + @XmlElement(name = "Exponent", required = true) + protected byte[] exponent; + + /** + * Gets the value of the modulus property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getModulus() { + return modulus; + } + + /** + * Sets the value of the modulus property. + * + * @param value + * allowed object is + * byte[] + */ + public void setModulus(byte[] value) { + this.modulus = value; + } + + /** + * Gets the value of the exponent property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getExponent() { + return exponent; + } + + /** + * Sets the value of the exponent property. + * + * @param value + * allowed object is + * byte[] + */ + public void setExponent(byte[] value) { + this.exponent = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/ReferenceType.java b/src/main/java/hi_override/org/w3/xmldsig/ReferenceType.java new file mode 100644 index 0000000..9549374 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/ReferenceType.java @@ -0,0 +1,222 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for ReferenceType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *         
+ *       
+ *       
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ReferenceType", propOrder = { + "transforms", + "digestMethod", + "digestValue" +}) +public class ReferenceType { + + @XmlElement(name = "Transforms") + protected TransformsType transforms; + @XmlElement(name = "DigestMethod", required = true) + protected DigestMethodType digestMethod; + @XmlElement(name = "DigestValue", required = true) + protected byte[] digestValue; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + @XmlAttribute(name = "URI") + @XmlSchemaType(name = "anyURI") + protected String uri; + @XmlAttribute(name = "Type") + @XmlSchemaType(name = "anyURI") + protected String type; + + /** + * Gets the value of the transforms property. + * + * @return + * possible object is + * {@link TransformsType } + * + */ + public TransformsType getTransforms() { + return transforms; + } + + /** + * Sets the value of the transforms property. + * + * @param value + * allowed object is + * {@link TransformsType } + * + */ + public void setTransforms(TransformsType value) { + this.transforms = value; + } + + /** + * Gets the value of the digestMethod property. + * + * @return + * possible object is + * {@link DigestMethodType } + * + */ + public DigestMethodType getDigestMethod() { + return digestMethod; + } + + /** + * Sets the value of the digestMethod property. + * + * @param value + * allowed object is + * {@link DigestMethodType } + * + */ + public void setDigestMethod(DigestMethodType value) { + this.digestMethod = value; + } + + /** + * Gets the value of the digestValue property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getDigestValue() { + return digestValue; + } + + /** + * Sets the value of the digestValue property. + * + * @param value + * allowed object is + * byte[] + */ + public void setDigestValue(byte[] value) { + this.digestValue = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + + /** + * Gets the value of the uri property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getURI() { + return uri; + } + + /** + * Sets the value of the uri property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setURI(String value) { + this.uri = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/RetrievalMethodType.java b/src/main/java/hi_override/org/w3/xmldsig/RetrievalMethodType.java new file mode 100644 index 0000000..f478e25 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/RetrievalMethodType.java @@ -0,0 +1,135 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for RetrievalMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "RetrievalMethodType", propOrder = { + "transforms" +}) +public class RetrievalMethodType { + + @XmlElement(name = "Transforms") + protected TransformsType transforms; + @XmlAttribute(name = "URI") + @XmlSchemaType(name = "anyURI") + protected String uri; + @XmlAttribute(name = "Type") + @XmlSchemaType(name = "anyURI") + protected String type; + + /** + * Gets the value of the transforms property. + * + * @return + * possible object is + * {@link TransformsType } + * + */ + public TransformsType getTransforms() { + return transforms; + } + + /** + * Sets the value of the transforms property. + * + * @param value + * allowed object is + * {@link TransformsType } + * + */ + public void setTransforms(TransformsType value) { + this.transforms = value; + } + + /** + * Gets the value of the uri property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getURI() { + return uri; + } + + /** + * Sets the value of the uri property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setURI(String value) { + this.uri = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SPKIDataType.java b/src/main/java/hi_override/org/w3/xmldsig/SPKIDataType.java new file mode 100644 index 0000000..60059a8 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SPKIDataType.java @@ -0,0 +1,91 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for SPKIDataType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SPKIDataType", propOrder = { + "spkiSexpAndAny" +}) +public class SPKIDataType { + + @XmlElementRef(name = "SPKISexp", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class) + @XmlAnyElement(lax = true) + protected List spkiSexpAndAny; + + /** + * Gets the value of the spkiSexpAndAny property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the spkiSexpAndAny property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getSPKISexpAndAny().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Element } + * {@link Object } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * + * + */ + public List getSPKISexpAndAny() { + if (spkiSexpAndAny == null) { + spkiSexpAndAny = new ArrayList(); + } + return this.spkiSexpAndAny; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SignatureMethodType.java b/src/main/java/hi_override/org/w3/xmldsig/SignatureMethodType.java new file mode 100644 index 0000000..6935f7c --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SignatureMethodType.java @@ -0,0 +1,123 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for SignatureMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignatureMethodType", propOrder = { + "content" +}) +public class SignatureMethodType { + + @XmlElementRef(name = "HMACOutputLength", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link JAXBElement }{@code <}{@link BigInteger }{@code >} + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SignaturePropertiesType.java b/src/main/java/hi_override/org/w3/xmldsig/SignaturePropertiesType.java new file mode 100644 index 0000000..e2c6dd0 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SignaturePropertiesType.java @@ -0,0 +1,119 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignaturePropertiesType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignaturePropertiesType", propOrder = { + "signatureProperty" +}) +public class SignaturePropertiesType { + + @XmlElement(name = "SignatureProperty", required = true) + protected List signatureProperty; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the signatureProperty property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the signatureProperty property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getSignatureProperty().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link SignaturePropertyType } + * + * + */ + public List getSignatureProperty() { + if (signatureProperty == null) { + signatureProperty = new ArrayList(); + } + return this.signatureProperty; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SignaturePropertyType.java b/src/main/java/hi_override/org/w3/xmldsig/SignaturePropertyType.java new file mode 100644 index 0000000..dc61b2b --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SignaturePropertyType.java @@ -0,0 +1,152 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for SignaturePropertyType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignaturePropertyType", propOrder = { + "content" +}) +public class SignaturePropertyType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Target", required = true) + @XmlSchemaType(name = "anyURI") + protected String target; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link Element } + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the target property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTarget() { + return target; + } + + /** + * Sets the value of the target property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTarget(String value) { + this.target = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SignatureType.java b/src/main/java/hi_override/org/w3/xmldsig/SignatureType.java new file mode 100644 index 0000000..192dd69 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SignatureType.java @@ -0,0 +1,203 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignatureType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *         
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignatureType", propOrder = { + "signedInfo", + "signatureValue", + "keyInfo", + "object" +}) +public class SignatureType { + + @XmlElement(name = "SignedInfo", required = true) + protected SignedInfoType signedInfo; + @XmlElement(name = "SignatureValue", required = true) + protected SignatureValueType signatureValue; + @XmlElement(name = "KeyInfo") + protected KeyInfoType keyInfo; + @XmlElement(name = "Object") + protected List object; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the signedInfo property. + * + * @return + * possible object is + * {@link SignedInfoType } + * + */ + public SignedInfoType getSignedInfo() { + return signedInfo; + } + + /** + * Sets the value of the signedInfo property. + * + * @param value + * allowed object is + * {@link SignedInfoType } + * + */ + public void setSignedInfo(SignedInfoType value) { + this.signedInfo = value; + } + + /** + * Gets the value of the signatureValue property. + * + * @return + * possible object is + * {@link SignatureValueType } + * + */ + public SignatureValueType getSignatureValue() { + return signatureValue; + } + + /** + * Sets the value of the signatureValue property. + * + * @param value + * allowed object is + * {@link SignatureValueType } + * + */ + public void setSignatureValue(SignatureValueType value) { + this.signatureValue = value; + } + + /** + * Gets the value of the keyInfo property. + * + * @return + * possible object is + * {@link KeyInfoType } + * + */ + public KeyInfoType getKeyInfo() { + return keyInfo; + } + + /** + * Sets the value of the keyInfo property. + * + * @param value + * allowed object is + * {@link KeyInfoType } + * + */ + public void setKeyInfo(KeyInfoType value) { + this.keyInfo = value; + } + + /** + * Gets the value of the object property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the object property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getObject().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link ObjectType } + * + * + */ + public List getObject() { + if (object == null) { + object = new ArrayList(); + } + return this.object; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SignatureValueType.java b/src/main/java/hi_override/org/w3/xmldsig/SignatureValueType.java new file mode 100644 index 0000000..fd85f49 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SignatureValueType.java @@ -0,0 +1,107 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignatureValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignatureValueType", propOrder = { + "value" +}) +public class SignatureValueType { + + @XmlValue + protected byte[] value; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the value property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getValue() { + return value; + } + + /** + * Sets the value of the value property. + * + * @param value + * allowed object is + * byte[] + */ + public void setValue(byte[] value) { + this.value = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/SignedInfoType.java b/src/main/java/hi_override/org/w3/xmldsig/SignedInfoType.java new file mode 100644 index 0000000..584499c --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/SignedInfoType.java @@ -0,0 +1,175 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlID; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignedInfoType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignedInfoType", propOrder = { + "canonicalizationMethod", + "signatureMethod", + "reference" +}) +public class SignedInfoType { + + @XmlElement(name = "CanonicalizationMethod", required = true) + protected CanonicalizationMethodType canonicalizationMethod; + @XmlElement(name = "SignatureMethod", required = true) + protected SignatureMethodType signatureMethod; + @XmlElement(name = "Reference", required = true) + protected List reference; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the canonicalizationMethod property. + * + * @return + * possible object is + * {@link CanonicalizationMethodType } + * + */ + public CanonicalizationMethodType getCanonicalizationMethod() { + return canonicalizationMethod; + } + + /** + * Sets the value of the canonicalizationMethod property. + * + * @param value + * allowed object is + * {@link CanonicalizationMethodType } + * + */ + public void setCanonicalizationMethod(CanonicalizationMethodType value) { + this.canonicalizationMethod = value; + } + + /** + * Gets the value of the signatureMethod property. + * + * @return + * possible object is + * {@link SignatureMethodType } + * + */ + public SignatureMethodType getSignatureMethod() { + return signatureMethod; + } + + /** + * Sets the value of the signatureMethod property. + * + * @param value + * allowed object is + * {@link SignatureMethodType } + * + */ + public void setSignatureMethod(SignatureMethodType value) { + this.signatureMethod = value; + } + + /** + * Gets the value of the reference property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the reference property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getReference().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link ReferenceType } + * + * + */ + public List getReference() { + if (reference == null) { + reference = new ArrayList(); + } + return this.reference; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/TransformType.java b/src/main/java/hi_override/org/w3/xmldsig/TransformType.java new file mode 100644 index 0000000..2ff7c1e --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/TransformType.java @@ -0,0 +1,124 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for TransformType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *       
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "TransformType", propOrder = { + "content" +}) +public class TransformType { + + @XmlElementRef(name = "XPath", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * {@link Element } + * {@link Object } + * {@link JAXBElement }{@code <}{@link String }{@code >} + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/TransformsType.java b/src/main/java/hi_override/org/w3/xmldsig/TransformsType.java new file mode 100644 index 0000000..ea4b87a --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/TransformsType.java @@ -0,0 +1,84 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for TransformsType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "TransformsType", propOrder = { + "transform" +}) +public class TransformsType { + + @XmlElement(name = "Transform", required = true) + protected List transform; + + /** + * Gets the value of the transform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the transform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link TransformType } + * + * + */ + public List getTransform() { + if (transform == null) { + transform = new ArrayList(); + } + return this.transform; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/X509DataType.java b/src/main/java/hi_override/org/w3/xmldsig/X509DataType.java new file mode 100644 index 0000000..48d5512 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/X509DataType.java @@ -0,0 +1,108 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.util.ArrayList; +import java.util.List; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlElementRefs; +import jakarta.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for X509DataType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *           
+ *           
+ *           
+ *           
+ *           
+ *           
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "X509DataType", propOrder = { + "x509IssuerSerialOrX509SKIOrX509SubjectName" +}) +public class X509DataType { + + @XmlElementRefs({ + @XmlElementRef(name = "X509SKI", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509CRL", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509Certificate", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509IssuerSerial", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509SubjectName", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlAnyElement(lax = true) + protected List x509IssuerSerialOrX509SKIOrX509SubjectName; + + /** + * Gets the value of the x509IssuerSerialOrX509SKIOrX509SubjectName property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the x509IssuerSerialOrX509SKIOrX509SubjectName property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getX509IssuerSerialOrX509SKIOrX509SubjectName().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link Element } + * {@link Object } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link JAXBElement }{@code <}{@link X509IssuerSerialType }{@code >} + * {@link JAXBElement }{@code <}{@link String }{@code >} + * + * + */ + public List getX509IssuerSerialOrX509SKIOrX509SubjectName() { + if (x509IssuerSerialOrX509SKIOrX509SubjectName == null) { + x509IssuerSerialOrX509SKIOrX509SubjectName = new ArrayList(); + } + return this.x509IssuerSerialOrX509SKIOrX509SubjectName; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/X509IssuerSerialType.java b/src/main/java/hi_override/org/w3/xmldsig/X509IssuerSerialType.java new file mode 100644 index 0000000..84e78f8 --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/X509IssuerSerialType.java @@ -0,0 +1,106 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package hi_override.org.w3.xmldsig; + +import java.math.BigInteger; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + + +/** + *

Java class for X509IssuerSerialType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * 
+ *   
+ *     
+ *       
+ *         
+ *         
+ *       
+ *     
+ *   
+ * 
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "X509IssuerSerialType", propOrder = { + "x509IssuerName", + "x509SerialNumber" +}) +public class X509IssuerSerialType { + + @XmlElement(name = "X509IssuerName", required = true) + protected String x509IssuerName; + @XmlElement(name = "X509SerialNumber", required = true) + protected BigInteger x509SerialNumber; + + /** + * Gets the value of the x509IssuerName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX509IssuerName() { + return x509IssuerName; + } + + /** + * Sets the value of the x509IssuerName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX509IssuerName(String value) { + this.x509IssuerName = value; + } + + /** + * Gets the value of the x509SerialNumber property. + * + * @return + * possible object is + * {@link BigInteger } + * + */ + public BigInteger getX509SerialNumber() { + return x509SerialNumber; + } + + /** + * Sets the value of the x509SerialNumber property. + * + * @param value + * allowed object is + * {@link BigInteger } + * + */ + public void setX509SerialNumber(BigInteger value) { + this.x509SerialNumber = value; + } + +} diff --git a/src/main/java/hi_override/org/w3/xmldsig/package-info.java b/src/main/java/hi_override/org/w3/xmldsig/package-info.java new file mode 100644 index 0000000..46a433f --- /dev/null +++ b/src/main/java/hi_override/org/w3/xmldsig/package-info.java @@ -0,0 +1,11 @@ +/** + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + *

Licensed under the Apache License, Version 2.0. See + * https://www.apache.org/licenses/LICENSE-2.0 + * and {@code LICENSE.md} at the repository root. + */ + +@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://www.w3.org/2000/09/xmldsig#", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) +package hi_override.org.w3.xmldsig; diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIBatchSyncClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIBatchSyncClientSample.java index acaeb21..0e64614 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIBatchSyncClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIBatchSyncClientSample.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIClientSample.java index 43b2d01..ead7b9c 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ConsumerSearchIHIClientSample.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderAdministrativeIndividualClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderAdministrativeIndividualClientSample.java index 5180a6c..8c78c69 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderAdministrativeIndividualClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderAdministrativeIndividualClientSample.java @@ -1,9 +1,11 @@ /* - * Copyright 2015 NEHTA + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderDirectoryEntryClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderDirectoryEntryClientSample.java index c82b8f1..50d498d 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderDirectoryEntryClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderDirectoryEntryClientSample.java @@ -1,9 +1,11 @@ /* - * Copyright 2015 NEHTA + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderOrganisationClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderOrganisationClientSample.java index 2417696..c29d4de 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderOrganisationClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderManageProviderOrganisationClientSample.java @@ -1,9 +1,11 @@ /* - * Copyright 2015 NEHTA + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadAdministrativeIndividualClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadAdministrativeIndividualClientSample.java index bae5564..50c25d4 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadAdministrativeIndividualClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadAdministrativeIndividualClientSample.java @@ -1,9 +1,11 @@ /* - * Copyright 2015 NEHTA + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -210,7 +212,7 @@ public static void main(String[] args) throws GeneralSecurityException, IOExcept /* The rules that govern processing of requests received through this service are as follows: - WR16.1. A HPI-O must be provided for every request made to read an organisation�s record. + WR16.1. A HPI-O must be provided for every request made to read an organisation's record. WR16.2. Each request received will be validated to ensure that all required elements are provided and that elements are consistent with their length and type restrictions. diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadProviderOrganisationClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadProviderOrganisationClientSample.java index 3a95cb8..6308b4b 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadProviderOrganisationClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderReadProviderOrganisationClientSample.java @@ -1,9 +1,11 @@ /* - * Copyright 2015 NEHTA + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -212,14 +214,14 @@ public static void main(String[] args) throws GeneralSecurityException, IOExcept WR15.1. A qualified identifier must be provided for every request made to - read a Provider or Administrative individual�s record. + read a Provider or Administrative individual's record. WR15.2. Each request received will be validated to ensure that all required elements are provided and that elements are consistent with their length and type restrictions. WR15.3. An individual who only holds a HPI-I role may only read the details of their own record - WR15.4. An OMO may read their own details and the details of another individuals� record which is + WR15.4. An OMO may read their own details and the details of another individual's record which is linked to the same organisation or an organisation below them in their hierarchy. WR15.5. An RO can read their own details and the details of any individual linked to the Seed organisation. diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForIndividualClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForIndividualClientSample.java index c2eb49e..2339bfc 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForIndividualClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForIndividualClientSample.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForOrganisationClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForOrganisationClientSample.java index f45d749..2946983 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForOrganisationClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ProviderSearchHIProviderDirectoryForOrganisationClientSample.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ReadReferenceDataClientSample.java b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ReadReferenceDataClientSample.java index b7c0e52..21d73e6 100644 --- a/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ReadReferenceDataClientSample.java +++ b/src/sample/java/au/gov/nehta/vendorlibrary/hi/sample/ReadReferenceDataClientSample.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/sample/resources/README.md b/src/sample/resources/README.md new file mode 100644 index 0000000..e456128 --- /dev/null +++ b/src/sample/resources/README.md @@ -0,0 +1,9 @@ +Copyright 2011 NEHTA; Copyright 2021-2026 ADHA. Apache-2.0 - see **LICENSE.md** at repository root. + +Sample programs live under `../java` (package `...hi.sample`). They illustrate how to construct HI SOAP +clients with keystores and endpoints; replace placeholders with values from your ADHA/Services Australia +registration (see **README.md**). + +These sources are not compiled by the default Maven lifecycle. Type-check them with +`mvn -B -Psample -Dgpg.skip=true -DskipTests=true clean compile` (see **CONTRIBUTING.md**), or run +from your IDE as part of a Maven-imported project so **hi-wsdl** types and dependencies resolve. diff --git a/src/sample/resources/build.properties b/src/sample/resources/build.properties index 237a50a..b9a1691 100644 --- a/src/sample/resources/build.properties +++ b/src/sample/resources/build.properties @@ -3,7 +3,7 @@ # # Licensed under the NEHTA Open Source (Apache) License; you may not use this # file except in compliance with the License. A copy of the License is in the - # 'license.txt' file, which should be provided with this work. + # LICENSE.md at the repository root. # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -33,8 +33,9 @@ sample.jar.file=${project.name}-sample-${project.version}.jar sample.src.jar.file=${project.name}-sample-${project.version}-sources.jar javadocs.jar.file=${project.name}-${project.version}-javadocs.jar sample.javadocs.jar.file=${project.name}-sample-${project.version}-javadocs.jar -license.file=license.txt -readme.file=readme.txt +license.dir=${basedir}/../../.. +license.file=LICENSE.md +readme.file=README.md build.file=build.xml build.properties.file=build.properties package.dir=${target.dir}/package diff --git a/src/sample/resources/build.xml b/src/sample/resources/build.xml index e12d9d2..115b593 100644 --- a/src/sample/resources/build.xml +++ b/src/sample/resources/build.xml @@ -5,7 +5,7 @@ * * Licensed under the NEHTA Open Source (Apache) License; you may not use this * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * LICENSE.md at the repository root. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -265,8 +265,10 @@ - + + + diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandlerTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandlerTest.java index 28e3388..50f2562 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandlerTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/handler/security/HISecurityHandlerTest.java @@ -1,16 +1,19 @@ /* -* Copyright 2011 NEHTA -* -* Licensed under the NEHTA Open Source (Apache) License; you may not use this -* file except in compliance with the License. A copy of the License is in the -* 'license.txt' file, which should be provided with this work. -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -* License for the specific language governing permissions and limitations -* under the License. -*/ + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + package au.gov.nehta.vendorlibrary.hi.handler.security; import org.junit.Ignore; diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClientTest.java new file mode 100644 index 0000000..f26ce41 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderManageTdsProviderIndividualClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpii; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ProviderManageTdsProviderIndividualClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ProviderManageTdsProviderIndividualClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderManageTdsProviderIndividualClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void manageTdsProviderIndividual_nullRequest_clientUser() throws Exception { + getMedicareTestClient().manageTdsProviderIndividual(null); + } + + @Test(expected = IllegalArgumentException.class) + public void manageTdsProviderIndividual_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().manageTdsProviderIndividual(null, getWrappedUserQualifiedId()); + } + + private ProviderManageTdsProviderIndividualClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ProviderManageTdsProviderIndividualClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClientTest.java similarity index 64% rename from src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchClientTest.java rename to src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClientTest.java index 93ac58b..696912d 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchForProviderIndividualClientTest.java @@ -1,68 +1,94 @@ -package au.gov.nehta.vendorlibrary.hi.hpio; +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpii; -import au.gov.nehta.vendorlibrary.hi.client.ClientBase; -import au.gov.nehta.vendorlibrary.hi.hpii.ProviderSearchForProviderIndividualClient; import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; import au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants; -import au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.ProviderSearchForProviderIndividualPortType; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; import au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.SearchForProviderIndividual; import au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.SearchForProviderIndividualResponse; -import au.net.electronichealth.ns.hi.svc.providersearchforproviderorganisation._5_0.SearchForProviderOrganisation; -import au.net.electronichealth.ns.hi.svc.providersearchforproviderorganisation._5_0.SearchForProviderOrganisationResponse; -import au.net.electronichealth.ns.hi.svc.providersearchforproviderorganisation._5_0.StandardErrorMsg; import au.net.electronichealth.ns.hi.xsd.common.addresscore._5_0.SearchAustralianAddressType; import au.net.electronichealth.ns.hi.xsd.common.addresscore._5_0.SearchInternationalAddressType; import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SexType; -import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; -import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.security.GeneralSecurityException; -import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.*; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; import static org.junit.Assert.fail; -public class ProviderSearchClientTest { +public class ProviderSearchForProviderIndividualClientTest { @Test - public void bindingProviderIsNotNull() throws GeneralSecurityException, IOException, StandardErrorMsg { - ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); + public void bindingProviderIsNotNull() throws GeneralSecurityException, IOException, au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.StandardErrorMsg { + ProviderSearchForProviderIndividualClient tc = getMCATestIClient(); Assert.assertNotNull(tc.getBindingProvider()); Assert.assertNotNull(tc.getPort()); } @Test - public void runProviderOrgClient() throws GeneralSecurityException, IOException, StandardErrorMsg { - ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); - - SearchForProviderOrganisation request = new SearchForProviderOrganisation(); - request.setHpioNumber(HPIOHPIITestConstants.MCA_HPIO); - SearchForProviderOrganisationResponse response = null; - - response = tc.identifierSearch(request); - System.out.println(response.getSearchForProviderOrganisationResult().getStatus()); + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderSearchForProviderIndividualClient testClient = getMCATestIClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(testClient.getLastSoapRequest(), LoggingHandler.EMPTY); + Assert.assertEquals(testClient.getLastSoapResponse(), LoggingHandler.EMPTY); } - @Test(expected = IllegalArgumentException.class) - public void runProviderOrgClientNegativeTestNoHPIO() throws GeneralSecurityException, IOException, StandardErrorMsg { - ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); + public void demographicSearch_nullRequest_clientUser() throws GeneralSecurityException, IOException, au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.StandardErrorMsg { + getMCATestIClient().demographicSearch(null); + } - SearchForProviderOrganisation request = new SearchForProviderOrganisation(); - //No hpio + @Test(expected = IllegalArgumentException.class) + public void demographicSearch_nullRequest_wrappedUser() throws GeneralSecurityException, IOException, au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.StandardErrorMsg { + getMCATestIClient().demographicSearch(null, getWrappedUserQualifiedId()); + } - tc.identifierSearch(request); - fail("Exception not thrown"); + @Test(expected = IllegalArgumentException.class) + public void identifierSearch_nullRequest_clientUser() throws GeneralSecurityException, IOException, au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.StandardErrorMsg { + getMCATestIClient().identifierSearch(null); } @Test(expected = IllegalArgumentException.class) - public void runProviderOrgClientNegativeTestNullRequest() throws GeneralSecurityException, IOException, StandardErrorMsg { - ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); - tc.identifierSearch(null); - fail("Exception not thrown"); + public void identifierSearch_nullRequest_wrappedUser() throws GeneralSecurityException, IOException, au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.StandardErrorMsg { + getMCATestIClient().identifierSearch(null, getWrappedUserQualifiedId()); + } + + @Test + public void demographicSearch_clientUser() throws GeneralSecurityException, IOException, au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.StandardErrorMsg { + ProviderSearchForProviderIndividualClient tic = getMCATestIClient(); + SearchForProviderIndividual r = new SearchForProviderIndividual(); + r.setFamilyName("Smith"); + r.setOnlyNameIndicator(false); + r.setPostcode("2900"); + r.setSex(SexType.M); + SearchForProviderIndividualResponse response = tic.demographicSearch(r); + Assert.assertNotNull(response); } @Test @@ -77,10 +103,9 @@ public void runProviderIndividualClient() throws GeneralSecurityException, IOExc request.setPostcode("2900"); request.setSex(SexType.M); - SearchForProviderIndividualResponse identifierSearch = tic.identifierSearch(request); - System.out.println(identifierSearch.getSearchForProviderIndividualResult().getStatus()); + Assert.assertNotNull(identifierSearch.getSearchForProviderIndividualResult()); } @Test(expected = IllegalArgumentException.class) @@ -98,7 +123,7 @@ public void runProviderIDClientWithALongFamilyName() throws GeneralSecurityExcep ProviderSearchForProviderIndividualClient tc = getMCATestIClient(); SearchForProviderIndividual r = new SearchForProviderIndividual(); r.setHpiiNumber("12345"); - r.setFamilyName("12345678901234567890123456789012345678901"); //41 chars + r.setFamilyName("12345678901234567890123456789012345678901"); tc.identifierSearch(r); fail("Exception not thrown"); } @@ -108,7 +133,7 @@ public void runProviderIDClientWithALongFamilyNameDemographic() throws GeneralSe ProviderSearchForProviderIndividualClient tc = getMCATestIClient(); SearchForProviderIndividual r = new SearchForProviderIndividual(); r.setHpiiNumber("12345"); - r.setFamilyName("12345678901234567890123456789012345678901"); //41 chars + r.setFamilyName("12345678901234567890123456789012345678901"); tc.demographicSearch(r); fail("Exception not thrown"); } @@ -142,7 +167,7 @@ public void runProviderIDClientWithATwoSearchCriteria() throws GeneralSecurityEx SearchInternationalAddressType intl = new SearchInternationalAddressType(); intl.setCountry("101"); r.setSearchInternationalAddress(intl); - r.setFamilyName("123456789012345678901234567890123456789"); //41 chars + r.setFamilyName("123456789012345678901234567890123456789"); tc.demographicSearch(r); fail("Exception not thrown"); } @@ -192,57 +217,12 @@ public void testWrappedGenericUInterface() throws GeneralSecurityException, IOEx Assert.assertNotNull(identifierResponse); } - private ProviderSearchForProviderOrganisationClient getMCATestClient() throws GeneralSecurityException, IOException { - ProviderSearchForProviderOrganisationClient testClient = new ProviderSearchForProviderOrganisationClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - private ProviderSearchForProviderIndividualClient getMCATestIClient() throws GeneralSecurityException, IOException { - ProviderSearchForProviderIndividualClient testClient = new ProviderSearchForProviderIndividualClient(MEDICARE_ENDPOINT_URL, + return new ProviderSearchForProviderIndividualClient(MEDICARE_ENDPOINT_URL, getUserQualifiedId(), getProductHeader(), getSigningPrivateKeyForMedicare(), getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare()); - return testClient; - } - - private ClientBase getGenericMCATestIClient() throws GeneralSecurityException, IOException { - - ClientBase testClient = new ProviderSearchForProviderIndividualClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - - public static QualifiedId getUserQualifiedId() { - QualifiedId qualifiedId = new QualifiedId(); - qualifiedId.setId(IHITestConstants.USER_QUALIFIED_ID); - qualifiedId.setQualifier(IHITestConstants.USER_QUALIFIER); - return qualifiedId; - } - - public static ProductType getProductHeader() { - ProductType productHeader = new ProductType(); - productHeader.setPlatform(IHITestConstants.PRODUCT_PLATFORM); - productHeader.setProductName(IHITestConstants.PRODUCT_NAME); - productHeader.setProductVersion(IHITestConstants.PRODUCT_VERSION); - productHeader.setVendor(getVendorQualifiedId()); - return productHeader; - } - - public static QualifiedId getVendorQualifiedId() { - QualifiedId qualifiedId = new QualifiedId(); - qualifiedId.setId(IHITestConstants.VENDOR_QUALIFIER_ID); - qualifiedId.setQualifier(IHITestConstants.VENDOR_QUALIFIER); - return qualifiedId; } } diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClientTest.java index 132e422..f2cc6a2 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchHIProviderDirectoryForIndividualClientTest.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -55,7 +57,7 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import au.gov.nehta.vendorlibrary.hi.test.utils.ReflectionFieldSetter; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; import au.gov.nehta.vendorlibrary.hi.client.BaseClient_3; import au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants; @@ -88,7 +90,7 @@ public void testNullLoggingHandler() throws Exception { setSystemVariablesForTest(); ProviderSearchHIProviderDirectoryForIndividualClient testClient = getMedicareTestClient(); - ReflectionFieldSetter.setField(testClient, "loggingHandler", null); + TestReflect.setField(testClient, "loggingHandler", null); String lastSoapRequest = testClient.getLastSoapRequest(); assertEquals(lastSoapRequest, LoggingHandler.EMPTY); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClientTest.java new file mode 100644 index 0000000..29b8e2b --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchTdsProviderIndividualClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpii; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ProviderSearchTdsProviderIndividualClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ProviderSearchTdsProviderIndividualClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderSearchTdsProviderIndividualClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void searchTdsProviderIndividual_nullRequest_clientUser() throws Exception { + getMedicareTestClient().searchTdsProviderIndividual(null); + } + + @Test(expected = IllegalArgumentException.class) + public void searchTdsProviderIndividual_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().searchTdsProviderIndividual(null, getWrappedUserQualifiedId()); + } + + private ProviderSearchTdsProviderIndividualClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ProviderSearchTdsProviderIndividualClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchIHIBatchAsync.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClientTest.java similarity index 60% rename from src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchIHIBatchAsync.java rename to src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClientTest.java index f52dca7..67aa97e 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/ProviderSearchIHIBatchAsync.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpii/SearchForProviderIndividualBatchAsyncClientTest.java @@ -1,5 +1,22 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpii; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderindividual._5_1.RetrieveSearchForProviderIndividual; import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderindividual._5_1.RetrieveSearchForProviderIndividualResponse; import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderindividual._5_1.StandardErrorMsg; @@ -17,11 +34,82 @@ import static au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants.MCA_FAMILY_NAME; import static au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants.MCA_HPII; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.*; -public class ProviderSearchIHIBatchAsync { - SearchForProviderIndividualBatchAsyncClient client = getMedicareTestClient(); - SearchForProviderIndividualBatchAsyncClient clientNoID = getMedicareTestClientNoId(); +public class SearchForProviderIndividualBatchAsyncClientTest { + + private final SearchForProviderIndividualBatchAsyncClient client = getMedicareTestClient(); + private final SearchForProviderIndividualBatchAsyncClient clientNoID = getMedicareTestClientNoId(); + + @Test + public void bindingProviderIsNotNull() throws Exception { + SearchForProviderIndividualBatchAsyncClient tc = getMedicareTestClient(); + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + SearchForProviderIndividualBatchAsyncClient testClient = getMedicareTestClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapRequest()); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapResponse()); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearch_nullBatchRequest_clientUser() throws StandardErrorMsg { + client.submitSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearch_nullBatchRequest_perRequestUser() throws StandardErrorMsg { + clientNoID.submitSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearch_nullIndividualId_throws() throws StandardErrorMsg { + ProviderIndividualBatchSearch batch = new ProviderIndividualBatchSearch(); + clientNoID.submitSearch(batch, null); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearch_nullRequest_clientUser() throws StandardErrorMsg { + client.retrieveSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearch_nullRequest_perRequestUser() throws StandardErrorMsg { + clientNoID.retrieveSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearch_nullIndividualId_throws() throws StandardErrorMsg { + RetrieveSearchForProviderIndividual retrieve = new RetrieveSearchForProviderIndividual(); + retrieve.setBatchIdentifier("dummy"); + clientNoID.retrieveSearch(retrieve, null); + } + + @Test + public void submitSearchCheck_nullSubmitRequestThrows() { + try { + client.submitSearchCheck(null); + Assert.fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException ex) { + Assert.assertTrue(ex.getMessage().contains("Request")); + } + } + + @Test + public void retrieveSearchCheck_nullRetrieveRequestThrows() { + try { + client.retrieveSearchCheck(null); + Assert.fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException ex) { + Assert.assertTrue(ex.getMessage().contains("Request")); + } + } @Test public void testIdentifierSearchSingle() throws StandardErrorMsg { @@ -47,7 +135,6 @@ public void testIdentifierSearchSingleWithSuppliedUserID() throws StandardErrorM batchIdSearch.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch); - // This is the client where we have to supply the user ID with the search SubmitSearchForProviderIndividualResponse response = clientNoID.submitSearch(batch, getWrappedUserQualifiedId()); Assert.assertEquals(response.getSubmitSearchForProviderIndividualResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); } @@ -62,18 +149,15 @@ public void testIdentifierSearchMulti() throws StandardErrorMsg { batchIdSearch1.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch1); - // add second batch (for the same hpii) BatchSearchForProviderIndividualCriteriaType batchIdSearch2 = new BatchSearchForProviderIndividualCriteriaType(); batchIdSearch2.setRequestIdentifier(UUID.randomUUID().toString()); batchIdSearch2.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch2); - SubmitSearchForProviderIndividualResponse response = client.submitSearch(batch); Assert.assertEquals(response.getSubmitSearchForProviderIndividualResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); } - @Test public void testIdentifierSearchMultiWithSuppliedUserID() throws StandardErrorMsg { ProviderIndividualBatchSearch batch = new ProviderIndividualBatchSearch(); @@ -84,13 +168,11 @@ public void testIdentifierSearchMultiWithSuppliedUserID() throws StandardErrorMs batchIdSearch1.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch1); - // add second batch (for the same hpii) BatchSearchForProviderIndividualCriteriaType batchIdSearch2 = new BatchSearchForProviderIndividualCriteriaType(); batchIdSearch2.setRequestIdentifier(UUID.randomUUID().toString()); batchIdSearch2.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch2); - // This is the client where we have to supply the user ID with the search SubmitSearchForProviderIndividualResponse response = clientNoID.submitSearch(batch, getWrappedUserQualifiedId()); Assert.assertEquals(response.getSubmitSearchForProviderIndividualResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); } @@ -105,17 +187,14 @@ public void testRetrieveIdentifierSearchWithSuppliedId() throws StandardErrorMsg batchIdSearch1.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch1); - // add second batch (for the same hpii) BatchSearchForProviderIndividualCriteriaType batchIdSearch2 = new BatchSearchForProviderIndividualCriteriaType(); batchIdSearch2.setRequestIdentifier(UUID.randomUUID().toString()); batchIdSearch2.setSearchForProviderIndividual(idSearch); batch.identifierSearch(batchIdSearch2); - // This is the client where we have to supply the user ID with the search SubmitSearchForProviderIndividualResponse response = clientNoID.submitSearch(batch, getWrappedUserQualifiedId()); Assert.assertEquals(response.getSubmitSearchForProviderIndividualResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); - // the id of this search String batchIdentifier = response.getSubmitSearchForProviderIndividualResult().getBatchIdentifier(); RetrieveSearchForProviderIndividual retrieveRequest = new RetrieveSearchForProviderIndividual(); @@ -126,6 +205,24 @@ public void testRetrieveIdentifierSearchWithSuppliedId() throws StandardErrorMsg Assert.assertEquals(2, searchResults.size()); } + @Test + public void testRetrieveSearch_clientScopedUser() throws StandardErrorMsg { + ProviderIndividualBatchSearch batch = new ProviderIndividualBatchSearch(); + BatchSearchForProviderIndividualCriteriaType criteria = new BatchSearchForProviderIndividualCriteriaType(); + criteria.setRequestIdentifier(UUID.randomUUID().toString()); + criteria.setSearchForProviderIndividual(getGenericIDSearch()); + batch.identifierSearch(criteria); + + SubmitSearchForProviderIndividualResponse submitResponse = client.submitSearch(batch); + Assert.assertEquals(SeverityType.INFORMATIONAL, + submitResponse.getSubmitSearchForProviderIndividualResult().getServiceMessages().getHighestSeverity()); + + RetrieveSearchForProviderIndividual retrieve = new RetrieveSearchForProviderIndividual(); + retrieve.setBatchIdentifier(submitResponse.getSubmitSearchForProviderIndividualResult().getBatchIdentifier()); + RetrieveSearchForProviderIndividualResponse retrieveResponse = client.retrieveSearch(retrieve); + Assert.assertEquals(1, retrieveResponse.getRetrieveSearchForProviderIndividualResult().getBatchSearchForProviderIndividualResult().size()); + } + private SearchForProviderIndividual getGenericIDSearch() { SearchForProviderIndividual idSearch = new SearchForProviderIndividual(); idSearch.setHpiiNumber(MCA_HPII); @@ -134,7 +231,7 @@ private SearchForProviderIndividual getGenericIDSearch() { return idSearch; } - protected SearchForProviderIndividualBatchAsyncClient getMedicareTestClient() { + private static SearchForProviderIndividualBatchAsyncClient getMedicareTestClient() { try { return new SearchForProviderIndividualBatchAsyncClient(MEDICARE_ENDPOINT_URL, getUserQualifiedId(), getProductHeader(), getSigningPrivateKeyForMedicare(), getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare()); @@ -143,7 +240,7 @@ protected SearchForProviderIndividualBatchAsyncClient getMedicareTestClient() { } } - protected SearchForProviderIndividualBatchAsyncClient getMedicareTestClientNoId() { + private static SearchForProviderIndividualBatchAsyncClient getMedicareTestClientNoId() { try { return new SearchForProviderIndividualBatchAsyncClient(MEDICARE_ENDPOINT_URL, getWrappedProductHeader(), getSigningPrivateKeyForMedicare(), getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare(), null); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageDirectoryEntryClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageDirectoryEntryClientTest.java index 0ab92d0..c55a4b3 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageDirectoryEntryClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageDirectoryEntryClientTest.java @@ -1,15 +1,29 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpio; -import au.gov.nehta.vendorlibrary.hi.client.ClientBase; import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; import au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; import au.net.electronichealth.ns.hi.svc.providermanageproviderdirectoryentry._3_2.ManageProviderDirectoryEntry; import au.net.electronichealth.ns.hi.svc.providermanageproviderdirectoryentry._3_2.ManageProviderDirectoryEntryResponse; -import au.net.electronichealth.ns.hi.svc.providermanageproviderdirectoryentry._3_2.ProviderManageProviderDirectoryEntryPortType; import au.net.electronichealth.ns.hi.svc.providermanageproviderdirectoryentry._3_2.StandardErrorMsg; import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; -import au.net.electronichealth.ns.hi.xsd.providercore.organisationdetails._3_2.OrganisationDetails; import org.junit.Assert; import org.junit.Test; @@ -28,6 +42,39 @@ public void bindingProviderIsNotNull() throws GeneralSecurityException, IOExcept Assert.assertNotNull(tc.getPort()); } + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderManageProviderDirectoryEntryClient testClient = getMCATestClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapRequest()); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapResponse()); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderDirectoryEntry_nullRequest_clientUser() throws Exception { + getMCATestClient().manageProviderDirectoryEntry(null); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderDirectoryEntry_nullRequest_explicitUser() throws Exception { + getMCATestClient().manageProviderDirectoryEntry(null, getUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderDirectoryEntry_blankQualifiedIdentifier_clientUser() throws Exception { + ManageProviderDirectoryEntry req = new ManageProviderDirectoryEntry(); + req.setQualifiedIdentifier(" "); + getMCATestClient().manageProviderDirectoryEntry(req); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderDirectoryEntry_blankQualifiedIdentifier_explicitUser() throws Exception { + ManageProviderDirectoryEntry req = new ManageProviderDirectoryEntry(); + req.setQualifiedIdentifier(" "); + getMCATestClient().manageProviderDirectoryEntry(req, getUserQualifiedId()); + } + @Test public void runProviderOrgClient() throws GeneralSecurityException, IOException, StandardErrorMsg { ProviderManageProviderDirectoryEntryClient tc = getMCATestClient(); @@ -35,13 +82,8 @@ public void runProviderOrgClient() throws GeneralSecurityException, IOException, ManageProviderDirectoryEntry request = new ManageProviderDirectoryEntry(); request.setQualifiedIdentifier(HPIOHPIITestConstants.MCA_HPIO); request.getIndividualDeleteEntry().add(1); - - OrganisationDetails orgDetails = new OrganisationDetails(); - orgDetails.setAustralianBusinessNumber("99 111 111 111"); - - ManageProviderDirectoryEntryResponse response = tc.manageProviderDirectoryEntry(request); - System.out.println(response.getManageProviderDirectoryEntryResult().getServiceMessages()); + Assert.assertNotNull(response.getManageProviderDirectoryEntryResult()); } private ProviderManageProviderDirectoryEntryClient getMCATestClient() throws GeneralSecurityException, IOException { @@ -54,27 +96,6 @@ private ProviderManageProviderDirectoryEntryClient getMCATestClient() throws Gen return testClient; } - private ProviderManageProviderDirectoryEntryClient getMCATestIClient() throws GeneralSecurityException, IOException { - ProviderManageProviderDirectoryEntryClient testClient = new ProviderManageProviderDirectoryEntryClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - - private ClientBase getGenericMCATestIClient() throws GeneralSecurityException, IOException { - - ClientBase testClient = new ProviderManageProviderDirectoryEntryClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - public static QualifiedId getUserQualifiedId() { QualifiedId qualifiedId = new QualifiedId(); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageOrganisationClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageOrganisationClientTest.java index 7e33548..1f24913 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageOrganisationClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageOrganisationClientTest.java @@ -1,15 +1,29 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpio; -import au.gov.nehta.vendorlibrary.hi.client.ClientBase; import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; import au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; import au.net.electronichealth.ns.hi.svc.providermanageproviderorganisation._3_2.ManageProviderOrganisation; import au.net.electronichealth.ns.hi.svc.providermanageproviderorganisation._3_2.ManageProviderOrganisationResponse; -import au.net.electronichealth.ns.hi.svc.providermanageproviderorganisation._3_2.ProviderManageProviderOrganisationPortType; import au.net.electronichealth.ns.hi.svc.providermanageproviderorganisation._3_2.StandardErrorMsg; import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; -import au.net.electronichealth.ns.hi.xsd.providercore.organisationdetails._3_2.OrganisationDetails; import org.junit.Assert; import org.junit.Test; @@ -29,19 +43,46 @@ public void bindingProviderIsNotNull() throws GeneralSecurityException, IOExcept } @Test - public void runProviderOrgClient() throws GeneralSecurityException, IOException, StandardErrorMsg { - ProviderManageProviderOrganisationClient tc = getMCATestClient(); + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderManageProviderOrganisationClient testClient = getMCATestClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapRequest()); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapResponse()); + } - ManageProviderOrganisation request = new ManageProviderOrganisation(); - request.setHpioNumber(HPIOHPIITestConstants.MCA_HPIO); + @Test(expected = IllegalArgumentException.class) + public void manageProviderOrganisation_nullRequest_clientUser() throws Exception { + getMCATestClient().manageProviderOrganisation(null); + } + @Test(expected = IllegalArgumentException.class) + public void manageProviderOrganisation_nullRequest_explicitUser() throws Exception { + getMCATestClient().manageProviderOrganisation(null, getUserQualifiedId()); + } - OrganisationDetails orgDetails = new OrganisationDetails(); - orgDetails.setAustralianBusinessNumber("99 111 111 111"); + @Test(expected = IllegalArgumentException.class) + public void manageProviderOrganisation_blankHpio_clientUser() throws Exception { + ManageProviderOrganisation req = new ManageProviderOrganisation(); + req.setHpioNumber(" "); + getMCATestClient().manageProviderOrganisation(req); + } + @Test(expected = IllegalArgumentException.class) + public void manageProviderOrganisation_blankHpio_explicitUser() throws Exception { + ManageProviderOrganisation req = new ManageProviderOrganisation(); + req.setHpioNumber(" "); + getMCATestClient().manageProviderOrganisation(req, getUserQualifiedId()); + } + @Test + public void runProviderOrgClient() throws GeneralSecurityException, IOException, StandardErrorMsg { + ProviderManageProviderOrganisationClient tc = getMCATestClient(); + + ManageProviderOrganisation request = new ManageProviderOrganisation(); + request.setHpioNumber(HPIOHPIITestConstants.MCA_HPIO); ManageProviderOrganisationResponse response = tc.manageProviderOrganisation(request); - System.out.println(response.getManageProviderOrganisationResult().getStatus()); + Assert.assertNotNull(response.getManageProviderOrganisationResult()); } private ProviderManageProviderOrganisationClient getMCATestClient() throws GeneralSecurityException, IOException { @@ -54,27 +95,6 @@ private ProviderManageProviderOrganisationClient getMCATestClient() throws Gener return testClient; } - private ProviderManageProviderOrganisationClient getMCATestIClient() throws GeneralSecurityException, IOException { - ProviderManageProviderOrganisationClient testClient = new ProviderManageProviderOrganisationClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - - private ClientBase getGenericMCATestIClient() throws GeneralSecurityException, IOException { - - ClientBase testClient = new ProviderManageProviderOrganisationClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - public static QualifiedId getUserQualifiedId() { QualifiedId qualifiedId = new QualifiedId(); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClientTest.java new file mode 100644 index 0000000..befa795 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderManageProviderAdministrativeIndividualClientTest.java @@ -0,0 +1,106 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpio; + +import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import au.net.electronichealth.ns.hi.svc.providermanageprovideradministrativeindividual._3_2.ManageProviderAdministrativeIndividual; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ProviderManageProviderAdministrativeIndividualClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ProviderManageProviderAdministrativeIndividualClient tc = getMedicareTestClient(); + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderManageProviderAdministrativeIndividualClient testClient = getMedicareTestClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapRequest()); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapResponse()); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderAdministrativeIndividual_nullRequest_clientUser() throws Exception { + getMedicareTestClient().manageProviderAdministrativeIndividual(null); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderAdministrativeIndividual_nullRequest_explicitUser() throws Exception { + getMedicareTestClient().manageProviderAdministrativeIndividual(null, getUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderAdministrativeIndividual_blankQualifiedIdentifier_clientUser() throws Exception { + ManageProviderAdministrativeIndividual req = new ManageProviderAdministrativeIndividual(); + req.setQualifiedIdentifier(" "); + getMedicareTestClient().manageProviderAdministrativeIndividual(req); + } + + @Test(expected = IllegalArgumentException.class) + public void manageProviderAdministrativeIndividual_blankQualifiedIdentifier_explicitUser() throws Exception { + ManageProviderAdministrativeIndividual req = new ManageProviderAdministrativeIndividual(); + req.setQualifiedIdentifier(" "); + getMedicareTestClient().manageProviderAdministrativeIndividual(req, getUserQualifiedId()); + } + + @Test + public void runManageAdministrativeIndividualClient() throws Exception { + setSystemVariablesForTest(); + ProviderManageProviderAdministrativeIndividualClient tc = getMedicareTestClient(); + ManageProviderAdministrativeIndividual request = new ManageProviderAdministrativeIndividual(); + request.setQualifiedIdentifier(HPIOHPIITestConstants.MCA_HPIO); + tc.manageProviderAdministrativeIndividual(request); + } + + @Test + public void runManageAdministrativeIndividualClient_explicitUser() throws Exception { + setSystemVariablesForTest(); + ProviderManageProviderAdministrativeIndividualClient tc = getMedicareTestClient(); + ManageProviderAdministrativeIndividual request = new ManageProviderAdministrativeIndividual(); + request.setQualifiedIdentifier(HPIOHPIITestConstants.MCA_HPIO); + tc.manageProviderAdministrativeIndividual(request, getUserQualifiedId()); + } + + private ProviderManageProviderAdministrativeIndividualClient getMedicareTestClient() + throws GeneralSecurityException, IOException { + return new ProviderManageProviderAdministrativeIndividualClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdminIndiviualClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdminIndiviualClientTest.java index 0ca2799..2a22ccc 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdminIndiviualClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadAdminIndiviualClientTest.java @@ -1,9 +1,22 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpio; -import au.gov.nehta.vendorlibrary.hi.client.ClientBase; import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; import au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants; -import au.net.electronichealth.ns.hi.svc.providerreadprovideradministrativeindividual._3_2.ProviderReadProviderAdministrativeIndividualPortType; import au.net.electronichealth.ns.hi.svc.providerreadprovideradministrativeindividual._3_2.ReadProviderAdministrativeIndividual; import au.net.electronichealth.ns.hi.svc.providerreadprovideradministrativeindividual._3_2.ReadProviderAdministrativeIndividualResponse; import au.net.electronichealth.ns.hi.svc.providerreadprovideradministrativeindividual._3_2.StandardErrorMsg; @@ -35,8 +48,7 @@ public void runProviderOrgClient() throws GeneralSecurityException, IOException, ReadProviderAdministrativeIndividual request = new ReadProviderAdministrativeIndividual(); request.setQualifiedIdentifier(HPIOHPIITestConstants.MCA_HPIO); ReadProviderAdministrativeIndividualResponse response = tc.readProviderAdministrativeIndividual(request); - - System.out.println(response.getReadProviderAdministrativeIndividualResult().getStatus()); + Assert.assertNotNull(response.getReadProviderAdministrativeIndividualResult()); } @Test(expected = IllegalArgumentException.class) @@ -67,8 +79,7 @@ public void runProviderReadClientLinkType() throws GeneralSecurityException, IOE ReadProviderAdministrativeIndividualResponse identifierSearch = tic.readProviderAdministrativeIndividual(request); - - System.out.println(identifierSearch.getReadProviderAdministrativeIndividualResult().getStatus()); + Assert.assertNotNull(identifierSearch.getReadProviderAdministrativeIndividualResult()); } private ProviderReadAdministrativeIndividualClient getMCATestClient() throws GeneralSecurityException, IOException { @@ -91,17 +102,6 @@ private ProviderReadAdministrativeIndividualClient getMCATestIClient() throws Ge return testClient; } - private ClientBase getGenericMCATestIClient() throws GeneralSecurityException, IOException { - - ClientBase testClient = new ProviderReadAdministrativeIndividualClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - public static QualifiedId getUserQualifiedId() { QualifiedId qualifiedId = new QualifiedId(); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadOrganisationClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadOrganisationClientTest.java index 6f6f362..989272c 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadOrganisationClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderReadOrganisationClientTest.java @@ -1,9 +1,22 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ package au.gov.nehta.vendorlibrary.hi.hpio; -import au.gov.nehta.vendorlibrary.hi.client.ClientBase; import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; import au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants; -import au.net.electronichealth.ns.hi.svc.providerreadproviderorganisation._3_2.ProviderReadProviderOrganisationPortType; import au.net.electronichealth.ns.hi.svc.providerreadproviderorganisation._3_2.ReadProviderOrganisation; import au.net.electronichealth.ns.hi.svc.providerreadproviderorganisation._3_2.ReadProviderOrganisationResponse; import au.net.electronichealth.ns.hi.svc.providerreadproviderorganisation._3_2.StandardErrorMsg; @@ -35,7 +48,7 @@ public void runProviderOrgClient() throws GeneralSecurityException, IOException, ReadProviderOrganisation request = new ReadProviderOrganisation(); request.setHpioNumber(HPIOHPIITestConstants.MCA_HPIO); ReadProviderOrganisationResponse response = tc.readProvider(request); - System.out.println(response.getReadProviderOrganisationResult().getStatus()); + Assert.assertNotNull(response.getReadProviderOrganisationResult()); } @Test(expected = IllegalArgumentException.class) @@ -66,8 +79,7 @@ public void runProviderReadClientLinkType() throws GeneralSecurityException, IOE request.setLinkSearchType("Children"); ReadProviderOrganisationResponse identifierSearch = tic.readProvider(request); - - System.out.println(identifierSearch.getReadProviderOrganisationResult().getStatus()); + Assert.assertNotNull(identifierSearch.getReadProviderOrganisationResult()); } private ProviderReadProviderOrganisationClient getMCATestClient() throws GeneralSecurityException, IOException { @@ -90,17 +102,6 @@ private ProviderReadProviderOrganisationClient getMCATestIClient() throws Genera return testClient; } - private ClientBase getGenericMCATestIClient() throws GeneralSecurityException, IOException { - - ClientBase testClient = new ProviderReadProviderOrganisationClient(MEDICARE_ENDPOINT_URL, - getUserQualifiedId(), - getProductHeader(), - getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), - getSslSocketFactoryForMedicare()); - return testClient; - } - public static QualifiedId getUserQualifiedId() { QualifiedId qualifiedId = new QualifiedId(); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClientTest.java new file mode 100644 index 0000000..494777a --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchForProviderOrganisationClientTest.java @@ -0,0 +1,93 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpio; + +import au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import au.net.electronichealth.ns.hi.svc.providersearchforproviderorganisation._5_0.SearchForProviderOrganisation; +import au.net.electronichealth.ns.hi.svc.providersearchforproviderorganisation._5_0.SearchForProviderOrganisationResponse; +import au.net.electronichealth.ns.hi.svc.providersearchforproviderorganisation._5_0.StandardErrorMsg; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; +import static org.junit.Assert.fail; + +public class ProviderSearchForProviderOrganisationClientTest { + + @Test + public void bindingProviderIsNotNull() throws GeneralSecurityException, IOException, StandardErrorMsg { + ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ProviderSearchForProviderOrganisationClient testClient = getMCATestClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(testClient.getLastSoapRequest(), LoggingHandler.EMPTY); + Assert.assertEquals(testClient.getLastSoapResponse(), LoggingHandler.EMPTY); + } + + @Test + public void runProviderOrgClient() throws GeneralSecurityException, IOException, StandardErrorMsg { + ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); + + SearchForProviderOrganisation request = new SearchForProviderOrganisation(); + request.setHpioNumber(HPIOHPIITestConstants.MCA_HPIO); + SearchForProviderOrganisationResponse response = tc.identifierSearch(request); + Assert.assertNotNull(response.getSearchForProviderOrganisationResult()); + } + + @Test(expected = IllegalArgumentException.class) + public void runProviderOrgClientNegativeTestNoHPIO() throws GeneralSecurityException, IOException, StandardErrorMsg { + ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); + + SearchForProviderOrganisation request = new SearchForProviderOrganisation(); + + tc.identifierSearch(request); + fail("Exception not thrown"); + } + + @Test(expected = IllegalArgumentException.class) + public void runProviderOrgClientNegativeTestNullRequest() throws GeneralSecurityException, IOException, StandardErrorMsg { + ProviderSearchForProviderOrganisationClient tc = getMCATestClient(); + tc.identifierSearch(null); + fail("Exception not thrown"); + } + + private ProviderSearchForProviderOrganisationClient getMCATestClient() throws GeneralSecurityException, IOException { + return new ProviderSearchForProviderOrganisationClient(MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClientTest.java index 7f2b0d9..652c192 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchHIProviderDirectoryForOrganisationClientTest.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -29,7 +31,7 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import au.gov.nehta.vendorlibrary.hi.test.utils.ReflectionFieldSetter; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; import static au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants.*; import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; @@ -46,7 +48,7 @@ public void testNullLoggingHandler() throws Exception { getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare()); - ReflectionFieldSetter.setField(testClient, "loggingHandler", null); + TestReflect.setField(testClient, "loggingHandler", null); String lastSoapRequest = testClient.getLastSoapRequest(); assertEquals(lastSoapRequest, LoggingHandler.EMPTY); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchOrganisationBatchAsync.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchOrganisationBatchAsync.java deleted file mode 100644 index a8aaeed..0000000 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/ProviderSearchOrganisationBatchAsync.java +++ /dev/null @@ -1,73 +0,0 @@ -package au.gov.nehta.vendorlibrary.hi.hpio; - -import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.RetrieveSearchForProviderOrganisation; -import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.RetrieveSearchForProviderOrganisationResponse; -import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.StandardErrorMsg; -import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.SubmitSearchForProviderOrganisationResponse; -import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SeverityType; -import au.net.electronichealth.ns.hi.xsd.providercore.organisationdetails._5_1.BatchSearchForProviderOrganisationCriteriaType; -import au.net.electronichealth.ns.hi.xsd.providermessages.searchorganisation._5_0.SearchForProviderOrganisation; -import org.junit.Assert; -import org.junit.Test; - -import java.util.UUID; - -import static au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants.MCA_HPIO; -import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.*; - -public class ProviderSearchOrganisationBatchAsync { - - SearchForProviderOrganisationBatchAsyncClient client = getMedicareTestClient(); - SearchForProviderOrganisationBatchAsyncClient clientNoID = getMedicareTestClientNoId(); - - @Test - public void testHPIOBatchSingle() throws StandardErrorMsg { - ProviderOrganisationBatchSearch request = new ProviderOrganisationBatchSearch(); - BatchSearchForProviderOrganisationCriteriaType idSearch = new BatchSearchForProviderOrganisationCriteriaType(); - idSearch.setRequestIdentifier(UUID.randomUUID().toString()); - SearchForProviderOrganisation hpioSearch = new SearchForProviderOrganisation(); - hpioSearch.setHpioNumber(MCA_HPIO); - idSearch.setSearchForProviderOrganisation(hpioSearch); - request.identifierSearch(idSearch); - SubmitSearchForProviderOrganisationResponse response = client.submitSearch(request); - Assert.assertEquals(response.getSubmitSearchForProviderOrganisationResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); - } - - @Test - public void testRetrieveHPIOBatchSingle() throws StandardErrorMsg { - // do a batch search - ProviderOrganisationBatchSearch request = new ProviderOrganisationBatchSearch(); - BatchSearchForProviderOrganisationCriteriaType idSearch = new BatchSearchForProviderOrganisationCriteriaType(); - idSearch.setRequestIdentifier(UUID.randomUUID().toString()); - SearchForProviderOrganisation hpioSearch = new SearchForProviderOrganisation(); - hpioSearch.setHpioNumber(MCA_HPIO); - idSearch.setSearchForProviderOrganisation(hpioSearch); - request.identifierSearch(idSearch); - SubmitSearchForProviderOrganisationResponse response = client.submitSearch(request); - Assert.assertEquals(response.getSubmitSearchForProviderOrganisationResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); - - RetrieveSearchForProviderOrganisation requestSearch = new RetrieveSearchForProviderOrganisation(); - requestSearch.setBatchIdentifier(response.getSubmitSearchForProviderOrganisationResult().getBatchIdentifier()); - RetrieveSearchForProviderOrganisationResponse retrieveSearchResponse = client.retrieveSearch(requestSearch); - Assert.assertEquals(1, retrieveSearchResponse.getRetrieveSearchForProviderOrganisationResult().getBatchSearchForProviderOrganisationResult().size()); - Assert.assertEquals(retrieveSearchResponse.getRetrieveSearchForProviderOrganisationResult().getBatchSearchForProviderOrganisationResult().get(0).getSearchForProviderOrganisationResult().getHpioNumber(), MCA_HPIO); - } - - protected SearchForProviderOrganisationBatchAsyncClient getMedicareTestClient() { - try { - return new SearchForProviderOrganisationBatchAsyncClient(MEDICARE_ENDPOINT_URL, getUserQualifiedId(), getProductHeader(), getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - protected SearchForProviderOrganisationBatchAsyncClient getMedicareTestClientNoId() { - try { - return new SearchForProviderOrganisationBatchAsyncClient(MEDICARE_ENDPOINT_URL, getWrappedProductHeader(), getSigningPrivateKeyForMedicare(), - getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare(), null); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClientTest.java new file mode 100644 index 0000000..74785b6 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/hpio/SearchForProviderOrganisationBatchAsyncClientTest.java @@ -0,0 +1,179 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.hpio; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.RetrieveSearchForProviderOrganisation; +import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.RetrieveSearchForProviderOrganisationResponse; +import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.StandardErrorMsg; +import au.net.electronichealth.ns.hi.svc.providerbatchasyncsearchforproviderorganisation._5_1.SubmitSearchForProviderOrganisationResponse; +import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SeverityType; +import au.net.electronichealth.ns.hi.xsd.providercore.organisationdetails._5_1.BatchSearchForProviderOrganisationCriteriaType; +import au.net.electronichealth.ns.hi.xsd.providermessages.searchorganisation._5_0.SearchForProviderOrganisation; +import org.junit.Assert; +import org.junit.Test; + +import java.util.UUID; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.HPIOHPIITestConstants.MCA_HPIO; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.*; + +public class SearchForProviderOrganisationBatchAsyncClientTest { + + private final SearchForProviderOrganisationBatchAsyncClient client = getMedicareTestClient(); + private final SearchForProviderOrganisationBatchAsyncClient clientNoID = getMedicareTestClientNoId(); + + @Test + public void bindingProviderIsNotNull() throws Exception { + SearchForProviderOrganisationBatchAsyncClient tc = getMedicareTestClient(); + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + SearchForProviderOrganisationBatchAsyncClient testClient = getMedicareTestClient(); + TestReflect.setField(testClient, "loggingHandler", null); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapRequest()); + Assert.assertEquals(LoggingHandler.EMPTY, testClient.getLastSoapResponse()); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearch_nullBatchRequest_clientUser() throws StandardErrorMsg { + client.submitSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearch_nullBatchRequest_perRequestUser() throws StandardErrorMsg { + clientNoID.submitSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearch_nullIndividualId_throws() throws StandardErrorMsg { + ProviderOrganisationBatchSearch batch = new ProviderOrganisationBatchSearch(); + clientNoID.submitSearch(batch, null); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearch_nullRequest_clientUser() throws StandardErrorMsg { + client.retrieveSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearch_nullRequest_perRequestUser() throws StandardErrorMsg { + clientNoID.retrieveSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearch_nullIndividualId_throws() throws StandardErrorMsg { + RetrieveSearchForProviderOrganisation retrieve = new RetrieveSearchForProviderOrganisation(); + retrieve.setBatchIdentifier("dummy"); + clientNoID.retrieveSearch(retrieve, null); + } + + @Test + public void submitSearchCheck_nullSubmitRequestThrows() { + try { + client.submitSearchCheck(null); + Assert.fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException ex) { + Assert.assertTrue(ex.getMessage().contains("Request")); + } + } + + @Test + public void retrieveSearchCheck_nullRetrieveRequestThrows() { + try { + client.retrieveSearchCheck(null); + Assert.fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException ex) { + Assert.assertTrue(ex.getMessage().contains("Request")); + } + } + + @Test + public void testHPIOBatchSingle() throws StandardErrorMsg { + ProviderOrganisationBatchSearch request = new ProviderOrganisationBatchSearch(); + BatchSearchForProviderOrganisationCriteriaType idSearch = new BatchSearchForProviderOrganisationCriteriaType(); + idSearch.setRequestIdentifier(UUID.randomUUID().toString()); + SearchForProviderOrganisation hpioSearch = new SearchForProviderOrganisation(); + hpioSearch.setHpioNumber(MCA_HPIO); + idSearch.setSearchForProviderOrganisation(hpioSearch); + request.identifierSearch(idSearch); + SubmitSearchForProviderOrganisationResponse response = client.submitSearch(request); + Assert.assertEquals(response.getSubmitSearchForProviderOrganisationResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); + } + + @Test + public void testRetrieveHPIOBatchSingle() throws StandardErrorMsg { + ProviderOrganisationBatchSearch request = new ProviderOrganisationBatchSearch(); + BatchSearchForProviderOrganisationCriteriaType idSearch = new BatchSearchForProviderOrganisationCriteriaType(); + idSearch.setRequestIdentifier(UUID.randomUUID().toString()); + SearchForProviderOrganisation hpioSearch = new SearchForProviderOrganisation(); + hpioSearch.setHpioNumber(MCA_HPIO); + idSearch.setSearchForProviderOrganisation(hpioSearch); + request.identifierSearch(idSearch); + SubmitSearchForProviderOrganisationResponse response = client.submitSearch(request); + Assert.assertEquals(response.getSubmitSearchForProviderOrganisationResult().getServiceMessages().getHighestSeverity(), SeverityType.INFORMATIONAL); + + RetrieveSearchForProviderOrganisation requestSearch = new RetrieveSearchForProviderOrganisation(); + requestSearch.setBatchIdentifier(response.getSubmitSearchForProviderOrganisationResult().getBatchIdentifier()); + RetrieveSearchForProviderOrganisationResponse retrieveSearchResponse = client.retrieveSearch(requestSearch); + Assert.assertEquals(1, retrieveSearchResponse.getRetrieveSearchForProviderOrganisationResult().getBatchSearchForProviderOrganisationResult().size()); + Assert.assertEquals(MCA_HPIO, + retrieveSearchResponse.getRetrieveSearchForProviderOrganisationResult().getBatchSearchForProviderOrganisationResult().get(0).getSearchForProviderOrganisationResult().getHpioNumber()); + } + + @Test + public void testRetrieveSearch_clientScopedUser() throws StandardErrorMsg { + ProviderOrganisationBatchSearch request = new ProviderOrganisationBatchSearch(); + BatchSearchForProviderOrganisationCriteriaType idSearch = new BatchSearchForProviderOrganisationCriteriaType(); + idSearch.setRequestIdentifier(UUID.randomUUID().toString()); + SearchForProviderOrganisation hpioSearch = new SearchForProviderOrganisation(); + hpioSearch.setHpioNumber(MCA_HPIO); + idSearch.setSearchForProviderOrganisation(hpioSearch); + request.identifierSearch(idSearch); + SubmitSearchForProviderOrganisationResponse submitResponse = client.submitSearch(request); + Assert.assertEquals(SeverityType.INFORMATIONAL, + submitResponse.getSubmitSearchForProviderOrganisationResult().getServiceMessages().getHighestSeverity()); + + RetrieveSearchForProviderOrganisation retrieve = new RetrieveSearchForProviderOrganisation(); + retrieve.setBatchIdentifier(submitResponse.getSubmitSearchForProviderOrganisationResult().getBatchIdentifier()); + RetrieveSearchForProviderOrganisationResponse retrieveResponse = client.retrieveSearch(retrieve); + Assert.assertEquals(1, retrieveResponse.getRetrieveSearchForProviderOrganisationResult().getBatchSearchForProviderOrganisationResult().size()); + } + + private static SearchForProviderOrganisationBatchAsyncClient getMedicareTestClient() { + try { + return new SearchForProviderOrganisationBatchAsyncClient(MEDICARE_ENDPOINT_URL, getUserQualifiedId(), getProductHeader(), getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static SearchForProviderOrganisationBatchAsyncClient getMedicareTestClientNoId() { + try { + return new SearchForProviderOrganisationBatchAsyncClient(MEDICARE_ENDPOINT_URL, getWrappedProductHeader(), getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare(), null); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClientTest.java new file mode 100644 index 0000000..31a449c --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateProvisionalIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerCreateProvisionalIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerCreateProvisionalIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerCreateProvisionalIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void createProvisionalIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().createProvisionalIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void createProvisionalIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().createProvisionalIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerCreateProvisionalIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerCreateProvisionalIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClientTest.java new file mode 100644 index 0000000..65804ee --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateUnverifiedIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerCreateUnverifiedIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerCreateUnverifiedIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerCreateUnverifiedIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void createUnverifiedIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().createUnverifiedIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void createUnverifiedIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().createUnverifiedIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerCreateUnverifiedIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerCreateUnverifiedIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClientTest.java new file mode 100644 index 0000000..f824979 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerCreateVerifiedIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerCreateVerifiedIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerCreateVerifiedIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerCreateVerifiedIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void createVerifiedIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().createVerifiedIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void createVerifiedIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().createVerifiedIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerCreateVerifiedIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerCreateVerifiedIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClientTest.java new file mode 100644 index 0000000..2d2b4ca --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerMergeProvisionalIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerMergeProvisionalIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerMergeProvisionalIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerMergeProvisionalIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void mergeProvisionalIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().mergeProvisionalIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void mergeProvisionalIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().mergeProvisionalIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerMergeProvisionalIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerMergeProvisionalIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClientTest.java new file mode 100644 index 0000000..7e30763 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyDuplicateIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerNotifyDuplicateIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerNotifyDuplicateIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerNotifyDuplicateIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void notifyDuplicateIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().notifyDuplicateIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void notifyDuplicateIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().notifyDuplicateIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerNotifyDuplicateIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerNotifyDuplicateIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClientTest.java new file mode 100644 index 0000000..5faf8ca --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerNotifyReplicaIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerNotifyReplicaIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerNotifyReplicaIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerNotifyReplicaIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void notifyReplicaIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().notifyReplicaIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void notifyReplicaIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().notifyReplicaIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerNotifyReplicaIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerNotifyReplicaIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClientTest.java new file mode 100644 index 0000000..cf32790 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerResolveProvisionalIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerResolveProvisionalIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerResolveProvisionalIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerResolveProvisionalIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void resolveProvisionalIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().resolveProvisionalIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void resolveProvisionalIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().resolveProvisionalIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerResolveProvisionalIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerResolveProvisionalIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClientTest.java new file mode 100644 index 0000000..57e317f --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchAsyncClientTest.java @@ -0,0 +1,229 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.DeleteSearchIHIBatch; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.DeleteSearchIHIBatchResponse; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.GetSearchIHIBatchStatus; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.GetSearchIHIBatchStatusResponse; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.RetrieveSearchIHIBatch; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.RetrieveSearchIHIBatchResponse; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.StandardErrorMsg; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.SubmitSearchIHIBatch; +import au.net.electronichealth.ns.hi.svc.consumersearchihibatchasync._3.SubmitSearchIHIBatchResponse; +import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SeverityType; +import au.net.electronichealth.ns.hi.xsd.consumermessages.searchihi._3.SearchIHI; +import au.net.electronichealth.ns.hi.xsd.consumermessages.searchihibatch._3.BatchResponseStatusType; +import au.net.electronichealth.ns.hi.xsd.consumermessages.searchihibatch._3.SearchIHIRequestType; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.UUID; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.MEDICARE_GENERIC_TEST_INDIVIDUAL_DATE_OF_BIRTH; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.MEDICARE_GENERIC_TEST_INDIVIDUAL_FAMILY_NAME; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.MEDICARE_GENERIC_TEST_INDIVIDUAL_GIVEN_NAME; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.MEDICARE_GENERIC_TEST_INDIVIDUAL_SEX; +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerSearchIHIBatchAsyncClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerSearchIHIBatchAsyncClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerSearchIHIBatchAsyncClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void submitSearchIHIBatch_nullRequest_throws() throws Exception { + getMedicareTestClient().submitSearchIHIBatch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void retrieveSearchIHIBatch_nullRequest_throws() throws Exception { + getMedicareTestClient().retrieveSearchIHIBatch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void getSearchIHIBatchStatus_nullRequest_throws() throws Exception { + getMedicareTestClient().getSearchIHIBatchStatus(null); + } + + @Test(expected = IllegalArgumentException.class) + public void deleteSearchIHIBatch_nullRequest_throws() throws Exception { + getMedicareTestClient().deleteSearchIHIBatch(null); + } + + @Test + public void asyncBatchMedicare_roundTrip_clientUser() throws Exception { + setSystemVariablesForTest(); + ConsumerSearchIHIBatchAsyncClient testClient = getMedicareTestClient(); + String batchId = submitOneBasicSearch(testClient, null); + waitForBatchCompleted(testClient, batchId, null); + + RetrieveSearchIHIBatch retrieveRequest = new RetrieveSearchIHIBatch(); + retrieveRequest.setBatchIdentifier(batchId); + RetrieveSearchIHIBatchResponse retrieveResponse = testClient.retrieveSearchIHIBatch(retrieveRequest); + verifySoapMessages(testClient); + Assert.assertEquals(batchId, retrieveResponse.getBatchIdentifier()); + Assert.assertEquals(1, retrieveResponse.getSearchIHIBatchResult().size()); + Assert.assertEquals(MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER, + retrieveResponse.getSearchIHIBatchResult().get(0).getSearchIHIResult().getIhiNumber()); + + GetSearchIHIBatchStatus statusRequest = new GetSearchIHIBatchStatus(); + statusRequest.setBatchIdentifier(batchId); + GetSearchIHIBatchStatusResponse statusResponse = testClient.getSearchIHIBatchStatus(statusRequest); + Assert.assertNotNull(statusResponse.getGetSearchIHIBatchStatusResult()); + Assert.assertEquals(batchId, statusResponse.getGetSearchIHIBatchStatusResult().getBatchIdentifier()); + + DeleteSearchIHIBatch deleteRequest = new DeleteSearchIHIBatch(); + deleteRequest.setBatchIdentifier(batchId); + DeleteSearchIHIBatchResponse deleteResponse = testClient.deleteSearchIHIBatch(deleteRequest); + Assert.assertEquals(BatchResponseStatusType.DELETED, deleteResponse.getDeleteSearchIHIBatchResult().getStatus()); + } + + @Test + public void asyncBatchMedicare_roundTrip_perRequestUser() throws Exception { + setSystemVariablesForTest(); + ConsumerSearchIHIBatchAsyncClient testClient = getMedicareWrappedClient(); + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId userId = getWrappedUserQualifiedId(); + String batchId = submitOneBasicSearch(testClient, userId); + waitForBatchCompleted(testClient, batchId, userId); + + RetrieveSearchIHIBatch retrieveRequest = new RetrieveSearchIHIBatch(); + retrieveRequest.setBatchIdentifier(batchId); + RetrieveSearchIHIBatchResponse retrieveResponse = testClient.retrieveSearchIHIBatch(retrieveRequest, userId); + verifySoapMessages(testClient); + Assert.assertEquals(batchId, retrieveResponse.getBatchIdentifier()); + Assert.assertEquals(1, retrieveResponse.getSearchIHIBatchResult().size()); + Assert.assertEquals(MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER, + retrieveResponse.getSearchIHIBatchResult().get(0).getSearchIHIResult().getIhiNumber()); + + GetSearchIHIBatchStatus statusRequest = new GetSearchIHIBatchStatus(); + statusRequest.setBatchIdentifier(batchId); + GetSearchIHIBatchStatusResponse statusResponse = testClient.getSearchIHIBatchStatus(statusRequest, userId); + Assert.assertNotNull(statusResponse.getGetSearchIHIBatchStatusResult()); + + DeleteSearchIHIBatch deleteRequest = new DeleteSearchIHIBatch(); + deleteRequest.setBatchIdentifier(batchId); + DeleteSearchIHIBatchResponse deleteResponse = testClient.deleteSearchIHIBatch(deleteRequest, userId); + Assert.assertEquals(BatchResponseStatusType.DELETED, deleteResponse.getDeleteSearchIHIBatchResult().getStatus()); + } + + private String submitOneBasicSearch(ConsumerSearchIHIBatchAsyncClient client, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId perRequestUser) throws StandardErrorMsg { + SearchBatch batch = buildSingleBasicSearchBatch(); + SubmitSearchIHIBatch submit = new SubmitSearchIHIBatch(); + submit.getSearchIHIBatchRequest().addAll(new ArrayList<>(batch.getBatch().getSearchIHIBatchRequest())); + SubmitSearchIHIBatchResponse submitResponse = perRequestUser == null + ? client.submitSearchIHIBatch(submit) + : client.submitSearchIHIBatch(submit, perRequestUser); + Assert.assertEquals(SeverityType.INFORMATIONAL, submitResponse.getServiceMessages().getHighestSeverity()); + Assert.assertNotNull(submitResponse.getBatchIdentifier()); + return submitResponse.getBatchIdentifier(); + } + + private void waitForBatchCompleted(ConsumerSearchIHIBatchAsyncClient client, String batchId, + au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId perRequestUser) throws Exception { + GetSearchIHIBatchStatus statusReq = new GetSearchIHIBatchStatus(); + statusReq.setBatchIdentifier(batchId); + for (int i = 0; i < 90; i++) { + GetSearchIHIBatchStatusResponse statusRes = perRequestUser == null + ? client.getSearchIHIBatchStatus(statusReq) + : client.getSearchIHIBatchStatus(statusReq, perRequestUser); + BatchResponseStatusType s = statusRes.getGetSearchIHIBatchStatusResult().getStatus(); + if (s == BatchResponseStatusType.COMPLETED) { + return; + } + if (s == BatchResponseStatusType.ERROR) { + Assert.fail("batch error status for " + batchId); + } + Thread.sleep(1000L); + } + Assert.fail("batch did not reach COMPLETED: " + batchId); + } + + private SearchBatch buildSingleBasicSearchBatch() { + SearchBatch searchBatch = new SearchBatch(); + SearchIHI basicSearchIHI = new SearchIHI(); + basicSearchIHI.setIhiNumber(MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER); + basicSearchIHI.setFamilyName(MEDICARE_GENERIC_TEST_INDIVIDUAL_FAMILY_NAME); + basicSearchIHI.setGivenName(MEDICARE_GENERIC_TEST_INDIVIDUAL_GIVEN_NAME); + basicSearchIHI.setDateOfBirth(MEDICARE_GENERIC_TEST_INDIVIDUAL_DATE_OF_BIRTH); + basicSearchIHI.setSex(MEDICARE_GENERIC_TEST_INDIVIDUAL_SEX); + SearchIHIRequestType basicSearchIhiRequestType = new SearchIHIRequestType(); + basicSearchIhiRequestType.setSearchIHI(basicSearchIHI); + basicSearchIhiRequestType.setRequestIdentifier(UUID.randomUUID().toString()); + searchBatch.addBasicSearch(basicSearchIhiRequestType); + return searchBatch; + } + + private void verifySoapMessages(ConsumerSearchIHIBatchAsyncClient testClient) { + Assert.assertNotNull(testClient.getLastSoapRequest()); + Assert.assertNotNull(testClient.getLastSoapResponse()); + Assert.assertNotEquals("", testClient.getLastSoapRequest()); + Assert.assertNotEquals("", testClient.getLastSoapResponse()); + } + + private ConsumerSearchIHIBatchAsyncClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerSearchIHIBatchAsyncClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } + + private ConsumerSearchIHIBatchAsyncClient getMedicareWrappedClient() throws GeneralSecurityException, IOException { + return new ConsumerSearchIHIBatchAsyncClient( + MEDICARE_ENDPOINT_URL, + getWrappedProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClientTest.java index f63cb6d..7bc420d 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIBatchSyncClientTest.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -29,7 +31,7 @@ import au.net.electronichealth.ns.hi.xsd.consumermessages.searchihibatch._3.SearchIHIResultType; import org.junit.Assert; import org.junit.Test; -import au.gov.nehta.vendorlibrary.hi.test.utils.ReflectionFieldSetter; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; import javax.xml.datatype.XMLGregorianCalendar; import java.io.IOException; @@ -38,6 +40,8 @@ import java.util.UUID; import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.*; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; public class ConsumerSearchIHIBatchSyncClientTest { @@ -54,7 +58,7 @@ public void testNullLoggingHandler() throws Exception { setSystemVariablesForTest(); ConsumerSearchIHIBatchSyncClient testClient = getMedicareTestClient(); - ReflectionFieldSetter.setField(testClient, "loggingHandler", null); + TestReflect.setField(testClient, "loggingHandler", null); String lastSoapRequest = testClient.getLastSoapRequest(); Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); @@ -63,6 +67,21 @@ public void testNullLoggingHandler() throws Exception { Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); } + @Test(expected = IllegalArgumentException.class) + public void batchSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().batchSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void batchSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().batchSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void batchSearch_nullIndividualId_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().batchSearch(new SearchBatch(), null); + } + @Test public void batchSearchAgainstMedicare() throws Exception { setSystemVariablesForTest(); @@ -318,6 +337,15 @@ private ConsumerSearchIHIBatchSyncClient getMedicareTestClient() throws GeneralS getSigningCertificateKeyForMedicare(), getSslSocketFactoryForMedicare()); } + private ConsumerSearchIHIBatchSyncClient getMedicarePerRequestUserClient() throws GeneralSecurityException, IOException { + return new ConsumerSearchIHIBatchSyncClient( + MEDICARE_ENDPOINT_URL, + getWrappedProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } + private SearchIHI getBasicSearchForMedicare() { SearchIHI searchIHI = new SearchIHI(); searchIHI.setIhiNumber(MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientArgumentValidatorTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientArgumentValidatorTest.java index 4da68de..e6a99e0 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientArgumentValidatorTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientArgumentValidatorTest.java @@ -10,6 +10,7 @@ import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SexType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianPostalAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianStreetAddressType; +import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianUnstructuredStreetAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.InternationalAddressType; import org.junit.Test; @@ -127,6 +128,35 @@ public void australianStreetAddressSearchCheck_rejectsIhiNumber() { validator.australianStreetAddressSearchCheck(request); } + @Test(expected = IllegalArgumentException.class) + public void australianStreetAddressSearchCheck_rejectsConcurrentUnstructuredAddress() { + SearchIHI request = australianStreetAddressSearchRequest(); + request.setAustralianUnstructuredStreetAddress(australianUnstructuredStreetAddressSuburbOnly()); + validator.australianStreetAddressSearchCheck(request); + } + + @Test(expected = IllegalArgumentException.class) + public void australianStreetAddressSearchCheck_rejectsStreetNumberWithoutStreetType() { + SearchIHI request = australianStreetAddressSearchRequest(); + request.getAustralianStreetAddress().setStreetType(null); + validator.australianStreetAddressSearchCheck(request); + } + + @Test + public void australianUnstructuredStreetAddressSearchCheck_acceptsSuburbOnly() { + SearchIHI request = demographicsOnlyRequest(); + request.setAustralianUnstructuredStreetAddress(australianUnstructuredStreetAddressSuburbOnly()); + validator.australianUnstructuredStreetAddressSearchCheck(request); + } + + @Test(expected = IllegalArgumentException.class) + public void australianUnstructuredStreetAddressSearchCheck_rejectsConcurrentStructuredAddress() { + SearchIHI request = demographicsOnlyRequest(); + request.setAustralianUnstructuredStreetAddress(australianUnstructuredStreetAddressSuburbOnly()); + request.setAustralianStreetAddress(australianStreetAddressSearchRequest().getAustralianStreetAddress()); + validator.australianUnstructuredStreetAddressSearchCheck(request); + } + @Test public void internationalAddressSearchCheck_acceptsMedicareTestPayload() { validator.internationalAddressSearchCheck(internationalAddressSearchRequest()); @@ -214,6 +244,14 @@ private static SearchIHI australianStreetAddressSearchRequest() { return searchIHI; } + private static AustralianUnstructuredStreetAddressType australianUnstructuredStreetAddressSuburbOnly() { + AustralianUnstructuredStreetAddressType address = new AustralianUnstructuredStreetAddressType(); + address.setSuburb(MEDICARE_GENERIC_TEST_INDIVIDUAL_AUSTRALIAN_STREET_ADDRESS_SUBURB); + address.setState(MEDICARE_GENERIC_TEST_INDIVIDUAL_AUSTRALIAN_STREET_ADDRESS_STATE); + address.setPostcode(MEDICARE_GENERIC_TEST_INDIVIDUAL_AUSTRALIAN_STREET_ADDRESS_POST_CODE); + return address; + } + private static SearchIHI internationalAddressSearchRequest() { SearchIHI searchIHI = demographicsOnlyRequest(); InternationalAddressType address = new InternationalAddressType(); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientTest.java index 222a0e1..2d2eee1 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerSearchIHIClientTest.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -24,7 +26,6 @@ import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.SexType; import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.StateType; import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.StreetType; -import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ServiceMessageType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianPostalAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.AustralianStreetAddressType; import au.net.electronichealth.ns.hi.xsd.consumercore.address._3.InternationalAddressType; @@ -33,13 +34,17 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import au.gov.nehta.vendorlibrary.hi.test.utils.ReflectionFieldSetter; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import javax.xml.datatype.DatatypeConstants; +import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import java.io.IOException; import java.security.GeneralSecurityException; import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.*; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; public class ConsumerSearchIHIClientTest { @@ -56,7 +61,7 @@ public void testNullLoggingHandler() throws Exception { setSystemVariablesForTest(); ConsumerSearchIHIClient testClient = getDrpTestClient(); - ReflectionFieldSetter.setField(testClient, "loggingHandler", null); + TestReflect.setField(testClient, "loggingHandler", null); String lastSoapRequest = testClient.getLastSoapRequest(); Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); @@ -65,6 +70,76 @@ public void testNullLoggingHandler() throws Exception { Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); } + @Test(expected = IllegalArgumentException.class) + public void basicSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().basicSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void basicSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().basicSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void basicMedicareSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().basicMedicareSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void basicMedicareSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().basicMedicareSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void basicDvaSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().basicDvaSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void basicDvaSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().basicDvaSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void detailedSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().detailedSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void detailedSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().detailedSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void australianPostalAddressSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().australianPostalAddressSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void australianPostalAddressSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().australianPostalAddressSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void australianStreetAddressSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().australianStreetAddressSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void australianStreetAddressSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().australianStreetAddressSearch(null, getWrappedUserQualifiedId()); + } + + @Test(expected = IllegalArgumentException.class) + public void internationalAddressSearch_nullRequest_clientUser() throws Exception { + getMedicareTestClient().internationalAddressSearch(null); + } + + @Test(expected = IllegalArgumentException.class) + public void internationalAddressSearch_nullRequest_perRequestUser() throws Exception { + getMedicarePerRequestUserClient().internationalAddressSearch(null, getWrappedUserQualifiedId()); + } + // Basic Search Integration Tests @Test public void basicSearchAgainstMedicare() throws Exception { @@ -131,8 +206,8 @@ public void basicSearchAgainstMedicare_VicHealthTest() throws Exception { // Schmidt // Helga - XMLGregorianCalendar cal = javax.xml.datatype.DatatypeFactory.newInstance() - .newXMLGregorianCalendarDate(1942, 8, 19, javax.xml.datatype.DatatypeConstants.FIELD_UNDEFINED); + XMLGregorianCalendar cal = DatatypeFactory.newInstance() + .newXMLGregorianCalendarDate(1942, 8, 19, DatatypeConstants.FIELD_UNDEFINED); searchIHI.setMedicareCardNumber("2950190661"); searchIHI.setFamilyName("Schmidt"); @@ -322,17 +397,9 @@ public void precedentHealthSearchAgainstMedicare() throws Exception { try { SearchIHIResponse addressSearchResponse = testClient.australianStreetAddressSearch(searchIHI); verifySoapMessages(testClient); - - for (ServiceMessageType t : addressSearchResponse.getSearchIHIResult().getServiceMessages().getServiceMessage()) { - System.out.println(t.getReason()); - } - //addressSearchResponse.getSearchIHIResult().getGivenName().toString(); - // Assert.assertNotNull( addressSearchResponse.getSearchIHIResult().getIhiNumber() ); + Assert.assertNotNull(addressSearchResponse.getSearchIHIResult()); } catch (StandardErrorMsg e) { - for (ServiceMessageType t : e.getFaultInfo().getServiceMessage()) { - System.out.println(t.getReason()); - } - e.printStackTrace(); + throw new AssertionError(e); } } @@ -405,6 +472,15 @@ private ConsumerSearchIHIClient getDrpTestClient() throws GeneralSecurityExcepti return testClient; } + private ConsumerSearchIHIClient getMedicarePerRequestUserClient() throws GeneralSecurityException, IOException { + return new ConsumerSearchIHIClient( + MEDICARE_ENDPOINT_URL, + getWrappedProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } + private SearchIHI getBasicSearchForMedicare() { SearchIHI searchIHI = new SearchIHI(); searchIHI.setIhiNumber(MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClientTest.java new file mode 100644 index 0000000..f85898c --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerUpdateIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerUpdateIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerUpdateIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void updateIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().updateIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void updateIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().updateIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerUpdateIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerUpdateIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClientTest.java new file mode 100644 index 0000000..f4e0e4c --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/ihi/ConsumerUpdateProvisionalIHIClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.ihi; + +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; +import au.gov.nehta.vendorlibrary.ws.handler.LoggingHandler; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static au.gov.nehta.vendorlibrary.hi.test.utils.IHITestConstants.setSystemVariablesForTest; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getProductHeader; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningCertificateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSigningPrivateKeyForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getSslSocketFactoryForMedicare; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.getWrappedUserQualifiedId; +import static au.gov.nehta.vendorlibrary.hi.test.utils.TestConstants.MEDICARE_ENDPOINT_URL; + +public class ConsumerUpdateProvisionalIHIClientTest { + + @Test + public void bindingProviderIsNotNull() throws Exception { + ConsumerUpdateProvisionalIHIClient tc = getMedicareTestClient(); + + Assert.assertNotNull(tc.getBindingProvider()); + Assert.assertNotNull(tc.getPort()); + } + + @Test + public void testNullLoggingHandler() throws Exception { + setSystemVariablesForTest(); + ConsumerUpdateProvisionalIHIClient testClient = getMedicareTestClient(); + + TestReflect.setField(testClient, "loggingHandler", null); + + String lastSoapRequest = testClient.getLastSoapRequest(); + Assert.assertEquals(lastSoapRequest, LoggingHandler.EMPTY); + + String lastSoapResponse = testClient.getLastSoapResponse(); + Assert.assertEquals(lastSoapResponse, LoggingHandler.EMPTY); + } + + @Test(expected = IllegalArgumentException.class) + public void updateProvisionalIHI_nullRequest_clientUser() throws Exception { + getMedicareTestClient().updateProvisionalIHI(null); + } + + @Test(expected = IllegalArgumentException.class) + public void updateProvisionalIHI_nullRequest_perRequestUser() throws Exception { + getMedicareTestClient().updateProvisionalIHI(null, getWrappedUserQualifiedId()); + } + + private ConsumerUpdateProvisionalIHIClient getMedicareTestClient() throws GeneralSecurityException, IOException { + return new ConsumerUpdateProvisionalIHIClient( + MEDICARE_ENDPOINT_URL, + getUserQualifiedId(), + getProductHeader(), + getSigningPrivateKeyForMedicare(), + getSigningCertificateKeyForMedicare(), + getSslSocketFactoryForMedicare()); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClientTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClientTest.java index 68aa8d7..8e1c62e 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClientTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/readreferencedata/ReadReferenceDataClientTest.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -20,7 +22,7 @@ import au.net.electronichealth.ns.hi.xsd.providermessages.readreferencedata._3_2.ElementReferenceValuesType; import org.junit.Assert; import org.junit.Test; -import au.gov.nehta.vendorlibrary.hi.test.utils.ReflectionFieldSetter; +import au.gov.nehta.vendorlibrary.hi.test.utils.TestReflect; import java.io.IOException; import java.security.GeneralSecurityException; @@ -46,7 +48,7 @@ public void testNullLoggingHandler() throws Exception { setSystemVariablesForTest(); ReadReferenceDataClient testClient = getMedicareTestClient(); - ReflectionFieldSetter.setField(testClient, "loggingHandler", null); + TestReflect.setField(testClient, "loggingHandler", null); String lastSoapRequest = testClient.getLastSoapRequest(); assertEquals(lastSoapRequest, LoggingHandler.EMPTY); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/config/TestConfiguration.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/config/TestConfiguration.java index dbf2165..47e8ea0 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/config/TestConfiguration.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/config/TestConfiguration.java @@ -31,6 +31,9 @@ * {@code local.properties}, then the default supplied by the caller. Environment variables override * the property file when both define a value. *

+ * The library reads {@code HI_WSDL_ARTIFACT_ROOT} from the same {@code local.properties} path (see + * {@link au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot}). + *

* This follows common Java practice: deployment-specific values (passwords, endpoints, registered * identifiers) should be supplied externally rather than edited into source and committed. */ @@ -68,8 +71,6 @@ public final class TestConfiguration { public static final String HI_PRODUCT_NAME = "HI_PRODUCT_NAME"; public static final String HI_PRODUCT_VERSION = "HI_PRODUCT_VERSION"; public static final String HI_PRODUCT_PLATFORM = "HI_PRODUCT_PLATFORM"; - /** Same key as {@link au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot#HI_WSDL_ARTIFACT_ROOT}. */ - public static final String HI_WSDL_ARTIFACT_ROOT = "HI_WSDL_ARTIFACT_ROOT"; private static final Properties LOCAL = new Properties(); diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/unittests/HiWsdlArtifactSmokeTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/unittests/HiWsdlArtifactSmokeTest.java new file mode 100644 index 0000000..3b81fde --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/unittests/HiWsdlArtifactSmokeTest.java @@ -0,0 +1,19 @@ +package au.gov.nehta.vendorlibrary.hi.test.unittests; + +import static org.junit.Assert.assertTrue; + +import jakarta.xml.ws.Service; +import org.junit.Test; + +/** + * Smoke test: generated HI SOAP types are on the compile classpath (from in-repo wsimport or {@code -Phi-wsdl-artifact}). + */ +public class HiWsdlArtifactSmokeTest { + + @Test + public void consumerSearchIhiServiceTypeIsOnClasspath() throws Exception { + Class serviceType = Class.forName( + "au.net.electronichealth.ns.hi.svc.consumersearchihi._3.ConsumerSearchIHIService"); + assertTrue(Service.class.isAssignableFrom(serviceType)); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/HPIOHPIITestConstants.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/HPIOHPIITestConstants.java index 73ea241..e06f67c 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/HPIOHPIITestConstants.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/HPIOHPIITestConstants.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/IHITestConstants.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/IHITestConstants.java index f0fb323..ba7c5b0 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/IHITestConstants.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/IHITestConstants.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -15,17 +17,20 @@ package au.gov.nehta.vendorlibrary.hi.test.utils; import au.gov.nehta.vendorlibrary.common.security.KeystoreUtil; +import au.gov.nehta.vendorlibrary.hi.test.config.TestConfiguration; import au.gov.nehta.vendorlibrary.ws.TimeUtility; import au.net.electronichealth.ns.hi.xsd.common.commoncoredatatypes._3.*; import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; -import javax.net.ssl.*; +import javax.net.ssl.SSLSocketFactory; import javax.xml.datatype.XMLGregorianCalendar; + import java.io.FileInputStream; import java.io.IOException; -import java.net.Socket; -import java.security.*; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.PrivateKey; import java.security.cert.X509Certificate; /** @@ -33,20 +38,24 @@ */ public class IHITestConstants { - public static final String MEDICARE_ENDPOINT_URL = "https://www5.medicareaustralia.gov.au/cert/soap/services/"; - public static final String DRP_IHI_SEARCH_ENDPOINT_URL = "https://nehta-drp-iis.nehta.net.au/MCAR3/ConsumerSearchIHI/Service.svc"; + public static final String MEDICARE_ENDPOINT_URL = TestConfiguration.getConfigurationValue(TestConfiguration.HI_MEDICARE_ENDPOINT_BASE, + "https://www5.medicareaustralia.gov.au/cert/soap/services/"); + public static final String DRP_IHI_SEARCH_ENDPOINT_URL = TestConfiguration.getConfigurationValue(TestConfiguration.HI_DRP_IHI_SEARCH_ENDPOINT_URL, + "https://nehta-drp-iis.nehta.net.au/MCAR3/ConsumerSearchIHI/Service.svc"); public static final String EMPTY = ""; - public static final String USER_QUALIFIER = "http://ns.tashealth.gov.au/id/hiclient/userid/1.0"; - public static final String USER_QUALIFIED_ID = "Identifier"; + public static final String USER_QUALIFIER = TestConfiguration.getConfigurationValue(TestConfiguration.HI_USER_QUALIFIER, + "http://ns.tashealth.gov.au/id/hiclient/userid/1.0"); + public static final String USER_QUALIFIED_ID = TestConfiguration.getConfigurationValue(TestConfiguration.HI_USER_QUALIFIED_ID, "Identifier"); - public static final String VENDOR_QUALIFIER_ID = "TAS00001"; - public static final String VENDOR_QUALIFIER = "http://ns.medicareaustralia.gov.au/mcaVendorId/1.0"; + public static final String VENDOR_QUALIFIER_ID = TestConfiguration.getConfigurationValue(TestConfiguration.HI_VENDOR_QUALIFIED_ID, "TAS00001"); + public static final String VENDOR_QUALIFIER = TestConfiguration.getConfigurationValue(TestConfiguration.HI_VENDOR_QUALIFIER, + "http://ns.medicareaustralia.gov.au/mcaVendorId/1.0"); - public static final String PRODUCT_PLATFORM = "Microsoft Windows XP SP3"; - public static final String PRODUCT_NAME = "TasHealthHIClient"; - public static final String PRODUCT_VERSION = "1.0"; + public static final String PRODUCT_PLATFORM = TestConfiguration.getConfigurationValue(TestConfiguration.HI_PRODUCT_PLATFORM, "Microsoft Windows XP SP3"); + public static final String PRODUCT_NAME = TestConfiguration.getConfigurationValue(TestConfiguration.HI_PRODUCT_NAME, "TasHealthHIClient"); + public static final String PRODUCT_VERSION = TestConfiguration.getConfigurationValue(TestConfiguration.HI_PRODUCT_VERSION, "1.0"); public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_IHI_NUMBER = "http://ns.electronichealth.net.au/id/hi/ihi/1.0/8003601240022579"; public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_MEDICARE_CARD_NUMBER = "2950141861"; @@ -72,7 +81,7 @@ public class IHITestConstants { public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_LINE = "1 Wall Street"; public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_STATE_PROVINCE = "New York"; public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_POSTCODE = "1234"; - public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_COUNTRY = "1"; + public static final String MEDICARE_GENERIC_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_COUNTRY = "1101"; public static final String MEDICARE_DVA_TEST_INDIVIDUAL_IHI_NUMBER = "http://ns.electronichealth.net.au/id/hi/ihi/1.0/8003604567897656"; @@ -108,22 +117,22 @@ public class IHITestConstants { public static final String DRP_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_LINE = "1 Wall Street"; public static final String DRP_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_STATE_PROVINCE = "New York"; public static final String DRP_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_POSTCODE = "1234"; - public static final String DRP_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_COUNTRY = "1"; + public static final String DRP_TEST_INDIVIDUAL_INTERNATIONAL_ADDRESS_INTERNATIONAL_ADDRESS_COUNTRY = "1101"; public static final String RESOURCES_DIR = "./src/test/resources/"; - public static final String PRIVATE_KEY_STORE_TYPE = "JKS"; - public static final String PRIVATE_KEY_STORE_FILE = RESOURCES_DIR + "keystore.jks"; - public static final String PRIVATE_KEY_STORE_PASSWORD = "password"; - public static final String DRP_PRIVATE_KEY_ALIAS = "8003630000000004"; - // Using ZedMed HPIO instead of Tas. Need to include Tasmania HPIO in DRP. - public static final String MEDICARE_PRIVATE_KEY_ALIAS = "8003628233352432";// "8003630833334588";// "8003620000030192"; - public static final String PRIVATE_KEY_PASSWORD = "password"; + public static final String PRIVATE_KEY_STORE_TYPE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEYSTORE_TYPE, "JKS"); + public static final String PRIVATE_KEY_STORE_FILE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEYSTORE_PATH, RESOURCES_DIR + "keystore.jks"); + public static final String PRIVATE_KEY_STORE_PASSWORD = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEYSTORE_PASSWORD, "password"); + public static final String DRP_PRIVATE_KEY_ALIAS = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEY_ALIAS_DRP, "8003630000000004"); + public static final String MEDICARE_PRIVATE_KEY_ALIAS = TestConfiguration.getConfigurationValueWithFallback( + TestConfiguration.HI_KEY_ALIAS_MEDICARE_IHI, TestConfiguration.HI_KEY_ALIAS_MEDICARE, "8003628233352432"); + public static final String PRIVATE_KEY_PASSWORD = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEY_PASSWORD, "password"); - public static final String TRUST_STORE_TYPE = "JKS"; - public static final String TRUST_STORE_FILE = RESOURCES_DIR + "truststore.jks"; - public static final String TRUST_STORE_PASSWORD = "password"; + public static final String TRUST_STORE_TYPE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_TRUSTSTORE_TYPE, "JKS"); + public static final String TRUST_STORE_FILE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_TRUSTSTORE_PATH, RESOURCES_DIR + "truststore.jks"); + public static final String TRUST_STORE_PASSWORD = TestConfiguration.getConfigurationValue(TestConfiguration.HI_TRUSTSTORE_PASSWORD, "password"); public static QualifiedId getUserQualifiedId() { QualifiedId qualifiedId = new QualifiedId(); @@ -132,9 +141,6 @@ public static QualifiedId getUserQualifiedId() { return qualifiedId; } - // Product Name -// Product Version -// Windows XP SP3 public static ProductType getProductHeader() { ProductType productHeader = new ProductType(); productHeader.setPlatform(PRODUCT_PLATFORM); @@ -153,8 +159,6 @@ public static QualifiedId getVendorQualifiedId() { public static void setSystemVariablesForTest() { System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); - // Enable this for SSL debugging purpose. - // System.setProperty("javax.net.debug", "ssl, handshake"); System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); } @@ -200,32 +204,11 @@ public static SSLSocketFactory getSslSocketFactory(String privateKeyAlias) KeyStore privateKeyStore = KeystoreUtil.loadKeyStore(PRIVATE_KEY_STORE_TYPE, PRIVATE_KEY_STORE_PASSWORD, PRIVATE_KEY_STORE_FILE); KeyStore trustStore = loadKeyStore(TRUST_STORE_TYPE, TRUST_STORE_FILE, TRUST_STORE_PASSWORD); - // Check private key can be retrieved - checkPrivateKey(privateKeyStore, PRIVATE_KEY_PASSWORD.toCharArray(), privateKeyAlias); - - // Build the key managers. - final KeyManagerFactory kmFactory = KeyManagerFactory.getInstance( - KeyManagerFactory.getDefaultAlgorithm()); - kmFactory.init(privateKeyStore, PRIVATE_KEY_PASSWORD.toCharArray()); - final KeyManager[] keyManagers = kmFactory.getKeyManagers(); - for (int i = 0; i < keyManagers.length; i++) { - if (keyManagers[i] instanceof X509KeyManager) { - keyManagers[i] = new AliasForcingX509KeyManager((X509KeyManager) keyManagers[i], privateKeyAlias); - } - } - - // Build the trust managers. - final TrustManagerFactory tmFactory = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm()); - tmFactory.init(trustStore); - final TrustManager[] trustManagers = tmFactory.getTrustManagers(); - - // Build the SSLSocketFactory. - final SSLContext context = SSLContext.getInstance("TLS"); - - context.init(keyManagers, trustManagers, null); - - return context.getSocketFactory(); + return TestSslSupport.buildMutualTlsSocketFactory( + privateKeyStore, + PRIVATE_KEY_PASSWORD.toCharArray(), + privateKeyAlias, + trustStore); } private static KeyStore loadKeyStore(String type, String file, String password) throws GeneralSecurityException, IOException { @@ -234,72 +217,4 @@ private static KeyStore loadKeyStore(String type, String file, String password) keyStore.load(new FileInputStream(file), password.toCharArray()); return keyStore; } - - /* - * Check that there is a private key in the key store with the given alias that can be retrieved using the given - * key password. - */ - - private static void checkPrivateKey(final KeyStore keyStore, final char[] keyPassword, final String keyAlias) - throws GeneralSecurityException { - // Check key store has alias - if (!keyStore.containsAlias(keyAlias)) { - final String errorMsg = "The SSLSocketFactory keystore doesn't have key alias '" + keyAlias + "'."; - throw new GeneralSecurityException(errorMsg); - } - - // Check key store has private key entry - if (!keyStore.isKeyEntry(keyAlias)) { - final String errorMsg = "The SSLSocketFactory keystore doesn't have a private key for alias '" + keyAlias + "'."; - throw new GeneralSecurityException(errorMsg); - } - - // Check password works - try { - keyStore.getKey(keyAlias, keyPassword); - } catch (final UnrecoverableKeyException e) { - final String errorMsg = "Couldn't recover the private key in the SSLSocketFactory keystore." - + " The most likely reason is that the key password is wrong."; - throw new GeneralSecurityException(errorMsg, e); - } - } - - private static class AliasForcingX509KeyManager implements X509KeyManager { - - private final X509KeyManager baseKM; - private final String keyAlias; - - public AliasForcingX509KeyManager(final X509KeyManager keyManager, final String keyAlias) { - this.baseKM = keyManager; - this.keyAlias = keyAlias; - } - - public String chooseClientAlias(final String[] keyType, - final Principal[] issuers, - final Socket socket) { - return this.keyAlias; - } - - public String chooseServerAlias(final String keyType, - final Principal[] issuers, - final Socket socket) { - return this.baseKM.chooseServerAlias(keyType, issuers, socket); - } - - public X509Certificate[] getCertificateChain(final String alias) { - return this.baseKM.getCertificateChain(alias); - } - - public String[] getClientAliases(final String keyType, final Principal[] issuers) { - return this.baseKM.getClientAliases(keyType, issuers); - } - - public PrivateKey getPrivateKey(final String alias) { - return this.baseKM.getPrivateKey(alias); - } - - public String[] getServerAliases(final String keyType, final Principal[] issuers) { - return this.baseKM.getServerAliases(keyType, issuers); - } - } } diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRule.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRule.java new file mode 100644 index 0000000..6331fca --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRule.java @@ -0,0 +1,75 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.test.utils; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import java.sql.Connection; +import java.util.Objects; +import java.util.function.Supplier; + +/** + * Runs each test method with a JDBC {@link Connection} in a transaction and rolls back after the + * method completes (success or failure). Use for tests that execute DML so the database is left + * unchanged. The {@link Supplier} must return a new connection per test invocation (or one that + * may be closed when the statement finishes). Not applicable to remote SOAP/registry calls. + */ +public final class JdbcTransactionTestRule implements TestRule { + + private final Supplier connectionSupplier; + private final ThreadLocal current = new ThreadLocal<>(); + + public JdbcTransactionTestRule(Supplier connectionSupplier) { + this.connectionSupplier = Objects.requireNonNull(connectionSupplier, "connectionSupplier"); + } + + /** + * Connection for the active test; only valid on the Surefire thread while the test body runs. + */ + public Connection connection() { + Connection c = current.get(); + if (c == null) { + throw new IllegalStateException("No JDBC transaction is active for this thread"); + } + return c; + } + + @Override + public Statement apply(Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + try (Connection connection = connectionSupplier.get()) { + boolean originalAutoCommit = connection.getAutoCommit(); + connection.setAutoCommit(false); + current.set(connection); + try { + base.evaluate(); + } finally { + current.remove(); + try { + connection.rollback(); + } finally { + connection.setAutoCommit(originalAutoCommit); + } + } + } + } + }; + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRuleTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRuleTest.java new file mode 100644 index 0000000..040d077 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/JdbcTransactionTestRuleTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.test.utils; + +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * Verifies {@link JdbcTransactionTestRule} rolls back DML so rows do not survive the test method. + */ +public class JdbcTransactionTestRuleTest { + + private static final String JDBC_URL = "jdbc:h2:mem:jdbc_tx_rule_verify;DB_CLOSE_DELAY=-1"; + + @Rule + public final JdbcTransactionTestRule jdbcTx = + new JdbcTransactionTestRule(() -> { + try { + return DriverManager.getConnection(JDBC_URL, "sa", ""); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + }); + + @BeforeClass + public static void createCommittedSchema() throws Exception { + try (Connection c = DriverManager.getConnection(JDBC_URL, "sa", ""); + Statement s = c.createStatement()) { + s.execute("drop table if exists jdbc_tx_rule_t"); + s.execute("create table jdbc_tx_rule_t (id int primary key)"); + } + } + + @AfterClass + public static void dropSchema() throws Exception { + try (Connection c = DriverManager.getConnection(JDBC_URL, "sa", ""); + Statement s = c.createStatement()) { + s.execute("drop table if exists jdbc_tx_rule_t"); + } + } + + @Test + public void insertVisibleDuringTestThenRolledBack() throws Exception { + Connection c = jdbcTx.connection(); + try (Statement st = c.createStatement()) { + st.executeUpdate("insert into jdbc_tx_rule_t (id) values (4242)"); + } + try (Statement st = c.createStatement(); + ResultSet rs = st.executeQuery("select count(*) from jdbc_tx_rule_t where id = 4242")) { + rs.next(); + Assert.assertEquals(1, rs.getInt(1)); + } + } + + @Test + public void previousInsertNotVisibleAfterRollback() throws Exception { + Connection c = jdbcTx.connection(); + try (Statement st = c.createStatement(); + ResultSet rs = st.executeQuery("select count(*) from jdbc_tx_rule_t where id = 4242")) { + rs.next(); + Assert.assertEquals(0, rs.getInt(1)); + } + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/ReflectionFieldSetter.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/ReflectionFieldSetter.java deleted file mode 100644 index f2fa3eb..0000000 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/ReflectionFieldSetter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2011 NEHTA - * Copyright 2021-2026 ADHA (Australian Digital Health Agency) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package au.gov.nehta.vendorlibrary.hi.test.utils; - -import java.lang.reflect.Field; - -/** - * Sets a non-public instance field, walking the declaring class hierarchy (same idea as - * {@code ReflectionTestUtils.setField} without a Spring test dependency). - */ -public final class ReflectionFieldSetter { - - private ReflectionFieldSetter() { - } - - public static void setField(Object target, String fieldName, Object value) throws Exception { - Class c = target.getClass(); - while (c != null) { - try { - Field f = c.getDeclaredField(fieldName); - f.setAccessible(true); - f.set(target, value); - return; - } catch (NoSuchFieldException e) { - c = c.getSuperclass(); - } - } - throw new NoSuchFieldException(fieldName + " on " + target.getClass()); - } -} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestConstants.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestConstants.java index 8ffea42..eba62d5 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestConstants.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestConstants.java @@ -1,9 +1,11 @@ /* * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) * - * Licensed under the NEHTA Open Source (Apache) License; you may not use this - * file except in compliance with the License. A copy of the License is in the - * 'license.txt' file, which should be provided with this work. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -15,14 +17,17 @@ package au.gov.nehta.vendorlibrary.hi.test.utils; import au.gov.nehta.vendorlibrary.common.security.KeystoreUtil; +import au.gov.nehta.vendorlibrary.hi.test.config.TestConfiguration; import au.net.electronichealth.ns.hi.xsd.common.commoncoreelements._3.ProductType; import au.net.electronichealth.ns.hi.xsd.common.qualifiedidentifier._3.QualifiedId; -import javax.net.ssl.*; +import javax.net.ssl.SSLSocketFactory; + import java.io.FileInputStream; import java.io.IOException; -import java.net.Socket; -import java.security.*; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.PrivateKey; import java.security.cert.X509Certificate; /** @@ -30,48 +35,53 @@ */ public class TestConstants { - public static final String MEDICARE_ENDPOINT_URL = "https://www5.medicareaustralia.gov.au/cert/soap/services/"; - public static final String DRP_HPII_SEARCH_ENDPOINT_URL = "https://nehta-drp-iis.nehta.net.au/MCAR3/ProviderSearchHIProviderDirectoryForIndividual/Service.svc"; - public static final String DRP_HPIO_SEARCH_ENDPOINT_URL = "https://nehta-drp-iis.nehta.net.au/MCAR3/ProviderSearchHIProviderDirectoryForOrganisation/Service.svc"; + public static final String MEDICARE_ENDPOINT_URL = TestConfiguration.getConfigurationValue(TestConfiguration.HI_MEDICARE_ENDPOINT_BASE, + "https://www5.medicareaustralia.gov.au/cert/soap/services/"); + public static final String DRP_HPII_SEARCH_ENDPOINT_URL = TestConfiguration.getConfigurationValue(TestConfiguration.HI_DRP_HPII_SEARCH_ENDPOINT_URL, + "https://nehta-drp-iis.nehta.net.au/MCAR3/ProviderSearchHIProviderDirectoryForIndividual/Service.svc"); + public static final String DRP_HPIO_SEARCH_ENDPOINT_URL = TestConfiguration.getConfigurationValue(TestConfiguration.HI_DRP_HPIO_SEARCH_ENDPOINT_URL, + "https://nehta-drp-iis.nehta.net.au/MCAR3/ProviderSearchHIProviderDirectoryForOrganisation/Service.svc"); public static final String EMPTY = ""; - public static final String USER_QUALIFIER = "http://ns.tashealth.gov.au/id/hiclient/userid/1.0"; - public static final String USER_QUALIFIED_ID = "Identifier"; + public static final String USER_QUALIFIER = TestConfiguration.getConfigurationValue(TestConfiguration.HI_USER_QUALIFIER, + "http://ns.tashealth.gov.au/id/hiclient/userid/1.0"); + public static final String USER_QUALIFIED_ID = TestConfiguration.getConfigurationValue(TestConfiguration.HI_USER_QUALIFIED_ID, "Identifier"); - public static final String VENDOR_QUALIFIFER_ID = "TAS00001"; - public static final String VENDOR_QUALIFIER = "http://ns.medicareaustralia.gov.au/mcaVendorId/1.0"; + public static final String VENDOR_QUALIFIFER_ID = TestConfiguration.getConfigurationValue(TestConfiguration.HI_VENDOR_QUALIFIED_ID, "TAS00001"); + public static final String VENDOR_QUALIFIER = TestConfiguration.getConfigurationValue(TestConfiguration.HI_VENDOR_QUALIFIER, + "http://ns.medicareaustralia.gov.au/mcaVendorId/1.0"); - public static final String HPIO_QUALIFIER_ID = "8003624166667003"; - public static final String HPIO_QUALIFIER = "http://ns.electronichealth.net.au/id/hi/hpio/1.0"; + public static final String HPIO_QUALIFIER_ID = TestConfiguration.getConfigurationValue(TestConfiguration.HI_HPIO_QUALIFIED_ID, "8003624166667003"); + public static final String HPIO_QUALIFIER = TestConfiguration.getConfigurationValue(TestConfiguration.HI_HPIO_QUALIFIER, + "http://ns.electronichealth.net.au/id/hi/hpio/1.0"); - public static final String NEHTA_HPIO_QUALIFIER_ID = "8003626566687887"; - public static final String NEHTA_HPIO_QUALIFIER = "http://ns.electronichealth.net.au/id/hi/hpio/1.0"; + public static final String NEHTA_HPIO_QUALIFIER_ID = TestConfiguration.getConfigurationValue(TestConfiguration.HI_NEHTA_HPIO_QUALIFIED_ID, "8003626566687887"); + public static final String NEHTA_HPIO_QUALIFIER = TestConfiguration.getConfigurationValue(TestConfiguration.HI_NEHTA_HPIO_QUALIFIER, + "http://ns.electronichealth.net.au/id/hi/hpio/1.0"); - public static final String PRODUCT_PLATFORM = "Microsoft Windows XP SP3"; - public static final String PRODUCT_NAME = "TasHealthHIClient"; - public static final String PRODUCT_VERSION = "1.0"; + public static final String PRODUCT_PLATFORM = TestConfiguration.getConfigurationValue(TestConfiguration.HI_PRODUCT_PLATFORM, "Microsoft Windows XP SP3"); + public static final String PRODUCT_NAME = TestConfiguration.getConfigurationValue(TestConfiguration.HI_PRODUCT_NAME, "TasHealthHIClient"); + public static final String PRODUCT_VERSION = TestConfiguration.getConfigurationValue(TestConfiguration.HI_PRODUCT_VERSION, "1.0"); - /** - * Length of Date string for YYYYMMHH - */ + /** Length of date strings formatted as {@code YYYYMMDD}. */ public static final int DATE_LENGTH = 8; public static final String RESOURCES_DIR = "./src/test/resources/"; - public static final String PRIVATE_KEY_STORE_TYPE = "JKS"; - public static final String PRIVATE_KEY_STORE_FILE = RESOURCES_DIR + "keystore.jks"; - public static final String PRIVATE_KEY_STORE_PASSWORD = "password"; - public static final String DRP_PRIVATE_KEY_ALIAS = "8003630000000004"; - // Using ZedMed HPIO instead of Tas. Need to include Tasmania HPIO in DRP. - public static final String MEDICARE_PRIVATE_KEY_ALIAS = "8003629900035144"; - public static final String MEDICARE_CSP_PRIVATE_KEY_ALIAS = "8003630833334588"; - public static final String PRIVATE_KEY_PASSWORD = "password"; + public static final String PRIVATE_KEY_STORE_TYPE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEYSTORE_TYPE, "JKS"); + public static final String PRIVATE_KEY_STORE_FILE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEYSTORE_PATH, RESOURCES_DIR + "keystore.jks"); + public static final String PRIVATE_KEY_STORE_PASSWORD = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEYSTORE_PASSWORD, "password"); + public static final String DRP_PRIVATE_KEY_ALIAS = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEY_ALIAS_DRP, "8003630000000004"); + public static final String MEDICARE_PRIVATE_KEY_ALIAS = TestConfiguration.getConfigurationValueWithFallback( + TestConfiguration.HI_KEY_ALIAS_MEDICARE_HPIO, TestConfiguration.HI_KEY_ALIAS_MEDICARE, "8003629900035144"); + public static final String MEDICARE_CSP_PRIVATE_KEY_ALIAS = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEY_ALIAS_MEDICARE_CSP, "8003630833334588"); + public static final String PRIVATE_KEY_PASSWORD = TestConfiguration.getConfigurationValue(TestConfiguration.HI_KEY_PASSWORD, "password"); - public static final String TRUST_STORE_TYPE = "JKS"; - public static final String TRUST_STORE_FILE = RESOURCES_DIR + "truststore.jks"; - public static final String TRUST_STORE_PASSWORD = "password"; + public static final String TRUST_STORE_TYPE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_TRUSTSTORE_TYPE, "JKS"); + public static final String TRUST_STORE_FILE = TestConfiguration.getConfigurationValue(TestConfiguration.HI_TRUSTSTORE_PATH, RESOURCES_DIR + "truststore.jks"); + public static final String TRUST_STORE_PASSWORD = TestConfiguration.getConfigurationValue(TestConfiguration.HI_TRUSTSTORE_PASSWORD, "password"); public static final String INVALID_KEYSTORE_FILE = PRIVATE_KEY_STORE_FILE + "Invalid"; public static final String BLANK_KEYSTORE_FILENAME = RESOURCES_DIR + "TestTruststore.jks"; @@ -139,8 +149,6 @@ public static au.gov.nehta.vendorlibrary.hi.client.wrapped.QualifiedId getWrappe public static void setSystemVariablesForTest() { System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); - // Enable this for SSL debugging purpose. -// System.setProperty("javax.net.debug", "ssl, handshake"); System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); } @@ -200,32 +208,11 @@ public static SSLSocketFactory getSslSocketFactory(String privateKeyAlias) KeyStore privateKeyStore = KeystoreUtil.loadKeyStore(PRIVATE_KEY_STORE_TYPE, PRIVATE_KEY_STORE_PASSWORD, PRIVATE_KEY_STORE_FILE); KeyStore trustStore = loadKeyStore(TRUST_STORE_TYPE, TRUST_STORE_FILE, TRUST_STORE_PASSWORD); - // Check private key can be retrieved - checkPrivateKey(privateKeyStore, PRIVATE_KEY_PASSWORD.toCharArray(), privateKeyAlias); - - // Build the key managers. - final KeyManagerFactory kmFactory = KeyManagerFactory.getInstance( - KeyManagerFactory.getDefaultAlgorithm()); - kmFactory.init(privateKeyStore, PRIVATE_KEY_PASSWORD.toCharArray()); - final KeyManager[] keyManagers = kmFactory.getKeyManagers(); - for (int i = 0; i < keyManagers.length; i++) { - if (keyManagers[i] instanceof X509KeyManager) { - keyManagers[i] = new AliasForcingX509KeyManager((X509KeyManager) keyManagers[i], privateKeyAlias); - } - } - - // Build the trust managers. - final TrustManagerFactory tmFactory = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm()); - tmFactory.init(trustStore); - final TrustManager[] trustManagers = tmFactory.getTrustManagers(); - - // Build the SSLSocketFactory. - final SSLContext context = SSLContext.getInstance("TLS"); - - context.init(keyManagers, trustManagers, null); - - return context.getSocketFactory(); + return TestSslSupport.buildMutualTlsSocketFactory( + privateKeyStore, + PRIVATE_KEY_PASSWORD.toCharArray(), + privateKeyAlias, + trustStore); } private static KeyStore loadKeyStore(String type, String file, String password) throws GeneralSecurityException, IOException { @@ -234,72 +221,4 @@ private static KeyStore loadKeyStore(String type, String file, String password) keyStore.load(new FileInputStream(file), password.toCharArray()); return keyStore; } - - /* - * Check that there is a private key in the key store with the given alias that can be retrieved using the given - * key password. - */ - - private static void checkPrivateKey(final KeyStore keyStore, final char[] keyPassword, final String keyAlias) - throws GeneralSecurityException { - // Check key store has alias - if (!keyStore.containsAlias(keyAlias)) { - final String errorMsg = "The SSLSocketFactory keystore doesn't have key alias '" + keyAlias + "'."; - throw new GeneralSecurityException(errorMsg); - } - - // Check key store has private key entry - if (!keyStore.isKeyEntry(keyAlias)) { - final String errorMsg = "The SSLSocketFactory keystore doesn't have a private key for alias '" + keyAlias + "'."; - throw new GeneralSecurityException(errorMsg); - } - - // Check password works - try { - keyStore.getKey(keyAlias, keyPassword); - } catch (final UnrecoverableKeyException e) { - final String errorMsg = "Couldn't recover the private key in the SSLSocketFactory keystore." - + " The most likely reason is that the key password is wrong."; - throw new GeneralSecurityException(errorMsg, e); - } - } - - private static class AliasForcingX509KeyManager implements X509KeyManager { - - private final X509KeyManager baseKM; - private final String keyAlias; - - public AliasForcingX509KeyManager(final X509KeyManager keyManager, final String keyAlias) { - this.baseKM = keyManager; - this.keyAlias = keyAlias; - } - - public String chooseClientAlias(final String[] keyType, - final Principal[] issuers, - final Socket socket) { - return this.keyAlias; - } - - public String chooseServerAlias(final String keyType, - final Principal[] issuers, - final Socket socket) { - return this.baseKM.chooseServerAlias(keyType, issuers, socket); - } - - public X509Certificate[] getCertificateChain(final String alias) { - return this.baseKM.getCertificateChain(alias); - } - - public String[] getClientAliases(final String keyType, final Principal[] issuers) { - return this.baseKM.getClientAliases(keyType, issuers); - } - - public PrivateKey getPrivateKey(final String alias) { - return this.baseKM.getPrivateKey(alias); - } - - public String[] getServerAliases(final String keyType, final Principal[] issuers) { - return this.baseKM.getServerAliases(keyType, issuers); - } - } } diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestReflect.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestReflect.java new file mode 100644 index 0000000..eb620c2 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestReflect.java @@ -0,0 +1,40 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.test.utils; + +import java.lang.reflect.Field; + +public final class TestReflect { + + private TestReflect() {} + + public static void setField(Object target, String name, Object value) { + Class c = target.getClass(); + while (c != null) { + try { + Field f = c.getDeclaredField(name); + f.setAccessible(true); + f.set(target, value); + return; + } catch (NoSuchFieldException e) { + c = c.getSuperclass(); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + throw new IllegalStateException("Field not found: " + name); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestSslSupport.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestSslSupport.java new file mode 100644 index 0000000..ba59256 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/test/utils/TestSslSupport.java @@ -0,0 +1,189 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.test.utils; + +import javax.net.ssl.*; +import java.net.Socket; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.Principal; +import java.security.PrivateKey; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; + +/** + * Builds mutually-authenticated TLS for integration tests: client keys from the test keystore and + * server trust using the project truststore plus the JVM default CA anchors (so + * public HI endpoints signed by well-known CAs validate without copying the whole cacerts file). + */ +public final class TestSslSupport { + + private TestSslSupport() { + } + + public static SSLSocketFactory buildMutualTlsSocketFactory( + KeyStore privateKeyStore, + char[] keyStorePassword, + String privateKeyAlias, + KeyStore supplementalTrustStore) throws GeneralSecurityException { + + checkPrivateKey(privateKeyStore, keyStorePassword, privateKeyAlias); + + KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmFactory.init(privateKeyStore, keyStorePassword); + KeyManager[] keyManagers = kmFactory.getKeyManagers(); + for (int i = 0; i < keyManagers.length; i++) { + if (keyManagers[i] instanceof X509KeyManager) { + keyManagers[i] = new AliasForcingX509KeyManager((X509KeyManager) keyManagers[i], privateKeyAlias); + } + } + + TrustManagerFactory customTmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + customTmf.init(supplementalTrustStore); + X509TrustManager customTm = firstX509(customTmf.getTrustManagers()); + + TrustManagerFactory defaultTmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + defaultTmf.init((KeyStore) null); + X509TrustManager defaultTm = firstX509(defaultTmf.getTrustManagers()); + + TrustManager[] trustManagers = { + new CompositeX509TrustManager(customTm, defaultTm) + }; + + SSLContext context = SSLContext.getInstance("TLS"); + context.init(keyManagers, trustManagers, null); + return context.getSocketFactory(); + } + + static void checkPrivateKey(KeyStore keyStore, char[] keyPassword, String keyAlias) + throws GeneralSecurityException { + if (!keyStore.containsAlias(keyAlias)) { + throw new GeneralSecurityException( + "The SSLSocketFactory keystore doesn't have key alias '" + keyAlias + "'."); + } + if (!keyStore.isKeyEntry(keyAlias)) { + throw new GeneralSecurityException( + "The SSLSocketFactory keystore doesn't have a private key for alias '" + keyAlias + "'."); + } + try { + keyStore.getKey(keyAlias, keyPassword); + } catch (UnrecoverableKeyException e) { + throw new GeneralSecurityException( + "Couldn't recover the private key in the SSLSocketFactory keystore." + + " The most likely reason is that the key password is wrong.", + e); + } catch (KeyStoreException | NoSuchAlgorithmException e) { + throw new GeneralSecurityException(e); + } + } + + private static X509TrustManager firstX509(TrustManager[] managers) { + for (TrustManager tm : managers) { + if (tm instanceof X509TrustManager) { + return (X509TrustManager) tm; + } + } + throw new IllegalStateException("No X509TrustManager in factory"); + } + + private static final class CompositeX509TrustManager implements X509TrustManager { + private final X509TrustManager primary; + private final X509TrustManager fallback; + + CompositeX509TrustManager(X509TrustManager primary, X509TrustManager fallback) { + this.primary = primary; + this.fallback = fallback; + } + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + try { + primary.checkClientTrusted(chain, authType); + } catch (CertificateException e) { + fallback.checkClientTrusted(chain, authType); + } + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + try { + primary.checkServerTrusted(chain, authType); + } catch (CertificateException e) { + fallback.checkServerTrusted(chain, authType); + } + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + X509Certificate[] a = primary.getAcceptedIssuers(); + X509Certificate[] b = fallback.getAcceptedIssuers(); + List merged = new ArrayList<>(a.length + b.length); + for (X509Certificate c : a) { + merged.add(c); + } + for (X509Certificate c : b) { + merged.add(c); + } + return merged.toArray(new X509Certificate[0]); + } + } + + private static final class AliasForcingX509KeyManager implements X509KeyManager { + + private final X509KeyManager baseKM; + private final String keyAlias; + + AliasForcingX509KeyManager(X509KeyManager keyManager, String keyAlias) { + this.baseKM = keyManager; + this.keyAlias = keyAlias; + } + + @Override + public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { + return this.keyAlias; + } + + @Override + public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) { + return this.baseKM.chooseServerAlias(keyType, issuers, socket); + } + + @Override + public X509Certificate[] getCertificateChain(String alias) { + return this.baseKM.getCertificateChain(alias); + } + + @Override + public String[] getClientAliases(String keyType, Principal[] issuers) { + return this.baseKM.getClientAliases(keyType, issuers); + } + + @Override + public PrivateKey getPrivateKey(String alias) { + return this.baseKM.getPrivateKey(alias); + } + + @Override + public String[] getServerAliases(String keyType, Principal[] issuers) { + return this.baseKM.getServerAliases(keyType, issuers); + } + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiRequestElementOrderParityTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiRequestElementOrderParityTest.java new file mode 100644 index 0000000..d699983 --- /dev/null +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiRequestElementOrderParityTest.java @@ -0,0 +1,164 @@ +/* + * Copyright 2011 NEHTA + * Copyright 2021-2026 ADHA (Australian Digital Health Agency) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package au.gov.nehta.vendorlibrary.hi.wsdl; + +import jakarta.xml.bind.annotation.XmlType; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +/** + * Asserts JAXB {@code @XmlType.propOrder} for selected HI request types used by + * Consumer Search IHI (Messages, Interface, batch, and TDS where applicable). + */ +public class HiRequestElementOrderParityTest { + + /** + * Messages {@code searchIHI} (batch synchronous / asynchronous): {@code electronicCommunication} + * before {@code dateOfBirth}. + */ + @Test + public void searchIhiMessagesPropOrderForBatchSync() { + assertPropOrder( + "au.net.electronichealth.ns.hi.xsd.consumermessages.searchihi._3.SearchIHI", + Arrays.asList( + "ihiNumber", + "medicareCardNumber", + "medicareIRN", + "dvaFileNumber", + "electronicCommunication", + "dateOfBirth", + "sex", + "familyName", + "givenName", + "australianPostalAddress", + "australianStreetAddress", + "internationalAddress", + "australianUnstructuredStreetAddress", + "history" + ) + ); + } + + /** + * Interface {@code searchIHI} (IHI inquiry): unstructured street address before international address. + */ + @Test + public void searchIhiInterfacePropOrderForInquiry() { + assertPropOrder( + "au.net.electronichealth.ns.hi.svc.consumersearchihi._3.SearchIHI", + Arrays.asList( + "ihiNumber", + "medicareCardNumber", + "medicareIRN", + "dvaFileNumber", + "electronicCommunication", + "dateOfBirth", + "sex", + "familyName", + "givenName", + "australianPostalAddress", + "australianStreetAddress", + "australianUnstructuredStreetAddress", + "internationalAddress", + "history" + ) + ); + } + + /** + * Batch wrapper {@code SearchIHIRequestType}. + */ + @Test + public void searchIhiRequestTypePropOrder() { + assertPropOrder( + "au.net.electronichealth.ns.hi.xsd.consumermessages.searchihibatch._3.SearchIHIRequestType", + Arrays.asList("searchIHI", "requestIdentifier") + ); + } + + /** + * HI31/HI33 {@code searchForProviderIndividual} (same sequence on svc and messages types). + */ + @Test + public void searchForProviderIndividualPropOrder() { + List expected = Arrays.asList( + "hpiiNumber", + "registrationId", + "familyName", + "onlyNameIndicator", + "givenName", + "dateOfBirth", + "sex", + "state", + "postcode", + "searchAustralianAddress", + "searchInternationalAddress" + ); + assertPropOrder( + "au.net.electronichealth.ns.hi.svc.providersearchforproviderindividual._5_0.SearchForProviderIndividual", + expected + ); + assertPropOrder( + "au.net.electronichealth.ns.hi.xsd.providermessages.searchindividual._5_0.SearchForProviderIndividual", + expected + ); + } + + /** + * TDS search {@code providerIndividual}. + */ + @Test + public void searchTdsProviderIndividualPropOrder() { + assertPropOrder( + "au.net.electronichealth.ns.hi.xsd.providermessages.searchtdsproviderindividual._5_1.ProviderIndividual", + Arrays.asList( + "hpiiNumber", + "status", + "personalDetails", + "individualNameRecord", + "addressRecord", + "electronicCommunicationRecord", + "providerTypeRecord" + ) + ); + } + + /** + * Loads {@code className}, reads {@link XmlType#propOrder()}, and asserts it equals {@code expected}. + * + * @param className fully qualified generated request type + * @param expected local element names in schema order + */ + private static void assertPropOrder(String className, List expected) { + Class type; + try { + type = Class.forName(className); + } catch (ClassNotFoundException ex) { + Assert.fail("Missing generated type on classpath: " + className); + return; + } + XmlType xmlType = type.getAnnotation(XmlType.class); + Assert.assertNotNull("@XmlType required on " + className, xmlType); + Assert.assertArrayEquals( + className + " propOrder", + expected.toArray(new String[0]), + xmlType.propOrder() + ); + } +} diff --git a/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRootTest.java b/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRootTest.java index 71f363c..c453fe8 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRootTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/hi/wsdl/HiWsdlArtifactRootTest.java @@ -17,68 +17,152 @@ import org.junit.After; import org.junit.Assert; +import org.junit.Assume; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; -import java.io.IOException; +import java.io.Reader; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Comparator; -import java.util.stream.Stream; +import java.nio.file.Paths; +import java.util.Properties; public class HiWsdlArtifactRootTest { - @Before - public void skipLocalProperties() { - HiWsdlArtifactRoot.setSkipLocalPropertiesFileForUnitTests(true); - } + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + @Before @After - public void reset() { - HiWsdlArtifactRoot.setSkipLocalPropertiesFileForUnitTests(false); + public void resetRoot() { HiWsdlArtifactRoot.setRoot(null); + System.clearProperty(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT); } @Test - public void setRootProgrammatic() throws IOException { - Path tmp = Files.createTempDirectory("hi-wsdl-root"); - try { - HiWsdlArtifactRoot.setRoot(tmp); - Assert.assertEquals(tmp.toRealPath(), HiWsdlArtifactRoot.getRootOrNull().toRealPath()); - } finally { - deleteTree(tmp); - } + public void findWsdlUrlReturnsNullWhenSetRootPointsToNonExistentRelativePath() { + HiWsdlArtifactRoot.setRoot(Paths.get("artifact-root-absent-" + System.nanoTime())); + Assert.assertNull(HiWsdlArtifactRoot.findWsdlUrl("HI_ConsumerSearchIHI-3.0.wsdl")); } @Test - public void findWsdlWalksUnderWsdl() throws IOException { - Path root = Files.createTempDirectory("hi-artifact"); - Path nested = root.resolve("wsdl").resolve("consumer").resolve("2010"); - Files.createDirectories(nested); - Path file = nested.resolve("HI_Foo.wsdl"); - Files.write(file, "".getBytes()); + public void findWsdlUrlReturnsNullWhenRootDirectoryHasNoWsdlChild() throws Exception { + Path root = temp.newFolder().toPath(); + HiWsdlArtifactRoot.setRoot(root); + Assert.assertNull(HiWsdlArtifactRoot.findWsdlUrl("HI_ConsumerSearchIHI-3.0.wsdl")); + } + + @Test + public void findWsdlUrlReturnsNullWhenSystemPropertyPointsToNonExistentArtifactRoot() { + String env = System.getenv(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT); + Assume.assumeTrue("Unset HI_WSDL_ARTIFACT_ROOT in the process environment for this assertion", + env == null || env.trim().isEmpty()); + HiWsdlArtifactRoot.setSkipLocalPropertiesFileForUnitTests(true); try { - HiWsdlArtifactRoot.setRoot(root); - URL url = HiWsdlArtifactRoot.findWsdlUrl("HI_Foo.wsdl"); - Assert.assertNotNull(url); - Assert.assertTrue(url.toString(), url.toString().contains("HI_Foo.wsdl")); + Path absent = temp.getRoot().toPath().resolve("no-such-artifact-root-" + System.nanoTime()); + Assert.assertFalse(Files.exists(absent)); + System.setProperty(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT, absent.toAbsolutePath().toString()); + Assert.assertNull(HiWsdlArtifactRoot.findWsdlUrl("HI_ConsumerSearchIHI-3.0.wsdl")); } finally { - deleteTree(root); + HiWsdlArtifactRoot.setSkipLocalPropertiesFileForUnitTests(false); } } - private static void deleteTree(Path root) throws IOException { - if (!Files.exists(root)) { + @Test + public void localPropertiesHiWsdlArtifactRootMustResolveSentinelWsdlWhenKeyPresent() throws Exception { + String env = System.getenv(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT); + Assume.assumeTrue("skipped when HI_WSDL_ARTIFACT_ROOT is set in the environment (overrides local.properties)", + env == null || env.trim().isEmpty()); + + Path cwd = Paths.get(System.getProperty("user.dir", ".")).toAbsolutePath().normalize(); + Path localFile = cwd.resolve("local.properties"); + if (!Files.isRegularFile(localFile)) { return; } - try (Stream walk = Files.walk(root)) { - walk.sorted(Comparator.reverseOrder()).forEach(p -> { - try { - Files.deleteIfExists(p); - } catch (IOException ignored) { - } - }); + Properties p = new Properties(); + try (Reader r = Files.newBufferedReader(localFile, StandardCharsets.UTF_8)) { + p.load(r); + } + String v = p.getProperty(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT); + if (v == null || v.trim().isEmpty()) { + return; + } + HiWsdlArtifactRoot.setRoot(null); + System.clearProperty(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT); + URL url = HiWsdlArtifactRoot.findWsdlUrl("HI_ConsumerSearchIHI-3.0.wsdl"); + Assert.assertNotNull( + "local.properties HI_WSDL_ARTIFACT_ROOT must point to a directory containing wsdl/ and " + + "schema/ (see README Implementors); failed to resolve HI_ConsumerSearchIHI-3.0.wsdl", + url); + } + + @Test + public void findWsdlUrlReturnsNullForMissingWsdlUnderExplicitRoot() throws Exception { + Path root = temp.newFolder().toPath(); + Files.createDirectories(root.resolve("wsdl")); + Files.createDirectories(root.resolve("schema")); + HiWsdlArtifactRoot.setRoot(root); + Assert.assertNull(HiWsdlArtifactRoot.findWsdlUrl("NoSuchWsdl-7f2a9c1e.wsdl")); + } + + @Test + public void findWsdlUrlReturnsNullWhenNoRootCanBeResolved() { + String env = System.getenv(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT); + Assume.assumeTrue("Unset HI_WSDL_ARTIFACT_ROOT in the process environment for this assertion", + env == null || env.trim().isEmpty()); + HiWsdlArtifactRoot.setSkipLocalPropertiesFileForUnitTests(true); + try { + Assert.assertNull(HiWsdlArtifactRoot.getRootOrNull()); + Assert.assertNull(HiWsdlArtifactRoot.findWsdlUrl("Any.wsdl")); + } finally { + HiWsdlArtifactRoot.setSkipLocalPropertiesFileForUnitTests(false); } } + + @Test + public void findWsdlUrlFindsNestedFileByBasename() throws Exception { + Path root = temp.newFolder().toPath(); + Path nested = root.resolve("wsdl/consumer/20100731"); + Files.createDirectories(nested); + Path file = nested.resolve("HI_Test.wsdl"); + Files.write(file, new byte[0]); + Files.createDirectories(root.resolve("schema")); + HiWsdlArtifactRoot.setRoot(root); + URL url = HiWsdlArtifactRoot.findWsdlUrl("HI_Test.wsdl"); + Assert.assertNotNull(url); + Assert.assertTrue(url.toString().startsWith("file:")); + Assert.assertTrue(url.getPath().replace('\\', '/').contains("HI_Test.wsdl")); + } + + @Test + public void programmaticSetRootOverridesSystemProperty() throws Exception { + Path rootProp = temp.newFolder().toPath(); + Files.createDirectories(rootProp.resolve("wsdl")); + Files.write(rootProp.resolve("wsdl/X.wsdl"), new byte[0]); + Path rootProg = temp.newFolder().toPath(); + Files.createDirectories(rootProg.resolve("wsdl")); + Files.write(rootProg.resolve("wsdl/Y.wsdl"), new byte[0]); + Files.createDirectories(rootProg.resolve("schema")); + System.setProperty(HiWsdlArtifactRoot.HI_WSDL_ARTIFACT_ROOT, rootProp.toString()); + HiWsdlArtifactRoot.setRoot(rootProg); + Assert.assertNotNull(HiWsdlArtifactRoot.findWsdlUrl("Y.wsdl")); + Assert.assertNull(HiWsdlArtifactRoot.findWsdlUrl("X.wsdl")); + } + + @Test + public void findWsdlUrlResolvesRelativePathUnderWsdl() throws Exception { + Path root = temp.newFolder().toPath(); + Path nested = root.resolve("wsdl/consumer/20100731"); + Files.createDirectories(nested); + Path file = nested.resolve("HI_Test.wsdl"); + Files.write(file, new byte[0]); + Files.createDirectories(root.resolve("schema")); + HiWsdlArtifactRoot.setRoot(root); + URL url = HiWsdlArtifactRoot.findWsdlUrl("consumer/20100731/HI_Test.wsdl"); + Assert.assertNotNull(url); + } } diff --git a/src/test/java/au/gov/nehta/vendorlibrary/ws/TimeUtilityTest.java b/src/test/java/au/gov/nehta/vendorlibrary/ws/TimeUtilityTest.java index 90bbf40..71f6274 100644 --- a/src/test/java/au/gov/nehta/vendorlibrary/ws/TimeUtilityTest.java +++ b/src/test/java/au/gov/nehta/vendorlibrary/ws/TimeUtilityTest.java @@ -1,19 +1,3 @@ -/* - * Copyright 2011 NEHTA - * Copyright 2021-2026 ADHA (Australian Digital Health Agency) - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - package au.gov.nehta.vendorlibrary.ws; import org.junit.Assert; @@ -36,8 +20,8 @@ public void getXMLGregorianDate_parsesEightDigitDate() { Assert.assertTrue(cal.isValid()); } - @Test(expected = NullPointerException.class) - public void getXMLGregorianDate_nullInputThrowsNullPointerException() { + @Test(expected = IllegalArgumentException.class) + public void getXMLGregorianDate_rejectsNull() { TimeUtility.getXMLGregorianDate(null); } @@ -55,8 +39,7 @@ public void getXMLGregorianDate_rejectsNonDigits() { public void getXMLGregorianDateTime_parsesSpacedDateTime() { XMLGregorianCalendar cal = TimeUtility.getXMLGregorianDateTime("20240513 14:30:52"); Assert.assertEquals(2024, cal.getYear()); - // common-library 1.2.x: copies Calendar.MONTH (0-based) into XMLGregorianCalendar without +1 - Assert.assertEquals(4, cal.getMonth()); + Assert.assertEquals(5, cal.getMonth()); Assert.assertEquals(13, cal.getDay()); Assert.assertEquals(14, cal.getHour()); Assert.assertEquals(30, cal.getMinute()); diff --git a/wsdls/CHANGELOG.md b/wsdls/CHANGELOG.md new file mode 100644 index 0000000..7ee89b0 --- /dev/null +++ b/wsdls/CHANGELOG.md @@ -0,0 +1,16 @@ +# WSDL / binding change log + +Notes for the **`wsdls/`** tree (bindings and optional Ant helpers). Main library releases: **`CHANGELOG.md`** at the repository root. + +## 1.6.0 + +- Added Provider Read Provider Organisation client +- Added Provider Read Provider Administrative Individual client +- Added Provider Manage Provider Organisation client +- Added Provider Manage Provider Directory client +- Added Provider Manage Provider Administrative Individual client + +## 1.5.0 + +- Unnecessary JAXB bindings have been removed from this build. This is everything barring the consumer binding and **`xmldsig_override.xml`**, which is needed for downstream projects (multiple different XMLDSig-bound types cause trouble for downstream projects). +- Added Provider Batch Async Search for Provider Organisation and Individual diff --git a/wsdls/LICENSE.md b/wsdls/LICENSE.md new file mode 100644 index 0000000..2ba5baa --- /dev/null +++ b/wsdls/LICENSE.md @@ -0,0 +1,23 @@ +# Licensing - `wsdls/` bindings and helpers + +Copyright 2011 National E-Health Transition Authority Ltd (NEHTA). +Copyright 2021-2026 Australian Digital Health Agency (ADHA) and contributors. + +Binding fragments and build helpers under **`wsdls/`** are licensed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). The full license text is in **LICENSE.md** at the repository root. + +Licensed ADHA WSDL and XSD files are **not** included in Git. See **README.md** in this directory. + +--- + +## Australian Digital Health Agency Production Disclaimer + +The Australian Digital Health Agency (as Licensor) grants You a licence to this Product subject to the terms of the Apache Licence (version 2.0), a copy of which is available at , and the following terms. + +This Product licensed under the Apache Licence and these terms may be used within production software systems. It nevertheless remains your responsibility to test and validate the use of this product within your software and the limitation of liability provisions in clause 8 of the Apache Licence continue to apply. + +Despite clause 7 of the Apache Licence, if a condition or warranty is implied by statute or law that cannot be excluded, then the liability of a Contributor to the extent that it has contributed to a breach of that condition or warranty is limited to one or more of the following at its option: + +- **(a)** in the case of goods, any one of the following: the replacement of those goods or the re-supply of equivalent goods; the repair of those goods; the payment of the cost of replacing those or acquiring equivalent goods; or the payment of the cost of having those goods repaired; and +- **(b)** in the case of services: the supplying of those services again; or the payment of the cost of having those services supplied again. + +A term which is given a meaning in the Apache Licence has the same meaning when used in these terms. diff --git a/wsdls/README.md b/wsdls/README.md new file mode 100644 index 0000000..dbcb624 --- /dev/null +++ b/wsdls/README.md @@ -0,0 +1,72 @@ +# Licensed WSDL and XSD + +Healthcare Identifier WSDL and XSD files are licensed material from Services Australia / ADHA and are **not** shipped in this Git repository. Download them from: + +https://healthsoftware.humanservices.gov.au/claiming/ext-vnd/ + +Extract the bundle to a directory whose immediate children are lowercase **`wsdl/`** and **`schema/`**. Some hosts are case-sensitive, so the casing matters. + +For Consumer Search IHI (Messages schema **`SearchIHIMessages.xsd`**), request XML must place **`electronicCommunication`** immediately after identity fields and **before** **`dateOfBirth`**, with **`internationalAddress`** before **`australianUnstructuredStreetAddress`**. If a vendor pack places those elements after demographics or addresses, move them before regenerating types with **`wsimport`**; otherwise batch and related mobile/email search requests can fail schema validation (`badlyFormedMsg`). + +For Consumer Search IHI Interface WSDL (**`HI_ConsumerSearchIHIInterface-3.0`**), request XML places optional **`electronicCommunication`** before **`dateOfBirth`** and **`australianUnstructuredStreetAddress`** before **`internationalAddress`**. + +Optional JAX-WS / JAXB binding fragments that this repository ships live under **`wsdls/xml/binding/`**. + +--- + +## Integrators (published JAR from Maven Central) + +Applications depend on **`au.gov.nehta:hi-b2b-client`** from Maven Central. At runtime the library resolves WSDL locations through **`au.gov.nehta.vendorlibrary.hi.wsdl.HiWsdlArtifactRoot`**. + +Set **`HI_WSDL_ARTIFACT_ROOT`** to a directory whose immediate children are **`wsdl/`** and **`schema/`**. Resolution order (first match wins): + +1. **`HiWsdlArtifactRoot.setRoot(Path)`** +2. **`HI_WSDL_ARTIFACT_ROOT`** environment variable +3. **`HI_WSDL_ARTIFACT_ROOT`** JVM system property (**`-D...`**) +4. **`HI_WSDL_ARTIFACT_ROOT`** in **`local.properties`** in the JVM working directory, if present + +Details and related TLS/registration keys: **`README.md`**, **`local.properties.example`**. + +The published JAR excludes **`*.wsdl`**; the licensed tree is never redistributed inside the client artifact. + +--- + +## Contributors (building this repository from source) + +Maven **`verify`** runs **`wsimport`** against the licensed tree. Default build-time root is **`wsdls/xml`** (relative to the repository root, beside **`pom.xml`**). + +| Property | Purpose | +| -------- | ------- | +| **`hi.wsdl.tree.root`** | Build-time WSDL/XSD root for **`wsimport`** | +| **`HI_WSDL_ARTIFACT_ROOT`** | Runtime only (integration tests, not Maven compile) | + +Override **`hi.wsdl.tree.root`** (first match wins): + +1. **`-Dhi.wsdl.tree.root=`** - Maven user property +2. **`HI_WSDL_TREE_ROOT`** - environment variable +3. **`hi.wsdl.tree.root`** in an active Maven **`settings.xml`** profile (see **`settings.xml.example`**) +4. Default: **`wsdls/xml`** + +Without the licensed tree under that root, use **`-Phi-wsdl-artifact`** and a matching **`au.gov.nehta:hi-wsdl`** artifact from Maven Central (or a local install - see **Local builds** in **`CONTRIBUTING.md`**). + +Optional Ant helpers under **`wsdls/`** (**`build.xml`**) use the same layout; they are not required for **`mvn verify`**. + +--- + +## Template files + +Templates at the repository root (beside **`pom.xml`**): + +| File | Purpose | +| ---- | ------- | +| **`local.properties.example`** | Documents **`HI_WSDL_ARTIFACT_ROOT`** and **`HI_*`** keys for runtime and integration tests | +| **`settings.xml.example`** | Optional Maven settings fragment for **`hi.wsdl.tree.root`** | + +Copy locally; do not commit populated copies: + +```text +local.properties.example -> local.properties +settings.xml.example -> settings.xml (optional, at repo root) +``` + +Use repository secrets, a vault, or environment variables in production - not committed property files. diff --git a/wsdls/build.properties b/wsdls/build.properties index 28ea95c..ee0a282 100644 --- a/wsdls/build.properties +++ b/wsdls/build.properties @@ -10,8 +10,8 @@ dist.dir=${basedir}/dist dist.file=${project.name}-${project.version}.zip src.jar.file=nehta-hi-wsdl-${project.version}-src.jar jar.file=nehta-hi-wsdl-${project.version}.jar -license.file=license.txt -readme.file=readme.txt +license.file=LICENSE.md +readme.file=README.md build.file=build.xml buildInterface.file=buildInterface.xml diff --git a/wsdls/build.xml b/wsdls/build.xml index a870da7..917d60c 100644 --- a/wsdls/build.xml +++ b/wsdls/build.xml @@ -46,7 +46,7 @@ - + @@ -197,7 +197,7 @@ - + diff --git a/wsdls/ee4j-jaxws-lib-pom.xml b/wsdls/ee4j-jaxws-lib-pom.xml index c66152a..1766edd 100644 --- a/wsdls/ee4j-jaxws-lib-pom.xml +++ b/wsdls/ee4j-jaxws-lib-pom.xml @@ -12,7 +12,8 @@ HI WSDLs - EE4J JAX-WS lib sync (internal) - 2.3.7 + + 4.0.4 UTF-8 ${encoding} 3.10.0 diff --git a/wsdls/license.txt b/wsdls/license.txt deleted file mode 100644 index 2bb02e8..0000000 --- a/wsdls/license.txt +++ /dev/null @@ -1,28 +0,0 @@ -Australian Digital Health Agency Production Disclaimer - - -The Australian Digital Health Agency (as Licensor) grants You a -licence to this Product subject to the terms of the Apache Licence -(version 2.0), a copy of which is available at -http://www.apache.org/licenses/LICENSE-2.0, and the following terms. - -This Product licensed under the Apache Licence and these terms may -be used within production software systems. It nevertheless remains -your responsibility to test and validate the use of this product -within your software and the limitation of liability provisions in -clause 8 of the Apache Licence continue to apply. - -Despite clause 7 of the Apache Licence, if a condition or warranty -is implied by statute or law that cannot be excluded, then the -liability of a Contributor to the extent that it has contributed to -a breach of that condition or warranty is limited to one or more of -the following at its option: (a) in the case of goods, any one of -the following: the replacement of those goods or the re-supply of -equivalent goods; the repair of those goods; the payment of the -cost of replacing those or acquiring equivalent goods; or the -payment of the cost of having those goods repaired; and (b) in the -case of services: the supplying of those services again; or the -payment of the cost of having those services supplied again. - -A term which is given a meaning in the Apache Licence, has the same -meaning when used in these terms. - diff --git a/wsdls/local-lib/metro-2.3/webservices-api.jar b/wsdls/local-lib/metro-2.3/webservices-api.jar deleted file mode 100644 index 3617ec9187e42816257f5fa6a632718d4b6d936f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201290 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

4puBfEd38@kkeJN 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 z zICdPDAC!1E^pEzgn2`;fE$xu|VBsQ}Cy&d;!|a^-1(e^SzAd=VWc+%V!L@Cte5`!f z54f6|Z}Hyid&HYEPJdarXYC9nv!`x3o7qn9$a-_RiJgX9ctu1*yZS=!u^BJC8Wl(i zHdtm^UiWj`HB)gV$=0!sA<47T2W~gEF7ZMw#2fW-r{xsu7 zL%`+{KL@fSf7^`z_CGVQzv3zRN8R)|AXktTmz-32krkhi3WXHQKZBN- z9G4QS5}T3*I^R1m)HT!v+&2b=_xTA(l!B)6C$)sJHeU1n{M(hE@Bcgy{fmSB6&uI@ z>w^t@_vLOY9K5#G%;s*7y>cwn{7d}R@V|?{MoE4n^aBt{@RHKgYU%hPr({MiBLX9- zuc9YqB&G*00gFipL z{Qr5blL|84|L1f4h05)JN!e=Kgr>T@y__%S|Q3Et$-$O&l5%4qv5wb!sL)R!mM zAJ8ng$sjIuR#8tlQXUWiwjY{T;}U=aNpD^&ce5#9%al=T(&J|G^m*X|m;1}=AU`z5 ze83Xiej;sSKy%)9WuRm{W4ta|F`v7bwgx<|Z($*tMqYgZt)_XR4VW zM@LnLcOEN_PH6F!a~C&G-l^o{Rp^9dTHEP+u9c|A8mVKYSuW?o_!5C{R8ngLLUd>! zG|x0P4}1`ll3CN6W&0&_*S!ojE=g|USyvNy^wjA6+1SlMKMgr+`{|Gh_uHxDYMT7Z zXwOio01AJ@4a(aPF&FE3GhK*E^wqhGNT&0vY)M3 zKmt8Vu$+le2*;APKyo3Io;KYyr9LxlXeOhv8B>)(tT*QEVegRXn05(kcaf=F%{+R* z7cnhBb#E*gGsyHE%tIQbMBKD%5xdNS%IK3n+Oa z2^Yv+Vn7RgDLr~IPjLjy0}+kB*!U(a3OeL~_97xK`P{BR1ZARzNF*vA;?sGsBeI2p za;+|=o+dhFY&E0~uXKB^Q2Iz8I@r`h;UAyO85z*aZ zKy*lg*2|{CgJ$MskVyo5Cp}Y+a{;+{NRW{ZSt$eG4N1PGNE}%=BWU~vr#yZFOb&Z^ z*7q`Y*EFv0->)IEquu}%PoGU*4rym6b6Pn@*#KW1w zN>avFSCt-e=NuT3>$BiY^vjh$l1sYe-}(n#NfheEw+f!08ydwH)ByzwSrpjVjiXby z?qNy$XI@XK78Lny&r`3x^53KG->tQZN*QgL~$PT$E~QW7ZYrBYx7D$ zc7ElUMT>lgPtUo-HbWXWlvrXXmJ8g7>;QBLDxO+EDFamE;Hj6wCN<2jk29_+x?U_& zquFBpUi^I?wJHSQ60Je3MskdBEoY7LKn?fzlh2+j*ZJKXAN+j(=O_OcxF7{ro8Qz) zzjcW}sdWB51}LaoBMKwEe`VKlUqaB21pr4a0@*IN93zIK?gr*-`syzdte{9`aVlHW zw_ZPQ4i=?>^RoPKU%~-M5DAPxldW_d#mC9es=D#rn`(SwjP(=3!n!f``mpyV3@~V` z-cOybK<6C-JT4WoRi`3F&XPwESgXf^I_QclpB%p9t0EmLNEaDKUT7=Y^jX7&qkmCS zuo3L0+)}r{ zItxu4St_&o+YJ300jq(V&j2cVu2$+h>&&(@#vJiEWw1=lA~kw~U@u+&@oAaFeS&xHuXP;5wDxCv8fk~$1su}h`#=Y=oq zKt&xCFNs^r^v=fWrBDU~y$+%=3mT1#t?V8v{i1XHt2>ovTQOuz&n-8VvTB+(;Rx1_ z19gzjoN2ugr3ORC-QNyt=mqF|_%j+Yr9!ls0%BhpqECx?rm9eb`f1B`;rKC}^rHeP z2Z~eAYiO9q#8TLMUXlaLnuHe3*s{FzS}05}(hGs6CrUcWnxqVV%tiBO;wN3aS_(Be zv2EPQ+wk{FLQymo=)!;m5^gxdpa-hgT`*BDlwW_>A1j_~QZyP0(u~cd>eM?vsf5#H zc4imM4#Vp&muWG;+?;6{9Y)K+jFNQ&`g&-&B=qCBC0%yss1;ixn0E)Pq7a@K5^kY3 z+|s)}CiBHaVej3OOr_5&724H{#oNz2y}&d|v`!ZHjO6!ZSOaaDpO1k^ZTaSe7qON% zMSSypu{XBb0_>cyM{~`0PgHIu{L9Mb-&Lt9{+F4_)i}Ef5+_qQ`zj_{W@k? z3Xm5ruuLaf5J~WR1ZW5-@>Ga%uq`+i7#&758YdGiUz%#&m%Vz97?;a09%TCCzOqID zq$!!l$DJL|Wd}DWZ$JQ%x)gw3BEmer4si6mivlX-wi&QeaIr7-!uLG}2}hdETyPo} zD6pwuzXGOZ;q;g)DU$dr3WC3ym&AuGgnyS$ld!SBAS&REdVqJLnis(_EnVGq6YiL1 zB6;R4Ocb`@jW{Xc z8ydHMMpb!E>P^{;X`w^1Ea(|e6L0-_I7AuF2Y>*!6o499#aU32xt95X#h>`z4!n;D zknbGwIsTIRc9LgJmL!Y?)FFH72Uh`4p-rL)(t}iBfxVYRB?XpS#fKEva6DBiaI;e9 zi+UESuz+GYINxkygp@aAY`dUA4S$2P$}YDyY10g2JGd9PLX5&;0#Sm4(!$u>FzVlH z38!pV$c^P^o%$j{u4`-GU^Q_Y2jewDLM3&K`8#+6Y>hmIeFpB~PaFT|;Qbf;u>Z90 zr((gsO~4{#e~&kj(y0RY1bJTP!$<_C{UVIRaYQ5}N^umda2l$*Vr!UI^d8kSCH^tr zYy^Rh5m@T&SW1~_Yg~((Y;*?r{o|g@-cKCbwn4 z_{z6&gGW?&ENqF>(3H5(L41}^qaWBtvm-#3gC43JYR0f@ODV#73Hq86)qX{L3s}Oo z?uTLbNz{P`q50ClRIH2F5`)4`->b`c=Z3G$dGQ@B*y&fY@z_|i|4F9EShzh~iL?f! zpjn7BVvaFelk>DlV}AjovT91kY2PlAF5!tzT28|dF&cSiE5qsgR^5Z{w0LsD7lv_@ z$?4&|kz%7L?QShF6&sUD^j{r9nKri9Um*N>T+j?4iXKG`FcNy6Pdde;Y{)%fC$W(@2qjI~K$L8z=mytVD&Qdjd5DR(O77=w0NFeAa1-S@yfbK@@=XxzCcoD$GIXI5(UdFd}M;u$Fan zCh%~IC3`nfrrzmwbQ1B>?%Di?%Cq#$S}bXV!!eCL6(7vVvwmGaZ#8_&r2xo|Nll>& zlXC%()nusN zfs!Ku0&Q~b1oso7xtUJe?(sd_GU-zKEjEPpHl{2`Xf%Yp3t^NDGwMkcs#c$ z_;#fu0NN%kucHpu*SXz2swDj~>(MqRUh);XIjZ!3bIaYT+mT+%zB_iDKOhOND15K5 zJ(eVA()QjnxkwT3n;repNcVH@7P2B=Te|q^6x3k=R(v6Gc=cg+BJF+cdx^*`7?#`N z6&iPLVNB6#l_MbCo&aZ0t7ROrMq*z2-c>GR8*RR%tTfmyfh>{ie7aI8u{h-*3}IXc z&rdB$<-KV0OK^vr$I26=X{ooI?42xzxqldR(zPoxwcVx?9| zJf-2YxuOJTyzLE>#LbhK?9gf**XOxnJ^@>Z#Mxj27mpC~B|jJxikn=!H{w3N3S@JK zr`~bGp_T3g^Jw4E^(#e+i$uXz+CQE~iG94*+<2&_ZIvjKXY6ba{H@3UR^sYQzf z*FB1-)Ql}quelXTRF5q{O&CQv?A2z@)-GR7ta2u(a_%4D1ZRiyX{S-b5n1d8JLT6v z_tj-YK=Tn^fXnkLnd15yMR>MznJ=afn5m>nqDyWdJC)nxkg$i&f%eZOa$}hOvkTJ4{d4ry1R+XSxLMy-9&&)$6q46jYxx+_kMNHjw$KpeMvl)| z3HZ0H{C|NL`0w%Z{}6hyl#w*=k%3EBOfx=B3c?Y9@FjIW$~(wZD=~ow7CgKorZ(Mu zl8ZGSw!Zm2r%tHEk&DJj)D2upF@)uA<@6@4L#9TqM5+YW?eUuEpLgq7+th9Oz9FQ( zgTNU!kM&~AcTy4lG+LBGfnV|K61}Cv9)ov@H5ecb|h@`{`nmZ$q0)s|*pmy|XFgmS}*w?Mj0c5HN>C zKFL_dZ>lSxibn;ng->3EtUPf355;C3)41gPXHa7J+rj|pe}*kb2U80gpwIj0^M3k# zeMY@Mum5~M5q*Adrt75ZLgQj-L8E7CWkB=iH+}=wK5M#9shxjxO9B+sr4c`wYzpJ8 zS}9SQOICTQSCmS~w8F>~f@S*z{5Rv48u(Rf)?(Kxj{H*5-cY%oH_J%Oco97ruY}Pj zCB)Ss5(LCYOpDp42(o~rVSGrw$l7b$2tB$z;n_Pe)koV=qu)jwdZjlJS|q`asLg$x zpaV9R(r`4+0Cf`a1s3HyYMkrJjvx*ElFlXR4f+I}7M*2>+E78$&8!I8#r5wv-) zjYRcNw72z!Bl>X0TojI(*eU5I^(v0o?EFz8D4=m7+G6p3#*MqNHY)F^!wP8`2&*4j z+USAZh44^0ln*1NXf1caw~^|B84=u4XP0%+aNjkO*!g;Dbk#Trk5O2^C~1zOrZZ}P z7gX)3pDhwh4wMc5)|9hFGQjAd#{<<^j4~LXo661q1AD@(yXKe`nTT<0tAQs~*+#fm zlhWj{%M?0HguJOp7mX0A9U5=gPY8<18l%@_yxSgXWo?ALxk)^+K42UutK)+??p$Jd zD{ycDmZ?|})zW-SBbIx+(%gWRi3_g@$~SrTgspC$wJ<|cATkxrEz+JS_npKuZ+ps; zWq%xOy%76nJJsBt7E|cD^7`-yoGhs-*vqEM2s%4@JoV_eXAl4do@r^dr@a+Tc`K!>9bP5v2}GxmA>IrgQ2r-RS8cyT@41U=5vs8|2@< zk|VX6#Js!J0drS7yz-pXPITeKBlvdaR(txRb?`+9b@EW{8q^tusgYnhZo1= zJem%N^xXEHMYahS&)F-%K~iG}kLfF3V~2sOS5dH~s@7Zlr#S9U@>1uC9}^!3Cm)p_ zfZ322NI58aa3{1!!USM6Buiro0CI4Hwm$%BaA$atc){_8xe8ucx`h(f8258()l=Ii zfRFBZ;B3cgRy63Owt2a6u6MTZN-ss==2#TNg|Cuvqh7B3ai#6Z68crYkqo_n5L1Vd z2L<}%rv^_*jmkK&YA+M-_u!Eu;!b(~cLI8mT=Iv+)0?&qpgv61Y9R5i5K2O=0uTy;gK^punBf1T+ zro=11S!^PI)=t&8G=Ra`oRA$o3DSAJ@uLRTuoXKRA?%T_O1wIrl?dfgyJfsz1?TEb zG-6a>WKc~fwEKzsS`;d=dSWyZ#ui`Y!<>jiBswurWrZNCrrhE}rLc|IoA^dwEu!c4 z8EAVQ{aSi8_Z0?W)2Fpg2%2BQO31{UIL+2r$1Oy)#blUbQVdn@C`#(iO=zKe_nn3M$I@3M(k`#Lh&zWILa6^m`VGG8+uZoi1IX1lcc9IxFEZhZ&No zOb|{(r$&Lt`Iui;^#Dm|fcf8jlQAOh5Ky&etQ0&(k^TTzYfim|@sZ zJNeZ#y>g*2YGaQi5Tx@#RPE=Uwv|M~5Rmi~0M+!BNwMwLC~!5b{CGzu~iFl$I|R@mWN!{ekz)9P?RMSefHL!iQOBHZGFY%^Zc) zGt6lS1>=0FhX$~)cVm#hC+*8JPIWG`J%bkW<8zer9tKVIs&%22K!(SpZlIMwdtci% zI8M2ZK0-{?1p@BpJ&XZ{4ye-*xXcAs`bV7`gS+AM zKf;w=!H;J!n2<}7g#~i1`KN`PqqtFLR|i+BSC8k;2QQ23&k#6f-!nq&qb>o}U;I+1 z{*ol)J4)7%>|f1u^tK2$r31JOm`eHO)Rf%`&R1TH*-1@KsGL$EAXHuQI?;Y}lA4r; z39K^arRerGh47d>t&UuLwzX;{7onoKH%!4pe1$1K9W;x09_|Z(He6p)ahLM#dj#P` zl_Yw@4wQU4XC=#n%u@1R@3x^Hr0P?A%gLVl$f}?11x>Qk-Ve25maL6|Jy;$eO;LO>NaWKH88DVAXS5 zdE>O>O#K+z+Q7R7MiZYn&OUxr+WXhQ5wPGli~FB z6C(omcg=^tOYZ)0ll>#Pi%`(~-7)6eVNo?+A{t=y_=KC{pfbzkcmNu8X_NmbxnyPWpu1>A2AsKDg57)(Y0G+$Tx_Os`Dh07v}76KdEx(1c%vwhcg_o(iO2v?&fT{8?8Y~5F6pkyy|P$@{HI$%h2X%Eb>Jq*<3taPlsjCU zL6_z#Hs2|{I0buwqA8>tlE`doKrS_VuW%C9agZx>QPYwz=S4qX{IL*5cSfuz5;#egxjC5eQZXWpiDf{RKxJsP92i!4s5 z&VZi@1kHm*#oao?%yh2!0k6aefjb#Y#UU175NCyNvJkNF)2aCN>N^6G-!@0EJ2*0!|f$9RX-AR_ZK*fnn2bcVsWhhND z3u{{!1)>m`39~PcjVR;|hu*iTU}+?ecnq1MdLYD`Thjsgjc4z0CvzLRP0Q=Rsc)sbrWV0-leRMxJ z$t%A#MPhE-%Xd>1Lmj1R%|jF@zFoA&f;d1>e)9ML@iw$VRTIyAZ+C}^8FR?MSF^!L*R3*H*0`u^Xi{ftprlT< zYk)4ZYAU>Z8!vtsv0#uG3Ur=ZODwQTapFI7DJ-bGa#}ID{;r7Pe$+(OtDijb%9VCh zWlOx?G=X{UW{r-*N9&XEYu>!$ETC2Zx{>wc#OLt{O8PzI9*$2LJ@bR~0AHb!ZWTt> z)d>uOtvV*!!#3R`2}ZPp1=~68XYzJ1=zSC&DS&8tmkI*n5G~XlJ#F~M8BU)qO~{K2 zoG@32AyTYM@GuKwAgddqQSYV1;Jj1Q88X%=0oUO8oJEo~yX1<;ASQB0ucrKJ@HFYu z-5$NQGbK%tGi6w&Qseaur%&n{{pvl1-=PNX{MnhZib+>t*KlT+nz!Yp@e9bP$&Ad7 z@^+HWE z*{hQNRxWOECwl!Y>lGwM*i_P3|I2m6do!&Ms2tu32o_jAEby-m?<(pz8Qhvydy6G4@)N_*pMu-(7vC)JYA4XNFB2idl(hF$Z&eY$BdE_4x9fBWVx95 zeo}vWpXlFu-(SpZ{uGG+^uB)yzGWzCN)s|8d9J^PmTl!^{{lW-5%bK(2PDTM`?8EI zNMXEBvZERGDfl*AsQBR?b(Z2$75q8*_wbDRt@*|d+78r$HnaBVGhvM*goq(+Lf?YT z9bv-K@xj>K(dGs=eX?bOp$DtHAm4(Kp&d^0w*DnHs8CD2nT!*AU)aIP?)paBn6#*f zv4KEYf)5o)U(`)lk1I(GVzN^DKumVb&S0rp(=KKcN33wwWD*0PfmB;ecnB!g&~E$` z@*uN~*L%3OVw)=Q(R^oVZ;eogTD2BA^gJykmUV3?y?fq4l& zC7z8@F<=vfMm41c@VDMuOZ0>~tGUOJWi?FgR==PK*I0xc9&t=PS0sWvof|DL{PS?Ir*`khKP71zIu@B%-JW&ax836h{G3ADEhT zmM3NrB#-R|lKnys-hIYnt3Nk=^$!!u3QYn|7d5KEbesov@I*!kXuc$l`2{tqvJ>}Z z|M+=61SU333#JCiXpFQH2*E`#i_xw_ipti+K3y6B@_G5KaBXX~GOqv_d2himtd>`( zj`%{RRZ&8iE<=z7RCHIyjsn<6f;QNF6>+<;1QJgZc4KVn}%N~Jw10i;* z*&i#1N2%Qtq3YXymUxu`${`T^+n^pdh^RV)S+bOlkH1cqPQQ%96@5u*VeGY(|@wn8(VY2$d zbt9|X(<0}cekO97-j=}~plkQeP189sYiaZ_NR;!z@N|!SwDLgq@rNMHH`^ee>60#i z2>kEz0Q&!s2mG7R4!^a9#eZ8nPEfRz|KvLHvZ^r{H4??AQXsP|36{(zZg}+lDidB( zP$(lQTHrC2wp&A4yL7g?Mmsxw_2U-yvpwZEvH0cGvQ+WkyfY zSFYX~pGjF-vJ*&bK_LF7k{xmEMu&1*qP|KSpe)_0x?X43O7umkN`n{P%$!aOb!ymD zIoj1jH7&4@i@kdcsYZM8* z%kQOp>pO};97nOrJ5mAS>TlMp^*SpgTD5Bdd=Q#*5Scr{YMY|{%Lu&H^(Dg+PB%ok zP@Zy+1lePj=bd9j1F&eZE2|ak1PBBCk*Wi*hLNsTw-li^;@QARMh(~^|U#QV=E+}?QH2=Um zHjGtR?k2>3kSNc~-RTIiuGZZqucS*qF{$4E%Ga{`P3%atUKHW}_`?*B4Gg=k{uqW8 zy>Pv)QC&Aq#_V{GfsgYP@vSQ5u=vOaHFPX`*dno|Y`2!vV^)$$*v5C>vUAY|O~x*L z;RLET1qZBDzvM-Gq@VV-ls=K52@Ry*4&A(MKyVN2nJZ{m??nNa=}RSU2_S^-5wNhLA6R3>qs=~pPJ3qMJ2 zehYovtD-3{*gTqO#YW;PC}X?l1Un_CGU|9l5H4Kl>6wil)m1pIo&9gnrvij=P$*y-RKpN%*#74?M1rAQt zlTK}SI$b@zgUPi-+)`K8MQ6sU*kUXo{TjoMrCVJmWO$Q4EnfX=}h26$fg|>$9oB(QYh^TghvY_@E*FUjfyq zD9OQO^@pXZUsVY>cs9yR$KYymCY;S78^5Vdi$`zNB?=*-{p#QRKDXNf(J#lOSB?Cl{5I5L>50k(m&TS#*$38o` zEs{7x3`NSf8v(LLb`6ESQ#ooBf<%9#)}6_IF_)03YG%5WU$#k8Is?kjQWMXvM7ZH% zOgVR98S6$zd0>c3Z^gGWBFT(|4qVl%qZf!Y3U2#X!)E`BvUd!#bjjAWD^+RRw(UyW zwrv}gw(YF6ZC2X0ZQJ;At=0SNuXlH^bM}w-S6(@<88PFHh%ugL+=IkY;wSO_SG!8- z86%WoU-2{QpVbPh{A|y^BV<3>&9Nqo3@O^t#M^n%2j8$b6V`!{A1=~14SzQrl-Xk8 zKy!YxfNl%C$k9Iffzf{i3bN|?XF?^z>G=}vOKq$9Tg8p?U-#SpG1LDfQ2vuA{4YcJ zMMPhF!k6{?4~MkycO&TR^1j+Wi1)BHtoQt}cBJ>}zKpSizPK+Fbv1&;INASjkee|f zZ1(^$i68MpHvWPeE7ZrTVUn zH{93t{Z9eJc-jIn@@ou3U(bKm1pn`&{6|Bizm}C%%=jN>&p;XT%o?RvpbJgZ6)D=C znF2B}0g&(uM#d%qaS~s8g;z@&&u_Tm?j|eN`D%NFq=#7cx37=yKwB`oXuW8JfyG-_ zA4y~pg>{A%tZ7)F2>X0Fq%Kuu^Q54Gb;oBy+v*8@Y}#{1BZ)n-6VV$B1)LOCBw7w6 zsp$p<^Oe6kC>m;1QGOhDbgO`Pt(zpg#$hNyy%$uKMPx@JPkuFeCRyxueXQ3*MaVwh zDsxjPr!%WAurecOrYV{=PQCc#BmfD7Nkeur;&KGoX3tH!_C*DKn6hyTr4$&kIG*lf9M`7>3 zssc7VJHqIpS2__m1ylx`7ayJIlCX((7nHEW+~ z?5#5Ik@QSa?pAB&khZ827^AguM_c_w8w@#`n8seavI2yvl6>8g2Puah$SjJ7RnaLQ z@QyC`T*TSumbaJPheQ^dFKrgfCul z=+{p>_O<2y=hp-0KW+m5#dV2{k&*Z!^Yw3G3 zl1PY#w&}Gcz07~1`QBuA2A1Gvz%KOkyl*!QjDP$=smRE)F_;vNo=UajPIJhyNdeQZ z1S|4yBTugjY;z4=7b5~(G_XUW!xocMgu#xULZkM~%CAU`^it5d7PQMY!$~=-&Nzq4 z_!)$Fa$DXD-eF0^YE0mGNvd#hnsX~@N=+OsZ_Yn^cJs@yC()ZQ14+uDf&d6FdxWj3{H8XS*1;k%R^rO2 znM0@$UOB#(a%6Q>S_zA!662a*CJR)RL0uf{RQX;7&lAcD$i}c6>T20qOlI~^*0SG! znk4&3H;PEUW<2C?{aOF!g;Fs!b2L)0)iW^qs)R83s*C=wxervfvQaQX>y-9bsdF|d z$HTU?YS_xqS|)=j-qLnNirHR@v66&~ZRD&3ZEJi8l>C8#u&F=S7n0r;r2oJdaTMI` zqYE{S#*_L)$h2hxS9Q3YbNZ{7`H+3`;?TS0;Vlyi>G|@IJEoe zv8#NySU*1ds3f>k*vyE;G^FU;RE4@%WaneeiYKs2iZplo6EYk}&LnT@o5+sNEF!t% z9Gs6S(E3x5x4`cE1I9nEkT$d7?KCyWh?7cR1-!hXQzQWV=qFrhNDqf(B5~<`0i}Oi zia_54dEkF&dXkYBv%A1|B6nhMm&tl>4Fm~SN}H|ukyO6q0(oAIUVX!9^5ZPuO1olS zI?(%l!~2#M_JqOZ`wRJZci1Piv$xOgHc0WAb@}KcF-A`(2%BZ|_d_O4lLQZk$B*kw z!Y)eIU)cC#X+Ty#(zv_bnvX6mZpVA2F3Fo$J!dHVKU#fP2(46dXmd{RP<~~jeGfgu zyT;;Y44Uo%kJut}w!dq&gL-B2@?VSIa$4rIg(v1*BI88sj*n14L+n&i#Fw9fb3%xBQ6f47QjQ zrFtZ)z_`cO0sFAYF>GH(K8qDx&(EjU6@{H8&V&%;Ohk+YUK`kmIY;js{&GNgK)t<* z!5)e`bDbKhjRAA)X<5jdvr;VUdXd0$*0Z_ks}VYOWTGS6A=OuNuUF$s%JVjeNuQq( z)DOicO7Di%+-FKgQ(Vf?S#rlei?oh9+!Z5Bz3&C*ww>slY?e-AtmTRphu`GJ%cOG_ z%7*y?sz`36awftu{oB@06Ueb8pA}xY795{xsB+jXJ?C_kwcZ*7=GDk; z{h~N|bd71K6|%V3X{V$6G7^NKnY@N|Xm!SP9nY8q!B<*w-C7B|Fq+N6>;{-N6haDT z5vpAZ=Mm~8oy&>QmKj`)$qA;^tE5sxzhm6)wLzaugNPF^%(SJ)M+tw33w0Fv#0cb| zQiJ>vckJCn=;BwR#&#lN7Uy4h!hUJpdd4qXOw!-x8~!-@q=XdtsKum(X|42}jjU<^ zG>_4Ina61UG>`pnyk~#pQUCta%=KLLsr78l{#TYZn*aBYwY9PO4S5|kHNr;hu8rqtU-vfkcXw2OHh}Y7&er)8SUmT*=)|DYEfev-^Sd>&v{)u z5_<6b7)Pwf)09oZxeuP;`xN}p?haWOe@Ikmj^WN3eic1Ay{oH3yv>g>y&QI{iyC7gF zkw2s#(Y6D$5Lvsum$UnQIEkaUe2<-<^^F-nkRu;Z9E6`YvokMY-;80P^J@_+>N|HI z)J@9xp{*M~3X$G2R=`v}FQg-X;GSceM4(m4`NJS7DTEiRt{9-7T$jeVg}fK!?4|?U zOXhys6jqh&2+;^%oH*kRQj8=)n%}`Klx4zqU}`>Msi7HqMOhyOsZc56@4!%G%Ohx| zz(PwQ*b=Fs0*jf%sv#j^OW?yj&jF}QVxf+VR_H1vS2EQ-gWH2Sh@)=$M-Bw7NTPM~#L!{ufYw$C==xUH*5x`8jz9ey5j!8h^Oa^d2$)!xlfRg2MH1X=y z5IKqvB;K=%a-8(Ph-#rf2Z@CA%zpmLWv>yX!6$p@w&jZpUdRpPH36nHSCQ=Tt)=ef zD<4iZ1>8W^mV)&nZz8t|01VHmVX*w_B8GU*KeZ#PvvLF*`m0VcusxQ#7b|}laf}*w zI_k(m&CJF{;rxJg(o){ zX)?5yUv}dgdk^lb(7CvjD19g8gE+S@?GTkdp$~P&xH|Ag8j74%!2G;mGMp&s5Kg>c zzg{m7g|2{+mOfiR4E@XZAs?;8r1#)7%jg09(oV4c7WfMxloU}P|7z``(g^ozdvZCZ z4*3j`A-;I4clr020?t|lL_z?0-wnPoMHXLbDi}e(!U4YE2)}gMh(O~Z$tAz`0zt!Y zp@w|n>Cz<1)JIN0&3TOPEdW|Q0o!SswpF1e0|wD};HT^XMO)lth9;Ka^Ef>T81qVo ztSu#dWUD@Lk-T7j2P=d`XE9YwQHqIW#?YDkf{NXIQelOLCChkpgIKkN+9-lJeIOrm z0Sf4og=2NVmY^k^Xiptkpcv+gM=vF8CuJnxxOJmYiJa&X8dBIICfCwWB_1mrzRmjh za(N=u2WZnIPuyrgvvRPZwf@%9UIW;{f;FYcKauevKFXO2MjcBCQ=t<`$Ghv+y?)s3 z9t1iR3-H?9D+Xmo>={|4ebF6I%gPM?QBSu%%GJbHqN|u0X^XdgH4FF+G$`zFfri2q zGv;H;AzY+)wStjV#NkR_pZnY*k*mq>t2D0!*wenNYXYgZgxFj_@{I|5E21)7HH_6> zc%rQ_q)>*>84#orm`1zeSrPn>#|P;s1(ZG!4xOF#93vylTbVs;f=i_r9qC9NponAZ z4R-MNdxSI3+IsG^X?<{%%>;Low+)?r*3&|bc(i%nm8O%C5CE${+cS_#NMb-^W+eI~ z+9I4&?24qKD?{WqFCt|#S~7DB62`F`43tWq3XZZ#B3JSVBss^vVVHj-83xo&7RiTZ zFFPajqXKdKVcIK+v_K2V9mIm@%}B^b39Q)lYi?^4;$FajhYx+=cj!uT}3@!)WQ8c|rQ zkX{2~iuUGg;9#V;X!itHlC@l2C`+~C*prZJJ66K$-?k?NE2)KvB~lUyN%fSvP+%cb zYl34*>z?Lf6&1#iI4b4DR)Xxo+7Wtwa;w3J@Cf`Y-VgJu-{R!X?RH3e+Z5*=+G1JY zp!HyGWJG;_;da_=pS0x~)b}wC&SsG0%y-Q+vY3LX+ih?)(t`=0MEFzcTzz{XmeQL2 zC=GWaTEd+xCtIjGS^P+6y}(?R49{~?w`Qd`ifEjgSA%YD9go9uS4@v$KiAb{k}8hs zAJRPll_)X*B(t+vpNl{3HlyZ*aE(f}5eut;=W@cD4Z^qn*ZH)@}g`x39u6ny_|xSsK<@q@=OKQD%r1dj~$@b z2Gl*U9rNtWn&}QTsPN^Td%L9zAF`84@bg{;h$+ws-#-poi|~#x1MEtEw;Yo?IH!mI z@Z7gpo*|ijH}G^^g4Hm`A7H&WHVA}Li~@1TLx(#;Ch9U8x1D@yezbe>=gP%}D#qjy ziwtpQ87!Yd)bohLZtP~+)?D#}rZ?GK(h4Yp1@*leBl_wGblDaDP4T53Qtx-~`n&@R zHVb?duQ#{BO-G=hYi?9B@|$GIpPb}86!=t-EQL2X=bi~vtH<| zY=_@Y+ICq_ddFbR1wB`vQ2QJb4>UB5s2lKKLsnMiVSZ*zL#BDtjC8#Su>zn7flGz@ zEh%4F=+ZJ}twi9~8l}-;Ej-#85%H~EDgi^FlDIb+6sZ%YEmetbEtCK1ReU{Dj}4QD zK2-#$FRx0b1ZS+LMa7|pUc@P<~jraf^m@p7pVsh|-P*c^D|eGjH1 zOGB(@TRDNlQU1wgMJG{1>qG_mqJBC4?U(%C0^ONb? z6Tcd%K;q_pSt-2swO-%lUtlDt6P??#zS^o#9}kXZydp2^0S7zw3b)mtVv4y#Y<&-H=T9j1*2h-f1z$lNn5AtWj%|KYqX7fz}~5EZ^tW_V`8=sdds;m z)Zq!NYx3n1C-r0$;6`I|{@#SM#M2E8>^^~i4Y6Ub7mA{1}zL8;Uttk)anA8teCu;%{RM``j$@ z)XR<$jq_q#i_9n~HE)zISh?XDGGsVv4ID&TwJKMvU3f5PZ05?3A3IQ1M@bBZ3I{5}O zyd||&cz?_kkFycJ$ccY8Gaiix!EC`LQZNLUNl9-@cg6r7w0@L$>zZSA<1P za2b-g)v>3z`I(C@Dy{K!Mmch~kq8YL{W8ughB%m6CTYxxh$|q!g^P0|P=ocPmZ^ky zyXE^)%6xw%Lalw#87Ma}LTQ)>r4!yzEr9C!+BH<=AxKfdvo;?H6#bD$O zs<-ot;nG8|bqGKTk*>%Pq;If?uqlXfYtQ7Dj_%9oUQW5h&XB0c803d=b0Iq5ZqMfb z(G|Qm{nRbqxSsD76-%9TYfwd}UG)ZCSNq5rG4iyp)hI!^YlnN&2Y}M8i%?hY4|qDj zP5w~p!JV@(@hgDAPGxA+?>*elH+txIvBDTu#ZwB>PlEnzvFl`3`SyH;3^w&^aPkk~ zFd4DyWlZvwCpNiuu?PxM39X9u9>bqm_7EnMV!Qp{Tv)c1ZL+6yIx+fXoGj6?S7~ZG zxB||_dmd7wtoR2TMJ#_}_c$xnOk;UTTbk2U5#LJdI9eXZN1m&McKB8qcpysDR8UAb zQ4OY1{skpEb!8s@qhNd&?C-V&%zu5S1&ti_%q;(5<^2bFA z6@ddJr(XOwo-{5oaXh*)1H(reO{}w%=Lf*rw&u2CPLZwf zQEI<_U$-jit86>s1!#Pt8)HMILec2hp1Zj`&IZ$Z=1j~~~4R}-G9k-gx~)o!U-UGF0OA3Yq32p zSG?m(x)T)sPW}(TkxoXo>aXa0z+xPtlK&<*Y5JA?SlXoTVkTu~Wv=>5odXX^Md$VT zGK`Bd&{qTgc^u%@GJREUfBTm5_5A1K;Gb=ue;xL-Gsji_x=mMQlVnyill<< zeQC^EhfYFdiJ?0h>P$aJ6EqtD+uaZG}WR;z=S~pde=%?%Au&Ql(o~YMr zr-@Djg_)@)qzFn^^9|S+%KwzmQ3iw>h2sf6@ylkbycg9(CDes zzU<@%HdKiX_lgQm-GD zD~@x(2jlg9X7nW0o(HZ~MlKpHb5jR3&9RMAltSGH3^_N~t<8Bk(Hy*EH=&pjGMv=a zTT;%1Q%r_LcbYTK0QO#$mreIi7u4=6zVq8_000ep07C8H`sCH65ROXlB@#%=A#!Hx z{nwo-sczuhsaW|A>4gBz4?h{2>Poqp+h{E?^E4Qh)w|*g8i@Bxg}IXH&%O4iUS|@B zzuiLGv#&}D=eNezNC|vzqL&LY>K4dG!rnHwqfDd=Zj%~TiiJzjpwm}}XBRe#<}-I? z05;PzGdG}#rDGVFV(EoW6R~e^VZxOtaA0vUJIb?nW6d=hovab_LS?ONi=Q6CNaZ$O z3xOtQ>*n~iwF=SM+huYefIqyAkn{MNh)#Tv{?`ALcP*q8vyoeLr>Cx98)tj3(IUA< z)`eU=v<*{IiXSEoO|A-YgV9QdKV@H1j-bkw$9DJVWJR5>P3J&}>0mq~md7#R7Cmeo z9whc<&~418Y9q!!w_pn-Kb~TgETs?|HPYBoreWVJhQgpORPeS`Xo}1!Hn{S@*a$y| zkhWm+zqEJ)$Wpozfad9m-alYLs0o*izZhPQg14BPvPA)IAu)rgb-b7v6y}^E4ude= z&yW9+J$r@trnpsWoPF)~IS!`t^3!#ng= zGUdb*1xy*=-fqHWm)FHLQ}f7ex&7C+5cq8sFO6^c{FTL9P&>5{iJp;q3NW=D_deix z&|%Y4X3*v?G4#)_(fs5fmA%f-5EbS(@T!SIA&^Z|d*gdu2<7nrh-pCou!Q0@1G~d{ zgf4K6Ks({026OPT`B^i8g`F#6b32gqeS9Mgp+^d-Wa-$c{@I_pLh)zbQCgQsi6(S0!xFj$}a9Djo#CyK-jhk>lYr zD8n#IJS2dYl2lC{d9mNj}ziXeg-CgcJUT_-4k(jY;&0pcoc1|(g&_!Bgz7P zaGmhKfhe-Lje*PXaw=%)(_mtll8M_v>%yo!a!kT_gUqpYYF$|BF`t^I)Y)_OI76>C zMEyQxubSGFaz$l6sewwL9@hq@T=rn~xI}bv%EzKOK8PzS$Jqv1z&|SI z83cYY=4^c^D@D)VqdWiba;^eMaFOU>AO46tYBX0H+~}J@^^SJ9@nRc@aA#mIL{+Q`=!JutJ-V+tcJc8h z!Ngw-fl1iiE8tY425z!?2~{C4{vWmdVMMCial9*cVa2qbF!y}9H4G=5(j20+%0gaz zn`(kZw!|&7BT7J4h_IZ*YHn$uCMInWF}im zLfd|d0ugLUd7}{PbBi&llK6v3(qPNIs;>Qcq3Ou zJ6CHUK*groioHl1E{z|s{h~Z#@{=N8t8pI{cIZT&-NHc4-T|dm zgrm2)a1N1oz}urpufJ#YY|_zivEeK31>P0;CbyAfAdIt7`>_$`x-Q_ulJow=z`F4` zmgC+Kxp6&)yz)NNwc+83aoGX7`+y6*A?}WyS9!7I zfvpmgZx_|!+aFcQU)7`s_I=vgcHc8DO6a9F+4hLiqZbX|3fY|!u_mak6R5DRQnC+* zX|0Q>-A5Rt4GuD2q{zotr820 zuaBP{_*6yQ({-zP2%`V^h2$=IZr`Wg-M1pv&b=E=@D9XsjdXgNj2P7s?=OYFjTw-V zrq_yus;zGcx{j-f?Kc-FQMDpNE`v7eH)n50t(NpX|Aci>+x4jprv~0`^>J?`*4(2# zOi1DW1o^{{0mNo1GVpa9u7v-)ThYIXa{uAP|HtL%uiIUqqLss}Fr4>2K(u>e~D{Bul#b2COitV!sV(cJz@9hY3fS-XY)MI}3H@hbSS(Hz)D41PUQ9+6i>SlD`$}1G6Hp$=hmlV*%WE3bt46-0}_4L^B3GUZiL-ca*M4y!+O^4i^pbljdzfJ~;B+ zD9pMJ8xFr4(?6gU9+@jY&0Kr6Nw7O9GW%@bVni2umTlA)AD97rD1q0wid10w2E(}Q zJP4-|6Kr!oY8kAfnAte|HdA_!a@&Np&KNZwETFt!cvdcEQMM~jhMi|oDhNDO&v3k4 zF0!?Bn_xz9Fh;|OjVB*fYf#~R@%fh(=bU=b=%gn5ci}DcOio4)Cvd_v5`)!SXmFRo zsVg)gXqoEV9HL~i1Z1vxSw5v++PL*6yWEk5sA@l%fc<@?k6>Fx*KTJ4^-wE$G;3J& zKEBba+k%gJCV8<9O9*iL`?^`Kd_tt+1tD9emZBN|O8W(%s=Qej7O1R^z~v9h;r*-x zp|0pk*N7XepWDeno&+863C?~vfg56CW79zFVzj1EjBJ6kx@?FSJN4NoD}zJP!)`@R zK~(5*5qm>D086+zqwMPOIoCfXW=oy0Yys+sM9e-S=%BB@hhCi(;>_+|3lM$u42|?` z0yh?s!seV+wD%tkXcS|DqRlpVWvDI{v zgFsA-$0-Dypz!iO@w2t;4e6jHoK0Aqj%tg+tRsmsmRL+wg&fl#J=gdzg&7jQrNHwm zyxsXKTm8==&Odi3`7^|kGP5!gHPZV(@r{$5##iShH14|7R&xytW7OM%tQl(cqlP00 zc)bT*FzzUhr6Fy7t^RDK7+~%@pclF6raYp2`YWvo&%=!9)T+y9nQtOwhq}7l;YciT z)n@vmf}!}xwmNi3=G;H_DhK^5S3?NV9i!1B@E^ZBrv8ZajgUcqptv=-6>Si!RnZGh zahCd?`{PQ3zDk{VjvyO77 zRlQNQghriJ0BC%8phcK1WMxO4^i>G*>sd>~_IWa&M1GU{VFV>+SN6g%yjc`-;`)rw7nQfCz&c zXqRn0M6DFrHNr41bA1F8$&7w>;vWl9){^8m&Az0PDJd-1L|O7Khf;BnVW$4*KW+SIr9MO8^{u{l8NbfJ?+j_#RWk0>w@_wMTb<(;h>OU)d@qvCA3=)hWCKo(T}Ml+>gwwQ*>I1ZULy({gf7Q(Gk(6nof`J_3_V>Ge?irn#e3yRW?x?~edfh0}Bx!&#J~m({&I5QaM-2sFLXeXmX!cCo*_gI1g< zfTW)%A26fO(HmR-aHsixzd*Q0+gu;FMz42D{#2(_I~QOobtm= zC&aE-J%lBm%I+%gkATzyxE5cw=&SEgHKC%V2tPP~%`I*Y)Xbr*AoI|5f>;10HLkX# zmA1npq;s++K9S^>j2uj8cFop2G}F!H3x!w`lEY>yLk@!b_Akc zb88R4x`OZ!L}xoAN;3KqSr*O&LyB&*&FUfC=Ziew*Rg$evDoT|;i};WHNme7TZA-f zrn&>zgB>?fu=nGJ zu8g>6ETW4r>op&+6-Jd)qme7sG{LR%mdPt&gfR`#l?r_KHi_Y3GyYjS`;)%m_wuL} zc6+ikwR(g@J5t2)Pl7|o7 z1#c4)bU+d+6q5&blWd#IOHPmMxA)D--vCR&G99J^KCskiigbJai2nL)gh6!>6VJc4 z+F>bz0-gA%bQI|bI+MAYshow8Bi!gN1iq;R%mysAQv|_!0skhUl7foY4(?VJBo?WcwF@4J%>#;m(3=*HH$Ep-~cd= zsZajNktzkuDkoAo9xw8@WVl3=6L2QOe4XAKvznBw@kVE7XYnJbN)@0S@x;TFUG~lD z*vY;-1#mfO-&#hGesE;YYK4B9vx5V5FyvX$;%47;1dOupDzSp%LKs0|=z8n?g}}-r zeqmJh2um?;W8zB8T?{caD`mX$mLz5QNoxl6DrN5=}V+j0v`P_1TJd z2**mABRMIe!j1>^-BH_=JpB+6dghrev{sh@ud)KZh?vUL9E@)M6gAAXp`5MD>t~2n zS#uzv8yUqdrlz_TJXJ#Qi&l-Z2fD@bO~7{=Zq%uf(gl$b8%0L<6!)AY-2&zCWyGFm zzTT8C7@zuva+g^t^bVY96X>~>gOsn$6<12UXo^Os4^>x|#ak%Iyba0@i7g|17KE`A zC#m)kk3=! zinpJl&nbOtz`VTAD=b;?zHrMondWboUY010m*{iOvt+-FH^{l&?oBwOxqT$m;RdQ? zgI72qu3V_-d}bxT{C;d%zMzM)(YHh_5!RZ0b`!65=s;-wa0B#ylvt!=dmdYbI*>i4 zq~y3!zx>(!_5@>NstJyWh+%6s3N2v>$lk~=ayPvdke-P>Az(ybvwQb*Oju#m5k$|C zx}>r_CbH{jDUqtS!i-DTuhoYX;(|3z{|90Ms~~{mut_g+{y6wCCc7mn!aKp6I7c0mrNhYkrs*o{5Y zRop>~p0qW$C33bI^P7|Vxdta&ZUQTkbxH5+Ycgn3-G}{hDi%9(wR<=ON4tNwxdzuz zcQo?5`Kk}U0>T`Fd?BxIu$UDmMj5|ww`)TC5frV+#HVJlyZqh3Y>G;)6~xOuNrpEK zfQ?l0rKD9K>J9zs8k!2yIz7>^OMbyiQ6lB%RViDGLk7JC-PIyd20G`_ zA|Y9VRyBVrUwh(8qfFwONE0ZJGo%Tx_S_&eR`|xekqG+l8zYu)=S>@Z=TU+lQv)bB zs!&t3SZezg<0H*OoRp5^aB`HOyd}xOYc-BYXe;ZESF&fw@OfqW34_M)7 z&>U6_)39-WaV!_2;PlJ8-ESv+vYTHBT@p8fBCM3e)H9x{sgymFyXHLQ?D;I~Wkwa- zg#$wwTVl}z)&T8s{lz%NJa-^y1G({MX`f!}JVD{tQ2xL?{^xM$-woEr@E?P9ifNPX zr9%shUX7_IPv+H7g)2YyBSuR_8woHi5M7Tn2vn5TBqk3~G1vllkwyMV<0Gh79sQO) zDKfZWxykcQb9bzJs(YwAB?q-cAOB9BKH_b-SH2yrQV8Sv*U%1AD>1<*$-oBcxql<<15RIL3ycqY@isT1>IvW5vh+zH)G zriRs{Sv+UZvXiG`kt5sj&%m1UxemCY^-!UxuSSjj6ffF(I?aNB5) z1yi!+G!;t|U!3-8biJU4C6PQaIcI0@`=dutg5mP2z6Y<*(9Rem<7B%n)91m(?fEEe zH11JwaBqJWJb>rprQ7x`!aoS^#0-;1B+z)m&qT888h^oqqK~DhK=6kNb?u&#X)x!{na^p&GMit0=$#-k! z?y@b+)`#uo>j@W5Su^*~Al#5rtSgumP~7Npk^t9a6auV?tO~8jiR$QOi77MpI+YVu zg?9!o85{Y)zF}EQF?poN`RhXjMxff_`$MUTn-G-Xlbs0(m>u$gbK0R{0W`%mg*D>t zdM^1)l5;(jdBf#P8eMNuzl-8m>Bru+t?a)Cd(%_5$ahg&alt|C-;A({RgO!%5YBH& zDO%u{aiMF~$ne6sSzF>e(wLQbq7z)tEJUsE;UCY4D=b7|H_wLjcQ46h1;h z+ue>K378pZ-Q+rU`zX>!57G2jvD@J7153y@3k zHzx8N-j^lGx`S+L6wg=Ae%2)ortx_auZ-YE1Q-ZCA5;vzZ>@}^y;uxn?78MfB>rxgc}`9Ig4c8m ziXU-SrpPAR-OaSOYjQa&J#tlQ)gSHqP5sWqQ=w1hpm^V@9x#kR{UzLG} zILAGIODz>4v!o*%YAQq!=cE`%=^d5R20t{E{I$bZk1zyh73n247zDSCLmbD1s;J)L z&O_c|vtfkZ7Rv!uxi*L1J`7Pek4ys|oY%ym$s6Afc4rv!7D7m0i#&u)KQQ-W7@|RT zDsxzarbocs7undGD}&Q-mM3!(_$(?&9|gw8JmAs<)=T)q=i z0C&dDzE330xL3yp*>G=pFg+WW1LG-HyS4Yn&fcl(m|>wK{^kI$jC~+w0Bx2Bj3t?VRT1Bg6 zT-1_Yz|&fs4M=HKRNL`WKys0ockrei(rARQdBIC1@8r5M-Z%>`*| z9LuWk?5#GTL8$7?R#fcUJKoi6v8HLIlxnO}&F=b`O6F!DNr^|+s)$P)VqmL#fa_1$)Wta|Pz1p{F2mV^uO(YH;ec8$i|0-1vkvv=NsA(UShPKeCUF>sIy z=5n$V4kCSbkCt~f^*{hU!>}QOJ-KVNsKkpE_Qi?nG@c&{WrEpN_3B{m5+v>^qKD;T)dxq{-u zRQQmA*2Ich-BlV8TrlYkZ=+&%PXXz&=0BDLgj=9-+RUIwe{(wJGDE^|r0r&h#LQK5 zSo^in$ljd9jT1lQyH_w}!7e2`uuZUA_q|Q8w{6H6Zu9W>;`)H*LdwV737A6u9T1uy zwu6X(e=AYr8o{ox7}Zed>rlHs}=} zAUq8O@X64cXUCsfFw9}zXooE*RlcIEOOS@76u-{CC*pHYI38mJ1WSJBG4RuDb8P=^ z3r?H@Hn^{N#iiPSucz5qsZ-`|(mRp%)+hJ!&ep3U(Ay@q#pO+2oCV39MSGojt7q#> z-FfKyTRbiXw+3)T50oN{_l+(=kc?~XCB+5aMbswrxG_N<21 zn8zh=tiHy+3|Gr)aQ1X{tLM3s{wU`bva zG@&N=ifbC7vm1CW7t%xVIZ4GexJ)lN71`M0smq}Qv*!H!WIR5QUc3^!YZGBEe=Up@ zFoECC8tw}FDze)>36t69nV|Q$rdyDon}L^ae|57EY+*b{`wHku{};f)KeM+Ae0<_k zUk0Ur(qbYL)D*s0`h%Z9_?WEQ5Xpf0U6g`LwywYMT7~5ch=K_4jY{X{s-f)Ym!*g? z`&oJ7I(>+hPU>(+YE9z9VuA1VjNRQ^|3K=u@pyYbL+FCH!q)u|R9x%I@N)x6^DFiP zL54u_QjI&U4Z~SWn4w12UQ?cq76NfWBZ}*W zdj}$v0JeJ<-EvNI(r(S{;&rhx%A+8$4_x7~)46J`1O6ZkI&wEQe4L&DaTw=s9ayX` ziUq*t==*OtL*xO$P(Z(1O4fn&*v?a#5Tesj`tuGhLFg!^=;F#kh|4OoHJ-^kjNOaMwdh|X6mj%Mb{j~IDIlR)iYs~~knI&O?o zyewh{kzII`l=Z%*6>&TW5_S%nj&K_XmSz{iERAhOv%f(ZI`Wi;{OwOtPr7{9;m}vY z-0E+k(*H)+_~Xs^C&YUEpPknSKOqZp%qWK5qwdw!i76=b;fs2Wg!fo>u5e}=`o!ua zYek>IUXDnoQF(E(vfpK+OlA`#FzXrD>kiL8-<%&a#xHqzya8P!R5+}6k}#}Kr|d+= zFHV|+GoqLZ=VD~?d|okdOj8zg8Hf(CCu1R@&Ra^bgZgsG9D*vD2X`?+=d~_=*Ews2 z-Iar{+PhF~%6TJ64sny}qG`SAdexg7SDd8zRzHlN%bVR(!@_8)8BQfzuxutrT>(PF zqQ5xgtT|Fw>03)|UQ-A)I30G<=2r)nu~^8_Ngk*-E>l@m+~QSJa1oi#xAxLK&>kxl z8zrl>kbX6o4UECmqt;i0rWPpeF?z3r@^2|IuF)?hunY&h+B=Qxl&U|_ zyjYW5+kL)dAyi>Jo}1%EUaIw^=r(-=pVO!JZ0o5?31)OwZLMzE9wij+0P#xLB+xsu zj+$O4H|f6yYH2=fHZsiVl(|3smKS9*6=bnD9&2Pc`>arHP@nnh9ka#iC|8aYvOLbq z-#QK5iM%o|*pl`g5$PDx_Z{9gw0wl&CQyNBC)7y)DuzvVQCN@}vkUKfonT~mNGipEF5WD6;X{;SIzW~417JWVQXU-b{Uf*(4%#FMIG5qeyPQo0QK z<3T@ShO>EJqojj$M7_8LNP7EeQA<-oZJ}8Cl^$sSh@_P1(q{d>mb2;KF6V!4PX5i2T3@W_&NNWm zu3!cjFn)0>y6fuY2^;6%HnoiJPo5s2J_f}Wvh!QK{usVkj1e@DmO{TOS=|L5#`rNf zSni22r}=(6F%GkU?|p@xghpbEi(4^WnK;~D<5<%fyylFH`9S+>mF&d6wU#UK8Oyn; zN4M3*r@8q&`kGU#pK>-;>Q1>M^PA?9b0ggJKUaL~H=0FsA(%nZmog#E+MO-8!BD%+ zJfCa6L!wR}aFy&KU!YbeNDTX5a!lN1-ATUK_mtpcb4ZjEC?e#kOtRwkx)6 z+rC+QpLWh&r|rGly$|y#FZt&j;~VJx>zxk~7ze-+f1ts}>Us|Y6u&1( zEM?5E|Bu%v``@UrMPYx5)A0R|I1MH_aiB2#FYbS5^2r|!1?Kd<4$1kCE0KRe_fY%} zy>B}_>u-%SGaKuF{)$8eY1uVC1h05DhL#4t=VNpf2f`g6`9T^8)ZE7emc&_+Q@cIO zIbrPTgGTvJG_nH1-cH^!{Y8GO9Ej2+E+)?3R}&qH-XEWCpxZP}!1Fh=!{zK9aB{st z(bD)f5D$WhCGR0}R!y%UR|7C4dbRmTFQpjphL6H9KV7hJk)b!xQ|*t|iju$Nl4=&% zQBCxbq=z`_L<;1qJ>Fjih(jYBjN({;Q_CSU4+Z~3&#E)TUEFFE2s4JY`70haX+-xz z_P&WzE3)>zF6%=Rr6ND3f6@FJiF9~|kCY2K2%C%F%w5+yN8>t^CVkiFQwWS1~&^^HOn1sj*t6 zzLj#~QAM)ku-`uBnRcMq-q4&49w;(zZge`)gk^*UXaQvuAd&IpgO61dT45XkLp0rcs*d&XaH42ZW^2LbH zLk`{l0&5E8=-&=JuX9pt85Jc_ja&EZ9@^kTU5MxB<$Pl1GC5}A?k!{sHpXZV%Zz!5 zQ@oRkt^ZZmPcw)KMHB`I!x#bX3bum@HD!v~Q)9^y9HdhZEIO9dSMRpKhSD|lbTSH) zeFxlM@eR2Iab94JDYVh#{_F_R2c!F9)R7kr`a}aY#4tnj+;Kg&m!(;#IIX(IP)Kho zbJgUy5%Joi{ArzqIQ)b)UVlSw%z!?~r7e7;4hyWBW5FIwdx;|l)4$(pHuq>zb>^yY zj;6I^7x)anQml4J&53}%nGf18mG>h3QzPzWOyc;Fv*ipbkYNFcXvL6&Cfq#Ti(tv` zte^=~>}PwNtPn>e^Me!BvxFqO&kGoUIhDv0irl=Xr zx#;Oc4uOOsB1ioEBhl^Z{BR5bKt=e89w4=(5DJGOj6vM>B6tj|W3>gbDb*V5{O)gY z#eVLH_~JSWTr96Ae;Crwe;nv);GKy*-$hvHKNexa?{o5h-46S&lhDCY&)U)9p9f)P z!av)}DMEpP-9m^kl@9;pAhhZb2`PV(HEFY1DA`N|=O1aLnWTl!wK(`VPD3{nnE0M| zXKYzoNFhE%5+-aPnO|Al$r~5V+4#J`e1K?gJH8-HNL&fqGXMy#o&a$D6(CT}vcz(& zG!i*>oMgR<*4YpKoA6VRFzD!|3X2OtX5@(?h32Y3<_QpnlGW$T8jqIV!YuhsXVqLk z=u5zUW32rC)!YdezYXe}Pe>b`O|0xUo75g-pX|nBB~zMMaj_yZU*_(g7CABTQ+-K7 zL^$5(QVu$u($~Q3B-(m`{PeyQWT?u6#2oZ&jhc_Sq)@(GkLH%}u(_a*rBp&U*MtYAi4Q$mE}DHFn!YLqy11G1nxZWZGs!H=0|Kc!+1*JIYp4MZlW(1HxWbb189j8aH!zb*shCv=9K zQhu`oyItZ^uEtir$kaqk<7^uiz@h2>Fu* zBd|HQ8fksdIqqUW(S%?75aJRJKWE*@wNy)l)2!;O)l&UIQ+*-CukmPy5A?!~SFsMq z_2|vu8@;r+YKQ4cWlO9>;?ro3LTk2^ywd85%Ab{wZlNTo67Nzd_jwfIq zcsM3lk;~7MYmh8PwE2Wg(G%*$G0Y=o%5rY1=o#l$HEfDVN9;y;Uy`CL!joiBC3aYm z%h!`;a4FWN;F;8(cCho$Gt$i)xwl6jnm#A$nnvHQlmD76_=Q#hYYqPM);rmc@Rh9d zF3T&Azuou2@U(${}nT)XJB@qLMGCyTIgeSGtya^`V(? za5P99vIt3#mU`Nzx?HQ#%?X6fF;{!bz4)vwesOy|3-2&wWZSyxD9$Pey!lA zg4B_;4GXBY@Zf(HRLUx~XpkhDQ{>5^LN`x<`zUp~YM#xqfVWm1VtUr{8;SG+S&TIZ z>&zp_suih&qz2unHm2vI94kNDWM>u9zO+u{f*kP_K9QLO> z4~g4~9`~Cc?s8JFkEAYtX#=F8tyQt*F|$=BqN+gkr5;nJZ?H9yo4*6=r`;^vkujBi z{DfqjU{PvW{;NAd&8*R8$w!kp+%+y`{I6#nH6X{f#ej$kotdAa!gf{V5*X~)F!6Y9 zFzxlY5j3H-PRUFLQ4yl~DzC2xA$)EXj)8EuGxNy7UQ9tedmMdM{mdMsl57*EaEjbR zW5^{_m2P${8n<(?wOR88kW7&PjW{lLF(5%BEZ*jW4-xpv5mN5P@J!@@%I<>L3&HCcp);ovVsJvhRV@6Ay3*tQvzj zU`d5G*hVbaS2vwC8goPKgBqmEQ+~KxW^6R^1oIJ!{7|VLfy#7}VmlDmPF1aW1?2B7 z&+2HAsz+|GwmksoZ$slTj=755*6RY5N@RUmDr&Y0Nm7@V#v>=KwR~AL<(_|pDT1AA zUEmgktqco2v0o-!e0ZvQUV_<0ZwCp5`-F)yFuie2?cX6k?>aeK4~7`GTC3tj$~dyAmC<15~k?6#IRnD7N{R zAQ7QK?3j$o+4;_(w~@WQ3Z>v=Q$eA5@tXPM<&Oz$RH{^(6s+j8y!_6G7$zWbepY2v z$2=+@X3#SX1bv|phM*lPH;NElL7#hiN0uBBrgez?)5}iPu?4>@o5o;#5YZfG0s;y|N--aSOW_UpJ+Tmf#g>#xVph zZczZs$=}(1BrN_QS1Br~H!pr``$ZrLoK;NQKY5?fQxyrHaGkh(I8+4R8nB5}4)f!c zf$s*$VPr5NPiH5Uy4OS5_g?WwjSeu0QVubUe#pDttXIRR5FX3J?}(qik6HmdRzTcg zYtlKxn#aU$o(*7D$E7Do>a>2|HNE*Vs-RrQe$W?iW_TLdWD^?6a(PSi{D_2llaC0S z?C-%_h~)VXmS;G(JM4bJM&!9oNL9j;rp1K;QH)hzb$f&OenQI&XkG=GvU1lehsAOU z0*w*+aTOH7AIbo8%$8g!wO42kt{?y4#GRXs3cr4*Q}ur&KNI|$bh36fvb3@NFVsKs zI|Taa5rnHHL(E(oxmdU!FTf-%+kr|$K;;TNeZ@uODUWjJf9))(etSTp=+9CL6o}~S zxgBnDirzl|WdYs8EJG56B#JZ)#Q!U{>Arvo$rXot{6T>#|4t~dN#f4%7T>5N&Roev zga%5h42)Ipxgn~g!7P@JSO#PW?o+4!BjB9-B!$vz^TjMG&XDXjI0IH>YG|Dh@{24oZ#+ZR+Je09v#iHu=h1tXL)O~GQg-zg z;P`f102`_Pv0opNQl68KK51Au5{Ij+_<#}MPF|Ce5zy=1 zRD%_bg{d(`dxx0@T?4cK1XRfQNzvsx0>Zdd1q8%Fh0|!%kyAX4b>dP==QuJb@vX8v zlk!iEBMTd*eallNKqA`qq{_rd%Y|9WmA=_`|FuTKa<(?3I5F>`Vr^T?4eAN|#*m4I zG9&xfSO-9f^s**J+j+UeWunr73{d4ta}x7bI;I&JN$M}jW9sjF@GpMKb|xrx!h8t; ztwoXk;G-WRLoLzTi~9@{IEs|06*TRCE|05bz{k@MQ5lhr6K5jv@G@iU(2j&O6YXI0 z8Aa$Rbse)kr|4D1nM`4V8`*xk$}r8zjIJ6tRaVz0JZVMXQ)DztY8V-Fbgk|HF|ic6 z1`e?*6de>$j?oJoXq zHqS#S@ z_;nhXB?ZUEmKw?wpTzU*;W?Px7uQ%J%k!MBdCC(X!zrLei&j6iVv>EeR&Nu}`}umH z0ua9}&k&&o>Yz7Xe#}Q1;fRs_jS_@`aw*hch=>ToC!tVNsmj-s<>A-saV6PH2L?H{ zj+Pw@N(_Rr9PEYq(P0KHs>GGAo$PBm8(CR+I9VAnHzsZ9hZsISJ7m?gbf&95Y0YhB z8Xu=SSWX=^b&piW>9+jLmLOwgT)A*Z2)Ya|vU+8L$(&gx6*Qe3iN6VqFbh9WARt?( zo>CLAX9H_yX|)*j62`pkX5tR2_3`Gd)u}JNt$k39^!YN0D63!-YFQ%E9*STjip zGsbaYz0n^P+s_op%gc^x6l7;NlpAS+VwgwsjZkpzrOtYLXtr$I zMr|cPik@<4J_C32-8t>%qhF6~Iy{5fwoIown#lkxPh?`E^R!lnA(}yZyG2ZWOp>1K zFqD5sm$^HF?L*^3yj7*L_^4GU)rJFVzxN)@jSE|LQ;@H{XdDa=%qfJq-Cs4+&i>U| zr>M>77~-W?%baH(J9?=4)Oz!QLZqx+uM*aGFxyxb4I_*7$|{kGUOXADcr-}WmZDAW)|G|a zcBk1=l{y8jG1WQWYILGaVWPTz7f{T}>E6jSi~VQwf$1~EPeZyU3ZPRTXK8g#JZsv(l{mA5z%g5|{v@URw=)J_khCi& zY?{pOhOj}lWaD#bzjCqfeesL7fN?PfQ6qfHNS2-AJJg$1j5D7f}qy91A$!w+TRN$~;-wH?rrY0^eWCs24y zXFQj$Ww_^KpD3^H6?1?uh1-ZEju890b4~2tT_gthg}4Q-dUqLKzqei8P9e~-zA6|v z-hmLIDlM)dlGXkyxCNRPA##U>=P*Ew5(I#XIkk8&^r(o7;Z#!n5NG9J;`!at{y!pP zn4WHYl;`g8`G>PZ$X%aV4>AmVda!y=S>RNiyyYjHB1J_iaUx`&1;ZUi&?Oyr3|TRK0U9pl)Uv3BAU2&;DpC? zF`2JcrsgLF{Bp;y!c&qWg&|H(X6va#-L=A`k>TCKkT@-{M;5C_=x>Yb2h15K8nMpm zEGX-SPODjAZm0F}rm2oaNAcBRTpNdaDg4jj2U? zwf%EEhK9YY|`o2TxZ@ZcQ2gGdVFT|{QU^WBk z?~s|>-ypN9h`%5+f&T@WA^&^G?AoHb+WGt6%=>=+eH;9*$Oqs1rT_aJnv zmT&ypJy6ZI}ToAAbGAQiMz8MX+LfwYd>fn8|+co%eegrVuOd%|eGuhq5 zI4hIR;a`IVz~s)fUl}Mf^eKphC4I}DWsiT;HePaCPvZx@z72I=ESYIZiY({&-h?9Z zg_DNtmqa?q?Zuy+F6TrT8dHRpmobu9()-l@le^OhGA{irs+T>sd9To1Ii?ry{TQE* zxnL;L;D%yg6*vQTj>W2+r!;V>asbFNhFo#q7Pypr>30m&(-JkCLaEj=jH|bP0DdBS zBQoil*~R2X$yEVKN;-u^RRz^>Co@Pr3AtLuhKj*7lKFiPa~!t!Mbr#FyUlA$0im2M z4#drUPv6V45KeLms-IUaoa$OiTk71Xf83+j=p5RRbQ=BxZ($;v`mC4_|E$x9A>{FA;60U>1D& z1-ZrH$Wz$qTd(ui3l_Vmq=x-|!DHXgzfXl9|M~_0mtep@5tBk?D-~>El;5NvNXc@N z(54sAxz!zkN-w zN+n51_tjZ(HB0hruJblA=w{>d(O{10V;7gyLAa&YYs8j;@l+w7#h_^{>)~Bhqfxv` zQ_Ao`VuGj>KtY#kk3&j(0lg;heMGdU6O!BD551=+RP7hb#Q4-~T1ITG28f{dIS z;)Q%roEx+}HVgFe;hufTFJl9LL}D_pq3||Y>Zra#DQ1gv-&s+ZpJmBQIPn1OV<&(nypuF3d=mvsh`Z1}dVR2ScePb}Z6cTrrf zl|^SpGFN~aW%Rm5#MVUZ39_0pr)SXxDp{4~8gKX5Q8jP^0`;IRPCyh=#S&boC zH+^!A;gVrDoEG)_^MR;c1zScaA!-|vb7+{# ziK$LL^Uva@Dkk%2RQf+jdNp~A$*>nhUZ)p=o_Z?tK(h}`>CB~o_;2Y*{MQqfUvukT2o3Mc4@2!5>P!&+w5nrHsBJOOFbPHi` z9s7Sp4`oACx?k^==$KC}eEkDXYK}aiO!{tpb)o;$8TW6&S)rq${lXDZEPng2KF1$;v259_;`7Cmfn?_a5zgBCPR^IcONd} zHFv@a=0?CzQyV8Y#vP?OV`|TU)t};&!gNBvW>C9H@va*xr8Z0CmlXG-CWiVzD03oP zvbo@q(w6F6Ef@Ij7FqyaCv28uI=T&-T}#*ZZP^;zqCYhLDoMc! zUp>g`RU%E*bM(*_hU;`QTDvImC@QpaT{p_wBeYZ|9_RAHZ(zcE(d0`*=Nkf8u|MaN z>2Mg-uV^b8bx76nxN1SI+@IIV9Mj)DpuG!aQgoffTddr$P=s--TOrT(HE~|R^;4C7D7j|8ct^4!x3sBy5 zXzoxSDNiX+ zdYjot&^=g8zCu4xQy`=u#aFB<8QM-Dcl6yz3q(CE5;qeYoo~hAKg!}<#8W&lTVuB_+8rZY8R1MzWB~g#Q@`FD4gH9&xB!A3P%; zBZ^NFZ;c);Zizr^4V6^f-V5|f{iJ4kUH#LX!lEJUvcjlF65hgihcB0Ftr!B|XzeN0#rLRPM#)#O+WDw!7t4dYmSOG*3l{ewL+M$tAB{XIWXA`ax^K_NM5M5gs(WUd8ta zgMJ*L;9?||3x?>qIs>{5(odq5bC%eb{DNN79pTt%0NmBWojn5gTcr5NS{2F}gPqu# z4SiO+aqlZrALfmmLGLRhLa|_YtS3_K>WlIYDB}*3dNLp%E^+gxYl~**8~;5xwgB*l z_oDFu)`iLX(Z#d#z{gK)_=&F*r+hrsXjPqOV%9-x>2kG$l_2e?-GjJ5oS7nInu*nG z{C65Fd*q678GmS@_QU#cqkWYtJXIprDe)$%GS1HHv3KGzsR_xNU$~9i+yc`$C^q0n zEjc#t)X7%$#KJ$4lQBZ8k0li_5S=F4?_dwP-=?i-Z#bh9tyhy41uc!6|DcalvCZv- zKG<{AWB9#aPw)^8I^i=_>s0L-?zu`qjOkEc4~p|E@J?vwos*!d`>5=pqV1}!hl{LV zTdIhh8OA3_UBg96Wz*!^)&){P%@E!sP14bxIJ)8?Huau=q6uy(|Q(0gI zh&2L^b;+=&$r>&f<&9r=W-wMFsgu!$S;h|Nf>K!pycsRsGeimn=_`D~RuT zjW}-{2jHE|cHdr><~vEd56`S}&GIURrSnR4i9y9Efr8NZj7iQ#{y90@SMHeO{jE5C(?ZOWEYtLqQ z7LY>Sw@ZEl$`;2 z3S+F~(wH*_P-H5+*f5-cMa^1>xjGJ2J}}`5C_nrCe#bjg-4D4Nog@u<>bfOtr6V!JlE z5+)@|uk);#SurYl^w`l?@Z&La`jKSnUr$13v(xN!67-~68fghUjp&V*S}6N|ou#0Q zKlt=IJ-_0pLp$7>qL&UnKPXwj2uZwbK7TY(#hD1s`iUc$QXB&BR6Y(KN3uaq$4kKF zapPXiTJFA|nMp_eOqy74=)XA%8q&T*yO%|S@SxZEb|JfmcSqjkPpAdaSVuL=P(jCSMxp3rhD!M01*k&)4R4 zf`@=Gu{)~djw}%KK_irVka#L@VF0DUmC`PNKOmxW$4&HN0o8gk-%RT_s_qD?X6KEKVQmdA<^%RX%sdd z^k8p|VeLLQuz+m0EJDK|!l4&1B&!+KkAL4NNA3igEv)9{n`1sI4c>5{E6fp-5t~jl z!I1R%MrO7d)VCe^E#2S1GUiRJ1)J@<>E-xrc7SuZ*Wp!D)9HN~#C1jI@}_*=AtnjP zVvwu#yXIq3RtY`47tmPT0rX1Vf(?V6i+hxElCf~^KD%le7Koq0#TD$%CmaoiO3kr! z?Zh6EszL*fIeu87403KaFC-OmHvDONd-d-_1$nvky6!Zq8n6?I)U+x7WhBi-idi-})C1fCZT|JGpODO54%b27n-`E2n>(=Dq znMcNAoO;eOsk-ntlf@s7VS7J#Lf;>|w%gH} zcacVyYwH8=qzDldwsadfAeTrSHvGOWu(I&pmR=^bkM;`RGRGkds*-5!sN-%hRWW1k zu^L)!9m{ALUx)-Tp@>tM1+ClaFLi<8iog4W2~F2%I1$OVk+eYtB*WOlgDe$`;I@=# zBcIM=rzS`}4uJ`L%q#qsFWnq6Su{(}9QaXIk*iW9IyiLdG>3B@Y1CuM$(hA&HfB-6 zxmN0uXeRKD?o(>scxXE@0^+2~$yvtMaFGEIyoniFNtk-lX}BMp=AfBsln#C*ko%?P z?6O1z)7ReWmX*8qU+fX-moXClU@1(blVC4URSwj6sqiVHZTW8FgB)qb0QGAj=hNG-A)jV0`6YmB%XuR~s;^ zZne0CHB!PMKnC@+`2DuRvC`%D(i!iXU_y}@OZOioi$Y9R45bEN(Hmbub5f>oZk0DS zIc}(3E$W3U-*8W~jTzN04-(+uASBiWO+aOL%6TNJD2sJ76RSI+jl7H#&O&|jt1_C& zEu?FcgV0m<>0G;qm}oVO+s0|S&PJ6*)SvTNfMP=Q{asZ-zMOQ;tpLBBQt)*p;^o61 zj;d|iO`i@yo|-_XEsx~n@)I6zktgYr#UUr4i`B1^?=A~|^-1&*zsB#0XHZUig`1mV z$Wa`1m&Fpii?>hUxc&AKF`@_MH0xDfh!PXjym_4ZM~n>kyvC;qdg z9Ut!X{y^7}-LnNN!up-Ozjs4-QBcHUIEw99)(o=~^Fy}VX=Ew>H-5eLL-kuSlRA>s z<89LBxfj+W=gfmHn$}!H=W!QnDl9F2P^Y-#7kw+ffn>btPrOe2h$^xMxL2Fx;*+_C zpU;N$9~MGunUODZ-Q4#ATF%Z+ ziw2({5xQ@L}^~r?_#j1gr zgKf-Ci@HgP^zgh6Tfh8~9Yjjx_|Aj6a;|O2Qn1}k{kIlCoh-3?(DFn8EV?L`F(6!b z}M2}`?rgiJ-)pmy5~X4Z#1gQxk8kNYxq7fyRaoz*YlO+ zKjNgvp^*(LD(yD8ZH{)Mh^5{uR3!B%sRm_1G>>upmd}QBpa@5-OKGO{-2=c@kE+fNjvTpC z019Xj-SjP>L*o?Iw7ZWZGlG=y$@aM-mBrD9pabTqQyU|8T`U-oOPG%e8K5~Nn$hcT zVf#h&gXU?+yvqnDJ_TES#Gykb>8#U0=)qsrrcHPtErrlQ;sU$`g_;aOAac6JWN$U6 zSP2jVPAq_Lu}hF>TD_nDY7PK^uY?#XG-35X*Z#$pH4_k83KOTLI_LviA-Lf8a6BD| zsr6e$o;dSV9&+$+G2AT}a8@t(j|QUGcJNBsv=pV+quvDF@%tuL93V)?Re8Q*Twq6P z4%-C*1La+(hqJ77o^{|X>58nPuXG;GO(@q> zv>bGGB4F;m1du;LxV`8B;Gd5$+~b@eEd(gSs?o|~ z-Z!?adp8S5y)mR8Tv_kTX_G@wPxnx!o-SWL6jdJnJN*HA+gdiRAM|YrwN6xQl5!gg z4{(3#>Ws78q3WjDBl7t9D(Kt|o4ExXvtOT`LHQ2WFp96SD?KKN5X+cC6`RrdoidFH`R4H8)PKw?V0b6|Q$%P^Fv zFf&12Ax*lNihoq~mxLix{~-RuUUuHtrIX8S;OVO^T4ux!3D?`hQueW5JfccSJTxOS zPD||h7D@U;5A}U)_QBN5i);brl(*a0Sa3c5$RsyAC+foM>GeVyz^43m$-%U+{MIz) zgo86)rqsyk0*xIHQPciUi9I`Nk{_clbQ?O8ycylR4z(UnGto06I?koF1AeYaf(A!4 zRFyoik8(XFiPXPJJiS7DI~J4kvTVe)GUHLu$iz!=C>*gv zC<=rmT|;Mh;%ii&I>|oy2DZY{`fjku)X4?cxkY}VULXZ-%9WrDI~A|E&Y z273UwtsOurI;{tm>hM4z1n3Pww1CsZv#@zAd5-m{*uXGk8)#UxXv@47%8d@x3qLFj z_4KO*4YF>p!X`5fj38QpfH zR@{0uxkux&?V>8&HIh13)~>H3Y#a0wThw117Nucm68Tg4tsM;DpIIVW(CY1p*KqIj zWWFSeE!{8-ISqv($Ekv!Lu2OIv0+t`hv%@Ak&jwP8agdZUVgm^RU`g0>%8bx?Y z%Vqg~`*IH~SVB>s_*S41H<=doklgAixcxu{CJ|ZmkDP#k&^iP{uN`!qczlyiqJh?g zNP}bb>|E++k>uv8A+96GbFrBC7Ou+LL%w|d0vJvh5grK8doo*k2V^PMj=u^g#U(k3%a6DrHJ0R-CB|;wfVs*MgTCkcysna39Qm>% zhO#(I(;MIRVWROInrXBt(D#|U`<~N&J`AGE78;151{+bh5V@~?3amW`zZx4`7rktq1sIv5I1~XS>w7SD+<8Z z06yUp8)ICfKehmRWi0R3Y!pm6E6ggUL`GO==sx_1esbq))vhhdJ9zRAg18%#TZonP zKzP%^E@_mG)`}4@bY^>$PmR^KKew|Hel<=9Sv1j1T55xMc~D9eT<7KG9AFE@VNI?F;?2_{R19K2&u zO=|h0|7i{MIgpO!DyplB8{CrY5M9I)5FDaL#2qadQVg?YhfF%W5XrXGGRuwXRGB2{ zm=Pn~7(6#(*vf+3Y9;CRwz10`iy{Z|56?dEOn6Y=$Gh(G>jI`S2&9$gEQ;y`0axAC zLY$UWfa&bZEq_TF#&%7DjsoH0r|e6TkbqnsO^x+snP6dA*`EHDSV{8>zVscSG>aKPi3EPBB@C0B zQ=E4-PM7aEZOB?jX-2p0`X{8!xz#O$Gv>9htSg4+SpHaalz!X2PR zi_qUYOnda}Dh)U_d$ejC4xOyAm`?EZFmy=>8=j7NeJ^4P$a1sBE3d?6go9lCi?Cya zF|!4p{Z3Gzz`Hn+;nlZFK};i&iYB)x2HSZ&&{_vTp9V=*q(|$0VVknQ-gONNP0rkc z923kv+*IQ&k=WAYwQW8_2%Ddz92$I-i*WnbE?hSLPEJor&!KLjh+S4 zKnQxEvKJj}xXI?QJ-SqJhm8PDMwD^q_~Yq5D4{AnmQ`7Fmn3>MYtfZsU9<3@wY27j z@S)mt7!C0(p-cVkPcE3<*W8&$KGDD+f5xO>=g9WzNEm=BTLN|ds&_IMXXZ6*or=4? zn@RIH^9%7;)V-#C^L3E6KxL1AoWL|yK^*_&KXr3JdsSb!f2O_?Bu#InzY`NueD znZf08r*ln;1`aNc_}Nl5t?v684-&t(G1p%H5 z2@(SHQlW#^bNUi!QmSfVEwNjQJyJFWgm{RpmbfYPD5+_W!6dzJ3mI{<*3-=I`~LfU z4o^7AY!&T(jZJKBE?R{qp-IN*=5RJo=JlXv`x$O%%E^+*L_zHzBbgw-gxL@nbS+&qHm~PLy(y6Nr2Lv@(3!8ZdlGn{$TY$`Ef1G;z5k z%GhI(B<<{^>*j&Y?H0#@9WGj*vupVy4)amNa1DW9DNkE7Jpj}y=agv8UJDSk>UNFa zTcc0yY?6p@-b{^c+V#s`cX3THJ zIjuab6F=R~GcT#MEsT6rNDKMv5C6x=bGTYRNu}PFEE75*W5%Y{MB%=tlm>#xDo>unna@>OF)TBSOkEy2R*SzI@kVT9EB2$T!~tMmo7y1RQ^iW*}!zn)&3Az?PCM zaeA5#s%fZ5^FQkeQHS+j;8HLR>_8X8$Jl2|<(Ov>^}J}r7@wX00tFnM&m=H!-Z{zP!}Pcl+`}C5+iWXe^bEY`m2-n`KF)vgIGuBp z>oToW&mc9wFw^;wI$+PNV`yPJ2vw^ej%FakuJIA-- zJqek#O$3F1lwKT4d72tW^guD*$eXqX+^6`K)MbC-k(AOZVQ@ym*7lP^g(kbko`dm(l>!vEu9dXm8NM&2qgGi~;=*31|Bcf={{2M1p)&UauB>O=J!Tq`2 zZl(f|D{kbNTSb2+y;~3lcJn*5)j;!96Bj^xM=A95?!3OWsA>76qCTN?e01`zklrtN zRwPz~T@dQWvv?F(YPMXQl-TY9hmqW$l_gp$tNFS=M4Zb&2O$&az6tgS5SIPDwFE{z zt9U_!%4x=&NO;&Iwhf=F%@99>OW@YXO|Jk2^9}S84FHYoG6H!#PqiS=Z+6RZdTbPX z$1V*ioB1B{nw)y?GW-UEOwqW>4i9`%h_?SvXXhPH_4hw;NjBMA*~yHo%Mx z?~y%=h{_0+5lUwEj1Va#JCQ^bQdXt#JGXqw<=$K0-~0Q0Kk~=tKF{mC&g;C+>%7i+ zpTjsSDA4Vyt&>c0N2DhJIuVlc$_-MlBIWyB#+q;Z{@~KZv!X?gH&aHKJbkUI!s-j~ z2jfh%^@-l&ihS-Mcj4=+@VDpeJ>#c6Dj<}PjV~T7+y5;4etr(G25VYzd1n)g9~ZSx zWLFp|7QSx+nZS8fdSSUSJ6-#9+bSng-a{3ih89|G>fz0|O1)3%`*MfPZ1h{`vxM%! ziTQyN@ilS24{TIbFCvugM30gyf3CN+BsS)(=&<9Dt{Qx>R_6BpF4nNviS{2l?M0T= ziA0TU=ptig1?BASo%|NBNJ}=8YLYWLMJzm4*iJnmH8;06ao6dY@6eda?EJL2!!x0i ztWl&Rk}>f84V43hzG4DihXa2;mw}UKz(=MW*#N6o%LOEF%R>Hav``oEnN)=!?# zT$jxl7JVy(p(kheqE0#VIU`-=AV=r0?Guc!06e+HFpR4&jz>M+Hnyn~@i887o;M-F z4me7{jowd7R5IC^_poQ&x3yq1e}k*&9EMu9vvwzX;k)QSnF^oSDJQE#?KTwG&hm^A z*yc1{@=S>LQ)RGU7}UluW?=6LAHElRn>Ews&{lx!g>HBBE6+J*dI%kjSiK`^A*;7O zoYCvzNn6^%1NqpmiuH#sF<=*U=Lvm#^Rz}swRrleRGDfx-QwVMG}=8Sj_qr*Syol0 zqq?b>mo5{Wh^+d^sfwHQqK5a*awwfxaQIC%o37NCzQjYBk(Hb`2?=R@?KdOnUuG3LzI5wG@oZawIvUPklOD8g%}s3oDTN_X3|UVthlGHYeZS1aiYF0Rbyy@3=EU37@m*dnR+EuYQ@&Sy#jMcK`+J!^uHo67o@sB6xCZN{ zgiAhCco!9MFAP2Z(K;WhdT9AXvmI^48B@`?Bbvq31TWMrA{w6In<}SThJKht|HPKW zDR?gV5Y02Yq|=90kEwaoQ<+sux5u)`k)df(UV5ZIJ}5>fY}yu2YLcS0I*HMq=z1nw_k;F6#A*UWiyt?tL5%17Vg^n`daE2{D`ug${@z@W~ z1~iM|+Ly&6(zrR-g~kI`>szsHU!@3&Nb(k z>(9M>qZ@W5pXmE}MS($@7#E1pc+BE94`%189< z6g+X%XU0oJjI@+3O{<5fv6?Ow9X{ThGB1Z-n;|#wd9gvh{B)GwOCwC1yHE9Oc+lQv z>IEAdy3cf{ld4@`A@WQ|fx&5JZNf__v9Bk{2u6-zHLOuwO9*u&Srugy{lRnLu0Yg9 z39T?g3Ed)dhHp_u_mzYi1kJUWTWN3@Ft$Dt&R}BIxkM9QEm!!IUQAtb`;FvO_u(%Z zhr!)z4^NcTtb+w~$3rex^^6^Oj!iD0QI0BWJ$u3~{5CS>Sx1e)WB0o`#!utzX?rJZ z+XJ6FDVL!ackB4xa(`><%@kE1e>|gtj72+BR{M-0;qlL$Pbr@n#MSF%DpzN*DRh9%GQvBmuxtDqHy(^fw#67{PHTEydME_#RKzj49i!brN2U?? zX*O$`XW+J$!)j{(lf~=zzVg2t5+enB+^!nS??;qn>%O4q?2Blq8>B$rY}4E7d;w_FTQz z&Ya6acyVUpS{uJ=)V8XQxT;2v%>)&><}?15kaRPXB+HVZij5`j93{$=VdSZWSu$G5 zSxOL>sIKj?4|zCsdbB5?;&F~IzT^mH3yo9>Iuhu!;#RTKKDdFWEI6wFMeaw|nOs2! zR&R#%nwHt1^woE`rbVoxrEc5e_7K|inN3-t<}a=iVOS(dJw-VW5-7}D+~;O>%CkzI%_oP8cUq`x&%La6EHxEG<@0oI+W_TVUsirA9mEwZ`fqC%ml(?zTVGA=Q9L3&N{Ey4$L+l8l9yJ1O8CKTG zj82N;I*T}wq9)2t*TmiPj#X=}RXB@WVb5GU0ewx|R3?zOk=4&~{MMs9MiqN>`P)Pz z$-#m1RXf!Nfe{>6#vhzzkN=QM&?e1dlh~4vyOGwQnG+I4|E5;AhuQZA@#I_judUBd1oWadoN` z8qeX9E>@Nk$XGm>=ZhPOVmRE!iVcP|43%y2 zvt^`B%f&(4UBhj9Pt`E2o%pf%v`#ROVcreVn|*W6pG^9J0?sS@MHAQl?AzYCnp;ng ziJo`oz4YX(?Td!Ez_wz}5h?<1!RH(3=3KRX2B%2ovM>*Ooi9HAvES5DD7RlS=-ztR z{L5jp+pgc4Ul+2Z_XhX{pNf^##C&yLhGX^PLp4m{nu>WJ@x~9DBGemL<8RxmDa*I! zI4+33OYrR6$v5!4ZI9scT7tCO5A-6F>q-nB%$ zgz|n-o*&J_d>SV0Ro)k5GZKY;FECfjER+&cVQi^A_jbN`Q)4sa0+rg!v{2K$S46pC ziEnP?evTCixPL6L;AN?XNnT(xz2`V#um84{afEH9a=(58LqNb|uy7QCp4=?Jfb~Th z+>9GoL$4MzaD4s5yu!eXoOf<9>BnxeDxe+x;4h(cw6(QsrBf~aRa6{-=$3$gpWywv z4?O|IrD@wcy2mv&H|Lq#4e$B-e>;`!I4jmGH-J@dACW|dyYZCL|5Tla@1?PUs@i+} zR6UnVq^Yh_bBhr9TLqXbI4~Db>boqa&Zi`VXN<3v1Rqy>Jv<)G(5ZCHNjX+ZRJ1-> zFYlP?jcLAF3z6p<8fS#3^wkZ@PWEi;oU|KG$r(STc;fDNo!Zh5pR|K}U+tXd&-IO~ zplZBFA0IQtWVy3Ky2FL#=%w6KM$b{Wa&9n_(?L34tHYFBKI!yFw&Ayr(~ z1hoFI-mX}4bC8Y5unhYWmzLRZjWjiu_jz#8$6WdpAFVv27+K}_V$10I%xQ^?rs$hr zJ0~&1^*x>Z*^lM=S-r-NsAeE?&9N@{cm=1RKq$f`qa4C4b;qh-nS(oe+ z4Vhv;7M2O#Lmk67miskU&2d>%XS;K0gOd7X%hNRiUq&`g3`@lDUJfKB>r_dmQN3kzmV|N6m!F}$`#jzk$ZfvneOT-d&YA(F-mxR zZIInw!@*CkygWk4ahWZk+q`9%B{+y#EjfIxSIRUgAzVyoye$&Hwo1;!!^Q#^yHyp_ z!NNb~1<##P0*T{7a%7)n4M$5{={X<%Fxn9tI;&C&Yl;sUzQmI$I7^UE=B5@_t&Rr&!0O}N8nxc z1G_|_dgO6VQHME4X>*hGX}x<&`K=I*(x3&_Nad@FU-=t9;GEY=2)Y+7k5}7Xy{;!* zFIc@}+UkBeZYou^CBwx16YIF$Q;Fa@S)QtGx|o|vBpyG|znV~O=M{BNd@l{Hd(9}$ zDzzGZ+cO6_pu_gR{iW}9)G88k$Ceywt(^OqE`v#LS>ii8&YQRbi0cL zvW;#Qku9b*MI!1u!A4$_!v4uE>v)ZRC?|ORdLG2DXbWwm-loZ z4kdqcHku|>RXG;bLf3#798R`=vy^3Ys0|ykO2df$cF9%}-^F}g`djOG)@G}YLgb;C zEe_-On$6L3IYokB*|GH*Y zKbuQ|jvEb)EFRVFYS;(Gzjs$VLwum%E+mK##E-|%*@@@p_r-^Qexm{YGc>Rb{pW*x zuQu!wMbtESI5))2f%ktYK;-{ZfSao`tU41k4zA-}>z+S2^JPLs9h6>bR2xy@*OYLJ zo%o)%ip^D_eGBf>*C6g|U{w#W8V0>y&Y)mz!_1e<_F&k->Z9r*!R0 zuK5MKNTulk1~uDd#fPtsnMx%DuT;N!Xf!-b5&ke&)yv&Kj*N|G~w|`^<&99?_;AX>duaDb5_<=e5WwyUsS|+ z!{Wv+n>~fCSpXrklCF&>%)vg1kwEn(l3U4AX`&Zr#eqo)-PbF&U3>lgM_V!D_`AMMaXJ@d9m(@Tkz5fLx_` z{AcsY@z0k9bR(@AWpK#Z4=bzmbVX?DggwF#xT0I8JxyAPkxa%YtEek2sX@jnN=!v` zD(eoX^Idc@2=|8B#p}yry`w=lbC14ax(Y2PoMIx0M-ONPt#wO(ujzBI^91g~D zl~yQYD$i7Rkv3HfI^KFFYnZ!LNkzh?*Y8-Qr6D0%IU@b{jAXPL54C;Mrl5*@haSXW zq|=avPI$)|XJallGl6Z&d|H1^E7eNLpPS4GpI)UcpNdY0>+Uy-n3;9OK>P9kTG5zNG>~>8+VG~PE$)VhwLGx$Q z(u+?m+mx}_uDfZ`dqmup%|<(ZzQ#UYqX4^rC`0m=oTUdHM(hUJ^evt|RklRFr|BoF zuqLl3i4!Q3xfN5U-SQ~z#?bpF!!RKg6n#EXVRU4UGo4Q^6$kw$DY1s(RrR#9cRFeX z*5_mS=_R4$o0UvyK?=7?=tv!oJghzB5gBxB7RuSrC_g3?qCbxlC~Ye_f}X}?QYt@H ztbA<9#7JLV4=2nke6e5o`tji(%!h>%L4I5ojXKvQ6n|9z{FzO?q@{}Lv?5+JkCLbh zw~mOCOflRYzQ>;{NnLk`J@y=9uU(h)P3K&htx&cQ^1L)E_e9*ajX6DA($Pm#XIa?K z<9jK|x{;<^mr&`@S2MUW5>uDmy{gA)GVF13H6sBnwJKW10NV-co}=;Pa0(s`hh7>Q$#yVH2HILE z6|a(&HM^sym9CIy2~Xcm-;IP!e6pGC!$lMNof;(83y?o|x#JNZ4wLNGkC1v@TPz;aWIJQlcw1V5w!y_;oEp zG>tDkuOJL7Uc*~_4b$&2(HM_0F3Wh56P+Um=Zh&RnGQcnQHx(7(X4iF zXsz%u2-jfnX0}?@7tbd8O6e?VlE+h8$nqeX>bl|w04uPm%RO1_h?wZS%anX>R>*k(h?favnsFduH!3cGDpJUyb-aY8vh zaB~XV17C$y^6M+&SE`~@&7l`lEf#JC%3&E6l<3ktiPCPj%PwS^>}hT7qsa;|!O6QU ze@j^};d2lle|W4$g^-)hG0GNpv}R*@GYB z%B&Wn;bktIj>3C3koC>3$+9NfN!!`g>Aa~;)ekrD7m0C6a49WMY9*Cjj_DSd zZgo>^bsNf!jWT^f_~dBdm*+2}V+`N!=#$5Git9p_o^+kjuq?i~&=Xr)%TVrnoPS>T zT{b;smP&RghBw<~o-^(?q9ZxE*OF+hjUHYbqwYFKaJAb#HCw+}q}#e_U^wlYr%|AU z(Ru0}#azpoRC3NLk>LanNB4*458r0HGOD`HsMG*WtV#Aj@sq5hfz<&xsS$%!~E zGeLdtdhdzn7*UKdOP2ZJl43KmZQ#z~7SSdVpOQ{2#X0LU4eNzN>JLP2`N92Ma2wiF`U(M+FP7$6sjI_BAMjN@EpY>7qmEhQ@S#n;cq_@Y$rUD6r!gW@UWKnfD)P660RSS1=yMd$BV+ z(hRM;64(AR;PZ6Uh141|ycIN0^rhwg>_Cc_qMT-PF12xDZTEzYI-c6BR+NaRE{XwuF_| z<^GeHwW|?v;HLGS;-FwI;oG?J$3h5HR@#3U9RU-|ThA^ODE2(KJ%3xGHSj{>DH2`j zBCD(kulzCETcRCJRDiT*xWwi+h8mjsE?N{n^MK;t4?lDkK7N4=HaHfCpr%sq??HN2Y?EL+?s zVy5_TUv`Y;>hV9^Nf7UlEq{}^vGGkdJ@9_l%u(7HQHK%V&k|Y-)prRvt>U^?Ic(xy z)#yK?xIthN5Vra%_9fHTPJ>aJ_ulD_I6w5{W{76L-+pJI`Q;e)OM-z0GKi{Fy5Uuq z?H2>%n?G-DyscZ4PXRu@?&m=@Rgn7s#@=oo;Fw1bF9)cnu8(GqDz^%kvbwfXq24ET zF4dm5IzF7;dTy%fI;T$Qof4?v7b@rH*K+eA&_2a~O5h!bDmO>(v%U(!!PCR1XH|H+ zdAUESmG`J{sTMuI-__I4*{jJlrNYJWL`_wVr!}!(ovUjG{pXB@)(L%1fr$o%2on~82y7^`DS#R)8VDO<9?#xj) zo3?TSeax})#ICGB?}=NV&iJwzhMj(%q}58VPkvjc%BxiGZXHE-;oGzmI;YVvqeOd| z*6JP;N1T_^Hc|U*+-}9r2W`ja;Cy*9W(_am)TKZtE<1L?IvVB6$0lpFgri%h0;8Vn zu-ue9ugAt5|0?ro4kx^T~z9BFW3reB?`nC*}wE`-V4^eT}RuKjPnzKc4nP zN4M*c)-&D8mV8srXo67;Ph1;+bXV$A;C`6im5r+p%nKJ8$+9uNvjrW&dxO^fn4ZS) z+s{M&45FHbl)wonC&3gHd0SGzwTPw*)EBaQZ%fpb9+ks<-~!d+>U+gf-o|odl;$*M z4J35hWg66q!X+=>=Fce-T}RR^@F-?hQkyZXUs>hx&<7ka=3m|dEK!q zl72jk2WKgdKbe<)D?$S|x8fz1+{#+wWIXdDcTX1mIBGG?TY}${-qbCtEf{WS+0o_I zd=`WdO$py9RjC_Wo^!l*rQnQRg4+wDZ#8Qd&)R=$h;lO--3}g~|LQ-J{OMe3dBm|z z>E=+XhSBfnup?t|(PXUN16BB&)z3ZGN2<6Q%W316`V^=*=4r z-0-Ogs@%_Kr=}lQoFF}wj!k7G*g8;FS!*-O+E9W0@LlWCPq~*R*uwc(j} zSmUzJJHk-LW-g0kB;ctpZW&=yHLSWqRbpE&O;_(Vd-9#iQCkV?O;!ePi zxnt~KUq7iOV5?~-$w*NwNZae(z@sHFeM2H3ezAk{$ck#5Plz1PoOk03?{CYoQ_n~O z)dHVfKa1;dt=wO}EX`;~)rnzMcCGA5k10NB7gOgK#$0EfIh-SlS@u(;7}=2%KQ9|n z9v`z11uECUnPf=S-_I z5UA^tl3dIo9z9Q3$6jYI%B9|xE{&>9bqWg|gt2L%(aVx_^x+X#Dwe+`X zA4{AscfLzw)ILrX^SJZTR9o$*my6B(X4Yx%lA)OQ{LA{LiUlJLUo73+Y&{pp_|5i6 zm#_V(Zf|C{jp5Lf1{sZ7mov83qKoMtoBONY$1!22FH;GfMz<&kxKU39FJDgaO|wnHRtHBA)-SMoMkj8O}!{Wo_-K}Z1aKS+VwX$ zRWB;$rhcIN^xYujRAqJ1)hrfFua{Vj>gYJKGgBiX*9qOObf;$(*Zy=J5`=Rtfk1q~ z{jl&H+vST1?81CE+)vjJh}J{L=sw({W1*O5Xq z?iZs`_O`Rbw>G`uGPGr7RfeG-1nsN0?sx;OmhWI zVS|m$7+1d1T$Jez3j0FFkLA~UsO0KUU$+~^gTwU`fDt2j$KN6*R!nC9)y`HN1%T4qjhom*PmwzkNTJ;i2)1bMtOY_ z6`aomZs4aC?s@_3-(En{@2i}A5)~7r@U12#GEx%h2RUqhG-VyY1=#pXe-k_!9C{qO z$jYFgee~Myi4rm>@qmwX@n^c9xnC*;`2$!H+MZI0H48hy_Fbq;(x z(|(JmEUgrB3jzo7X$MYcP^cg4WvZ~Ke9{;0lBmgX(a)ihxA@q=yB&w(Gbv*Riqlo?J3-H{ZC7V{ifV2yKnS9G*KY`)HDYDWX*$52>nL)aG=1Tsy`7E~5-Qa#!b*(K2rezVA-vpl zV{B`4`zwZ9!r{XgFgFPFFmzNBl(Nk3zb2fOOTVRexZ?g{LjoR**i@BoCg(>C2?COm z3XU)&(my?0WA~^rr8U%6StNy!`G(=uJ~C_;$MthpX&*3*tmn35bB8rkG?~b^(O0*p0CKfQCVPZrISBYSt>>lrlS@t9OIgO#zH%*tZaTQX6BR^aOvf~ z`kyjbzqa?Ks(j{U>@kk6u)&T9TjVdR#-AzM##<|Eb;+P(D~l3;9YaT6YsTV~8|gtO zDNW>4_WdwyVBPM1R3Qsm;snZ;pxNJ}bfF$T4%WNpoc|XU&bBdSWldwzfRT00>h0LI zOKFJ=BzI}vI-ERg{J<&WBgIVVuM-Iet{OQji92odjQhLV`ba*UltP=rCFCBhnQ93a zjmVtVwb2rLXs`M8^7z&JSIebv&D9oBd_tEk)+H8u#exOy^zRQn7xbxHR-lI6cUbNhVyj`*mAz+EOe<{3M)Xq#7GPgE@^zu{4`Tt6nJvC#Zv z%CD;ZQcS_KilJroOS&sw6p}hRz5eg78gi=yRh;m2K0(TVmyPgf1Wx_h!xNn9*UD)x z3ngY>%Y&B8-bJ4|X_Cu+zm+K`k!^TDj!*si3%PGcrPqb9Z7oSTyp9tW%2cY4M$_Mw z|3psph-WeAXWNXY?o{c4wy{OoHb>#w=6_z^_;dOyY{>rkb7dC?uRShPT~pl=1pPs| z{iB1W5f>%a4PL5J_T9pjC&G|#{Z2(WmgvMXW)zYU1B>{*HmpQXiN9;|Urig|+QhSr zmA>e5@!Um8#3ywynszYx+S?j%Sd;0^gqi1LDOf}2p9q8b(CpY}IbFSXjNj`IXkU8vB z5%>L|9BW0t;*-IdhTbn|!=5L)bT`DGy(Nc7LF6@D_ZT4Ovb>HHaqbK3Y!kDEB&NJiA^Pn7b> zrPt?vAsBHJ_|gPD#okcuEHa)VNk=0aEz?wR{QdIalaIvI^a9<&V^&sy&t})$z$ue>K!{CAxlzbBL>ICM;J48TuK-}Z)WA1a!>G`*{}(<2U+Q@LmC0y`Oftj_)kM_ zG-Wty*L;7;(!|)a__AKi16#RkMXu~sIa|+_f&j;jyB4=1*4WAut6IC>Q)#Me2#e~Q z&4}Pm2fC8rat|EFIZExZLr^-!f9zy!tRrbf=-qItoJ!M*OzI!>j+UfhHbTOA1^pkX z=~I>Rd5?9M@dX7=2Bh$8raV+k;aI5rguBHm!`gA<(2Vsf#Q`$`sN9{zc9MBKZLe$M z4`=vB6~Fc}1ZG`)Loybcs>&dDRrlH^!Pmx`HyG_dPJHcSSiyX)CJRrulFOHE7w2W|9WIv+KfblSX{ab&!!*m z(RL{rj`i^H-FVg`zAD}z_GNWsz#rYsuu6Bf6-0G85X$s-Fk9r%_jS4%t)_nF2C63;z31bV! z64A*XPsN3#=8L~bG>!1Rey`wtVfn_=u`!p^CmH-P-w&O;B&|GL{S-?Kv+cuzgI2Tk z0JU2}m0kcxsM!a)q(@^9mQ0eR8(h4<^oWiWUDOy7#@E!%N&1-PqAR><9zHiPu$GV_ zMlf*ihIvK}-IrwZ3g^$Sq$HGsT78zbDcXL7u=@@O%6xhK(yKlcB5YnEHLr8xWC!WC zOdEBC@QE_9k6Grm=N2fE?km_mcQ)d6D&ZH`zBcPdpe=cbFaGg#dH4x@)e-NZvQTw` z8h1MQ5vNovY>X6`kuRfF<#f)l|-9JBGuf; zsQUU9lOvAY6y$fqi)V3Ogp!e7C7^OprnyZ~KYbO-ho={kl6OgvM*a4d_T#!5Ifu&Q zs{Cz>&(3(hn;g6Suz4G;?2-%`|FL_1mn*~5!i#VTXkUqcwwBJD(LI;6%KRwkT&)nnU2T@1@Obvv<~iSlM6UG! zt^6l}*ZfWeN7N^UGS4*&`rw#7GwY)piZO3xRIW~%^0DgLuT`iL6Gqx2u@ulGJX>FTp->#NpH zlIm;4{_Oa5qmpT;;d%|UyiwV)u-`>>R>Tl9@rv7VjZexanVAzXxMtt9Lrk@V6!|p`? zQLP8GoCTlgEe;vF-FECuzpMO6GvL~3R)X|MsXEuhqdBo&xH~xLOj=N4jHcHoujW_k zVXct04&#h|zWrWCraea_FY;nG}4NlnYuc+oR^y7 zgUXXnEtDpzJ)aX8$NR5ZXSCKvQ*ElG)Nsa!iI7shn=;D~C1S3aD17<-mgr}_hk=(S zpNCLzMBy56@}+= z1!l&PTM}?Rdl@EA+GFWy-@K3m}n1lzRy`sU5EXLS25x zOS$3h!=4DKmg7)5p;mGye&=@!U(%k9eCa$9sw!}p4)ZRSJv$j!k5TsI`Pb_2lVxOm zNC-&^mS$A4hs%XD*!#Wbt5p{bOe6D_ipEkmrtH8f-3SKEF9=Ek9OuHYl;T;-ZUnhjHf)@j$nJT0^$6 zLQY%RouP9O6P(hxKU{IwgH`Tp{ozm^qR$jnrNiD6GY56hA5JLG3QX=&naKR z+vWs%pzigbDnEoyhDL^l4gNQL^QH{Y^Y86yIB38n!acvYsBL${<}~m>Ro6)$Tmb*M z55U6C9{ux3fIol#R9#v_SwUV`k4If$KLPd&;E8`euo>r{=R9EkCj8oMhw8`7e|`!6 zx_9u$t{!$gc1{paPg@61dmd+~mxn9JK*QGu#`sT~({R8a{|5AhT6z9TVR-)BueZN| znkfghv)E{8!63j9g)6`Ul)JCGh$P-$!0vv%{pA>ZOx*AQeAt4XG+a4YVD0k%S`7#ICusA z0Ks3e|ICEx8F~FPls?yZ0aiWOLkj-C=dmUDSE-S-B#iZ+YQee2dmcfMJ^QHvluCpx z+WvVQfByz-@noX`c+$)@}}n066mwEfm0j5PKdwu%HA7 z+s(cF8pZc>IvZ)xHUWbJ_(rBZ6g0F1kmW+e(eiNhaj=1UAm+7TpQ~p8y!YURrOEz0 zqYQ|7dj9|2{kUJYLOLvOLBP2N^iKN+1pbl(qQc20=iuoE@v^o@EEH`Q5#wc0!FJyV$t7I=Ji}nY~}46!*At3?R{U@WN{=6%6SJL9(tcUcZmv-p@n3xPv|k zYR3hvA9&3@&%#M0JRPVl)C21BUmkfsv8Y#DPzOk72&nM-rv;rCPQss;MWHfS%EAVL zT)>(FEO@)G0~4P`!H&*b`I7Mr`)jQZGsoxJfgusxu1x__-CZi z!nJ^C#y~Xqnz{ks37XQK17kPdBKw7s{^w zMA`K=OmUF_2Ma*|Jbl6_aSBj~m$%1mR${;M#9!!`4gnPG_8)lVWt>4kb#?hKy|EuO zn8NFs(IZqm%-DefkqlDC0i@ZFO`0Ws&#K7jo);Y$QZvjf%&c;Q*k75A~g zdM;|mCgXeMg(Bc61G(T^QBL_F>!;^HT)~8g8{!H81k1<5hpmGu2SK}vmvwT0B6GQ? z(691{0H6{8!gqH^HRM24PIpk6Wxx**VGaa73|m)6O8kop!IEH86avhC@WM;ks)>|| zvS0OI(do7YGy@SQ^yZ`OagQ1HYigLi; zd7YnL2#_Km&%p492mZRRhZG40F~sK6xLzlH6wqFRml2MZYk-QjJ6GP{MPLL_)t?Xf z?!UkOIb^gCXa8&C-hsH0B=1fgm>r^d0g0I45DLf;CX&1=eD~gDua2*kRA(VuFObJKCZYx7zZQVmg4WfESF`dmax{)Y#oY z9A*5I9^G9a1sW(E_-NS5;h*Qc84@}?mPOb4_toM18$T}Mp(zKjN)_O@;WdJ3@lSBX zCQ9O5PErE|T?H?^hl{a7g4J^M@KScMbwvz>Rr)_8g&$k4SR(=cTyoxD-?KE~k#m3* z4J?2Y2L1hvq2$0;!BE=3>72)hsQ`2ty!^kRus^7ws04(8;hXF43Lt^wC)w`jdwIDX z=%N<+%`LDliVoz1Z;=6nzgN=J`)@%Su|P~?J?CK~YcF`=-Q-6*L;}Hpe;FWP)%vfI z;p^z&un&o_akI?zfBo6O7f{9?)Gu{DB1P@H}K?K~h`ixjYrrMhn zut`%ikP?2VsPsby{27}454K1QXG`Y;_H)5^x%>UheXbpCVq7$|2Gaep&V58b-@Qv+ z0qg)lHg}5j(`b5_g(C+@kzV5 zxOzd5rGhT=02#e zC*-%QJC^S>5_xH1B2x9(g6C7c4QCSq`vF}wS} zmLTKpfIKzjr8LpM2nx^un&W~i$fyKWL2eLhM~EGi+u@&rI#7!}&#ltEWGmnn510+? zzea3+69<0``Rxx-a+vps0D4N<0U`EqAT|&;ut)FU3P#PE=gwDPVTM>}Xi{*%fPVwZ zx;i;Q+&rN+x?Ub2Hj(~S5MnFXGLm|D6sRE(geV}DwC8zU`A^a-LH$5N4C3LBvY75m zyzO5=F}1+p&h9A$4NV_}`G1mjKU)fsk~CaBoFPsQ0smB~JG7EVoPf10f)e55uKN0a zD$U5*31xNOadIe-fC6Bd2wAx5#5DeE0V?3+4_I1$w;&cdc?D^GH9f@5giWADbqy3I z2bf zoly=emTT4LV}Ug%fOQCvjoN*(Z^Yeb&e?hiAE4{N3*VYv1Ajw%c|ol0ok6Y^X#($rTKQ*n zKt2rwhaXWV2mek-rINJTBTBHfw-oTg$IVg0ec53!iU0KK*ZOB;ev_vp0+Z6t;}W2WK%6Z~qO9a$!u0U(TEd;4uIm ze#Rs=`!~Fcw=-fzj~HeR!+K{qc;Wkf^Sgh58bF-9kxcNOwoIgL04-bvWL7wB(9Qpa ztSpCE*h5fl@2>!r29WS8q0sk#Me4{aAf~oE3lhV6Nup zF9_lSC{>e|U^*@UFMPw%EdHecH3v^5TN=twJ_@G>Kv=F5-ike!{sL8ZaE2luA0H44 zX?;PctPa!;w3o;3p#}R@KzD!UEeC)e0y4w!GY zfn8m_PzDFaP^wq3^r`?DN#J!c2>Kw(U`*HA9_oz5a*fHF^bijs1E3%N0~Tgxs0WcO zC!Mr(Ao&8&3Vg&QzWL8ZAa2Q*glwg-5xft)@CxVq@y}=^#wTzs<@8~|Ednom)Nvh{ zIcm*7q0&yCNEVf@Ejo1`+U3Ig<7E)EqU7p%KwLbLFUW_8s4c+AvEYS|dsWa5{e}G3 zRwQ|Q%@j77!~^yR@8a%)GEs|-bRQYXFr6@L1UcyL6M^bcLQ#xM0Ei?>^9nfW{nX!) z^MNGIC|kdgDX4NQFkJX_8ru<69592}4aU_W9-j6PCvfZxV*5>=Wcv==Sp(a@C@{{eh*f`gQcF60E`6= zqy~bmeZubMn}4k>u<#+SK6{YrI?SiRJOezD4upm%iTsF(1bKI4?En#SfJgy0FQ6oz zMogR!JvXFJiG~&c;yos~TK9pJ2Pz_B9;uUxnk0}=2uKL;$GzAO@L&-KtVuvZ?k_7x zb!K0N{ISu{E`y{v8=ROpU_{y{CJgHZIwfc%uxkP26A_F0gYi*(2(X&-`1{j3!~B0| zDm%M5vB*N4pe{BL57=M~@j_aXjATc2E*%=$x3l|w?ZY$wRubYGs76%!UI2==#@g=@ z>ka;a3-*V4*g}wP=wul9pl1nG?E+pP`<~}2m?P{{Im)s9#3b45=coV)CWGKDzvnDFZ=Xuyx47sAKCzM)9V z+1-SJBm`kNmqkAaV&5#>{oSG|^6yBu--o*Gk5hMAiwP5fy%_;<;kEw$5>l>)tCzA3 zP=bT41H{S+`comuwLYid9SzGI94z8h9MU4d83dlYP6@VC?k`2ils*W8rJN2HF&vM) z2(Y-}^~>-5LlL@eRHdq*0Y2jF&&c(G$paGe+-Ee%b#!Q&#d923<|9IoAcC_@zw7@> zS97(7c)5BYFGQi$Co%zOsSY>;_*M5>5R~t$f{L_}4Di`tzJR#93d(-gb_M+?kZJ$E z^J|$1VTduwOI)#GK&DGTCP3QrD1%R^5XiI}O(2USG-Y~@W&uU214T0Ip@AL2_fhc> zOUF5UmT3o2qJV_(0XjCwp&*d%za*xjldBcP3B|rQxopQcb6`%6pg+UQ33-5uj9AVb z-V9D}(1UG&!-3Z#ehp%ppEcAC`Syf$$w~r8Q0FV4Rp1?1e?3B;vJ3c{?dR@xS0oX{ zik2%qY};c6c$wiE=1L<%kDi*h#%#uG9hu2?3r1zS}vrqM#yf>A`gq(?I~^2Q5txr$)+- zgD|jU1XjS23@OT&u!l)OSLp^O2yZk(PmrUK4<&@Ib`#-1q!RGLhqE_8-fCZGK{SLQ zuCZv{bDJ=PSPwAQ--kssY#_!i6thbs#;QC&h($0|Ajb9=t6-l3=Hmtw3m?BRfyLha z((VRte=*Cfp(0CI*XaZ=ykheQ4lsXZcr?Ai?Ok*aUdu<7|a;qdQ|u;lw8CHP$}4>J`6CYfvE64gkTCK4rN3MlMB@Q=R>yp z@2`K(yg5Mi_HsD*X=Uft>5x`{=mv%fKfw+{LV!g8z=A;Ri@2uoB4Iauz?_huXuqi^ z&LEZvM$~on_OON`8@_L?S@^_&#&`l|Y4B2-Ec}g$SV~DjnNl7=R0c#QIL)12ModH< zh=*s{+z|u=Hw*CQ@U~sP@)sU**I7_+kdqIDgiTK2mrcdKAcpRXEMZ%Az^7%%2H#9@ zLMjz7NZ7&;yjrEdAK>ppBUY!j$%9D%lI5_& zBKC@pK^;qo_j_Ru>I1ZY*o=-xT$dLJ^fnE~ALc)zfxpf&9pLRc^j$1s@9_TV$xx67 zM1!4z0Ux9jupI<~HB}`j1ZjF4i{)_W9FUF_xO0#z-t&~5Kmqe)QHOmV4>G*UAlnF= z%OjR`j!WBP0r-hyAYx(I14l#K086BQe9ljcgRTGmk`>7`08&51ln*GdpoJQa#tV+9 z+DFrXI3vjiDDKGT!`9zw!3&R}1KW)DV}75Tz2C#g)tz3V0%|(}f(m&1Juh$ov%ABW z$KK1?X+J1Kr)91SG^X=`c;_iNXnCJJy3*1r;7D}{N)s_Sl|B#-i1vU8Zz8jj2#KhI zCxNwd#~gsF@IWX5KaZ=FJ_v&y&gp7{q;E-I!Nv3j4VML8_`%&?7AXp461qL;gk&}l z4jwH7+`I%Wnc&DR5FJ;Ajn+ zsAwpwe7hOvDeN0M*gjH5I4CYiTOg>iJXqLqLi+tB6EC~SDnLC3EyDzdGu1IPC&~cql8I&FUxt0$?;kART<{Vqk`ZhIG2}$+5K52h=bJysU6F zy#aQ$B9siUP&V-3L_#9$lc*eEg76-}3XCHNkf;U?rKMsn*e_w6+-6jP>Fcl;Zf|=?gzG_1MC^zXKC9Zq#+MemW%8qlR+h`zzaWG zIG;a&(nESQ%ie1<;itvQpd0@_WlBw1R$fC_p2y42YyU6-Q#7d3&j;SZ3exrv5MH*4 ziUmLHum6?x(^!56-mp;{VVu18;vbP+k$?STaN}>HBETbwnD^eqBL!E=i#z|%QvNM= z1`cD-Q;_$c8Nkjw+^^}qSIoe#x4wb<-R?|t&qY7`Nqg^Kq1aPC8k%RpUJ3SIP_v)0 z_X-hsW6rv}mjS*K+6s8Ka*Auk06jtT+={5O%EB?R(MKhPlHATpxLg0vE{V)Rd=ARu5M z@=}mcFP{MY^JDVAycreviT}D;Mo?BlOjJpkPDac*MoO-q0V(i2`2qhH0YO#~?}oMv z2}bdgWYuP4Qi76&LC)2Xnfu3vCsjUg!z5*YqUJTNGJ|tz*@g1E0OB z-W{aPm0Y7e1u^AHPYn6%dYjju9YmxgIL%Px+7M22{qJW{J(O*kH_5i>-NYn5-2k{7 z6^6okZ@I8hYljZr@a#~ZOvkhhf!qxrkfN@@oFuNC;ISkIr~sz8yl+h;oZpY88~wiiJ;53M(bJYLx*l2$C38*3^nFU~C5x$NZ~Y#h zcDN^@qIYjeL0~-Mi^q_X4dX6={_uPS0`%ao+>Q9p9<$bWF}9)qPaIDC_uFk9OzBLm z^c@{d%pJ|>tc{%0GU?PTy(T?zCWeP1WcHfllNaQl_cruJ!B;vW$>X#&d)=aBGA2`X-xYG$c~QD&rO` zKCkyjkWkxOnQ~2>34cXRz(?#J`%b6)91@}x>ru>-G8kgUza9Zat(bOc@PqKj;g{j{ zjRJfC_apy}J2yADkGQY{X9pqvlx=j)$VIvqzAl^(A6ZC$g>LnftgP+H+0xeK$FsG} z?5K~2m%{}+$BQ|9iF-nqhvTtp*YHcvPxsw7>!+vP9EB2;}*WKK+5{!0B$ z(tI$2tCTXRbJA-KG@EPVm=ebN@BDZ<2~CDrdj$n3#hh55`V@sD2LQyuWvdd5(K(}4 zSz1rKzOwInQPFnGv0=009kc6&n6Db%!?}qY5uzKhbG35CtRo#F;*atSe|g<*DwNEb zX!owxAJ^U*6<=*A8^Nr7W@{#nw<|-EFc)*Ubx;!$4I=G8M*1Uty@LR!cB~M#qF};j zrrX&1StOmFtB$~!@WePyX$OHo`V_9;OUnK4#@2o@s;()0)@5*cZ&Aerr}_Bz^>+ILqF!3tJd-)4Se zF@zYweg+#{BOy0IQ0xfWQB*MQEoc%diPUJ6GOyM18Z+Z^w9A%hY3Kc56tco{9C;_% zYq&ej)m#WQUk6KA$zhk__lPy;sqt>qV@t7>{ zjXFwgeYK;n<%^A*o23VQv{f6MGqB(a%Sdr(IW96CC|)=9)63H$3FD*N&MXB^BdVMXxMq7U4=*XG)ZG=E zMC71@w5Wy2r@mRGu#FvvYgvNb2?L;WlvsTG+WE;G@x(cpN!Q>lHK^dD^4b*y;K>F&ZS8aB?}?f#q1pWp5R+5$_q zP&#YRd#rY#rQY`K;pQ8PAO@W%Pb!=WDxJxE7(ZJ#K`Af?Q)LIh^f_R>POh4+v5&4x zvK+yo3re*a>GcXnw>qmPv=fi6RHuV&lQg~gURR>jZ>syH$oD+9t#e(^v;+}$O(F7C z&=b-UnJ-@KoQLWFsoe3TvK77b|INtUQ z4B$My6vA1_v6K7?c8We#M31JaC6=9F2itjn&Ufy$9)a(K4xefLh^zCuw*d@tMvlvp zFX^75N-u|h7rj_gbx)lQ#C4UeClibGUZQg;d}Wj;udH_)Qwvr4E}^JNm7(_i1)cYX z+!4M`NTI61KI3j?)M+A^#sQvLg;`AU!y$y%hI6cC0KKw$$B&YY<{K+JeHntBMNHmB z;rx4$c+U>5emjNh-~trcr>)2X^0QF>D4Rs8v(WivM?+>LgsQ-tb_V5xp1O`*e>!&L z6__~)KSq*whUfG4wOs+{3qxoaW0TaP5ROjm^^IHvE@Y&R8XU`NK}~o!Rf?Yn!s1)0 z-+o+&G0aj^M;UXwI;cUp?_rc{v3rIAtt9f_HyV;m#A2xwox<0Zi3Ira*3PTwJ~}l} z*Sc?vTv%xcA#)Wy&f%|=y)sAuh6}%*0+y>2A^gK%~^QCYk7bZ1Z)2T&WFwrr+E<`ie3cEpZ zvz0!Qp~ZBqp1CzQ5_f^8;%aR#c-|}Wk7vK^;3Wo$pEg3dKWR_1xZy@pzAWI1)CG#EQioRj@rXrZSZ#K5nv6XP$gl6SgK)^XKbYbcR<(SbVd z&5wY%vma0A0v>qmNf~xbzUKU{#hkIgD8Z+B?(VKa;>oY%U9`j?FGa?YRHGy`)%obc zYQlB`jF@hN?)KhZ&28osay z2?An+_d5Y4{{N~X>>OJa=HkU*w8b?u>0(&_yA=w^%!J?PJ zSH7H8{uWQ6<*_M#P|V+O!nfQEPguU~6L z0Pue;^j-8_|09_N^IvxX_0oTIC&FLubg(o0kM73&+ug$YR#tR|FVZwi<0=2gBIT)(dT3`b|Ho zJIz*hs@mt_;r0!PP0v?k9;#kLP-c4VcJ&VyxA$Um=8F@bEkPTOa}LN@g|VAt)UF6D zYLHUP2jXH`;&E7{mpFI?H-h)tYBIlQOufg=Mt&!Mu3B+4ztLW`aO~1+@jCVWn+koE zMl45+$O^C_lP0}NBo31W>Pd~JC!UC9TU}zi`6g{Ox6hRpok4QFRwx{ALIHb?{Ukf8 zyX*J47D7yUqjKxF=%&lFVY4HlcIbl3Fy=RLdixgPTjd2_eOPa|}G5i6&n z#rAxj2HEpzWXq!6Mb_OGImCWoOS@05vKZT?&2_V_8%f1XP!r|K0TG;BF%UB*4{2pg z8wh0<@46mulZTO6-z)f=f~$(34#@_{nmBX3_7H6^U)PVuSrT_qOe8uv}QQlh`D0`55Di%2SK|z;ib!BwiV?9CeNy}_M9x%6HJ)Kdo zB~~*ke(W+mo>@)y_~gy7@7RtVy^{#j2I-iW=Wo~pPs*86f@Aq4(+=2=%&AP)3F9Ea zlkdZ5t_<)~WcHceH<)+m5L}1?!{_o`X)b!_@Hsgt?acA`zNBRg>gmya<_Q{8uCgW&#zT$(z4ap ziZrJ8QY(AYe*A%F|Dhv(J{-BTa-d#B44{pqlBXM& zQJ||FTbYxdl9>~qmQo#~jY1p%^0w1kmPkI#M^V+n0eYHC3_u2e(lgQn#7o1`{LB@> zo}t$GbF zlk;N1W9C4I)8l4*{&@--gc<@y1$+0gV6ESkU?Mm`YSL!alR-!piww z=ym8M*z0$UU!c1kLCxJ#2m;l<+;)3G*g8a}14D`T&=AZmDU-ls9vJ`0C)`f>7ouWiEI`-2ln9OUljJBS1Q|wUqd@|6T7`Q*P zqF9BdnPi#?u)VVK^oeEbP*=YVG8t*g7=D%0Z`jB1rAS4A1K;S0&OOgTshaOY(7e<+b}Y@zun{efnh63E+iYoc>B!k z6AP0fVFDHd)}8m*v_i1f1h)wBrATc}(d+atxKcurS6%};M&P$?nwLJyAF1~xiN2)5 z|H74>zM-YQsWF|IleHD;cssl=0SH7-Hsv~aJqTf4V}sqR>0$Cwa)Eps+bwuIsz@jE zJS$Ee+GZr~@+G;QumCy}m+|A-Ey;c;@SNV&g3i!ORiZQv!&|!vlJ%mj1o^9}#E0{r z4W$^8YBY7=a~J}zU+;0oUq7kR|21$&Hh&FU>wn$JKVd5a`vTjh7ufp!30tba!!{J8 zKGg~Mz_GtIiTr;y=^vmKjb=pXV}KL&$z_oTV77qZ(1;iqn}RYX!WQ;YmCZK7K%hkr z^}OOhCDNw|=%zjX?$gabh2hIOgex5VTD*^8qHHOFOR9o??@|Y)->PmE?TRcYjt#?n zr*VQEPC`RFE5C{@JFRfHk>!V=4cfb4H?t};DPpZEaCMa|rXvjU)1!1n5ILP__(vHLG*4T@#70cAuI zeMag-Mh1t--vrM9NU>0sn#IQYQ?Ow$m^3mn9VcB9eVkFW13?Hf0P|-WG%MtP=J%R7 zeDDBg5aJf3?zQx17a}*!shgWUz;{WY-6DR}8p}czLvQ`qF(=CB-Tl_1ZUb{mlC(wM zrD*37?+pqdP9>?xIa|$9b)$ZIWnv+3*Y~tUEwr?Q&EU(DgsowD($XkpwncyM4Tx+J zOmII#Fw|i;gpIe*oq|uDR>M``y6Eh!O^Q@MJZK*J7fR0}Rr2{uxWF|5WK<#MBiHXg zC9-li)Y<~jAsoNODaEf{rtD^CETeB{2h4?kP+OIPj2zHeUI9>{1fipd7vLBfu6v~p zSHx{Ym^`11>(%Q|*iMCd+I>a?_>^#T?u~Jg z5I|)+!xY10-CWV{M;Ic(48P0XZF!QED2gy41g2Pw-O<=4AFpJQUY)(kLr=#+5K5^3 zLMZ6uP@nJ?d(Lq{dVDA@bT2h3o-g89>i)zTGB8}H5G8v-ax$p#3W9zdCdQef;3CXf z_lJ4@K6O%wmA83A+R@T%7g6B-P4JI)Mxp-Z(G>!?r;?@mB`BGR9i!3jTb~~o+p|BL z#^p3u=rGOj-SvlBXRNet!lK-_9ZX$qTqpiS_})eFtR{ zag!D7TY}2_t>AYHs$M8J;Hy zzT|2(B^w1$9iNA{tswT z{pzY24K?Dy_0$pv)U?YHw@0!ZDs*ps5sc%;gm|$zSEX2Sy zlQf6fO0AN25ns|>@`kk3bCB z+CW-Ar;j)c;nKH{FbI*-Q)J5!Cg&{=nRj}hDWxY}>^c?gdE)4xmbc1gX2U+81LAmq z*qT)veD|6I@5buKimeU-e%`ii)XMrEkf??re?v_-*?O&(3}-8y(Y>+Ta&6SNbX&-#wjOZV@aK#aOQik=Pqy)^e|pMNOo6H<(`pbE*lI zF4#da&CAwBIo*J&>gA^-JAM82J}MkPX-!gl0*)(h|1^%R)kBgm6XwI)U?$9uTQYuI&phf)Dzwp>j>Sud zPE1*c(wL{|YGmXkW+m}zUva9BO5ccEI7;3I`AJAaU-OlQ*jSZr_{A%e!X0<5urSCh ztHIx?Fau1k4W=U>wfULsk{UJ3{M4~;=Y=KRW%ex>`rguNEz~G`(VMk6gR#Gj3SYT3 zHLVw%i$Z`OpV9J};O9tBT^OMXsatmN8>&AV^5!(7=q^h*R)wdDk96#|Uen?(;FIKb z(rmNG=6U=Ku+bmwv4%;up`jcQNG?vMpi!!&tdxKEX+>ROx4iB1Td}8S0tneTFq1VE z$Dq;d^Fh#*;mnc*(#O;NXI|#6u!y5!t8$+LLb$oQ(iw)V&@U{G!EQ;MV;w^slO4U8 zhLg+~sqASHq*#qgrz({<#(9+nS@&qIrwlm*Cr)ohPM>CFE0j z+M>j6Aa1Crq-VIDG~R+S>3)mfUTd!etOfAOP2a!yv8cFAqS@Wdvf|4Ya2nX0U{%tX zW#S>WLa@@XoNef#vx3!((Fk7$Z^=F8BD><&jL{TT+gW((-yE^pPug5~l(H0GuB-2% zvO=LbdurTV7{Um=?12|_b7B3$qRzrC;7#B(q=EuF0!KswX0Mx8AGp{j-gJ4>3_w@iVTKw5VIHr{?sA%uUUkUwRJn7NJ7KeSksnx+Si8k)9vGRv&d z_K@uCyFzFSn_l9E0-e9^i!KJ8pMVg7ONqw59V!`o86 z{m7t<%2;85P@FkI%~6zFs3#Z%N(_+VJH;Hm`W_lifeT>+m#w9yoH>NWNmG81I4s3c zF?+p_#)I9DvAq~QY~achOi#s8;^3@)@)< ztA^%D8(dTIb_)yb{gyf>4|#~~z=aIjM&BT2*PH(LsGe%Qci{PVX~~DY1k-Uxyktmt zb+Exb);q<XiqhMqe7RrDt47?M~enNyKR zZc{GFVlowa9KxVDG&|#|d+u#XC9{u|x;#p=RZHWA`>CH#eO1xjQ*Gwtzl(`Qv z{Swt7Zprw;>W2`h_VJA?4LXEN)yCA)dZ~6DObGf{u_b2f2!G9t!1TKvH(g=fi-N9K zRQ)40f~bowC?}ve`b5d3^q#96QBE3VB97=< zv+L{z>c&6`7fMq|r&+GhhOd*;!J-l=r8Yh+>{4Z`kG^&8zmyg(c2KHQ{TSC2C{lQU z+qq|5VKy0^9uLT;m{w;tSjK7<-;3=P3d99`n&ZH(MvVwIM2*H43>S*$)5O^~RBhd6 zd@HOQ8w9l)Gb5&^K%ZoiI!Q)jzhEbu;bvIblOo=W7-}(F&EZxMT;3iO955RajJT&ZR}bz)WY-Dtuqp{Mz#2)jC!G>6ol?6z^lT(Mv7LPz*t$*Iu9i~1pMH;j8w~nrl1dwC!LQrNCq{+VYmabSe zP*&#Rx$az`-;0+eKk=J=BYqm7lEF>qO2r$CGV!-)!-7|-G;8rkb7%*D8l4G=&7~24$+eTvx;`G|+V==mLCHvT0N$%jiPYYGG7VY(G zQ`qaF)^0=j3-Q+?N5QCUT&|9%4`-uaMr42d8nwrcd8G0yG+T5p|747tXY;BFgz8~mj`&Bdm1dSTuE z-j%He8WLXjY{-arcOPP7&T}LgLuKBzFh6D0IjyW=3!LBeY%3(?VWIcgY76NbfhiW> zcQNAG51^M!92=^zLMVvUURvpVa+iVCdwPkdo?|V)IQ7&^Jzb!3n z^{)nD4tECD#V{xxh~XFgmEQY25rLIf`Yi+pJ{BqCy0B^ zn>D~7_MnwDAZ{1B730tarhjTJg6etA^%#WeDcy@1=pW()fj`V4+J_p2JPYp71Q+zQ zRYRDXSxtp=!_?-$wCjYHF~`J$XEjn(Lzs=%;$M}L@_N$QHo-$sk)pKAA1^IwVELN2 z3Du;(Vv#Qks%A6VisW^f!SL4u?Lk?pE_NIl5w*BXSrJt`Q?zzug<_ZYsuC3N;x`@V z&{wh%oN@4o9SF2u5FQO%#>svlx5oWp7p%DN2DK|y!V%g%)CBsj7djB8G4KyXuCbe) z5XtgYjOYYqM8M?YtWv?3=CqFPK1q4KpQwp#J-FLT6LstVXnT*B+!O{ZJ=AAshL7C4kzBRRHmvY19GWo_H!=r_2hXA0v z*dKOeF!w^hun)(h>43`k;F^|F5>QdPY5P!i3GgxM2y6I8jyKqSfw|u2M#LF%>?-86 zDNz@aOfsV*gkf)WT{bUBLd6(m_j#&;_#3z>-TN4W_>LBVT_qkBPbb8Chhd2o!_1&C z$Jh$F_;QRg?$Z^IfIxmfIs0>&r~J4!g?!#fxgF;D7QBx^q#KwGa{8094nx%PC$}TG z29f)hoEsU1&e&Oqaox6t#D}Y#l?)Qkg8J_if4n)lRp&$Tf>m$rXILI?>-jLzjKNkJ7^QSl_izA3s z$rgbze*ZfARiMB}K(Az6yl`X-fnOXPg|8=wJ!TC~gBdSuyXEeK5*?@LC?S4qjLQ_BA#@;FH_J9N~vPgRM-xW#|K*Gqf;<2Nt@P8z%y9$oQdbi#Ff{ z0zF2nEScg4ouyv`z*Ogc` zcfA==b!}CuIb7-37lD@R7`LM)LdeHZ@3UafLlG;mOs;TR9MDE>KtE)jzT?zR|dYmVy3UWNKgXk~cs^rNOSL3B*a^whL=4yA5yKTPeJI(f< z0^!CvGicd@GF13jGRoJp`%?o~%h4jdOzznLo%m}F{P$MVKQQ^H1BK1>&29d`l67pa zEGQ$YsO_smD1ZNL$d>e_#Q|C=f%2DwuweuY!uSo!!~J^boZC{KjwV|GNVgDjav zyhe>Ae{?qHk8YimqR*7UHeQTLL3xU_)~x#P)KG&K#Kw);qVcf4g}3b;LJBjlW`UJF z5V4LjYK2TS^}fvrEt+bQp^}SzFc;Hz5*e6QFBZkCC}U%p*zCgds!v{CKbwbRAMSrt zW75K<;_t9hmL~iW0>ymlnc%9A(8{a2eeV*=CP(YYll7#V6eq3U&Guv}Q67zM~Zc8F8ePbx8tgvV; zPIg0qwdl6l21CJ5e}`JjmYI7tW;XLaUB)kO&tuYS_%+0eU!COQ(WOAN%10`-0JRP{S7~ zG~Bl6?jwSzA{rF>Z);HW!ql~w7YRRFK>(s*BS@E@LO|s*5 z*n^jIwyP}=-&d&&LUCQ|LkgC-@Lh|aTO|;N9cJt+Jrk^F2=@=dX))KA7+kmr>lwj_ zue+d3hLEhu%Bp66ooQgUd$IWcN4@%{=z}} zsb^JGIGHUPzgHQQ8+kW$5!r+vA^az|t+jT!BB)y`DJPI!G8GKdnV?B_6N|u+mlctV z8d*o{;gTUtqlvj3jED_ol)7qo$yT2ZBLTT+!ozf8yQK|7QvG0P6lV*>j z_du>&isbkv4r6VXqb##3T>S%8bVs9Zv@5!_!l0?NJ>5X#Kgt#Hu7AnbhqJiwNw~*Kg$t`|u za+3O5zkqYe1UcSy=nq!)6SlZ>l>2rBcq!-rlinL88Xia_>04tA z&PS+h!&(0P;v!TfZK#(6qL)tluhY=4MV*YXqa*NO@-HX!K{36OV8BFlUSTb+S%o%3 zk7UgbSaqR<@^2RE4Ql7$8=_1rB&jieV8!tE#V0iZ^eVubTp|Q|IOwkP>ui8%Z4&f) z`xEBjzdP&DtWUw{TRJewThPF=W@g36S+SaJN#mvCNE-RZ=dM1-y|x+k93JSm-&gg0 zg=g7l=q{wJA>R?_DU5Hx%rL2pjsq!LT=$fEB&rSlRwFa!v9ne4dt!}4e_+2Rf}p7< zRz*wV*HMB@WeOE_%)OK{_s_Q@wQBqgbvJkCZQw$%pAH+LHO;`{-Z)v3EmpS%=uGgr z7{=FPn8F6gz4$K~#Gdv5=)d&e`j6Lo_y${KfIMn2N0QoNO( zl$DlKc`G3^HZDc0Y6o{gqxyD?UJ>f{J)Hc73@sgC#GT|z(QY9+n&Z-e@b&V6a3tu@ z6sW4(ye&W8#^2r=+_3i#6<^St!`g5uO-_QL?^qn^(&NNESFyfb6G zg&VwQIBP#97Kd*z1icpoyW#srBg&3 z`8s;*NLYx5;k`v94xsBR&i6NZ1df9wX3i7AY38M4Vu2&6ekV6BA_EIjuEp^yPl$^1 zi}QmHP4goh9Pj(s)7LZF15&tzx!B7B2}UjtIItlY8R&ukxiRt*JBVLqIFx_8W&cez zXln&*yE^_ydxGZg+w0F&gv?Dvj1A4L^{w9i{LP>Bp!^u{XbzQkt~e^Hj^0|uj<(KU zP@9TQIXogCw&-4hi$#entWcsXXHN+HCwZ)=p;OHUMYKBN?`J!<=x*TWfK1lz_w>2I z8=ov5EFLT`8kdf@P=O1-XV_vs8|I05u;lDQ%ZqGn(<{{(75SnDXMAqS|MgczvxD`T>=5_5uZay*jx!*6aM6A0-G%Tr_uBKHFGN=EkAd1N}aIj^^Q zu)++kqz+WyzqRT9upTJq;!6E$fCf;!7*Db?KgUf2|yg@tt+}4 zV(+^^(*E8bYl8sU!(zZe@^vb5frlCev2{4Q%Dy}3{Eu_J8ut!~nSA_ObGL~6QI^nh zvd8e;CK5~}MSWV)X?|~E6o#VSnq1UAk#0vLsF;sWh|W&dHzSG);ng6aRBa z{ys8h_79ZU+FBXw+x#^iQd0c_NKeHwI4G977HHRGLZ`jCcxZ?)gTm7Rv%@b?yn{xBLIWt*~Yf}Tl zg*q@vqQmmj#9*Qz|nxHI^JR_M5LB5lt?* zf-kDVJ9%FrFBjQ?neTaH!dnd#NXQWQJ>rD7lY-`o@~i87CZ=Ndk6*t-Y~n&9&^TFA z7%mKD!!Hc+2^;tBX)!njK_B>AlflUtVykL$zo7aI1Gp)L5~INL$4k_4UoMQ0kw94@D{`YjByzoY zeXpll1926>$h{uoZwizy-5h3eVVI5T_lkDS`oEPAXXP z*=`_LmmCGVse=Li!_q3omEZkqXD%J&3$p>^(xdvak~zCxyUmGj@im#BcpP?>Hl-8H zh<5wzzbb1n2$JWP>X%1-lFcAv8zQUHfOs=d=E6`~u#J?*0sbcO zjQw!1c$d&zaXDv?!2f0Li8MO{&<2HYxBB%PUdY#xM_8OZkY0`mfc4E!uK zP(%_dK5d)NLS+Lz(YutIyJn1%z381d8o~r^^hD#I%FW9UE6RiJR(RA_hW5fxH!loz z#uT>p!0J?@&J*{2^+q+QqvpzT2!Y2qm%PGv1^g=|^;h|5B2pvU+72hmFg2qAK~w+NP?Q)^Axx+J;th z2m68qjM3~_Dxl{-{nq=mzxDpVC8r75J|Gs*C8^Q!eDfjCLCM&T6m|qrw)18J08=aV zaq&THQc|0BJeVkme7=arncC^GrI3i++|2in!~cVkdEku7X!vQg!f@@!-x9+uZ~n9Vdj+F&S6?eOEZ zL=BKEzfaQpp-fci!+yfH;(!x>b}H_+wL0$)3uOxK?;f!P$eM?to4Glqx)eYFnaMGn zPG$cKMCtWLkIwj4HqjKDT(R9Z;atoF~zvbO|<5HWBW zVr30t7?NCH&1iT<<}NfgUgFWL69LT%j0Mzhnd#q@#D6jq@C_7W8zcRH5m7R7z+ia6 z21!=Q^MNDcMF~n<%@+*8LSG78=Wca1;;7dH2^0E>261TM=OkdJw!C5A3om83eO))= z^HS|@F0?FS5r=vsUJd90aN5Qtx;%WJ2S-WpWXV~(aU#R20{=fPrN z_rqLzcUhinn=B_PsB7O)G--$-ss-Dg7G4J<%Zg|pE=1KGi_Vm4K1P8T4fZ;ne=0xba?}99#9F@XMP! zX_DT(I9kGhgL7G3_Bp)0l!?*Zmyde{NrT5zWFYY9%CtL{}d z6WI*|*!x19kZh~^-t0R#V`XJP%b#}pXHU2WRE)82*10BBoWX@DB-mPS*1!kj>YE3# z9pHE7UhT}XpyX(4;4ZSsYVVv>XE`lw+aAg_Mpb`>c)`P91A8D1Fam488idcI<8c1EGLpbMCl!zK_$$4>TA<13~zk;#lW! zGVeb24X(DDe&Mk>yPMj_@O8YV!Q?0}h%`ibgQAT>4wu9luP4_Lm{k5FV>I%yp zkv&j8!6Y!Wn^4?AG6QzV;6s-)gTq>;4COwO%ZiZ7df`p9z@gFMMOoohV~Q=i?$~U9 zOp@BjDp4TVEr)VT_H0GHlI2%4D0zO5fTkUx3l@c0In0vMl^O_heY==R35mlxZ>_A) z1oy=IDxe|4=K{TN3RCuO>;p`sc^<$l&M9@Yz&NF}z_lDb5B3pEIT&Bh_Q$<%xhT6{ z!nfG+BbG4v02||J8aT26Wi2TzIPr6eQ!Q*%L<4L)irS*AHcgkULavY@Md8NA>c^iM zqbz8o?uDUHe~XEK(~tQR6Jl1j`c8jI*s*ml2XMhYAIyb?&E`OZ{2-hu-_-iP9`HwH zRA%sP<2KJN%LFfyP{E6MMaXyo!h^a!83hi895D61>$z*AZK~!D5u{}Cy`Fx15SNS9 z$@0OQ>3d@f;z}v1^u5jM;@Ws%jZ~+3mb31edFao^#MiZPhROyTg%J z-eECV`vzdN7&42XAB0@bT& zF&K-OEfRfkr^HMij-9z{1d*wjh)RYHz=_INPVzGs945Su!hK%j2wq|1W}N;)><>$4 z(e3d9+e`8`lj=M87f2+>@xi`8V(GV#`1@%6KT3+90r+=_h@E=L*+bnyLPbQ+A{U!r z1V5AZVBzKTfndPCwYu?0GpQ8ew|97vVUYMeAxx7t5*$BEyK(QYk8FQPC)^M`+>-@) zv4ugui0lYpNip(Ch@r8cQrAKE@_GpYs0oFV{fDk2p6Jh4%7C4k|9++HRWkMGkWzgkBoK)|`g`{;UAhzy8ABsI178p^fXPcE?vD=b zF6$d!L*N5B0DZlziwH@h7#^6aO@(2*sBS zX}H}Bd65^{AO(+sfal_3a+`6^zI2{5MGu0(VW*d;EsWL9c5CHib;7KS&XW!s?BX+u z!4vArgm9Li6&ciKP^vQ~@`W94@9fgIw@pU8(E8e#2=B|Ke5om4Wa->d31JLCOF|n% zhC1gXR)3kj4q%J}Mj0KDz=93UdSB2%k!>urmPSX&y#}9Q=1S_FBr&e1eQh0)ww~%|2i-2AJn^ae4l5u5>`NkqgW?#4It-5}65nl+VdpU8fZbBOH7^^0V8dKQU z!r!L^;ZW<>9Dq&}T;TH&E?eij}q{uJJbo5EP8YWWx_z$(bcXX8)VZMYEgOIfsuE8YVd+1|cZjl@Vf8V|J+bhpIu$|ri2^d6d4eLM=xmIK@sjJ1 zZfGRa4p(MZv3kIwT$C?jkYi3bX-YJ)s6g{r*TJ^k6r5^~e8SxSITp>WvMsFHoxiFi z7)=lC69}4XV8Qcd;B+Gt?Oa?7zO-@&0qz6u4X+<_S14>3I6o7UXBDzX<>=@AgFaPX zhkdkbtFa6#uO~m>kPnO4Q*8FiI~yQJmI5iHxXk(>S^XG^-juAGWz3{Ty}_hSG)uY( zkr-DRCSk!@mfk<#?QlH2YM}=LgB$`4|)=i)MVn&0)96 z$zfDl*`fs#Y{IZleI}JH{YW5FoC0^Nk|^?>^`#PJe8+wm2&_aU2iBPIU~fJS$8(($ zz_;SsqaC)HX?&;AV7QJvS=Jq%RZ~BhQsjJXp%1J?r0{cDGM+hzpq4pUHixxSQs1rm5k*7Yzn|6Y2=CaMv(8kVysh$ z!KNo00GkO2zHhcN8WEB)hpyS{P5s#(+Zmq~DImjh@pkFT8R_up=z7I5SPcpJ(#v^wWCU5VsdywS{qVI+T91ef#qHJUL?@;o&(vgdX`a8Q5O!J51N=-QjUCwpC6!zc{f zEE%plAsXx45DXsQxdrt883!7iUmN`P=}Q$BM_vGDuJ8HuC0OuFrMkXo_UQiQrqvS6IQSW$j`ql3JG< z9U^*eTjVb^1nD*J9$I&pJuRdx5X(!a+=PD>;Fx=Wbc?wD(|O6B1!A zr?zxL0$gJn)>t|C+<*A5I4Za!(Ps+Pu?w3^CI`(=Ba7w3)0>^Lj^w_}qiW;0oomQh z`+2G$4EgF_4w!#be=8h*t^XBd^{xN4Bz`$l@LG8}c9W@46?{D)Ri!5%6ONJR3WcWN zz5#5TE|HMRNIt6L0aYpDg?Ly)hA(d@P%x~Y-D7_Fdi)61!|6hcxoDLePK&Za)<))n zY4Or5s@<3Q?oYpFOtO|LZos$WXLlYlufsH7)5kGhjaA;c^BQ>06Dcuw)%OnW>qm@3 z;ycn#rw)=$hk-fyt*e=jWLueAW~78!5N9NDhH;Y-k(%%nhq-sd1XL@L*{piCc=0^& z0|d&1li?F(4z+c`!BJe&!Tml7BLenXBRk}GlR4o8hKtYIsuXr&87u-gh5gD1)~!Ns z1{Is2v=8ueKl^}r%xoMh)3&|J7{F0hDUk?FccKnZHD@3w-qsk+^|=Zkjgd;&7L*1< zfM{+~`k+n~I#`eDSu!Eni=Z1zB zU-SaTrJ{$O!XLqK554Y^2#{DJi7zYys<+oX-$3{hIT8TZ1g?uqX<0s9K573@40?L) z0c0-HC+V2!z*>wpNhc7r55?^NkoJz@m3GaxaFUK~qhs5)%}&R*ZQERN$LiQl$F|Lm zZ6_!F?Dt&XdH1vT^IiL#AM5YE?t9Lfvqp`o8l~HBuB8LRB2KOhyi1m$SbQ*G?$#vn z%HXTeS(M_R0VXA{`WcJyV;iGlfDE2%(auX%BGcX!3y7ut2zDpzpcoxp{n<=%HDn0E z>`wQn-F00niXW7isyIP^MY(Hbm1CF>r@VEj%LlAZ+#p4;*TIkQg^A{!g@&-%>J~z?b z&>2$CxX%<@$Xf)9R+%NTDZFj`=a@8YB1W%Js~0v5Fns`rmMz!v9AVP37gld>a50GRUW6wUG&f z$%BD?F;DA?v$JBX*B5kC*r$OPrd zyjG#o;=^7Rs>GD5zZzH-$xYz{+aQ86CDKkNbj4OwY5MR4N?s280n?`^`{#C&pmKdE zewUH7W|^v23>~(6^(70egY&vfAsWJrd0#+-&YV4motijgKojw-P!MlXp%qGbhA4sC z=+e1;fLD#Q=_0$LQ=K#3oV=gY^+k& zVkIf%?(}@jbwBFipvra=n5WAc2E0<9IMx_zy}CL;6~&Tl0qYu{03KAh^a=25*CqwR z`eBO%dh;f~a><0j<+Ur8fa$QILO4W=n5XFUsfZvfrFSDf4Bm*S*MRxf?IBLQbFDbE z<*|=|p`7A=2=A`dX6|9_pw0GPm-R;!&vfkDXC=H6E%9aqF~6CuG-n+-_?Hc}R~RVR ziJ;nWK9Vw}wp)uvG{>r&fCtr0GBz12rm+T589wfv=J+wQ(njauq;fTmD4wgil*-71 z*Y#vpwj%vy21e3+u$gLmlqO8T2RBa0aoWy1L)hDoAuV*W`rc|g9|~Ay`$u+~_g$ha z?1e*j%v&u?mSqxA_lQzc4O6ow;e)77fFtyNHT@Ldv|OO<39gd{_0TqzstThtH}`N+ zo4Y9KB;^s7s`+h}{c-UWdESDgS6~D?+Rw~_VhSwnZlZ3I`Zyt7_*YIRM0n-=fJ#SJF%R${@wTE z>JG<`825K|*gDO9t=m|2X-0IBi_(dcZ2rojg@<8`4+9P z;N2PnvdtX&ggTX*gDCJkN97R#Dvz;xw&k(-S^dgc>LBzFZOS=R9{C{o@s(^-#p;hH zyXpMC>UduKIOf z47-hXqsk7p`&vJn@KvjaQ^pfDRtK}WDD3hSN~hDLZxv1JJj*Hhv{J=kJfbhIYO;+~2gi2WV=)!Pb(Mxs2>he#np|51;foI=MYY zxXPWF)cS6`WCOl%V+E4dM1nn+`r|B#flKE+kZ1@1)Fti950tzTIkI;^t}0Ng5UYwF z*{(Dq7Q-(J+ydR0`!(wgt~8a}#j$=cRI9v$+;i5f6*p&+z_HKbhuV|7bqgf8$sF4OBK|~1#I@4GXbjM}WQ@)gn^7}J@&V*2DO`SerMNmZzYHKE`DZPzi?6ewi}g?=^GgKO6vhkd;fCv(X<8|4;n)ppsR{KQNdhQ8ernD;c61e9zv`B&aCcMJh% znemY!?t?AJV1;}68}V&XCVRZ_Mo_rD|0_Rvk~a#Ol0?SP5NTw+z&^E5o%azJVZ^QY z;2}86F}b3FqeB=YiatOwn21%-H20@ivXGfdDB^rHImLqtWojO)XvfzgeQe3GDQJ(D z460JnG$)kXv4mcU*&XaKRf60#?~#7@x-O>u62gRO##k?w_Q@iFBe3J|ayUfyejGQT zj#=&rErfLuw%;R3wDL&MRhmBvWk}uQB!cxc4`vi(v(A!W7LX6Vh_&X^W($rhqj-TBX}lJYoa1%(G{EF6fWYYq3bE)DrI>p$}QGrULpFl{Q*f^-LRPc~(2 zX>Qby>5o!@SdT*D9SB_h#qI`RKtI)fE(6e~3H_s_eA>P|?c-(hncz3v*`Df6WsodrOLWI4y(VInLyy^dsarL!kAYTfx6rRsry*iq zoQY^;{u+hlJ5uOfJ<>-N$)ev{C`z}Rta>iXA`C7DtHqrXoLQhG%wZ0&AJdQ~N9RHR z#Ur@RR6Zy>y34P(+P$Q(XWW8wlWHN!aeZRI#S{*S*CZ9N%&d=CM2#~_t(so6nk3CU zsbt(aJ0X=|x6&!yk~VqG-?RAi-Swk3spbR)5-+K0k@PeNruu%WYOdF&&=XUoHI|SY z3gXq3;rXwHMgaWegZ^CP&VO9!zt^At%h>({8YC+XD}Bl*oi)P|5uLY@BiIp=euKwX zkS-g5tLJfx$b|__uVC^I(7oA$cvJ-7Da2zbWcHH0ZJeaYxo&Le>Hz0}LZF{&R1bDp z7EW#rLvwePm9Vc?5>N<`RJnQ5LYuA%t^e$zq{-4h~E{Lx!>2!=fhJ5!7o zp6dd_U;C-;tM8LnkD9E2REfh#@unuceFae}G%TCIsYZp0E!($s_$_oA{63rgBSqV| zM{J?q;dOu`CHfVUNc!w&t_3%8G;!b?q48^%kMDR`zCWd{`QRP~cJh=z(Kwkoz6JTc zzQCrWY;Rze>-4aI+ zjz0{$^q|L5()1bNm{BK{j22q(4f^9y#|GnAXh`B@K)%a-UB;{h<%Gth>6ME5{wd>J z2anV7sSg@vTrK-Sx%BkcZ4z|75)=Qqt8f44!2hlQ^sk-$?<0#Q=XJ|;n5KkAEhPy3 ztp+p994pB{^i^Z_2>sB`!URQ!(+RjwNWJCzmNs2o;gD97*be(&2mN0*Ek_?&F84-j=piH#gGrQaWR98=IUu=L zrD7lU>?pW2wv<2uGn4_AA~hD#)K&Yd;g@Z;eFE$gHN*Cy`nkj?Oe@LaZAWoGqbsNf zjGFQlPe;G`*J^i~UFK3bFu<$=4@N}*B>K9w*9_HPKAbS64$_~B6Xh@gbQ6L4WZ~~2 zWgnPB;33W)*yy}y;KB{!itz@=fCbK#vnkH}s{RW3slf0iv6r( zvlEhaM>dMe!`5ORvZ~(7KDQwlU%!(ct=PtxmxVvr}4Z^+*R z)LUd~5L-ijmR?Y`;1vh^SNe9__er#-r!Se_K(;=jf|RVxq>fTYSnl32Ogb_Rx@i=u zEZI7c{iK+l3$|2DG?mEa6*H>QA*s-wE97sm56n@qDB=LVwTyHpd#0lku9Jbk0tyfU z?W8|Z>dQYG)ZgjWe;L%jsncbtEGwZ1qVnPik--YasV>7dlPWSrlnlWWswf8agDPE% zunI>8CZ^351U_QDhj;pss_xVg7`vMyGZF%)gdXkPwjBKU(Ye0q>-7Y!hboCyfeA%~ zA5^r1ginpBdMVPK8c<9XaK6Ian32ot+=b9$;$W#eDlu4nAHI=LT@mmbFy>H4f!T^d=|J7kqD z*`Y!B$&AZJVup!yyXO7tAu3vo$Oq~cig;hyq!j)U5k1^0k`hF+E(IbRAa@EUJcxLc~{br8aW48&*; zF>k|D(9=Zmqg=KvfBUr@HWi{cJNi4>Lt*}!wJijay~^nNmlYho-VeBFf^P<<)Wwii z*+k9W0Yxr%nBz5uK_%Q`qfnJuiVQh1{(|__o z(Mp^0D1wOZ_a2KY4t_-Hxp_H6XHYr@QNI|-M7F~H)MrID0frTpm9FD=QqRY}1>w=* z2=Bn}pP9-IYQTo1S6W)uTj!IB$;09W0Y5O0NJjv&+6aY#YTD|^n&Q3nRN$RZn;(_3*^)ap>6?RVt zM-*lRInn-%X-Q1-S#bNw`5{aXhVGES06o^mJbl~*)f;hQvROUm*f)>nWpAvoK%WD3 z5!tl!8i2S0@I2Ge#+aEE#w=y)=rtiE zd82m&!Q5F`-5Ez32g*Ht2F2pdXGTrNTo(likq0aj^vyG{FY)B}1=tnoXCMAVE2;gh z(b5#FC3+(v6=N(Wm<#WgFtF0To<6e(2Fpl>DKK}Z64B^tM>v4Plyrt9HqnrT#SJ-L zR>2JrUIMzr4x!@7q^6<8%;*cfi8n%6Q^T-;I?kXYnsi}xT~_y)Q{-@<*ziwrEdD~K z$-v+1t85vK78Rg%wC--+(Apn8W~cCPav~-|M60z#11OaF-SIW? zjlz!>_^&`d6uU5tCcr2N);G6Lyw;nI*}4}5Kz0x*oE+nV(E@wnX_fQmX~KgIc(Z4} z5KH*vo&s=y5y-)3XAsC~K_DI!OIQ%@{2*$Eda+Eh*bFBdSD(iBw=)IS>$zgq8=iYz zig(kaNKd&|V2fKDSx+0{y8+eokVzp@X5wOwgm)2L)`kxZ;aHw5Xg_RNAx^ePu-c!9 zm)2wr(1tVnO@)w3Sbe6{U;L-%g&goCgCc1n3d!+b1rRA1@L~_sd$~0cqzyS?U^yS6 z8iaG&JMjEZ;KbwehZITM)t@~?-OF{&%Y$IAKtJ>xE9W#x2GxJFkzsU_mp~5Q3?Z=Y z?be_|!?dn|Ctv5sO>ihJ)q+A6T$&o?z?+{!o#sjjqC3;&UV-JtO^MFEKxqd!fqy{b z?kIuA^^rb&EE|hr~1#(ps1R)&63v@3{{^U4hCo zt;O1UoidCgl7Rm_yGkqO;(Q?g@aKo8FGuIElUNf)TPHMaxT3n@t=V2H0bO{Al(*@6 zf-Ef^Z8-V-O<5h1@7P(+{J3~o&iT}JQZoewu@UFfim1~Vw@1bRfIHJ>^7oBsHZr-$ zp}xps3dxjV$J(|26N*vdM1W*V>_~BQ6naazwDQ(&uy@)!4fFHLP*WwU>%v2O8Q9`}OSg=rSeWO{oWu4y*;!@CjG=}LxCv(DI^5mfSF zs)*S)^U!zK;a=6vl|JdfCO6kr4*JA?8@vOwnZq4^gR4ohV)Ij}(-HZdSz+mZ?ET{T z?|ZZT=BqK^hSMRTcLtmcjtm{g4oNAq( zmc@tnP90a1)Jbw;(>0GAe;b^%uN~mZ*KYm<_e429tZjGphY?hqRE!Y{IR2`E?A9X1MZlhAVmoj88+v2tKqW6xAygY4P zzm0HPW9-{7A3A=w@@te~FRn;vG4i)F#@N|fL;7{HcjDzwsez~bf^M^I(fBDKyp_W3 zT|$p*z87YGtm`@bz8Abj34?EN;fW#9Lf zLv&(x_7Z||r;AW%$5$>1UTLizP|C;T0%1hj_Uj^ze}B8cS0`qllx(E_$=z`|`bsh? zGcH}Ng4eLcD>Q|RY724DoMZb+lVV**BKkEY1v9+rP+AES$$7l(25z7CWy+fFiaR#h zW(BYyY-Q3kgfU#nF}odp=fG8m8Sr{J&PUwuOu$^FTe)kr>m~y^s!Ma(FDaMx63}s~VBiEL zQwSLv7qr8|+XkF9%Dhj9=_Zf^^03qGqtdgVbJI?KtF_Pa4lQtG^}N@ZgpVJyPm_L+ zI6&V;A?{->BHZiAcR|-@i6eCzuM)1V|#9 zQSN`)uDI_%jOKuvN|b`nD0gSKJ_g)=@4CtJr-^!yydNSzNXb;{Z zcp&x^eDOHaNb|b&`x*W@e5wEpEM8y_MKK=O{Ci*)%Pj&TMDVP=J!Bu9Z< zXyDPnnNA2gjsdA8VDOfwY8uXOeExU#1h+uY`m9L5M%KY>;5Y_{ZLk-oMh-PsKp5ae zz!ghBYuV{vh-r`02?ScbkMI!@$9G0lJy3+=-e~3X71aXBGdXIS&{un0_CeF^-D#>c zO=NIceIn&1Ie;&AmL3K!hh!QsJnJ{;|b&<&c?eXB@bCn0<6IzGgp)bC)z@&o%3EIT6P zbG4b$gPP)jVP+bG#~DPlNJPnvVq3?o7zKaH$Gkfl)GH_ESGkGxoSpFPvR;*HnR^Kg_5Spe4hrMegjQ+&P9N^t1kV0_9UH`M(=t2)G7@GUQ@V;tY}k4f>p*DW85s#4_cwSd<02B=&58hjA^RMNAQo1Be%=h02u zs6g@rKA~V|F6p2@TxOQ7b31;YOdSSz)alI{wV!*dX&z9>T|dfjZN5oM2vT6!@ zhe+C8j|rfx*w6(e@80O?l}FBIl6J~A9f1A=$w5NEd(Bu4+r_I@9FzrLwkzZ?$&>;YU$p7n(-BxVYO|RR6`8DbQr9sN2k=s7Z%t)RavoIHZBmA5I~y@OJw zhIbgFx-@zl+L$|RW!$Joyry<*`x1KQ2NGdiIMO6mLCcoLQ*CghvQLjFk=ZIOHxl_4 zvJRM#bOdK)h?Q~?{H7{h^uuZVMip55K<9t!ZDF9~A{DRWl_ zE$^N4EDUqC>fYBRih#779k!@YhMH@=pJi^nXS>7(KbeTWvK1!NOK}#cs|9O5mHQRZ zH9L9gggDWT0vptL-I}(zjZ`b;A=B&Zx?p+3-@*`dY#Srx#5h)8;&=JL0DIRgJn1V(j~TFd0GJV?uoM^^m&5l544wnO5^F=Li$z(NPRWGj@4Vp@fM?mE!@V-Y&3Z!gIT|MXl5jTpUQHI zCBP-G62ew$!N-M|x1V4nnvU5oh73rGv?O{RMPz4J76kYOKEOGfV@^;fdq9Q2%@2f? z2k}q6rho^&eg&OnUS7%pCrPv&HYO`TSZ{EXfAKr!V5LAvmSJmwLnMjP*!1S;1LREH&TawK7 zI-h^M8Yw|g9S$^<;qqMeh?(via}|g~l3^a#2N@oZ_zei-^2TIlzr{VpGhjbP=OY!& z>_(TKq7s*0L8kA8pnde1vR>mzHML^a=x}-@*@T$y5G#I&Dt~DHV(Ph{uag@=ln)AQ z!Od#|g5~1sTI;@bSi)JmBcFccdS1(r@yK7s;9MBJx_FcPph}OaGQE}M$Ck-|8Gd}| zM)Q7TXw7pqX}V1tr^SoS+n_kUFS^xZf1b;LFUmT+(R1PUNo~nxl(oGjeLm51nh$@z zrG=aQczG+}&zh;;m1JpdBY=Ot-P3d8^lHYAvU#QG?OxYg5Eio>jNv$xH^=J0dXxX< zJiM6bLr|x4SM`#@tbuHOe+}3;^~S#Ep1#vV*PgBKIP7FkgQFt|>5z2#U}zyQluk5b z!S5i5swA(6f3{62KANp(c{E~pvlLm)ihi2?#d{m_WrZ-o_TmKv`?iw3^>+(G1>8$S zXB0u}bkaS0yTJ?#KIrsI>pSq9CBx1^n9;+nB*YgH^8A`OJqGMC@Qz$rh=Fdo$1BFf zX9u2y@~x}iNeg`5%_k?vMa-UT`R}AzVz$?$>G$Nn5a^yD$=+Tz{2Wx@#MK-!?=-rv5$%Zbdm(Cmta ziBKmr({yqKOVW~cMkPQD*ENR%y<%ccINtk}dLHeDnnA@0Fd5sJk=!FnHmesz@oYq& z``d$lyVAZWNs@zf>feJmh)*U6r%&~_tA~`@38iT@620lq#nCGIXG*2VWcX!A5A-;bQk^?43z%Xqe+O2KzF3|^Xn zb$>|Qf|Vr$VbjO3je_8Lpu{v09d9@$xYmj;y`c`9?kh4`sV;$ULO|gUUDk#-TMM>h zWcu#D6_i-Z=zB|FcjZ24QriD)F+A~3)d6Rlzk#YF84R0AH{5VN6JW~ z+SDdG|6L#)jhL$J(CFa{C6J(c@eTh1dUS44E&JO9a$_htziht?GI?AbNct~)wckfc z+!hM@6q4p*!un|UiKq2@n>kd7ztTQzTXY)ZCZ^(O3_G^V0Zuv$MeYLCZCgeA(o=~X zrOqHqP-(~!g`%gLO?OvvidBIz;U$6u7CMEAr!;y6FJ?anHvv1b9p z$Y9|%SB1RcD1{dI3?|Zpn%TUR=Si|o=Anf8NZ@V4La=*#ywwvww?S0Mr>CkuA9N?_ zjomh~9vNO3aeDz^X9}igHGW<#Dp2k8uCcoa&R(P@{FTN2$?ZrUZ%!mXY&HI^4npxAp z;K2`OJ1cN4QeK!Vt>&601$qftv7+xh+S|!>3%GXBtF8d~5#YU*;_y0!*Rt!qA*D>; z*?))nBEKg!snO9lwXJOwPF$Fkq@k29TTCrDqOKxk#N69YaJQSCH+t^uIum^SY=@o| zwN1+Na<`a$7?6ncEi4g+i50gw{&bTxfAa{5WW0Bh3M{bMw=j$n9#my;W9 z{`vTFJ{@R7ajRr+N>p)k3Txca1wTt>_;{Yyo{zZkH;dG+Jq_vCkth0f-3k88U;K_W zo)6Qp)5E$hr8Rv4ZUAA!16t||KDc{@u95|+7~yl>zQYmnM|Et%FBKZdFu8o)BD>p` z6Laz$BsFqlF)%13iwUS)@dKzzM5LVqC-{=9)bF|}e))!WqOk_1(&%+0pZ@D z1@3AUV2l(^M202&xc6djSAmARKzJ?fAm4Ob_N+7zK*9(y>Ots$r$}bt^4Rj6>d=?{W7DB8@ms1jIMU32wKUQ_pSDBSxdpCN-;&JStDcv-XIaSoGts!n1_L5lEo$VK;V`>ox zQU|Q=^%0y{Az9Mt?@CtlZg*uprARDZF%CEngrg*=L!823<=Jy!S5QReu$9efWcH5& zOy?sHkb}Z}nRfztk*tiPykr%A_~#}S_03yB(;WGiqmwk66?Ktb>npi`Mf*Z3wh$OS z4hyNh4}wwC?>2t_A`75}(Sl5eXZPw@>}8YY<*6pArNDQ!90wTl|JX&jxR0D2)P6N1 z!9A7oT^klkOnQP}5jX>pI~gnNlf~afJaw_8SLZ#E5DuXuqv7nx#8BjqH%V1LVx?^% z$-K|#R;?z1g^RL&nzcc>Q#?+b61N^kQ|!af$q%OmpGVw)U&y7D(?s)u23w>{@Fh<^N$A2p>-#a@U{yvsL|Rk9I2(bf+jo5? z??WUvVm)>=cH`T!hi)I+GEj(D4!N}w{=(V9VjWcmI)^?C|Jksi^1@!ZL=F}i1nIlk zk0|wDWI+jomlf4+i}K7Ee?oGy_R5PON5~}1xwMHI;Lktt! zA1n5)F}|S_H;^R1uy{q-$@WAy9PL9^4~ECRrv`S~QNF9ViCyTdwDWQGDnDP!|8jXO zJH#G4zrAIZZCBCmwm;AIi8cX$ByZInlqgI?en~&v9Yio%NWkt6bnQ6oeOg{#eyNKk z@FCpIadny#{|O38oYjlY7f@S2*0#Qg0)Dv6Io{HpBB{V}3?dZK!i~g>Z%_4eKx$qT zJ^y_D>$QtKw6$=GblBc2HuZ#dAjVKju-~3+JWo+=WkUa^bi4Qhwvg}u4HDi+!GLmv z9VZlE|4b~~O4~d)rsLZLY5TMU(R%->G2`YBsLdAAU%s~XS)(x&Ac2wDdtOO*8o%)` zI|DkuP#Xr*DRLLZbbvyr?`R`U$t%Hj^yHR3r4Hh_0bpW4c?79?08&y=OCxFV{%qrH zY|C3yD#;bJDhQ>oK&7F>JP>odA`S_0WI8VLq`jY$qt$aql~T`Jbx@m4u~ap_ioe+V&OGsDq^kAg+5k<@G#C zD4{6Km@Ge&m=pE$2rj^l62;9Fc=b9%gMHb-jgG9kRt;eu{%r2OMm5~Z+D zSd$&B^+asQtGwzN6`G#7hd3o!c)F`6S|M|!E9%(3hY`kbSHTyRs!G}D!hb-94Zj#m z0_Rkjw}yrDl1;Lmj2J%(rGpZ7L1!;G+VYam;&^td;|&@En+~ht%?c*czfnO~crK~4 z=`BiiYt>+=#k>8$htbxa9Uy>i)nzimw}L4RbT~R=^;q>_9ezg#hhm9K#mSNH)|D~@ zQ?ml;P^ojakYwdIYMD&9zL`$%+?b}!ccVL{j#?XR zzM+619EK`M0-5bM57v-L$P%OL{dUKy3@to-0?DJ5dV1}g+XS+puk?_xtRSKDULaYc zvK$A&Mc2a@e=uS+zIh?OGbvI+i&BxjmQ#ij7&7WA5^afV%3U%JCB#I?&E|wjjTo6J z&whaZQBs1WdCPGYQ$*`;0mld26pr$?fQCj6cUSE~({O+Zh6TLsgGC*f`R`13bhQ*| z6ylJ!x8W?%P`bhVGXLg*U0e9!pTLRX-rqL>*plY6u zRz?t*bTkl0L@vQs)mIA=ln?MHqxSvy$8n6PGw=dXeH(Wme=0n)17%|A@( zMNF6)SCU109#ZQGqbt3TBU#fgX291~hcvo~)`vyZru9fLy!{0(BebE~Qc$l!|rE8MQey((I2vi$ctBD6vMC-_t>Lwm4=$WhMeQU%uOy^v_S z^{Wc9BAg&N9E5<~ynxum8RxPDi(wD*A)TL?k=C_K#%(?OVpgIYgIec$DBaAfh6?Cd zd}vxs$(*fFE`Dh|<-c3PIKa+v^+VSfM4}tYaq17HSgSVc zO~RjmewHrXB3PJqbokpORoE7>HxzOWrYcBOijHF9YXSk*@q-%{Z zb*M3Z>h3h>30XmZq>U4pJCKsg+D1_Z#^@)YmZg8^itQ`LAAZr%gnyUZlsWHBK9Ese zAqve*+T40@fYSHENu46H_-#$?1~`V>)tJpGaobP_xglvh7prKkyb~)`9XVUCZ9o#Q zo_paY{jrA(F~PalPI!B2zmuf|;)WMJ>R#TP#o!)-iPQ87W8K#@*~kOb)?NxTwKHd6 zBW_kUp=>}Tn;4t2BciW@z>dsrxC2Uaf0Bp_N5heen;QSCz;QU2rJ_W8c_m-(tC-7A zuzsi{ddc{GL`bXN?ixblt`+={ezkNHZe)C%VY~YGl_p4*&=UAn3bPAf;e12=WJ6$M z`^;cIuVZbf)2p2_+%8+??$L82swRQEyhi8lo6Laz5HoaM^8G!(RN^hdJyw9=Psu{-i5Q1?I4u{|GSoP(Y@&^yD`dGcvb+I9thc%fom~hS@L^ zC{YlygeG~_YNChqow}~ylqsZPuJ*Rt?x+M}ft$SVRjIFBuQ3j>y%&UIS*y5)!hVoR zcMYZTIld`5V~|7F;hKzL7)4v#Ov7Gj{IFkcD|7Jj^n-3)DOs*ui6dk7WgF8RT~#~= zrr(^Yh(^uI(c_#bPuRm??V=cYSH#l-`=VzC2pd9iH4HD6za9I$%Q!kW?{3a)^2??; z2Al%t*)5XFwf}Ng-*1EY#xku?X&T7F?F0QH&b=;!+sq1AoM=xBV}K(fPu016hBwC* z^JGOkjM_mmh9(y6$jR=BdRwRe^Gfays+Q{MCrWnJ@ zKNsE8l|{<6w&E+r zc)&twL^f%r5%8Obt>=h6NbD5V?{RobbyDZRX8oHV$DArdbg5?_FrR$vqj)QD_*cmC zkwUho?a?MB>583E{%Yv}+|#+85TH^Cs`o_U9D|0cCFKO=!2=;vQ9?9N&%NNFi}(&_Q40NHNT0C$&zYkY*wQ7t^o1~t zOth~a{ha%c)R|ft%w=Hf>ge8bj;DG(BpZ2OH7z?51LAXZS(pc?z)jl#g9h)1H$*Da zXJWpdgbHHnT6uibAqrdlqK#S@qb@3B zgoI=yOB-XgetvU)sWyZDCXhG2<4hIVX4nxE?y?0FCJya6KlR#u=qC+)LEdSKQ^%>v z6$vI^fdw}ss~gxh2CFHVqUU$K0dh$ePtB^642(Ty8qfSi8ehht6;rEGurGo{1QkdD zBfLj-b&eaCU9&eDMFXI4vjN%{X9KO@OJYB=gr3)_Z&nP#|FgP_egB5iSI)Aj;LM>i z);e;>aY1XYg7bwsake>Z8S=v(w@72)H_Q(q#Fa)WR|r~r;9$<39g&|LajEERR^#F@ zEvpHE`yiTZ2w$P7{ZD%yS1ys3Ume?kbQhXeDi#Hy^OD$BJ#JdNAx+i*tlW7LTX;^A zP;TPN7+;OnHV~c2xw;?c`V=Ii&SY!}gIj?)HXtb<5 z_HEoSCw{PLAyJJ^vl+d!&Ep=DA7gPvb@V?3aBTE2M#&JASvEMd8HNrc5O*g{+-e)?ydYyxVbRw@MUr8nf+cfla;pJZlCIE*bAk7&fvsb5W zqBYFHDl6*XMkS*vMsz^CnJPYNz-2@QgP47)VnLk!#cIsNityoph|P6WxJ59Cwp;YX z7(Ywo8!j@gS31uUmf$d61^;in%H`T$pMurPB-q+mwH1iFv7x?#zMaGW28U>|34u?j z5xY#Uz^csN=Gz+i@*wx+NRjs!d1cexX9C?4*d{^cyEz^H#t9I{lBB}eFa`T=5MZpo ziDkgPB=7rZv>DFCx=Ekcl$B&PNX3Yf>ks=~6KA5})@Xu^I#d$HOkqXNZ}0?H)T0<< zYLTrfnUak;WRm?Qd-(Q(Z_-nw0Nh!=A0*i zLFtc{@-s(BAvs4v-zIqIefhW$szn8d+?XfQa^@kAEthSvfz=XDl@z*x0;e_&Mv`?& z^+Dt{hclnmoYeVidQ;b)clymfv}QReSC!p6kC{GB`tN69w$2AzUVjMW`0?_*+8A{0 zF8hN$B`w%3Ag&Yfz`-VY-1bT<#v#@#XE>subv3VJ&AoZ4^L7raW>3fVVN88>p|GVT zG{N~K>nif`yPv_KM@0Ff8IEAcjo9T302|n2;<=J79!<6{x>^!Y;uGDl=NA^frtroN zO)R|`28PLmR^mKLr%*v$8j@CtJobh7jqZcSEQR+u(a8r8f4sbW`a1t_AA^Wl00NsQvUilFaP+vM|ngYmYTmB)!)(~vfH z@g9XO#X{eB;n7SgdDU&^g^hojP}d8OO)a&;2tvZ$Zx(zKyyd)G)z~l4u+tanQAss$ zUTW33{Uv3^Jo*nK)GvfG%Tqm zTdR7u)!ae4=2OB|Osy&*C%+qFbUJ-?DV&_9pV}0zr}Z^(Lb|nwjFF4MU%&K{LVmh5 zP^ot`fohbFiwf`ep@m+RQ5jG}D<%j=1#;qL@Dg8@y=@(LRKZ#?s5P@w4cqD5Z0CIW zw^4j93w!$T;YX91wn(qu3hG5nI9k@Jdk}4!=1DaMA755 zshQ@Yd+l6cl+);IaP}0=h+}v4ByJQssY1d8eUq7TwhqgZd-nCjlvzpj(=1#=%=eGm zPRqZFVDl)$_bOhglG7;k>cn$gg`aSLH~1cCQZG5J8uQh|W8gD!6bO>s$?_HAL9j+v z*sBRo#(S3Fj{Hz;b|!D%E;JoKi&P8<;n`x8U1i~cl|h`miAO8XJYNcf+^oMvJSJo6fZh- zi%9R|8s&oq!qQ1{yc&<{=e5pUCbhX>kwU*F7OHqisaD}@`WLGHa^D6TLpU7wwcTq& zS}N23EK}-JJ=3u>Uggby} z^Zh2#q=w}t2M%WH(Vwu4!u-W7hV^4jM?vhAyBJiJCHbb^PSrbE8TAqyReTx(LIdWP z(zi&GvL=Jh$eb;Kk$fEQ_-WyqbUCk;p!W3z-cUMF*7P57T*_2$G-`PnLZKuJq4Q&L zL~7i+&Cp=cn>7$F<52Ew>GdBJeAR6yP?w&YzgSWrRFpKBW)Qz>{SZTXCL8=l_jk3WE?yy; zk>YabFXvYAWYw`Z6V6BSY3*Q9sM*tobhF1r=Xae@Y?(=ZudkG$cJKQ(v53Q;4VaF* zz^M1DIyG2Ibs8L>iFmjm^jfZ_bqNnr(VlJvC?4u?w!k?zyh2urH7*Y1mG^5?Rdsd< zGOLtI6m{#%Re7I~21zD}KQgr+Ls=-qc$bEV!Zi0a-l?#+vNnEbcH2iq{x8zrF}}}s z+52wnG*-jLY@9TH7y?mN4r-KJqe)q(4&Ah6+r62$GQS*)(~P`J&<_>_Vq?&?%Rno=Btdb@|Ab_CSG5I&IGKIM_Jug;2TFk|#CtxTZROROh|=Aq7YM+MmBY zN|0)N*S>sOn>J2%t&o4Q=Y{biMMB5L#?98MP>b~LOPN{`GWUfzuI<_Z>^34{8UsYX zn}|x8vD$L7i(tnCv_qS~Fh-8&co(=f3ideL3ni9vE4G=Wck8cPAMohE;cL*WYhUJ z?9a(y)E4@ht!I})Z?InG1BQ#J%*D~jy!$g4l}RBR5W&pfO65D}6CW&9w&2CZa09!r zzruL=q1)5dd$W8gao|Y2NZabg$$*cFPF`00qBLs77Y0;dW@qN-{#x zGOpJR)VwNh!57$!P9oYGMNdY^Cs+xu2Xoimian@K9lrZeo#;9g*5R4dUG08}a;0@Q zDf`J1Q`#W^b)`l6!#sHiW&{0Fc4aW@b832!M}r}X^!E-L1SpBLZ_**nO$69KcyU9E z5JgNPsa3e!i}+Qz8@@F?f}A(FwgAl!ykx012c1p7{Swqv%%u{-2B?msME+?f9tUt0 zLsC$Ims(Ux=#!}>S^SG1U)8p3~k*nfF6wXTin|LXC~|NF<= zSX=)5C97(t)+?-7uUXpNOwbl9r3Kil{rKf>%<;{ZXe}`YMr>qZen}?jr9{v~hJ)$` z-cKDI4tTZcm{hF~Q))Y-cU-t?KfGI`3G0b8WRlu2Pg}kc3dH#YGNyK7zSuo2JlNjM zx(vRBZ=amt-?O&}peHvS9Gp1WMbcDH-|jqLEkdz%v^~B&-mE^UH@LfTw8*+Qol9F! zJq=F}?|fq_j#h2mbLfaUaJ>LNJwH2TznBDS-C+%Z>=8Yniz-2ZoHSz0Q$gCy%O~S| zOyJ3Y>`5l7f3`vg1*3{3^5taax8nu#^Y02n27qmFporpNnIYo>2Ghc1Tz1?}SNlJu zO|!=#L=ie9N)lq_Fkr<9Al#JO!hRE`3SBsOI9Q!uJ^<6(yPyl#U*aGTN2+B6CuaOq z1Dq*C@Hx{+F0=7_R&?FlkbVyz!WLe`B%Kge3lwL7WSxXZ2+` zbRCU|S9jBUBagT?RfAWq4R{bt7ELXB54xRH#rCTX5?X>a6g*m5<}gW&W>)!9F3WDr zr4acA2AfipBps+(9zUcK_K{@z3jv}-R!IU&Yhj8%vuZ#~B4HXPCxuEBBVpXNVm-OB zI942jY>Oe$pdk*e%B8gw0ec!j#n0ATJ)?D~-JoBLDL_(3F819`KU zJ>)w^KE;U5*ulAboc?Xbl&Ep!3S(t^V#vPAh9r|@p?tb0z>5sJ5~+UV+K>rPgVIxQ zGmsEQp5ydUOBB31_8$)|D*L8D>8S?_%Y~IA(r?Jsrw5t3pOGI^Hd4qwf%e1K5I)b6 zooj}Qk`H8uqX%ZUJG%26_KM8eT*tb4Y0dx2d7EFQ^XgBJySu%Bh;kMbP;eAYv@Q zxa5$(KL?{OQ7%vX z$~NWj^!2OzTJZIk53Csa!6bZT51_@MoG5OW5vfYGzO-|~x#$_Y$CF>PombrvqXxb) zbAwk4EPT-)@3}KG4}xW*B+7Q3g0Y{dyJ5uc&6!1>yt_(_6LQ?fgeRg}qxPMm)9|RS zla*Vk$HBW_t0P$%4LqMCqAb0mxnI~dokGw?)-1HQ5nH)}S$03u;%{ZjX27UGk}J=v zsd_JXSjM$9S6r)(E06rW5~`vyAwa%lIiy(+M;g=MSx`KLt|**p-?!{cl5ZfA-l-Xf zA&b6BUR+i4EV-C$gE-G7t;miV5pFO>-pbeAqdK|DfXUy9WqdEM#$laPW}#_;J*q23 ziQ3iTO&Pufd(4>~egteoTd`}Kp|K2`eDNCFTwrN2%H>A`?f`^?gX58VVZ4VAK2UM1 zdqlN`u}ksum6BvL)H};8J7~CTZG@I=C@I+Bqgt^nLk_HcR0$$u;uHXY+*tfw#`~_V zb(MwH!g-27%9>1Kg{pGs#lE?2bDGgGdN0%PE6cmeBtK0GWiihijb~n_i`@=i3SQqM z=$rXD8=g_DJ}DKyWXYULUZ?&LKV3(MXdo!M5Pru}DYy$s;(83cTvPDtRLIRS*0BwQ zy^-BKrPZt$7YPj=fC4(>=WZ2b|Wt)a&&R2HjKjb&{Fug_=`;!^*h8u1nGBYFdffu@Q-4#RKfN4HUK4M!n2A{u%|E=uV|dBA0WQ?tFA8YS+x$rd$J2OKXW#WLTJl!x^bvKQyhQB3MXc^na)IU=7 zG)A3Q8Qiffoc23!vwoDrcITE0)ce;3K7A&>k_F66W9+7MXI_1{Rr|LycTe8g0Ho{B zu|ZQ_XCz~hpSP|hoE7##>M2}Ph~G7AX5k#U%8(w0jQd=@6Jpa?IX}mKpb#-ae2Wmc z=>UmCH&&ygC$n3D#A&Y1#?GYzLx8^H2+y)wG}T7DnE{~+GM#IgrLK=}>;wZ68gekk zl{+!s?oOwG_x{lUlF5Cqg?^f!0odEBJ(uPkU$F;c418Tfuu3)wn{VP>R31E7UOe*L z2HI$cRr0J(PNu{O?LcPy?!iU)r2cRU~Ewq zJkUrz_ggvK?06QwEGk4j9N5g_!=qX2=Bj`i;)JU6o%sX>eiGnbb6QOYYAgi$z4jnR ze+De!7()-ML_N5Jmi$>K=_z^~GYVWyftP`1ekvMdm#a$-C_-z6GM)PQa_7>hW3{fv zpqviEUvCBTZU+iNITx9}SCwe8a%CNu4TE2;XSLSY9sv|yG8Y@(Y{PuY`4it9gquv> z@{_&nNK`~nay(S&Th}U6HMSSlU38{;m|f_ScV|l3 zLg1#je;E5D&si2uItFC%)USkawEOVJ(w)R=(A~IvyWMp66^=Iwh*YVa8=)KpJNum? zW491BLvjW1Rfrq$=C(tck{lHEmwh#-9={5n$qr)^mThxyae}n!oUq%$@eAgfUL?4d z`%ACao4i@+bs5*Amvdm_p2%gKm71NaJHe>Z_DZv}<;A`9%HU$B`>RUDK-XHxlMmGm zYOqubAR**Xi#%U?hOD?yVruvn#%Z`838H8iQjKQdvwl40?|bLl*}{j2?3;&+Ti$)` zDMj>!UZ=8U9)36OlqViwo0vljEP7DVWZJR#{iHog<3mFgt9&OM=46g_TDgdRemYR2 zwmGy2u6d4n1t%Hd^~*V#oZkpF;!5`{V!9i|@cjF;paHYR=}(xcl0OA@UJ)uJO*SL(Z6b^(5!go+#IfHh)G+ z0#Q+Z+GeqjZN(x>|Fm>CzO8^mH+Dze2y08ascT(fNb7Bw3q%O6!3%d{zj5I zfqMyouK}o}`_CB}b31Wk&m2PFP`|;X0xvUhW7wVn5ln<2$>xG~WS1=bPX{Yf(g&<=oB12p54^#u_4;(_5&ZIr*z(bLk?0?{$h z>ZGV*V5(rK_;N7gM}vuc0TE=S6=20|juG@p`7mUpw*mCa+PaIeGfMzV>jJL!{=K#T zO`++Zrm{D+0x*exYE|+7)T)xywF2;o?fz04{3%3^5(s#K1O>G^vO_;in{3OeLQMD|+Y{Lyv z5@f*yJFL2F3|KnoUe7a@o8^Rz@V>A?>L^=s)KNM`6)b6kMr1*b*d@5JY&n*Dj}b-; z)Z|2h9p+o9`=jt`@Y~J!qHGR#hp$64y!)qD;NCsY?V2YyJirRUt(5oOB%LyI^CEUG zDE!^li2brndKG-F@L1tiCYU-Xv~NWpQK6aD23^|*FqB0SNIx-!&$2%!fNFp7v@&Y9&&nCuH=Aj5)Iq+1bA?&f}*!oRXT9E;KRsS8>I2I8g zv?roc09KuNJZUghiBe6n>*$yGf3G!6_D_!TC)^zjeAsLP?*#7d2>Y>%!dXQdrZ!<=B#k)mP3{gJ&ROZBnzc@L|e@xV^Dhr<)C55 z<1v}_2plQIv{u~|DEbFZZ9A@QJmlR6$TQ~egsG;IqDpp*o2b0A3=R|0f;-k{7E`!( z3HUG8cd77bj>~f4Q!YBc+-TYgpKpRU_pk9CW#i;d^eUS<7Uv9Hu)SA5m4SJ$+Pm=M zc|7go`{fgT1Kvk}W(?o<@7tNFXI0-+MXlH?^9nMJDh8_IqeaeSJ9uGdEV1yARLDEq z-Yp{1Zlu7ewAU^bZPGEa`~=C^OF zKF4qR5q*&kHD<`##6E7U;-S7$`Pymc4ux>gGatzvqUXy4fI>wN89qG^FGOx*6KoEnJrx2%15L6Zj zR7WN4*|rvLL{pio{`t+_$Xt>d1iT#Bf6SYN|MTku5VErZumb*%-mhiM_)ms=p!89_ zeEG|VHzhyHR4eS(Gcj<@5PS!og0FON`XebKaY={eEk7}ubeLiDOFSYI$@ZW2f6KvR z7!ySCXCMfGF~}>~SkAHOoAr|uHb)5Gg?l6_i{7e{m|bVMbU^X$7v-Id+mJhi$or8{ z7dFEE*qSEfO+TJHbcHhl)vWr`kn>3lx@8WOb9@XBp^riNz@=;{1FH9W=8CN9nn=8N zlt|x5?kn^p)Azo$Zx%fgG^mD6ZS}Q}r6_)~$#)}|P!rA(Elh~8M_z_BVLO|yfReI5 zD(>rX@!_O$JtQQS4JGW!0c3@h+U`UWF~K+7W#K_Wh_@kvR@}qf^H`vu&d}A^b{3nP zU*IPkVVF^5fPEkSXyd;N!T)39|DsqGscdfZK^gURA*tcYE&kiYsMxnWBB`Tfq8 zZ!*FS-Idf3ood0ss-x!a@~Y)#%Au0vo);$kVvl0JNmpJ4Q@~cHhVrvSU|R`Ez`d|C zMmo?Su(TKcm|oqm3Fl{3hRbr_Ut8SozT2NYOnhF?a=#0FHX16k7s#vxZQrT4_Er-^wH?GpiMO-$?p?c$~T3eVkW(enAgkh{0 z)C%i#EjY|@M#9yBEuAQnS}#qktyxQ)*s&NWHkbbxn6*!HCd*P)D3`BxHSiH*J}HaSjL5OJ>L$I#Le4qY zf<{+Tz(vOP-FeK^$rKe|nqZO%8adqsSq-VFlwgI1TOo6xyix01i8)2QoGr$A?9{zm zGnFnsCXzU0B3(!0OHjwhMC$Sf8(QN6Y&RzOB0*B zG(jNuNfFlN_wYuB9JyPfV`U;6UvX0!h9>x8Xocb2-q#}J)|&w&0NcS`{9f(irG0~e!9a2pAWRyx^ z=AX<9*B@FC$*mI7cs`tyYeOeE@rosznpB>59sYmgvfBlSFzMPT}R3ymSXMjLRa} zW6m#1eY(3K$}U*W4l>C|9Y5W#)+}LfN`vTXfrJw{C=qR?`VEx3B2u!jEYJ8`5&M3V zhSd{6@kdG(B3=@YJNC6(te7OX^P)P>cp?$otr_D+f)^^K2p0z)ErRc+H zcz0ZO;Z^Ky#F#Zo!ufb>`U7*c@QtEJlVaHe~V$d_j01j|J}LJ@45BCb`tN87Kv zG+&OjuoXqO*SkE$oK48jn>p5*sVLopBV)h?*7`Z4wAJYi!>((c8d`?>B|lReR(`xj zLWF;6y#DqzTKNpxLJ;gvQ1m@Mr+vp3(*92l(Ib1ZhSU>+(!JAuawxDXlk@{YMgVfdE$USOxl)xGI5nrKx5G|e;E_j-Bz09%on{ge0+WVl*2YibL zQd{_fe^vpsLKi|Xq4yk!X;9KL3t446zd2^rbrCiP(dXC&*SUpwCiaFzXgx$Yv~i5| zG0O&5y%(4Ty^**lyac{!e0yej_Ja866FU7TJ&Fa6P?nGw{?XY}D=)ncuoDdU$GsW` zCDe+M{7VAHPdeyu&V$dqZ@^U;@Ji#kJ=d|?mYXn5cz z^QrgP;R++)_0VZgHHCP>gw!C&vQ>C*WB(Z2l&o50nMKF5hI&M=t$nTJ^~SY!#}J!3 zcP$HhPKBIRTaT!PeG|{D&XMqnrE82`Aoqa%@<4Q3_Vjk*c*y@zJb^^lISQ}eN9di<6&TJ;^N>&RLO)@D7+ zMENz8&S&?;vVc|7eu50f4K<{I={HHdto;hk%^J&DwmC-KG_;YlzhFbs9W>!+F=I-`k;n@0kxXsAmO(% zZ<1jfoQ&9txlp0`^!WjfmIw@ufgf!G&<7c|y*pa4xjDHxfK|Hl;Nj#^6KKa5BBU13 zakMWbd!6C9LB-NXl&6z;*2*#=QLwsGQE1agk|9<{|&1&*c(@lzOr3^W6aU$x*fXLaM`r(tDZzq9FgI?x#i`UBMFuvU;mS!XJ z1S`^umVvM5z)nI++B^3guvN|J7>X7xtME)p;|h=xsvz>W`8gjNce1v+2i6@r$5g>b zN-!{bS=EbtRmV(IST2xZfUoh+eV7vo*d!vkR0GcoVk7Dpb9RA{qYMMUMr30uqJ+Mf zouh|+exzf(koVd6d^k6}A`nHz({xT?VH^G(&h<0w^aGSD8}&#@>{<|SR%{8Kgf?RQ zSi((so!t#?-SOR!ah{TFA6Dq1{+z%^X<3WN4Tf$Ewlu!?qP?j?z?!Z6o9F6B%(5SL z&im$;1>VG%+FAAE^@mAm8;l;r5J7uO=SD7>ktdbB+In zm^Oguf9M7j^x1#xJ5c@4FPxB}fg#|1Gc@@36VyLjbW%>>%ue6{lqkFqc-6-9Ox}({ z(^!TApg-3%moS&t7dMBp|J>I0yKDCks3_B4P|<|6EL9CTh0&b;3LF7-hQ^V(aA4zwn~2-G?@Np16rE705LPUev~5AF|riHAq(4Nh!t4Te3ywB z3U_6Af33|b`|qvo4$llvb-e8UsMSU+6PDTGtluQS7TbntwOeY>PaEeuELA$>_s6@u z>wmPkH!N0tb_TlpE*aEDpsCdBbi81?Vc*n2PGRIRXysN_aEf071XuEx*8@+%9h0Gt#k!Eae1}-jDe|<{xvE|};@-6gVDPKmMUPq{oC0?+$OPmvij8KKx`62`FlsYtCyXwezM86ZRAgH`<`t=I^`N`gp7dTWt6 z5tC>czFU1C9l-pBw|oaNRSi`XB#U65-FPe}6E z=n%|QHV;L4D?~0zG~0o($~$?AScQ@6XR?;tYTZM2iA(u?=LtP^texUta^_!<~3PgS6FFScz%gylMldpp{veaGFT1dV_W( z1lKz}Xxlopy$+(+%;(A2?VY>q?9O)^3?3ETU$C%|mvqtRBI9G6RA&lnpAx&YY>12U zQbRrFc8U}p4q$wP)OWsxe7_N7j)mtStvQ#QK$_q?8}#yCKI?+P9?93rsHZ{KCwInS zC8+r-cdMev)zE_*nY@{-bl=(v+4->s^){~Syr!U+rUj%L%0e#?yu0oqs4Mq_qq^4+ z5=&0TljVA0EneXL1+}l`gq!Djzh!n4YdDTeFoWrVD&ZP($>jmZ%~Bu;9^{-W9l89n zQfl89({c|NX2jITB7=ugHZtJBdCP^2$S+3Z!eZ%mYZ}9w;%nHZjLmVS-IYVBB9deS zb(9j1IL5_%;xzV^5oxcK%nq_?3vFStnR<(noT{ivK+-9RJiCH9S_!_71nhQIP!=e} z<8}Ry_|yX+iQ+8CYTI1$x+q>dW(8Em6p0@6Q%KHg=nog(%97~u9%RPHppX@tll5T2 zHZWHCXE_TxIGSHha#*Mqr_+U*J58RXPrthfna^6#O^Wdp^g}50! z&}l(&v}kevMvMpIOjIucVuj$3vGQ~K>tAGq|N2y#S{Yee0_Z0e|EuB0zu~g~`@?wc z?XC4q0kzFvP^v_^UsSMm5Rrx)9nV}VjYc|Khf`=cnut&+B>nG^h9*HbyhdS-oqNBK zU`?jxV&X(pdyZ$Hi;d52e)8GgRc$Ev6T-OxqVIr}!vlJ6W-r=W-YOWh#FSHFnLXTO zr$xa|xI|_^;Xb|#X5f2aFRU2YBIpgT!L=$Gu(qj`ATI;(kK@T6f&f+h)d12nOPDaBW08j>S4dM%>mi?}x-stegnnbJ{@;5|=v?QJ^9 z3~Jr=JMAFv>NO&soS^)u&g3=xDIYivrpvi5MScV1MzIjB&3cLqW{cz)oP&fInv*1i ze7_ULm={6NL7+2poBLn1HWF836h45fiT~*8znQoE)789=2Br?WdKQL)fF(eOf2iWh ztw;gpEg2vpsDixRPn>k!DNFZb@*w7Z1UzB{j{?wD1qCPpdK-%#KdCp{+`(|$m# zmme`R3`M?zuL_0Z9Maz?4Wj*5U}fO^@P8dstlOxGV7ww%&+%qqKv zJz6%ny76(;*w}GPlC6sFP@Ip|e*7-pKrS0k(aOnSl(^)L35n5#TG2h9SA0#K8RFa| z-*}WMy)h%p=~xiaDv1P~I-t)1c*Wt{k+kwC2%0hLTmB=j`<(YV&B!?jftId-tq-Kq zJ^Rs%30Z`)r%R;mSnwjI^}S8TWzl+ApPix(&PlNTDaZfQQdP;I7m%z}#y znh(+Lf>a8D7=RY$5`M^RH5_apAL>2s&)tPbELF4M6e;w6^o(Py?Rui7+8V$YkE$ux zmG4aovJ6Ta-M*%^x#u6#!PuLh@~TIsyyT?Zs*16_F$mQ`c+|~yUtqmXIQk~~h@^|p zbRt7l>>#miO>Y#Pn}~H`LEg{9>O`^Rc-AtB8D+m}kPzFD^elQwG^w1VV^+sU;@-&e zF>+ujad+9*+;Lk3l!mEtNK|O{J}V~dKtBHJ^>#Iey`GZNdSn8_6Getn)94U;Z>(sj zAjpibF+N4u_mmC=?m9_^1zQll69E@4Z}My#f8KcMZ4essNW1*r;qhx%g>+DR#L4KF z^ogCfL`)25hp?NLa^fJQJu(V;g*&+uSys+;65u`6_I zRm?+NbW3D=@~H@Ch*@_jXs1}#6|Sf ziF54j%0PaYYHDmci`yeo&9!q6_U#v|ua0ZGuoe9^3l|ay(8xamaEGxEyJVzd9u}k9 zmUqTqRokyWA29@F3UqpY%fb>GCk}$!Y>iYe)U>L|77B~EF|tZH&`&P(7iAx!%eteqY-MIlIMmm!ntAf0KU!E;FYB|e0yz%c4rFM za1mpSE|QrGA^(m>gHSEX8r6Aso`jqXP&U(k$#NIA z#*}2|#uUrc2o13jxIS7T)P+`})Maj>Fk~P($qm`Ji4g3<%5{&T)TLi8_j)1a+9I64 z&HoyGLAN}Jd;!FT_aEcpZ{`mF%+Y`|%1^4}Uu>PYrxl`p)46Aj|_%pHu2+>{xcnd5|_5!`@0wZn-bR_(!KZ3)O{ zEnG6xdxJfeh3)s}VJ_&+mt!g>W@9}45=zoJG&GI11EmgYpKk#BgQ&?2c9pxKbk_vY zOl#4(uR#IDh)&7_$(0uSrH~zK+(om)0yF9j(J%KN=IO^)E!($gOzkYUmo;00I%oDbl2sRw#6E9;1C z>^Gc&tI|KmcfiS+tKk3_@Bh)oKUd`cSaAtj>Y7^c8W`9CmLPun`JV?-px?V9fKw=7 zQDhJxr9Zc&Cj^f8*Oo{|Uz@|rMqJ)ln}c}{)?(PsoF8D1q)iX7TY}$-AsSr*UW7JI zD+KP8(@l^FR?4G97txQJp{w_vIE(=M`ENH+C7v5l}B+y3D~I#mz!k> z7Z0PjWdKa~CV3Xz3yGD{iGn#3X5S4P?6VR!8YRLY{g3KFNY3=;-Pi=osk$ zU8(YN;E#i&=o)YEAaC}`^ahrJhqU-wkbwWjnjxhpep~<;LL?27y~0X4HUJC=SSKbT0Yhk>ioXhtf9K?H^9J9XG&D=D3P!g5CH(^>w9mb~hXi{{6t<=bc|-QQDng~IGA$M=z7%tz zkQOA4S5UXfF<-W!mgBh1x87nG3(Gk&R$ooNV^0RcjB$h?h*8*Wk^~ZGj+W-F9FEbE zdWCJ?PkP=G1a;G2B|9wX*m_>t+`SayfCr&HAJ$_kO*y@k9X}tVMp;R!@>dt#c+(v( zm5`?|J(f1J+c?6k{7OMH2{j9_07Db~QEi{;|HjyMR=O6V27oH@Uk;O*apON3iGh=I z^`V#5^9vT5MUe0`4%=b{ejg#JQJVDGBIQX!C5n)=#{=JQ@Q1QYDM`NYqW6w*+D|%v zvftmmJ;dxHaMHB+x@0?TWYRzL!?4269JktODyOI>_CHvK39!UA>HRTkJxFbWaL)JoNX_#+f1GCLDz(aRb&S&s_E z1V;;n1W5}|1rw%24gTX_qi3Jt0b(40{r&!E|NopH0Kxv#{t~8E=D!2oGq(HZs9(_f zTkUjN!#p&NrV|2em1d}d40I1l_zEj>@El{TgxY|%{U!jiw)MfGUV)sTt!7^5d|Dr?=(KHy(fNo4&~6L>5DRuwhwN zdC>-|&H(}^mH(Ae+Si@5T(LEk>sdpa;AlM^NZrJb^DnX?APH@I9;&!64u0@$@!nZp|#y_ei; z>ETa1`~7OLuyAUU0yoIxA-W*cGpvq?^OACnQ(Cf(wO=Zx)(Y)GGJoaYPb=f~AOQQ$ z{4tr(|6jy60A6ixs{gOK#54BSr#9#fs6eL8$FFrx(>wxsu}Y$^WID!&E@)L{z(~Z} z30zL=S8QWS6Oxe!^{1v@?>_G{|3ZUI*qY>8=IZNa=WdE$=kPtSiWBj#*q#sSQMllL z%ziIX_VLZH`wYNzjR+&O-1HG}Q=PL_Vmd?Smps(^xJH5^=k%R`Khpq4&Nj$ZB7Ee| z5Xszd%fZRqV918i`r~#FgBitD>$4b!En%K4zPwpUp|auNgqxz)1a4paT>K)%Q1Gdd z>lZcG_T<`|F;yC4)|cV9Kp^SD>UvRQ4Z&(#jA(-{7_6YZ^%EF}I%a!f5$t~q_MaEJ{`fHzwfYt8KRX7x7Qd0aAE1fhjzoK6peo?!8^$ zu8ryHNm{^KicQ9L;$#Kgq9o*2;8${~gW{{e_7pMpjV#Fgjb*gg{4|PW@6T1Bp|Y!t z&`_D#kr|ZaEy$!&DC0iT^BEuJ)mxgG%MTftmYluAA3J&2qEyA5r(SUlnWJ&{MaF@H zwV_M*XF9G3aqp?t^yw3``}leet0Q*~Am20#@JFlM5=3=RB|RC`&|SSND<z0 zI30l!N$6<2LXr6IeDa$QFz0NY4&LSWl5Qg$T&ReoOE6xTCJ|G!ay1{LR0cp|M^AbL z>_oQb_7UZ=b6?0cPWjJ<-;}Q}tzNv!`0x{QiVYA(XcJfxXVqjw!JgP<)#s_qex(p| zOGAuiKurF`UjBVO@*h)(gtb1P&+2Aq@UIbT89NDRrC{_KBbxBa3dpp$1_)TTrMj5a z^kMV`cwY)F)GZJfGM(y8314r3+{+A93j)Cej~f{qdtC#j^H1BzU0`Kc6j<<>Ba2G2 zCrxg>1Ch&zYVEo!ZC^0ND(Sp;gGMfa(0Dqv!&H(U;MaqRcJn>u$V_XuGzD zn3+|cTU}E3$t?S`_Tkm%$Cqu=cWr*j@NG6alfE>*yCH?ba>WUF0l9i=$bfCo_r(qZ zgRiWc9eT1A@{VVNTj>BTq-O5^b<&LvOo$Vz$igZ3`-4(y>CS8Jq&0Nl@d{d0QiaUB z0uj>~q@^^)W#e%aw7I!PCwC#R7Dn-tDcUh$;9I-k+a{O>ZVCOfJEDE6p~rEsD!owb zTE5v7P_lA;l>i}m*74CO*Et)y(LTWfJ08|~dozI}#R8yRNA!OgBakvh?$JWrm|{$T|6 z^wPcf+JCBz&!Yps$nk3QjR}~k*>@UPh{=O3WNx#_w|R;-M!m)aUmVTuLlRtpsqL9c z2C52E3{$f?{&7+nm?g+^4eK4%glG75*T^dZF6K~Cp__$mmP$tP#TZXxg~kfn6*e3A zmLy@blMOdOjN#Xm#k#Qq4;c_^?0?)+{hKZ3e}U>^NHMG+yj?P{$B;5!kUQGFTpwTj;DLByyc}0R-A&ln zoOjFzR|O7UTRuZ(u-dr!#)C?6+rXzst$;XN={ElYeZ4>G9lHnQ)uTV=)xX(@_!pB} z+dJs~*RydVV15s%1A->;uArq>TR^A(+Yy$YSw*Eh(CnE ze3hn{PeafZltyV_;xptd6{LO6Tdvlv7#OeatSHjM$`eBl(wD|G6`N?C)A=6TH?TE{}-^` zcksrj8p0~Y8~49@oEOvby+5&S8Go!8{-ZbL{xKjDv;y3+`TdSW#x4K$CZr0l&AQC@ zcCxf3ms7=DriGfqO2z6SAHveo{(663MW&>0&aZD{Gp=tgo*+I9 ztZ_QZewo>5R@{b+6f*3p;UIR-yv*Qidx(UMB=Q~`ZqeTLy&)^fc3rHqO|i+$ z*GVfL!I-YNj8B|1=w%Mg$K+VMC)kpk&8DhRZUW^A^Jk!vPMdD9Pbn3@_xFiwlBdyVBr-=fz+wJK1e1swuc?k0Qv_Z#rZSu*@;b?Cw)qK{4)dz)AGGgPl=%<0YGo*BsJenlN6u4BWrq z89()0kBosu}ZaJbhsS-(Q~c9rI{UOom2KVJT>IF+5HdWyfFA8FcI%appbux|Z` zt_5@@BE^+zb&$jOm{;rW0Kk7q>n~P1IS((bz-``RXuEXVwR^a!&BDmc3yR%Q*8(n4+0oED1+mqvSc5ne1@YK|&`<-y^}Z8Q+s9 zZ8ru>EIXvneH$XIB!%5ogrpF2`~sVzK3)bapU}GfGdXOD&c_^ zQY66`9>77+p0rUaL{U&C#t1%5g*>odz&dMx;vfw*X@ix zV2}(zSNF3+3F*+Ex-7^*ViYjrjQ1YGtuGhb-ud%`t0`h&c?SfIw`tKSOn4l`@KRQOmgQc zXQaXo-zws&WO44S!PNPY=oXLOJ3H;TU7nx z$mY5M+Oe=wUUucu%#vMMc;#*jRFV8?76G?ZBRAN1@yM44ef>2E}3G zhS1VWOOyz6&T%DMOnV8DIg#Mv5sMz^Oy>1kPoM5_4^^`B_20g5vD9AN2g*Rj*j&Nv zlzWGj8qpHyzQy+r#KxS+i4V8CuBUDC<6Ju&KhiJfl{uwh*3zZx7y06-YDY&7RtM|^ z%v986ra%RIw_xXT2#PC%RXoww81zg>C$^`~$vP2WQ_*Q>uix!OtKuWrF)N+y+g=55 zC|N4isIHxb)&<=r$n^<{k?S%PS{QPyU`k^q3ib=lXW1`3{HlO;*}ODq0A3jXqZj^T zmj8zr_yC(|rdGzkBRw(x=RyHOkTGJVk^&0FM(ijOa{1*9C1aY2hy+h)ljB#$aB=a* zz>RX(&7Y@Wa&n3linyX;>;3H1S9Z@|pLqEavzqemEbu2RY=of}stWlLzl~g1{v4A9 zEKPS4^`0LZ<)~t3E&HH1<%otaF;7~6aYvaSd7>_fU<0!+2T5lWvDT;NeSBh_elVeh z5>l#R4cvgM{w=M+^9OijrSM^bVk$J9Q;!%CJH3fSLNh^O&j_fLHw)l$bjv~0Tg+V? zsna1J@VhLijPWC$#E5j-nK&>|idt{~7?|T3biZj6#|m=Mh3jCd!r-e$JaSIsU|0$%P8X~*2&`$n4&R&3W1HQN^fFbU(&*9z7GEOE*ozoGIKRN*VyR7X1>6;a|*9-`PmsRKWTUiN9@W7ZWX z03)O5`~ONi3#h7=uYuEobW1ATND2Zf-Q5yOUAh}2q@_bTM5Vhyq>)w-5Tr{|kPuK5 zP`-10PrdgF_`dZY*I5hH^P7Dp_RQ>=*;~59n!!j``Mb&+j>lKm0<#oT~e z9XNOFX84;)PR-ix-~C6M*g3^^4uUQv!U;GD36+mmJ(2m?@7$|tjksiDn%3nm#;l&s z#9|Q+bS(7Ctsz{GsMe|VieDalavK=?J3f*@;0M(&KVIQ zXa(Opmncu=^==JD)-01>PU?gB+}P$PUOn>TVgsdPH@Xj|`Xyg}?CzxhfUjLw7T`2y zHGTb)>&s?mdch0h9Zilxg7!_J8uSMH$+kl`UsTGvXxhIeaTym5xn$Q$MUe?XvB!=E6DDfpLIu&FxX(Q&lj^DMOrP!Uo|k7{AQTbXU!bdcWA^Y_y$)I*5yemY|mLT^4ZB$&V)Qg@J4^w=x zHqlXywJDno$+tfUxMWF^hbn1TN*$h?@i4_n(P;&&LE*3r81AdWO~J>b#fvWJc(;M1 z99K-T?I;`k1re%stehueBG>Zs@^PP34+yCh2&!DQM3+dzUvrvI7XED1Au;DP4#zBQ z+V7UOnM&812#GEUkHUoWZNf9Hnun!Z`B{L_#A7{cJ9 ztPIqc!nytNuf|4o;8?r8xt%RY(Z$B-=gCf+7!^5SLUDh4#adr$V?@Dw-vP1W%ZE3Y z_C&aiH)aNpgM_KgNto>?mDFO zJo=LMjNZ!RZ8-+beeYc#lMS>DYDQ7YJhj66CiQd!uPJsdvLmfmwDSY=@@UpdMAfmz z#adhYJMVD@3bQa?MuddX73BK0t2g#UcnMjLT-o;tY1C!CZH=RN^4|W2&-0V7Y!~34 zAdl`&q3RCidZksaJ3n|vG*KblP5nsXInhVMIuV5M54W?;V!gx3N6T49d13e_JF8 zT(^oYywJ#MmGx0QcQ|Z1`YWm(ehVLGy%4v*KEDOnzOe>T2WhLh4d3eZ-rzH;NycmZ zeoYU5eNhO{jK(Dn+59&9_l3T1_Er@+&DpWZ(sZc$_r7olP>_F3z!zn>{!%F{hdMDu z#!jC8g7@&fC)ywV1|3+{ghD60+z4W+_P;m2mQ3rc%TT%!KcBlap}A9BroB2+Cv)GD zvqIO2b=?j;`I03Usi+4O1bCD9Z0q-52M7(PpRF+Rw{b=Uw@;#tWi8j;O0S9NiESsko zzL5%Qw1_g)MPg5oHO_Cc#CI{`N>H1@!OAQQ{$!o@`97BmWf`9I2!pqPBeAGIK7x#M zW1il)rW!Ys-(JhHDaUiVPNPpjyW8*jX#66krir4uECb;4M3qGz&(kS)N41TRrEyLk zw3~^e-c@gRs1v~;bG}X!^I3syJ%7d(vEQhD>S01BTOCJu5O(~~P`J&|%J>IEdjvDe zULH9uK`cJjrbDaoV$`abp=Y+1UB_r96~!{P_ur##^Q=l`Zin69@$=GV77}}E9PN=g zON#NtT}#<#*%7Ia0)MyweB=|;PqLgWvhN$c zja6@@BzO>n@g5I0k#Oj0KHWjeJ8_=VyE*->G+Rk{P)z6>tu=;Bew`ShF)fp;j!E63 z356N<5u4+Ek%xhT7#`SJKYGlocrTu9pvUx{+hfkKgvr>tf|Z9V$iW5VDe4904 zhO5YZiubf052Irz+@BfqnmTX6 zn~4izqaLn>98mGcHs2)Aw=*VWuwxMW#5-hI&OYd@+O+!8V9ACd7E5wNuYrh(Bm{o! z`L2E|o4vy32Xcu8w=HG~jSxq2wSa!npw>$6H`i{|;W7L@j&E&`=-nY}|+R z{YQFqp0DdOxZ}}PUMqJx;k8Js$fXELIXENop>+*@B^S7YDOiFrc|!uUeRtjJ>1RgY zhpM_M-{UNo)uYy2-#BcTuN*6Rys4eKE|DPT946~U|B}8_S1ocXiS7fztH`T4&APrn z2K=?BIAnuBOQ|}yUZ?84)qTWC>g|&JzXdb~gYY)PpzZgpIm=}7h&waKukxR1C{NBKOk4LMGua9b5 zPP~rb4anc%;a#$k5Zo0aeaJ|fWRI-nA<&i;%2?WIuP=&WtTO#zAvcg8+fKqkFiZx1 z!KKEM8(u#sZ@o5kOd~7(?sWAl;`P*lHE$DHZXPooVL4ZG8DaCc(~q~rMYzXbSb`#N zhc~JSR~nQS9mZK&2pxn`nWvTvI7iSLkKsqSn=I+{jjtI(YAy>W=O|?^oB& zq5ER1nx@WG^j4rDul}A>$A(HNQx;+dmm*DXR(wSGGlI_e2tnzWYf?JGCkxh2&j*s{z?UX5cav#nbX-YVe zOUfypYF|*kv5pze?$}S3CEt1&>0fbf11XFhd23D> zFXQqFJAZwB?-+e{5RI-bgd?ek_o2J^tqi)bB*Xv)uh2lbR~PbLtl*XnKXl9K8Iz_u zK$lrY@5o%jy73ujrhoI0RL1cV;~TDP7I{4Hyom;7JOm8iQS4xlb|5P;Y_IGm?op~r zP8+e6gAAih@B30xj%Rl|gvxu@)^0y2q18R0qF9Qjc+{m8w|jFEE1rBa*HJo?8h)Pe zsk?%euUJi8^{$)v@l6hoE;q(SLFWlK^YJu20@Cj9IG1$ym2^-hBu!p+qbw<^E#VOK zMO_h#>`_vPx&B;K-6GFwyd?Vghg)QZ>Y=M#Ko6`qcYE&)M_%Aw2<^zrCFUQGRIhWS zmlqH_F4#Jwk&%s+GQ$T@B|9^c@|m{EsHvjYs`&$JBj6xCsL>{Zho0S(ezn1AE4}{5 zWSiZ=^4)j`nxR(2W(CWmz^Tp8fxtD8@;CZ{6^TzC^;}Uw5iGCwuoKK`TcgjZe&T(P z!#U%QEP7xUwu{u~K=jX_IEpR>rsh>=-N7f^Xybk|v4yefNLL~p{D{tZDP)%L$*}J0 z5!EB|7vkZ{rb&aU44iG|Zu~~0(VGeTh}SXIyC^5*5^j>aNJ8z>AISaBrhLAr_VQ9pv!jhT;&oto>adtTYO}KFGxXE<- zV)b;-VEx(?u2bp+HQtign2zIR58(t z6H^W5B4XT=_cNo^_JYR-j(>K(>(TtM!9vnqdV6QEcx&_C=ZV#65v{|$vbhtu`}jLf zNVbymYzR&Mg}D;9dwMN`gjrn_bl<$oHD&A87`s-yyoYqy`E>bN>hgf4X^P~64MIS> zyy^g2XncHai1Bj3+A?aZ<0&li8!Ofj6+wU=P2?dN^(gvsn#l`uR$x00D zGSp!{;s)ZH%!o~|_;o%7%Zo2u^RrPK_9D31)vB&Tpt|cHU;OPD&9B+nRaAKixg|=e zLV<*-=&7&7&a`iEr|Gbzq5-*Yl%8g4jEd>aXrHR&d31T@MJ|7SI(Z-fuyzA8$P9$r zrZp~qc?rKVu2}m^s&I6wtTEx-e0n~KOtD+J&R$)9`a@M!Q?3$e50I(A0`IC|M4C#| ziFb6O*-)j{^#N4^pVmU>G)s1ct9P=V%gqmJ+gD<9tGkd7oG4o8=h2O|YT)<@;(p;o zxP?2ep@C1Hmrs^@z~Yyt(fjGkVIfJ~`^tr9pCzZu6T^x+5qKAGXYS^lcyN>oTrJry zc+b%V=SflU98aO&A%afqAacgiu-Kuo@NQ1gzE}B;e$rYA{rv;EZpqZ(o6bNs_$2Uz!O7vT7eJm-} zA~onkwyfv>I6`lKbW32}|IXlQ*~yzl_7UsiiUOt=I`7|p;EYRN^W^TgrR3Ec7}9aL z^x@Ls3Y+jmI+cQ3WQ}aFyQ))-Oh0q-c;egJ+Bf8@>rxpzIQ`U&*_PVZX*p)UQ(_RO z?gjOg8g{8k=yShF^pP4CECeYHVIt&B9fUi4k}2fpwjFFYopYSo=`S#Pp2ODbN)_8u zHT=2Kl!WhC@b(1;7MA;!U$H3PZ-OorlD<}+V$um)nNg``qd>Ju(p2)ZxLQ4z8vMm@ z&K39W)OvK~oPhHzTdoFj@zkN|cq6U}kGF(w7n*eS9JwN5CvigyuoZP2o+P`;D<-wN zI_b96{d8RPfMTpuiZq=bqe%I>+q;s1jV`!t{UKtmaNA9tsm-8wp<`~o4>XsB@WXRM zm1ylQyQLb|-IWhruMw2}q-kFXGX9c$=s%$HFtL<~tuS7TxQT4)qo$FbcvC-j6tQo) zMk60afG34bzwc4^oB0pg?p2~ScpxV_xeV1I$HrwY^~ZE+>ow76jKnOuy>JuJ6HEbl zsY}!EkQ~^JUXIL6JJ;NBWo#sw<}VAftgzm2p61}Rj&IEeARuQpv+sfqR=MZyY{ z{wP*KaV&+uT}67NZz9Y{jG?8=Q&1gDthlX4a^Pn~dmO~Cde36R%8M;DNdMarX<2E2 z-^*G1wGwOHeosUj=wC+&BVv>c4 z;wq=)GITKTl&ma5!tVR$kXLW$4B2&$93|$ZdvGRnUc{l__H2@;NFwo~Hra_-j+e`M zx;gBhpHMCFf@eBX=anl0(iZ&v8|B2cBG^yw;m#mV;YwX1muL)V6U05>dWP+AE8qeS zHkUiqdN+hUDrZI4=-FlIy6d{A!P|005NEAWdU%C^)oYQSX)ulsG$ zR5yF(#U5NX+qv}a1;$PPFK8&2C5~wWqN$>|zwp1q$G92#g$X6oKkEk4qu@6^LILsw zW{Vi!@=>7V3&a3Tm@GGFG-WM$J zl8ea_gV%H6cv@Kdb?aS7GbXpco{M2czGr#=HZ}(t z)ho;>56nAeB*zDmpq9q3KU^51yyrj?17-#Ur03Z{C{G`memLy-cQLH|QZYao=Z2bP zfw|SFrL*C?${A_B234_#q!GJ=gM=cEV&*uco}4>Y?8k6`pUT1PN_)HOxL@SSL|VE|2hE==Wf!%dQLG}46I<0mbnWGg-D>;cijO8z{< zd>=5i_;1IC7!ff{i&tHY)zYeowAZ|qbElcXll`eX+n%hQbNgD^(3>gMz&QJ_(MJn! ztLo4{eL-E@nY=h~{dt7zy3*rrZJULgi!(%T2jAm;E`R;%eu@qWm(%^B75~VMHDd5+ z-`>&3i3*JLLFbP4XUw?%bbBElaxg$9L(w(c^cWS?hHK>~WjL7uQl~Pi!X5%(2xn>2<^ntqqe5 zl~tBo9?hs8aK89D%s(W$`%+pqKw;E!FI>D?fIvxJ%LK#j``}yant9jpqK7V;2hD80VNdkx6_>d8B%fKVcP%h7GHY9!2SkF_ zJa^W-TD-&kp7>d7D+CkrC^T9=wYFhpwg>p&Lb27Cvcg6 zdj2(!3Mg-)bJv<@Y^46&qlQ^;M#jzA4J#9Lw-C$vsfyJ4?eV2ev9gtZ6!9Lf?2tEo z_du;y-kY_iQqf$2sqZ_B!gS)7`OEW{K|*y+BII;iPwH0Fk8Wf-ZPg$AxPd4XSa2mI zN2pSJz09j|zyzZz&*?_%v;E4h+C$Bme`fz>|W z;oOAnGv~X#FF$O}(UVrX8mx<9QR35c#pVsASi!RAz)QoHMWhRwc~Y_UiFUe8Vl4Lc zSN&Dpm#{9qjk{PAG(}02D9c6bo1FC+$a}$|O^ySot-wPyG#5(o%G`1Pu4uF|?`=LAm)6N-~R#*tyq>CQmpUL-wUg zH9vndG!PVIzwGE@8Mi^6^At`)f^h5^Z=PsKtb|x6VsTNA*prp3PHY%8NE6|Cc2oFq zLcX+9A5F-(>G_T4_s|T3_13!iddnY==4}(p?E?<5j!9IHIZS#@-o#ooiO$k@l6)il zMlNrbC+$shHHf-IBHLn=s_pSKitJKB1*w)wR6Y-vh^OLhrbA-qMe_IJBQz#E$#I$D z`IfB2jJEy8eg@<^xP#X$+;d6A$joA9^|Ei$SUz-grM6^y8(mQN*fE^_x&RO?*}sJ) zmHmAe30Grath!OO>6fq%WB8FtU39Xz$$UN(eCE*s{XG}B4&8e0cJp7q*qn9=Bxztf z%%DOmHODqhl*~4iSxlA}b5fflK7<9D!e{GUOf;FM!aNG`Y($-Ns9Y4e>x$7XJGWS@=m+Q>29y~~>l4_HBL!YbVSdyiA2;F1BvLEm<-x^N z^4)xvE~?jwI9H;}hS49AEU9H0%qR?NB!nc2Z)y$XyhYN5F7( zJjCQDVclP-Q@YBS-{GpbwZ2sGwm}&q%8?b@FEopBgoy0hQF8BxRTK6ABCX1yj21I? z4g(H^-o*&cOF^8I(Qnwl5=lE47zw8Y7Qll@O`ps9X(K1o*Eq zY+|XV^c($QEEW0sfFT7?N%`lhq%+K4YCvQn7S0AN{LFmBR z(R&$%_}EfhFzv?NLY5pQDoJ-*ialc&#)T$3uRgQSA3RMiYzaran9rM8RjU(pn%;i0 z(?ldzpR4!z!9B!=%P8$+)h3;K^Sc$>y%$;LNQwiCb27pW=TBmq7}eh{Jmjp=P;}<_ zF!DBc-P;$Be=AhEYIfsW$t%tnsWxF;x&nDb!Vgyb96O{M!F^(T-0JwOs}AH8hz1m^BW%N(nI)%YQu$UBa&eRk9E;G!oNwb6H72z z4<25!(AkJLjBSArpr&zL#PtrMPT_nXU#Yr3TTY6ejjs~Y^X|c`?u#{q6UOoCN;~le zc+W}1UiZ>)N1{%q)9fw#T889bW(1B%((TTvL?$y6&J>aIMLWJaxx{Cq6M4O|QkUZ=$A!(8l57cm% zUr5pyjG-7s54ii;O$n7%;fDWg1ESWQpuU4^NPVL{hHeyP#+iYBy8>i-O*qnd ztM~LaC*0s!I(e&|JSo52sxL!LaLe$C)&YFUAek1?lpKc6Ve8fBxp&mZIu)1C0WAgb zVe-2k9_6;i;Aj-0az^EoOefs@>>lje*HIy~bj>9h?$w76a3$r1QYzV$F}{6aM9wXI z`5ODu-u_GTd4>yZZ-Dkv8;T)u-*!es`yEQkTs(+FazoCsrVjhNekG~eX<_s9=H79ot;=@niAbBRKVMpRC7uT zcxuD;YVIo7j9!1P9y!Csf`+Y=i@m*_BiP^9FNe~9G@2LXaWO!_&y%~Nz8M2$%cod_V|}>m-@iMsU+9zFu6gtOM(|E7NzLp=aLu?TW3_UyR;0-1}ksFRj>-Z56%Lrf{77f-nO_I~{qIDG;CTOL^8b#IC;Y!;^ea~01`sO` z@1*f7i@T(s+`WYOYJCIT{K=Pews8`7q$?Zr2_!`1s{1wZkmD*BSsZw?#t)EdmB7Ikaf+&o>w6}v;a7s~Bx%5kbR@-2R3sk||OA*&0VwtSQa|e338y;+i8f z>5pS_;-!?!N$Q5-I=*@Xo zJM1bY)!iND&1d3(5vDS)+cff2GSPH@T4D`5(MkmE&XahV_yGC@(9%uX6mcHpmk%+# z;)9Xc+GyE&`Z!gU9{^FX6=+dVFjy!0_zP(z#`A9^ap7Nh#1~$HqsF{qD^9d!*4Sz* zo1J9w+PyE(_dfB>P2WkkRj$xTuP82ZpEmCHrsP-lA2P&_uiAB&HYPoO$wn1PllK-F z)u}RumC-{T1YU|DrE>Ok62xJHaJZP&Q3GAA%n_i_qXb=`G}k z|1d0r-KUo9widXjfC z80_6D*&rpV?FrQ&69mF4>u1B_^Pq%YHQ9I4ml|3>$zM{VH|QfqSpL31;~c=+_2l;5 zigcP0?aw%7XM=EoKBL?FPYW5ZFQX0{x zSl?t~3f4=*8YNk6t+w-H%dXq?YXc4pq2sP-TV*naE`#P6N> z*e2S45%mh8ofJ4wp7f4?HhXaGH3s%Y?(M_%_Irz4OeR2}ye(w5f~1!@4PGVh?`&>v z-rK%9VCTo#hNTdszK8Y<=?0GH$8;c2UYlWlwCGj-aK6mXH#h4Ks7aB5KzZjE^Kd0X=2+YB*lRM%d8#tw9wvqso=Ggcc8RH3YbrnAW)h{$ z+ir+|iUn)VBE49#$*rx9oq<~ep(qh6a&PPbMf#A7f-D={aJ`*QsS+8} z%~MAGQG7uct623$%j|{{Co(I-_eg#G^rhN#_$U(g6W)oOCE>L=f$O$PG+mL3u4@#W zk2p)!6g?hKmOW#fXMDPo1`d}OiO|Da*CEzCCZ`peDoU2V#I2Hg)aSjqbu>Hac>z7b zZnO~b=&r|;F6|Gl9DUd4jWovFuIs+lF8oA&pfmKjhUSsCjpQCY#huKrca~`{KbGk! z*kW$G8nSJNA>v(=sCqpbQTG{PBCCD&cEM(bXtCtLd~B-5vQdqxKLK)Y#6vVJDjXFn zwGGcFySF4567xw+6i_}QVeHva+)TTCb?7$f^X9Q}OGgKyv6opDlpXhVy_9^d9X;5t zEtds@YLHdjvvtvpXG0xV1d(}1I%$*&^lBnmy{`tR+hN_k)mQg0zqDF^-Lb9<^{BAZ z)!kD&HfpNlQM1AbPch!pU=@V>UKr$BcMCn9J+b+!O)EG}>*(mGCcG|FbrPNsLyLA( z4Xb4CX0aflJQJpJ_H1BP&Xw8TuM3--4OLTbf_(**_V6*rCY@ceP)26-bhjK`2oD#j zK>|%t9{eG?AUHlr_U{u3aLB;^iIo{&;>Fd_@-4h)&Uq`dIIUfN+SwN*su!FH&D`_b zPcDC={V4A~qd!}*_>{gei;etSf|OeZS2`+@aOgU#5}Yk&=pd=^k-n{?J)1*yUjM3$ z;^LvRpR27&onXBFwz(=Uay90Gzs42!e1tSllm&IN4f)T*gG2l4Q*GhIv*>lHOfh>F zR+68pQY^PYjCGT_o-?(!@BN2kU-*=B*S*H>ly1H>MH8^86bF`o9}*8^J5Fq(615FV&=Ep@QJ#}cW;-bmF!U-CJFVZJ>v|#E1jJx8=g&b z4Y3c=b=}^kr3L*%DNc6NGkF>LZ9!Wiy4N}p7;7`^qDNa~b>8pIzgh;ME|VCTJ}bSG zw&hyacNq3KiSn@!M!`VFmYAT$kuHw&pdQ~ERp)n*kh^ZnHKC(PhZOgnCiY1wy32K( z_H)2|+u3cK{Si%MW~O(^Tqw_c@K9;Wl4L`nm{A_$o9&_ zF2;qvlZmnBBJ(+>Fss#&%RW1|2x-Rr1X}%DzuenNPF5LH58C!7ee`bD{ynCvih}T# zOfoistpvwB=`;Art>pV@dEz~vbPWTj(gG^r#V>Rf*oz{+9ogr5`OTU;c+n3ybNQo}gItaT zlQ-eB>6YwXuUrWvOQk|iep5bbuzJTUkHnMX(ZrDzXBRkvUZBjo_!uYMk&l*_h_Q&j z8Pna;3(keJvA`akv){Cdaj&@-OwuCe@h02aC&~TsT>{DvEO|9+hghGl349&;eB^zN z#Q1Bi_ew7xp&(k>ZKHc~HVeMoUq|L&sQL?L?4k&A99&Djo9n4gtdznHIu0+nGQzTV zV&~6h-_dSUwUKAH?MCKLj;L7d=}WE2M0XRu(A+;#$JC+nVh_!_MquR0a) zkOWK(?@-^J<8DZksl2s-lVR7;*WX=pa7}p*57XoG$7|pBb-)qy?AK@Z$XDAH#?5LC za|pMy$<-Wn6DF(5HtWo=m25tYrd6cwIO2BH-N`6HE62f($)VL-e3^Qs;j1!r8|m%3 zXa1kO@$N2jz0Aqr+t`TSJyBdfMz|j{FviOiIkSE7Q5VwlIn&T885HvhV}0s~BBY>R zDQc;2$$bZtX-#!8WLa-{&DPzR+6X3d>iw#(Jx4Y;($BuXRDtq*c`|^ja{MHUnl67D zFTcr0Kv}H}dGzJn#30Y+VOL{_k5PCU42)*j7Sl`}#GAZA?3tnhiRFNek12OQHfxF&k&+VoD z*D1ICU!vjlGHTe%DX4OAXmRjVadFjg@oL$-VyXZ!*?3l%<=B`9UcIj39pN72UXZ=o zca?2NzM@~2RjzojsHcC3MONW8D?3x+k}NnvoSZy+8*@>bc1$nwkHw1!)^4>mAU@d1 zw6YvL0s$NW94hdq|51i0@K?VUHfV52;9nuquf@#wzCT~ZNi>e#0sgZWu+k!ccnJ>f z2JqXjR~1AQWh5ok)Y%mz&&wPeieLvYe-Zu(SAO2hG*B;>{`s<YLg_AkE z4anKi?&^6!@JjA?f(Mp&F%+d4Xw(pXj{pfkw#IhgTXKJh66__~4z8zo-~l_r z`<;++&V-1Afc9nq_CfQ*-3j0|(iv!Xr%S20miaLspbh{J_{7!kH2q&P_<7bJ_T$xX zl+|YdmN3xgzz3jzrzzb3AUDVnD#R8nJ({+Z@HT)n1|H}>P6R~pJfmps|Gjc+?rdWX z3w!`qnd}U}Vt@yHvGI3mJsSw@J^jZ*Zu3bo&jOf$wuA#;p!l600vhrRd4J;1Dq{5( z)R{4W#19lP__+S>6i)abpyw7amrU*DYXFx4=mp>%xZkOn=uEb{hdmIk)878qZBN)z zRxg+-5df%ffo=iaC}e?dc1AHkP=9Xvo!*jDrMUvZp(h;yB})5SVBn{BBxlmK739Gg zoKEx%(nX{KXw#U0BXuYu9iXJ4<^8ufC4t+nXH^)O@KYfGr3jG{fYT4qICDc=6Kjy; zANrtM4f}ZwP=rIkhcZJD;NYgtWJrN*ftG44{SWf=Pc2nq!`cCOwg8(3in|6h*wbY@ z7bsUSi3dLQkp?`_Er7K+l z(tt-Nb)XcXhd^gwSMVI^)RaV&|4VT~em-=+%mVU*$-vGU=-*C%e0j{*lZ5MlfW$yK zf+NlRPVdiTh+3Ed;hrpP46UVqP)~22H6qLXr<1(^XRW782av(86M?wN=aH$uyQPDj zG=h&|Ll6Df!1mc0WIH=+kfH5)SRDIOPw<#T3KRvjmVe0q7p#^eFnpXZbi{sd1vfz7 z03PVh$|P_m-NP9q;^=7Tah}-3eUFBj0q7|3fKMU(PBnt(fzM;s-U&wo`>sO;iURC0 z?04b@)5d z2%p6jw{rom0iIV71wp+P;DR6kqy^$btPJ|f`!2GkXHOrmH{0}AI5*wjG1EBYT2f9xvD4d1<=RC@J0*hUM2kw8t z!D#{ybSvmmJd1kXIN1|1w*zjmm_RFl=>|YHrx&UU*g@fWLf%4?4LH4TeN;XRs%8!x zus9EjhxC&0^uFZ?OleM+^au1m)D;6up$i943MYTm6|(x7Y-hmb^SO?JyA(UZmVJ!d$O))<@T3s%fN1Od zZ(smermveo#9crnuuTs*zYdXTbYPk1H6*O`pdPRL%8tR93z5MHC@DClQ1I}wO zdv8XKj)C&hM}loIhUTYA173Pa8oF4+-s^{LFw-I-9rge?82DCbOJl7iELhFi#pv|v z)Of-wNe;{}2_j)F?$&@V_+_D%ml2atRFhzLc6WxA16(dYi<<)c%dgaz0zvr4;{HQH zvjfIc_S1}~;5UDwpr?AoseeI1floD(^Ji(?U_%E~955xj_De?a53c`z_!*{g_#8Ym zV}R%YJisg+B3;P+e}BM#H;6;G@=+iwh=K6usWaGmGaQQ@9tR{e1lkbv-0V``sQ^(I zYb)p*%&^E8cIcU4g9X@>2Cc)y^3OmzS=a(ri_i)u{3@U*pqE5Kh3De` zya@!0p3fLp>;?*h9Kb^_iS&w3MgKkms_bZIYH^lUr;tK_i4QQp0uK#Da{zWvN>1n6 z+1dh!l7GcHgcTGrLNv6XbESU)o~tw=<0C__1H|f1<(?aD8dhq^FuTyR;EZQy&`*iD z3`>QKatm!ZseXPc^~`|1uw=+^sq|3Q7T$0=`OlcSuuRCXn$XPjrZbr^VOL?9V9|am zOlaNP({d^k!Xq}!t}SFJNa#f?Ve4N|e+1`*6%#TXA+%noYWo}el+co}c*w|k(D?8d zf5AgX%R7CDgbct27`GtOt^DG$0E6z=T7X_UMV-vogKo$A!FG924{%$eBkf!KZ6Ou@*yLzK+kEU2LHl8Gd>P%9*~hup!L?r zp}*wuE3ykL6EZLdbh&&R{tNTe2r009$UqFxl^Qql7yh5YK49UHAqk+TAqZoCfx||2 zfJH<4$A=z;HGrwwxmrN^&j<&wbVwKM&~%!~ztDefRzY~&ho#R$c)5nw!j#khkq+t9 z9TpGi-x<2ekj(u@yfUQYY*;>|=VE9D>@)ut{<-UANZ+~8#e($izj2|wAj66c>AaNz zLchSlO)mZo|H~aOEELkeC=V3$+4A3@r+a~g%>mMlCUk9DuKp#5Q@xhL@*y2kLMwpf zwZHKHbj=A1hjfDoUFJvc{{{!FRHx4}ARPii&%fSn`~~`lKSfx9A>GG8cYLjmhqRy#hMrC?|a?E0V4tRQd7L#ws!Z>J)EX?l0?r1H#lDCCuF z=oOt6U>ZGTr25G{S6M<{=!I@dItZsyPr2L;Td0tiKA}~OBhsnNzg!H4KgkByz zMLC22_lu;knSh(s&xIZ}L>mJ(TY-}@zsz)h7}?G;{y_4sL-DSn{TJSk3jW8A2YKNT yR&2;~(85sJB>ykjoMC-~Jd`X2l^Z(Y|L{?;b~t1dFgpnNvjtckJ^*Mqxc>vnaED+3 diff --git a/wsdls/local-lib/metro-2.3/webservices-extra.jar b/wsdls/local-lib/metro-2.3/webservices-extra.jar deleted file mode 100644 index ea8180a9e818299672d008b1856727546b9639a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 827092 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�{5SLUuMg$le?=6(39$e2nk-R^&{AGS`O*;p3k@T$0T-6G=7Jp? zA}K5s<(K}Ak6EB;v3}3My*o}Xw9_TPAhWPyYLS)RR3DX@-o&!pM5=-nmTyt0(^M~& zStGHy?!2?gm#^n{+-+dG8&n&ebDhY>Ni-ilPtfMj*pi zJopLfJglT$&HTy3z84LuPKy-I{RV+<;#R?emoyp7pE9M|x99+Pr=rdv`hr~@gDg%>qug881c`pXbL)p!n96TQWLF4ZM3W5eS3{} zV73a5m@ba5DrBhAq_Zp)2?)X4t=c2by5CfV((NaMm9k{_t1)wf{k0y%!JL6K0usXI zt~EeE=4P)2fOxAEbg^Kbv0Q}W=CBWZ=7Iy`&8h3%K=+J_cHI2gSEFnRt z&ZoC^Jdz+ncWCd+LA@5wT%QH@N~$xKse?!i)G%K|y~wIMTHQwLa+>rOLYhk~xuvvi z%?vs)zel6%h}KpH5m(CVNTVv)B$LT1k1$0v#5y#@vL)xvlpR%b^jTM8Df%EiJlUt9 zMqQ~)z3j(-sf=zUD0D}1!f3%g6z|OpV8^<;O)6&4l@r)z0sQ481W0=}Q#}j=L`m2moG?C{oX9NQItSsPAOTge{$6B_Lstm`sp;U!(4&A&C&Sh~C(T zJu~xdZIsGpM03PFF~+qX#Ld)qYl~M&aR!T#aU6|W7=LZ|I{DbeFch$d8Ad68GD5l`9$;8NW{FP3~_B)hy-x(=VMvLX6Y<2e098>$1v$W%q*Kr$hU;czTT)=OR{HEzj?0EtAWdtV8Ot5!;a-;lNc&8~y?}-chcB~+KU1Cy6Ji#A z-p1iCH&@duLJ)$^A&i9L%DV6!DVKOX-sCRqKel_;AYQ}16@K7n%wS4$V=I%mWg@gI z225g^lfhc{R9+;tGsS_ricWvhUa2N0!stafznsP-@ZHdroL(NYQ&qWeIIOXD3r>J2 zQI~zyxXU#~z4bXaQYMV1ekxMZF-}nSm|=-0#8|CCsrBS-$Vl}up?$vpNo_h)sAB%K9vj~1OX-AUV@5w#+pv0YQ#>l;z zEZIa#T6C4|>^n&k(32qjys{vaPWFc(`iDeCq*(s>QdttRGH z4k8r)B4mEQ$QtCTjYHK1Hde!hzbxU5I)sg8K&qtLR$z^S_J7i%Ol0@Bdq6H+>G@k& z>k-ASDooXmJNin{4yzRUG7(X!mNpcQCNO_N{gc0QtWI8ae5)%LzKz5Gb&kaTZzrz* zl^^9KO34lIBZpke=XVW1X|>eNMbMg<*h`DcW0DW$P)ry9JdZwYqI_pY`~2aTd@DO& zd?Kpd#AbGsTT3?W@#XFV?5|XoVXr?>03r4(QZ;U?UTXz&E&7KA5_xN}d;!rw!M@lg zKiID3+lXoRc3;Dv5?;bzlB%tCep(M2k^DW&-7TCKR^#~kq*sf-DsbWGmXzBrLOK=5 zfq{-6L`PHLltls^5&rHnpi{}_y@Yotf?w^SJ_O!cAIY5twsIV61UR=VGS=a^^b*_k zM|ENUeJ$8`021vE;47-|1+iWE%4%iE2KFP?1#LrD2Zr*&0HN*0d_(U*^poGok-*!Va2!yvF6ATU-o%x;iy5%b=fq4HB@>9u3u>&7w(v|Ezl`z|$%VGyt_%u7M_5Pl zgz-#Lu$Eu+30!rbxB5Fi+4Pxmwd!zYahy-ruZD9! z6ZCL45p*#%HE|R*_y_2F{3im-QPh${5jx_5!o8xXeEcGHvZu=VbEd5Z!07^f$(AwAm2BDO0g3@)i z{fnkYZQsYSYJY*G*GwY~nca(E&H1qSjchV{1INY&la$Hofo+u*!i8-3lf}@|aP`+bxW>wavwDMRK5kwtqs>r+#B@t}puKBSK zm}t3@#x|wAB`sGeK3Q~76uobFEJh6hv9|XoC&Fsja4ycf39+MyoO3lsm`t1vh^BIE zN6u6G5!#9?q!eoQDF&}!JO<_}LF}oWM!ZxP6$)H488Y3NJf2GkUV-d1Fl2cvAEzv; zw9F;_CC)ok5&Z77LdQE`miCY(j04znBZjr=`UAM*fDPoLY7_5jBuX-U=coV4M(E;8fAb zi+J>NU%2Izg=FD4ME3|C6Z^?(%W6V|-6}$kLWk>?MVRG)g^`ov-}zYL@JHVsiHNt5 zgYGd7T?J@H_Fg8E=hY~XM1E8G+9e+uzo_Wy}dV3=Wx|H1db3XFhNLf#}BU$qa+PqdoM$ z)iDVFpGCZct-Xu0lJmE`!R9}szC_*QTON+`wUxofWJd}o9!O*y^dmL6F1oFlQ)7sK zj$b?(KU~>_(F1}g$zxGtNnht|LDRxYD-Dvi*%E4{?FZw}a?#FkO`FQC^KB3-o9gQ3 z&qX=U86P`S-4Tp~x7WiguWvojcH{d@`|)<#F|X$Z#E+<3JUmVNcC^wxNZXo&BT8G| z+396o?I5f6_8GB3I{F8Z-!*1uQk$E7)2etq(Y5Y3D!H8r9C~*J*m_R@thR{qERTMg z&CRnxHis;*4eqt8{!8AaT}QmDz8v1o5WCwOTa=y00?4PEU0u8i2RyrXSg1Ezt>(d~ zoVJ~?Yrs#GqOLOm6gY>kx=1nQ3&r{@v!|O5F_jCIgj@aS>GjcRUt8Qe05SH>?pxPi z2e@2#d$E`T0v-bSEgyxGJ$d|`NMYcqsG(4xEyo&>@3EYC&?QCX%bw=?GREp`3lu-+ zNp{ciBu;To`vp(|Y$8L1qWMIlzqe+lU&Hx*d|A6FkfToLjq~N=&H&0o;nhoG<^~!A zv^zv%5bI~QF++squ8B+RcGdn3OXzbTzn#SlJ>@*x^yI1_9>gM){@4Ty%{Lba2alpE zN!UaZgQPl##Q^vjaiC7>lXJt#2qk#zBewCtv5ckIO^AVnBF0i_<`J@Pb?V(Ym(vJ^ zLdUyKV?=O_lSoM(l*3>mC4`Vh7cq}hevC?OiZ3yzY!XT90Ll`I=ZgXIhE95%xNL|N zKKwJeVpsH(zkGwyI~c?XPP&+@Mlpo{E-bed1et{U{u~X31xi5I(V23@3JNkN3Db^) zDPc`{3`6C5eKYwnKxDvb4QbOfDyc8KPZpA7-~fkSS<;>a5eG5O#G%nAkJ;%SMkLUb zr%Fea=Yg9xY&9U|>`^G%_Y6sb&peCU>xu8nCv1Y*QL^z<{gGWeF*64lP;)3~2Q zLiP64kPis!%-V~KD_2KyQuU-{6`#2l5>EVcZ+2HPeS>y9Z@6H3M<+3L`zw>3`#oW5 zZ*N>|Q}=<$V`tVqq3a5kkES{NQJ#JD%dv|RH7Gm+ks(gbEO|hUps6ZSAc*I!7 z4N|(?$g!c$luSKa#zETi=jGv({RVefx}t=D8lev9iaApX7gAP*1ZrE;h11YFssMQI za)W#rV}1^e*w;`^Uw$g`gT1!_I1lg2sa&_u@d*$@})6;U2x!BW|>(myIpvD%4cg&~cljs3Lw`YdSs?-(keMG0+v6k;&i zkM6W^4pN$vp$*GPa`(|h=BZ|yGABX_#*y`0)y^p_ZHzd>DVPRM55^U2xd#1qYRjV>9XorA=s^ z3*5Ei6nwPTo^Ma%uIpyFZ0-{dR6H3mFbM&c6ZFUB(P&A7YO3tWP)?!BS+S4kY1z0~ z>eZzS5$d=h8Dh}TlNqW993^^FfhmVNJUKur-yU;afqIxF+lB{n#N)*;`eioM6u~=? zNOg=wPQq1|PNxda>k^p1P*YYkfD|5E?O<@WHa!HIF7tOjPmYd?DQ)f2a z8s?R0foU$@3a5Q&UQLFm-I-b^-PgZInN#cwy}g?iYHxB#y*jRqd#Co?CO*-@dtl3X zl0?n=1(5Bn7tw{2)}X`|ZP}j$EgUaHtk9;}=Z5d>6})gIP6N@p?|<6EzOVVC3@uAT zs7KhIX}nTOd8WH^mDN&Ec3XVvw%t)yjAQHu0->NG`V}cVRZ&bR4kB|&szG@=LT=E6 zTmk*z9q$g$Ub9X*oEdjKHhw@P{$1sd9dzN1d?n^sxS5zy=W#XR;mfM3l_gilTG_<` zJZs+nIcfd2y!qLqt$j4f@ZpML-8IspaKKtaP&E|;MLi5_Rxp8O&4tsRV>NCZw&?-( zAbZ9oowR(JerWB|vb-?o0{1S1;jU%X(%%idZG~ev3TUl%*^oC-?19AYF$6;v)4j8H zguPEW9+WA5F&+3ojoheCm&l85wAc*aC{cMR_Fxq8#3?BYQeD~8E?irHom_Ze3@Nvl z$eL}mw*5wH3meQk9A6R86OcJQtEjeiw41sUo3nH8!Ue}#f;;%QrF)s!@K8C^k&S;2 z-7?grjlO5?^%@oc2$^ADQn&z)(JLB1d*Mt_muEiS*E^uUXNP;dWimvpgMnu%6yg@o z?uUV=irHhk76gny)u%O(3+*(;As~a1GvSuX$4L3DkM}q(NwjG0qCR)e|9z7^(-<-IaL=}xdF0f(*s!Fr%fWurJgqtf6n81f9KhPgM|*gt z0y~th^jC58aM-Yt{yb2YY}F;G)FpY-C92eI%?X*<)BrciSI2QcUP%xlKCMP{367%G z0eZ(U==Wst80l$7)Qk=CSR<`95(QPt73Od{DZLO9spQaVuQ7F2N!6y8ZJ-2iA4beT zGPZlV)DgVp(Y)oYe(5{XvPxKFN~cnMge*nQ%^nn?+JtBIfiBF1(3c7ihD^Ij^(QBc zYf1a=*o)UJ50Ne&i;?8v;0hL{VmofiO=oHMgv$<*oGb{BgfJC5OgTP`V_?FZ;ZROs z*5vx#v{-;DkOtl%GNszEn>*z z&0cy=<&YD6`cKu>P`VzD%6e9Xwj}6herMz-BfDxlWst>rg?96*34OOlbK4=FPQNuD z3d;J$Rs@aj^~pTtPQ(??GkKY6xqw{CD{@6^zg7uv#Mv!ynXcatmh(}0trAoIW>Zm6 zCaUvtz%BI|)3Gnr}QYV8O8z!UqW@whodZH#r zoUlBGc?B_-+3WZsND5R$g^3|TK>;IC)HJORU1+SyMNM3 z(pu8#s&ucM-8~hsuL*Q%9h^tPQ`!rK6pyn))sSyR8c&<{GG^$G(G84VdlyFYjs5S%CXw)BbRHu1D%sSyI zp;B|fICcNVA;BuNpU{!}2I0eP+S$RC!{cj|vi&i8%A16NYqXm7wdTV?g)m-2r(@xF z^?9$rg~0oU7_gDDUHCJ7VTK|0Q7MJeRfva$YR|)#3{v+IP{SOC{8cCp^|IWQwDA@^ z;t{rUUNiYks;9E%BG`F{RI1VQQN-h7;pBG|gG-DW>^REEN)3G-L$<|-G6mn%3IlBc zks_(60|g2V8-YEasCe$EDy_2hc*?rJi)5+naCx%+8~kQaJ4*jXRT8;1N(0J!9;(1B zcIb!Gf4U6r75NvOd`~jVLH+M|0KWgT%=-VDRO`r1N&*YOSIM$s#MFj^`wDikyCd8E z1pY}7#(&i)WS3o+0nykvaiwT9lyI<6>O%Ih% zCub1K%T~<940b&wHHrrdf8yR<^&E4J3bT_@Ek6pK-W=C>n%D}w)fh6xi_Z6{Xd9__ z@?#5`0xB%>gBgXY;{D8aNmo#|4cs07a4@ESy|JEIR(xnQfC1BXKyw|_tnq<%8?e&K zE~=^jHUTq-TUI7tAeSW)dgLr%3ugISzW1w2{T1{QssLRjsKUrNk1!T8v1|{tU|EC3 zQT^xd1j7=O;x&A}$!Zy{1^gn~qB5x$Fhe`C@K(t`R7TV&y@Et(GG*>SIod}b=;Ny; z42pSZ&KClsOx8snl42YS1x84%_Fl68{4y}IyxzT9+IjnrxMNdXE`2I^J5TrkSUIS5SnS~$KcbCNAg4;O!t1KTe~kW)lM&4 zN8ji3jq4xyaC)Q$aMs}VG!UzR5%`PHETFEj=fod$Og)5sG$U#tZPU-0KWdqJ2>P<3 z?I3Pg_ql+&CZBbIw&nW3ej%zXYO##tFG7DveLZM_q#PZP^J7DB6QE=Z3;v#m7r9x#n zGE``q5@nYN$jGFbbRIEQyGBU{4h%fn`TTz3nyjuh&5Wr-oi0tI_AmBuJhUr2YS`4A zAO+^$-{rEUWaRsc2%a=ZwP+2=N>PCXENUoOu!URl)bd64FY;Juah4M4d^y7?ZDSvp zBE^X*$-)wqj1&PY(hJYa50!AuULEGfGJTc?TANSg_)vFI$B~hT_ae7N_12L*7uNGRGb}ZoQ5ybsJKm z5;;bwI&0WrnrO`b!PrJvKILp-Q|3^$&Uu|<;UQDwP~#(A*G9Q&7j83s$^Mb&B7$41 zY&?u}FQ=sAFS2RW(gpPG*sQ{GUk$(Jy5f+t%PlH{ZBu8oOS7wjqkz3y?A4Y#FwC>@xSLvC;}Sj*{wex-&fw zMc;X3)%5{XEk{O@vDEHsx&ATGaB~i7xCluIM6Ck+h9g6=Cj-eFM5AzrG@WEFT&o+ZFrf}3g_O(!=-G{P`IvwI0if6YKSmZk!ow~_- zd)@iGSR?*UzZow;4*bgq|2p*L={B(y6%Lu`b2L=HAF;b|`Fj$!0)dzySVYec6L_Eg zMxy&Ik%*%6q(uLX2~d(32+!RuZqd1l+VzCbI%mx}_^aE;e}bBOaYd1+;QUSsK&?<9 zS#W%(1>jaJkT5vD6E_cD5(5w`$V{VFP_@pUSe?VK4aAS>gne@NiV`zAfvSnr6)2O| zs2*952t+nX27f=foAH4-xj$AXX_E)BoEQ&R>0bfiE4Bjpr%x`DAu9_cb9CPMH8w;T zoP6P}CEYQ(0nlBuR*+r8mujCRH*ui{^xmWQ9%zR5n;U|+;Y9fU4lsFQniF@c=D&J> z@hbJ8$gW z4`8hiBJE-Y5;W~9ynTGL%pYR(8Vnrc0pS(^1fKXmp)salB_WNM^Z%O=TaI+jM-Tq% z7wmu9>i?|;ME-xYfT)?dk(;fnqO*gEnTv~q^Z#wN?Dcv0rmg`vc`JB7c(-_=sYpqm z$U{+u;SjB%KtQ4CK)_U?rpReSZ8zmC+if;%?t=epMiLVf(h^2*4(|I5ywvD7^zGGr zo6kSqwB(qDI1c>u7Q7vMxA20juTOyM%ctdbjV^ndZbGp z%+HceB4v_grG50vP@>)R+=m=Rs#MIC3gl`Yu^4%x7VkH~oYD2F8*_C36OnQer5UZi zx}KAa0=oo>gy#2GEd4?PuLU{^*LtRmG~w#KN30)Ha7wTPlN4ell4#X|GVM?00i$%d z3UhF>aJDBY2wqvtlISp|NNm}()00vtF7n^KV$E2VQ7}+tllS?Rz9;IVBTgUor zx9ZKqwkrgeQ&kjpbz8cuw`zvwXJ53?Q`MTrO;gkr!QZiT-uKj%$M1ot<9>C_&*4kr zzBFMk0#;>~K=h*ApCH+LfcO!`gs?aW3FkD3h=6rmNQ7UGMG%FO5IqrTk)U#k=*Ddu zNdfy%N|f&`;_%Q)l6GMWMI0qvAR1;8NUD+e5a zdw@GVz&_@|{^}$0XB%KWm$6`)Nj_?@?)j zw5Qxc;Ue-mnosR>^9m+X!rP<&z-ERilYen((aw@9%k|8nd4%06c)2HgN^+P4S!G_N zgCt7Q#I~Iz3dgmc1ns~jm%^Gt>ZWBqk>t>!kx*jJPG(vSp04b`wU{J6X(*keh@r|7 z%uFrRosR0xJu%0aoO)7{E~5&)Q|+KlIjxjCW!014IEB@lUp=MOQ)gVPv989>;q`~e zoA&+g{;VFaz9P&2v_8N#NTC>*w8oA4`pie0%NJC+`S0()_>ILIUy!(g$lyq!%WS+l z%}eYnJ1aX!oI`zG+1AIzMQ>?UmDAzi=Q4z7QBie2>n=e=PXAeXZt=@mC^7K%MyR!Aj0uD-HSI)?0G*;Qc%3Dp=d~D@8p?H_CT258P*b_oyA|U9YfRUm&G&mq&2s}e zlT4E|at!tjRQ5Qh8gwQ)3Z$mVMM$g7!OOp}i|9b4*5S$LcmAhZ{uq#5!0-E$d%)x0 z_B$Ie?Z_$812>3DE2;z&mW!Xz8a1f$ew|H~jqL+z?)?X3wDJe;m5I}BJh?is4@nxw z+OLJzZU0v=A+(J6i=4Pn)99pevDICru>s3cj%|Q8z{+jO7tVUCyHZR)Z=kojsCvEy zmuaS;-;>H%#3qo1V*Sl8ZY;j>7{H~hdsZcO_?}!Hp6$I&5fY!*Kedh-TA=;6s?NIJ z;m^PQX|}jXHRrkogMU>`QtemBHJ~=w)iUZn)j4#s$6rSAj2G+ew}tSnb!dT8M6MBd zJl$eQzmXJuOo6M27&ly?u-vR~(S9>HN;2Sx16v>o1C{VXCNfvSnmSZ<+qZgco%<^B zJ3$wt`%-I0lxF#9`QE$HNNT715H`>|Cg8)>;$kRVTF1t1vn{x0Tm9oT<(Yfl2W0d0 zlvnyl{9|vNIT7-e|1YmkC-g&sBkaPj(v93obgkW*K! zcg^AQ)x*PwLQN#5l^@0=goUKp%;qijX$I_$;4qMX?HD`JD0 ze>|hcL7ei}_RG6udPzCVNw&ipWhLmfPmGyuO(Ly=JB-R4vMMM~f?N|av1vZ%H1$@r z;b+IG0|;C5maYg8+8?3!-pa||lvrYJSd5vFprPJ!|Ans)G)=XCKZwSTb*ElxwROc}6^5qTj zxAQ`-R0qsR>8yE;H&_9{9MzAWm(s;0OucP9h9Kesm8e*?+y(e<98$N_pyDtaMjeVf z@PUD-uX>KG0W+6UJgw73F+v+9D{;#4*E(&vpXAxQ=`r<8TV_4w(nYIcPq)cyca{0J z_UbybB%hB`6FTPHg@zOnd4grm6D2(>=ax4V{TK{Z_Jm&*3{8Z1W@GW0s#Zh>DGl2i z3Nmaya$8X=+fBAjVIbv;;B$C(<{rKin4+JF_!TPyA3nj$S$ zaDvz9e-s&B*jL% z%JrVow!t)kdYG^n#|By}4jpP6mUURoc^b@Nhgws)TU?vrnO(~zTu29p+N`ePHoo9b zNrYaDPzzxlo;0$#pGnqMS4C}(!;0hCtxv)Ql)0yL{$z?lPJisk_jWt;6#nM zDb-o}%S>Tfj|u%iZ0U4#ja18j9g{ZyQlo(~;mKqFe_myye({|Cz?MtH`!F>Zp%vNCudlO5|g_ z!bO;D;WK!MGdI5+U&}1UIB$?-xRZ*lT{N}T2Qni@;UiU?VqJ)_1S>L;gfv!-l69Qe zz_qM|VVudhC*V2u~Qg?pIdhZ6SoxEz)5qU)k3Bsz6lCGdN7Fp8J)kM`` z4%#6q*8A3YHOD*U1JlD_IKa=2yV}qqMI8u}sh=#Wt1k%=0Z790NLq`N-L31Or@5mm zpiS2+NfIsbyrnv{2}^;i=7=*U97*P|5rDq>x%({UI7 z4>Rvp4T}6Fn3+nsVj&wN8}6zsyj4|X_vm(Iw0yLN9k_s-L*Zz2I(F%3EwPi0@GNHd z4o)MEVwhW{O-)XfZRBGX(ud_ngK9?FCf8!Mi}}s`^gg-Q@4rhRy5Yx0Y8`Ms{*=^s zSDRDZ%p4zlX(vV65?PIXcF{_g_4jNfEELthoy==HB?Gc|OdT3usk~N9HCk+B-RXMf zO*dL_WZUEGIJV+$$W!)a*)wfP$Z{yV!jg5Uy5f>|sJde8n6~y(ZOcyZ+viMQm7D+5 zw2D>~WUozn3)E zg(9iAU2T3o%_sTPvXnJ>({S|{;&CNV7g49j^H@*SG* zA}e7w5z?<3pDi*4(ALvZs2EZ)E&+Gty_)*Q(=w-K<-NJrjZsooCn(n{Ju089f`Yi;qZ#-TiroKh~`jdmLt6awc%GEzT(AQEq zR-|8|o03r;XfZXB^(9s82|aO~`cBC8Yi4weWduh%7a@AnLR(Alz7SjjX&w6{9uC<- z{d#(*QavW;$OWPbVz)0YkOV_Fz1>@TY5LaicOcAgne-x$d>IZbrqR7B=5-y#2q$c21Zc|^2n9uO!x@2zIfgzuP zR3WUE38GxA@9FLn9#23% zzi+}NPFSmzUL z;bV>DmBna`jI?yw8ePsNTlXbZ+aCItyOM#j1<|0mUJ@3f5e;R6SXxe6{i96#-PIMY*sco7o)r3PhXW4wvpB2 zM5An-mscCN3p z)DoD=wcN5fy3TniFE>W^HneI6YBfw4fm|Iz1!uEL195BldPX6cMmQrvUfVscqFfO7 z?vr-R-XGE>ewH<4lt#!If^`~d8jYg@wQ&JxJ;@Oh(iND?qTN|(NJRTOxay3<9 zblSU&BRErt5I&2L3F!(zBqh^%cxw` zZ3T#sA7{s=u~zk?wE^)Bd^9eS5Rd>a+xUeY@A9At*3xIz06ueMdY5aa@Qt&iD!8P8 z%x%SOeDK{Gn-N*N&h%m%64^RM94qUR$&YJ4+95O5(Fs(b_<2oRyU;q@n>t%)Yq9}O z97Rl~eJmR<)q8U6cq~&}(>A9H&GLATc2oGowY-E^S`d4ABQ(d(g;t#|a)E$H8h2>| zdGAuA4OwT0^JUhA<)7~GPx==^yrBKTy?K0NNH@FUD!FBHlHbOLc;1%CN9|T+*!Z6x z;}^U;Q4kXD1=VSn+FeyuDPi|Yym>Ww6`;Sn+4ok>Em`FH;~OOA+psE(2c3~@>I$mn zi1}27x^JkJwbGmg?EPp0SEOHw7U6tLrZ|+G5xDg(s)~@YU1st5^e{EsDUK-}tXq^= z3QaU@tX(LxWRg9I@q=2uE`TuTiyx5oTWytzMDv1gt&{QX4rEmz(X6h}YZNG3YlP{UiZ~U1q}NCg|2(FP z_y4-VvQa$A5kPAmSE?(}c#3ALUE6`i#&8$|+}L!oQ#L-R2$eut_`%(#pF$PSi!d)n z?*GYd;%~Z*GzOPT8FBmT*YB;MCUW8L#C_Y`9{@6rFN|>?Q&;R~BxUrtJgKM_vDh|) z#2`XBO8`U+J~sH;_9kV%+5C%^@2zGOhO?B^@Vd6P6zvKxq(L2QomBnFyvEJ!3U9q< z&R3X>B2!VsJsZoG?Hvm{{nw4T75JAq1Hqq0h8Jjw#US90s-2p93Kph4&A(jW~Bfp;EKkyOXNZy+Xe zS&ythH{X-HK7`QrUWs1ry&emjx3hCojxg z;Td8E2g<;O8^faNsHX}lZ0E0KhU$yYC?<&Hd6|@Q-3EbopXq>hTw8%j3<$l*^%u)A z=YCWhHurM!GIamxe_BPong)!!sC(M z-QR;ObrTMKRO?b!)ydtvk(N;-z`p18xp*zL7*q|-CS13wt@a=w&D=j?vSNA1{BUdv z^_yzSEEVRO(SE~@SC@S!KCB81)VL>p5xz||r}Q_7g{%9#3VbLeK@TQsM`R;wp4MZp zlN@$4&E7ct=-0)(S0~+}@bEZZ`~XtkjBe@})VRU7vq5Ydw3!<99XCqlq=wt+)y3Gr zmXe#p1V3ou3}<%9PwLn8jTIH;72}?PsVn9~Pll7r>6b}ARcQtCRhj7f4=Qg%XWoRm zZK|j^RW-hZ;zHao3qDcTGge`R_IPf;*bOhggeDsBX?0eOHOOtx{9t^$XbwZFUMqcr zEHj{^LArbnXI`zcNr^XRiifO!3|=-a)|x>=$fXlou7-Llq6GE zABeW2OqRQS&OcHzBEc4EYRcU*ARkEgirX7UPqDMNSEr7c*%GaB#Uqy=guOrH_-q&& zni)(CHH}4De1V?U@_Xq1OI+L6jYyad4du4ARb(-Fsb3Qy?jqkaeBy6HWJ7Tl#YcKR z+rZi**u-NoBxNVpznyROtMsR?Q@?5*bDBZv@_HLEvJ|RBT~?#vT1oG1F}!@?{EkO< z_Te0Uz?$uc<}*5!_tb@|rux)2`yR0(b&kHSYP+Mhl9v=suA`?`4Mp4oyC4l9(F;uJ zs7XRNp`5dMqBa?DnMTG^zF-YbB6RtEj}Xx7>?NfzM?GQ>mHk2ew?h8R)!)I z6Jtq9SN%xaM9??DHSRI-#9B04!|vBposGSWM#ES1OJP70UmTY4YOP?~I(-AhZk46k zc-!?f0&G=khwlbzXH3fD|E#$RT4S^@%7tD|gZu86TAZBgApHH%b(hqu zqS5?OYctRoFh{Mmn<2XUgRN)p?@(GD`t&`&r@`9|By`Sk2Eu%s!h9P_8Uvawo^5GY z64=O7D-ZV5mT8Jg?4m0%hPEV-KGpTq5J?fodKYc_A~|NMkYL^OnJC0u^4fn}&5>Uh z)tPDh09sLxuoHt}631!0}{tz1nkG#wF~H)C_ckpF}>m9AWPKBq{)_?EO&n}Q=&NOFz^r}G53WoY_)Gk zuP)DxC!Ci5AmDCM=Q2*++1R(nkNL%;%R9aw-J_zONj>+ES^gRsitLx*dJ2a`!OJtb z%x#3^e+wv-`ube$MlW2+Z4g?Mi!>sNf0tR^^xc_@= zUyFGD4YLEKt!JARiMg^RhocFf=@bM z1>pSOCwR}d7*D`deZW@uWArpnvj!5sNdwY8BfL|9-WtPTH^*j9W`CH0NMoGQ?R2_N z;6Fvy{k_f%4)<;%CKOC&s5MkWfuD>OULgirYt%JP+&6e{nkvn$H) z>NnxER~rmGTZ8^vs|*o})Bp7Wv)?WLh63}}iHL+S5zSZ7C&kfqA(7PuachG`Iq{T_ za3=#}3So5N`Hr+NU^s;7cR_y_f&V$g$As>2Po*8ce^5?*CexlStuI#f{a09U75G;~Utz;h@E_Zcv!4T) z?X3TH;);Dzh~M_@=c3wvRILx3-=yRCY7gQ^{8@r#XHT2O!fc>PBVD=_(=lhI#M~zi zWw31fmOLDD>%-`fEjzr3mma?8Owi)M{Ft**MjWBiyI9?vR10xopsH$qj z5Q`wpM6c=TH7>|QYD9BY?n4;02a~tyelg}Q4AO%jUUHis^WGiA_seDz#PmUAazEn8 zdR2v^_v|Cq={Dk^EAyP_m?W`Q>5VVF560}qPlBAg zIOsjoFZkrFYPll%-Z{qc1q%zdHY=8PbA-PmZdi^p{%O>-)O_5Va(>+ROenJrhn$dw z8vgJ4K0+ELd5eb#_?jkdwuo^PzMBx@S$iS;COC!pUC4iwVVMocSCqNxzq(X61(I_Z zi#cB~fUN;1VE@qR2RwNb0g3CHsYEeFOF%M_IPQQWdJPm4nYVI+W-V~3{RTmDh!0W! zW0exURyA;-6{KN=i4@kg`82af#wFGidUWq}~t_k6ikf~y8CW8lG1Gu zR@)AL)#@hD#H5uXz78VS=v3I^OxoWYPxWA=Ll|ixUX`r%C|^nU(TFv`3UBgLV$N*T zXqAOYiy-w(&f^y~{guuKxc7`T|(f}zt;}e49d}(d}iXqYX-yzY^Z@u0?`ix0*P)Wz>;E|@S zpQI#Ei-SE$;9RV=Gh^lErO*U78p~$56}oLj=RW@(_$7a&AECPg?sUBtE;P64`dHAQ zEas_v0*!7FGISm|buLU?5Yfy_unYvfSWs{Vn-m0jhgRc*UNn>lgx~>XeS-oqelk8l zFU-@Fz`6BL&P|lwhnxe2)78eJGtO0Zu2EJ`Np4BhTLINl*MV_uNj=oA(33G206S7$ zv#okx(Jr*9^wF;TxUBBkqq5IC7O|{M9-L3V&n*&tpQTI^C;c`D5wL;ervEjyh);DL za%KOknr&L5usIKoVo3P2+!xwkCs!|~7hE55suzFzkt}h%uahrBm|!2u%NNdm35_zs zpK=fYg&!!q9}4LFV}8HJm{Sl9@MNbwsTd;m=k{#u4J`-)c#*R{wiwb05X>KA432%? zIid|AagVyyufI`Mxm6@OK$x)E)+9;8<5pR9T{9XPbV z_X~vIz9;-$39xH0Eg{pG(Pp^VingP4=TdjMvz>X#cfouuSL5Y?Ixm7xq$3Q|t|8fY z3&ynR{cW*kgxoD~Ueh~#)WU51Nxr*-Ll|-p|JnDO{NZ0`!(C|AC;iE}d*z`{Ve&y- z?=FN4uf0O)kchVzT_>T= z^k|=>ZbIFJG936KhgdANXun4Jz}-;o?W=x%D30km&G{DDXSs->ycP_5{fK&=C{b>? zHW+W>;H^jZp|oam{^Q1d=a)U_*sx&;o9zA~E8QZi`(O;XnBaF934f8+`M94h0xu z|3tZ+4m5v%aMxr*hU@N=1CfHKx6C>y1I8nn(Tz-{6l}RO<>&OPa1@eB7F&# zG;fG@eJQ^f-bcdQ^dS!MqvCEN5VLs6xu|xZmAaUU6KZ%=*p8U)SvspGE`fpkE#8FT7Np)PxWp(+sl=cNIHE(;d-^ zM%-~vUQ(j*5J8NPAyg4UE!Z$urC)iYj2BelBKepgCS#PDq~n9EOz7q@#+eM#h0?O2 z+Dy>tQOl7ehJ7Z$YrGkQfYQ?n1HtW=V^bc8)tTX>RcY|#)(UVuPTFFjO%d1zsNsFa z^yY44?r5&an_Z~%*FRMj?_m{l7h~)tEQjO;aHT0AXaCkcZ)1dhbac31i@JaT9^e5G2`z%1 z`l5}ZPmf$YMnC45mRK{8>p{Cg!w-dR+mPC$@m555sTj&abjRelPmAVc&8(Jv&QWvE ztn16hRFEO}_pQAmi*yX9NKa@4r#NXAk&Fa3ARa}nAZmn#6C5ICf0fGcxbnD*BK=>W z$)F;%MJ;+X5aAm_++QLohM@pIgu4_RGOhI13cX9wd|D(uCK2?oU%lJVbN7L-Ih4rmbnA^C>;Dpl8(enGu1Ta_D772!VjHe9hR&&Q6DTu^->G{ON;B%` zh*BM{<4CYa^)e#wgy1erJe8P_TE@ z_2G{Vg}%w*B@>}Lww1QU2TP$1D z!WP!CjeGiAavoj3afT64`T?#-$ajK0=5CAq;r9-ezv*j?!RE>_$4l}X!-wGKJU>Q2 zW5Z~{4dhf8IT=S;j7KW>9TnWZ#Q4Ma@`;EUC;=G?kTh%5V*16mN%mYnYY4}TTtLMA zIAezXlY1-ffT-v3Uo(XOq0i%l8Nqk-&CEf@*V}+8{EyHX;Ab*Ocv6U13LXjXlyOM{ z9)rs{lrqs|42nxSHnn8TluKSVP0TnQm%;iJY>Ad4X02JYHVI|SOS4~59w}p{>X=)L zoPF~0Se;8_m&hU#ol9kx!Xhffx!qHD9%*3;IIW5ss(Mir?@&;vrfo&AMoKH#FhBRV z>GqH9ms%S{5e!Gw==-p4{vb+|D|_bVJ4|}}(NI60!tnBW5%L{0P+jUNh?Gq@Iw`SG zT#~3Tl;RQ9R?kG@4NO|zKrPw$H!Rdx^5`Rx4pshnRc{}&+rlGjXoPt|#Up%s7;eac z>wkfS=Qj{Yr;1Vtmd)(M^ykjBjWT-oMQ*29yer{p4mvu29-=9EX#9}e)m?UnD?S-qQ`Nbn(K5DqG!Ixk)D%L^AY?$99ibb8e_DFMl-#z~5v?5F<$@B-ps1ESbxL#|v^q4`F1}25wTlj!PuqHiMM;l`$?Z>85fuG7Vy-1n z$)2W?X)K>4ttiWTlUW$N^z4pdRWyhuuAbf*ez$slg3GF2C`&u>@|t+#M;F5e_((S) z^O<5;$}9qg^*)}VvPGxsoj8V(2sAVgiov+B!Y)3mxC<2~Q6WFAu&NgmN{^)D#@@nT zU9K1GC^E;ks%N!J(hY69fO3tmUB{^ExAKN-KP_)QA(Wwtor!Ik=tM6&GG(K;ZnJYL zGN%*1V$|rSxy{B&>+>+P7REB|jx-5_V1ib7gKFe^7@K5;9|F&Ucp#HU?PU3z>>NT{ zN0^V6ZS^2I^ETVb>Y?qMSO%#TK{!Ln+QQN%%QDHlQ4)fcuq_j)%f8*6vOiqBaXCyV7;LS4wL6cCO}YM5`*A_(;3-mjZAt2GiU(Yx_ z_auj=0g(Kf;lP{>z~>(QnYcEUuxSN=anJw6=#llGt4}*kUm=9Q~RrnZHt^AN+~xSb7N)ZjveR|EUljV8Zw6=t?s^= z>9aAdto&j#hc2zM{est{eA*iQve)xp+7ABR>k$QYW>x=w@T>2u=3fRd-XHQU19cnG zoV^&@!8=~aG3R~$mS@!R(H>FU^BXpDOaAq1qKEg7VDUnaU(5_$>m`UY<7R!drM9WOt;(_KWwm`+3Z8SbX%$5O2UZC&16?978o;=L4%c5D=&DBU-)T|Nl_I|n z=F~iB86^Lv)Cs*^QN+)@46B-B(5!96iz2uPT{|#T>o7)T z9Js%&Op3*EVO86lnN?^)W$gI!OVLH@IZ!lhQjOv{u;-R#j#cd7^(*DWbJ|$D-OX12NQxpGU`o3geAHEhjd+9})U9m2@oE_gu3r!G$2KVLvce$c*xmBp1} zIOK_D#~Re+hVY$Y&9$)>&&)ZA>UGh~F^Qzkluj;txin;Hh`*W${McieBGA{f6Nl-@ zjA><$O{i=kS+r3JC3N6vv_TkE|2mQTPyTK}EE>W2&c`&F7Q*EtHV+-M;6}I$A zuTflBMG&$sr%8Jj`JGWklR!lF6xY|S^$qGi-(IUWk$SMC&*aBPs?>ptZO)nJoL066 z#aBg#u(OY)Svqa*u!E?Gg6L+NOeWCoytSatQE~fgO&V_>t{BSb%?{gP5BBt%m8&G-4$HK3nZy^fUpHd@)(u*0Rv!Xq#_qxQeIn$piNbimF?k&SLhNx_gFChK!l68B&4dL7?fN?A=F%lI4 z{F3@thYcoaSGY*G4XLYZTsZ9pCgvG7WQm>_;}jddyffN}@CI1r1p9zZa&bSB6=uY~ zVHmST2~mLtHP+pqv}h6tr3=T>s0HznaaAi$Y<6$1mC5t_u1OdU+EWVSJkh_}Bj;2o z8SoYN!0A!9P@pe}6c6B@)W4Yy+n)!KsT{?d0LKW*oWnMhch-Iv%8#+fi^O%rc0_z~ z@CLHgGV?1I9j=8yWL{&n1a2cX@^B0j@|EcmHMijC69!1^^Nj#SFsm@NHFK8ox5H3- zf8>VrdMuXaj*ti1Ljoo@FpWYdjaxlGHm7t9o>gAPtl}`3VU$I(%k45V+I~Ew);fQ( zDwD#+NrY~{h*KR5WpPnr+6v9Geyr1aE%By0$eteI$!TpEaRZssnQahkgPGE4ZDfkR zz$JC#K2m=SgT%}pbG(MC6^tyg2vkh;9~FFC#XYt+N-TbJ#0Ean%VjGLbMY{LeOlyP z^`;Sleg)^m8}e-&(#uq&ejtl+s2`@mbjDb;Kp$G%BrtLk+-|hs;)sJtnINa~$x<_e zsCH&2ux*6g+Do>0xg@Ha9YQJhJGuN3T|`4gH(f5{u=br%@6EKsTQLpK)HD0l^vbyFGy} zV-a-9j3~(#im&xjvU%gT`jEE7OY>Bkt6iYy2Kg##M{#`bZ!{pf=IJ)Pjh@bt>IR=< zkqw3JRri9?ZdIb;fUeLx?zSKNKc5>9N;JEb`AEmvkXZ>%g5Z64v|4`xo0B>y%_1m7 zc93B7G^8@VM$-Z72*mLY0?v)2mB7IRCW zJgdnTXM4KD4mpU8x$6mx;r22=*#xbtx<(ZXPcU)YghWTwMO^u!eGowq>lIfn#$`s< zp4k{%<=_+}NePQ4?+Awaj|)ZCo>q(to`h4zUtlpIam_Wc*CAe_$4M%PmTKTc^4ebm zR`O(SB}Kc%NRshTl30vMmie%gh9V~u*%7%+Nu14PMY|6m17he%_==IJgha{P zgC>o1#OI@_{+lo>BFj0~of#6IK zGZ#Z{Oppc_l}BwakMP_X>bTAOuKxvrG{pcBl0Jq%h0r$z9dfl$`qaE;-j~4B<)gi) zYB_@I8v@gPw(pm z52^+U@tjy>024c&t>zwAZtdJyzEzJ@P0oVTH@Nmhf@~wJ+htAoTlLo%;}Vl#2xWPd z0i698w&YSn*!;U&5A~0M_^gPNC)iIQbQhQF1@@^wUl*BwfntTG44;8jrE+ zJVQIjIvG3@id{~2rd)cf#yozzImc5p`kY;2;Q z+;M(KRL}TO1M~xl)KyAI{Iq|&JHGTxmCvS?t2k$#JZNSCk|~yuyZKCkfka>0vH)0B z0GQM}#iGy;s{G>5C2at5>4Oc>?N10lJcJ+O@0jfCgrsbTr0l!z;A|XYdNuVYt*(G|qT@c&ZY;-cND_e$Y!v=-wIV%p~C?go}T262>YhKo;b~ z^Yh{P+CyV0urKsS4opO|5KGVhyV4T!?1bImW0C+DTsX_QF^_&PZx-6r&G&)2fKXv` zXwCVs%87(shL0fR;Q=(K*9WrzF2t3o_tL3e8(r4JhR)(IgAI?V==1z|TuH0=O!>g) znoFjAHoJ64G)w%IjAO+N9C1gn#ukS%q5NW}D1}vu1~bEpS$>map)u}NhGvcHaxQTq zS;qkzS2cgdjZZmtJN?PEQXK&ohtoA#9f})A?%b*L(7)vn=5aG1FG}}sDz>jl)M9tx z8Fc$pM|)=oRQqIi%kl?#Qd;5*!g+Yf-1l@(O)##FtYW!~^rM}OUxpHAu^gXfXC01t zX)<)ddFPl|9^hJHTnGmHdo#dDPuIk@j?_pm{z-53dmzI$&dowLE)AuuDYnLh`HH@u zZ2Zvh=@7>RzCXtyPE3q3J9;NEdS|CF*gscZb$6tLi$RGlVAelM8_)E74<&3qJ(EG{ zF79%zyM*j)KeN@=WA|E$o$i5@$zGZ`zg+PKDwa=jQQr|K$z5Qdh&unS@#`k9$?xUO z5`r)C9=>&`P{&sDb*z-0KD%4OSh<6So!Dt9vQVEb-|}}-96NE3$;fm}_%rXYcTwD; z=3;mo1-X*fl4u|P%J%K)$Bo4b+NQ9IYomW9Qp0WS7Es3pz8NO?W|)!F2DmSt_6pz1 zvL7>89}=Pmc|GQOk;ghfP_ey0&{zT3+;^t1q3(|Nu5n4!TLpb!#XYN+jcs(-Z<$b9ox2T+kRu)wmL><_gep6 zYmB`QzA?VDI-gauX5IDN*L5Vn4)iMCmidzRmy+K}_)CPAB{O74Nns{5#i&ih7jNr> zGf)lw7x_miB2>Gz_b%WciqJh8{*0f-dH}&f&GY$hsQ(4E6>~NM?f=Kd*^T&5h57#qp7Z|} z=Kp`%1|2vb_2rE3-$@x;z$40lJNO9XqkU%NAFwJzV$vW86vx>ucDEt?zmZC$M&D>a?lnyc;}7$4s^JsoTj5ft=& zKWBJevj6ntS$aMVH!*>v)5SqLaTxv?cwZGLgXX(G{Lz6hx4e6HheqI6IdsYUDIeCy zarXyAzPpsDZ*Kqg2fklLRUgx+&|VCPU&v3q*D(;u!#vm1yr_GoS1p6Dtey84key*Y z&`&78qF;`ecd>-sc>TW*+B)Bv!1~~fSPd8VUwFIAEN}5%Z%yRKpk(inyzk>8FMqo} z^?`m839{d*u-G_>wh2+{fC@=?{^UQBgLR#in;9+>GZu!wN7IjtBqtsLWhohsUjV_} z*k5NAHu@0AGa9xJhGkonbQbo9hdK$T8P6Xu=oHJYulK|=1wi=uvPH! zOvZan4EXddRhaA)^d8v>@JQWeSBdqIzI zQnc>N8utb*c+O74y2Vzhj#SA;J9qKg%Hk+%jdW=CXAX{9D5GnnDZ0AT3~*653rR+OWOI;jm2xrTsi8_8OJOU5qO+6jlC8qZGs_4FEShOpOCHMC zg&E^Ztk5n^I=fIJ%t7dDMoJBr)!;fW*&J%{^pw+Ix5tRSP?Sm=Q4O{qU)++uIqBsZ zE#y1HfisQJwrI#F<~A+r-~87kifug6ChhF}wV6t-VPeeSs3}Cr!x{Dc+rX4~wGz)DPerCz zq#x}nEydPyS;G*+^HJZxCQow^2;_MteKy?axYAdd-NlV@XNVbVO&Tb)B9cf`ipukm zoM;U}+mAh~#9s+mJv&fuCQB_v(UkB|`B`CA%9m2l zlp_GI1w5uIxro|;sSQ`&G>LGMEF!b=Djs0o!kBl;NFQ@G<Wpk#ZGh0|T!_n&Ex|*An%4%P_`IKuFM7{Bn$S?ft{1$nui8wXly+tKJaB z_rO)*r-}YOD7_`a74QVSQ77*tErpgul7?$a!9w%co20BAI+gc<`B2!3+?2 z9{+h<)<>TAvopf&G`;71n!X5dFrzxWh$4t$U_FLhFB&qWJkwd$JYJey8Nkv$$`)8{ z!_v3}3R1?(DZCZ>0F%F*i)grjZh_}u6&3j$DA&JGGw>Bof^965E>XZTxQ;D4Mw0b3 zw)lb_e1#pjju8tWVu>eZ1*IP_)e(zxJSzG9LS&rJt^~tNAq`pX3Ha?Na@b*R)I8Q0 zeqv;=%pO)@bZ$UYZ~@dE{jg^79yrtxCrHqk_CF|ZMg>Z@C_G+d7KLoHoZ~8+NSDW= z7RQba+O@t;1dor?RnJD!bb19D(lVXb@&~W?HVIQKe|C%9%*HQws9Od`wmjSSor;O-O}?C0MGWQ7^%6a9Ctt&$g5DJ zRv`AlCova+-TUg=P_lTfu7t5~Lub_Q%H{AS)^cPrZ2|lq*f9VhWoOrCnn2Z|rLaxU zniw|;o!;|^sIa08rT(O%ceSumhYeL=?I+pzM7KdmSZ1j?9d0?;tH|5 z#kxEd@NOiFEkBOpK;MNFUJ;bpxCMCI^T*ok=d|Oy5_~%I|pWXoII`td? z2>K))bjY3Z)MBqOoS9%>bENbRB8?`xI7RneD|NGO8`l^hNho*34DF&ugs1?n=4_KZ zE*kX3S`PSs1f6;BeO3Pb`wTo>QQ~{HOnhDu&I53lXsK}yTosfMi1W9U*?50J_7)A| zn&6VNF*@v#4ZiCy?&Pi*u>@jqvFi*R-X8qo&t3@RwS`_p+RyG~#IvK0D`3G58}j|` zm$^}P(IdracpP=&Un!N%xwr1?oW^ko$nWH>Nin)2K5D-mdRQt0R@W%V@t0Ki{jWM?1g>*+MsWdv@H#?#JcC5>>QFh~1_E1CuBR&`*&F=7o zXby%e04p`B8TO=8LH|7RuhSuB$vk4p>V9AYT^kSq^S%VKH-AcLS?3tuufo(3DOMXU;+@)s*ZpfYlzy6id40IFDny>wXSS z55_EXCbvD%F{@%JcV=DagG=^H%n`LF2;bw$;pUEw2YKeu@`;Xp#3fz6D%&r(^Z@aRO~UdgrW!^*Yn1gEvq76TAQbA?(P3`f z&x0D`HVgb_a^eOR+Bn80=#XIV8JH$)bNq9&{EK_~(S08I)1(^6*+cy9a0(w|1OMB7 z)Emcvm-(4AZ^$}kdOvBUU&}2(Gy0N{XT5`4w~^oe2fyg=Z_5_cKU>U9Pw1@pBX!1< z7x6RKqt->=*{(vNdeRSD7-?LYP8MW4Cl02v$;*aj@5_>p+`MOI znF)ocwEFrf?3=XTjTY_dGWkv#HP{_s>B zS#>$s9@1V2N_h%pPUSjHoqC_@G=UqsJ`%Qmz<4#>1*$vSj=ed3({i6sK-~8&SO%4GNbD(+f6k<3fmiUCZ*wQe}XAX8yS&J3TMH* zhH%lDBZOw1uHYI4vREb#*$C;{Wy{$aXe=ER|&HO`|w2cK!P(t9> zQy4K-**Ss2M~p`92lE2wmjsmY68>0oUa%>KCfa^H_26%_s{rtsQKKydT=>%T%9X#wKK+1W|P{wsLmb5 zp!h_cVkizxgE_Zb;8SwUz~E%9-N=1dNQ5N77ekW z$ip{By6F_5A2IEEJxLMKUOY!(E%(<(7Qh2H%a*KcuE3LdH^&pJn>jvf*W)0f3&g7| znRl<4+t@T-hQW-;=9tjva^}c6z(t>Q&^_+#7UkNQe&k|Kw(G7@l*k)To;&Y~^YUj~ z<{&jo>rT(l>#3n-;xY=pD#>{{)_9AkRiJ8ozasIQCqg6OWw_|gmZL?|@pFavZbdZv z#C(6Mi4Fr}K7Qt3qF}s09WxOB?c1ip)@s++s}eN@XyzHItP@W;nwT@5x*BLa;fJDi z!MDO2>Aho~B9yn~f#0ph(t5$*6s6?XoxVa%-FmbN@Rr9kXiYKz=K4!`7avPz%Du7t zkzqBf&&>(oKCQUQ>US&RsLN;2Y7eX%rH<@hGqFlzof`x8q|?8cRx-CZBTfXRQz02g z@JCDD)Wl0UWjyAq5sIny2IM?&yHBF6(d`cVy`^57mJHjjP7&K)8b3o`fO7FhK3*_2 z#F{&}>*l-#4QouqRy_jTeX<+JANx129;xJswv|wU-11}zPj4XxYq=91G*eOO)MLyF zhNZ+zEHwCK%ysRlIRkIMrhZLq_^k58bymA^*BHlSRhJ?R9=T`9gq0A0=?cA}pdH%M zGYgd({tnc6@HP}*Y8U@$(q@KM)3OD3XAR=BDWO@O^>E2=ln3|8>bDn~G|LOO5wlpV zWE=M=i`Yk??YMxlGl=fR7pFK^;?i9=Z%k$tW?#U0z~({<<*Kz4q_i^|l_$#O2b&{X z7;yhd<)qQ5h8=z>cJOWmt>4Dm@GABh5>?eNyBJa+ z%&BRM$RHqv6#pqck@|0Vga1^l=3>UCR_5gY_e#RS_5Y}WYBcq<@HEi>&cHA$u(Bsd zt&xVbq7SL_#j948)TAa?ZOOJrVC2XnnmMs1&6F@0^mh0>jbL3P#h-Qt8xs0d+rDM} z>mvfe0}beHE4H(W#qTkL6;QqL{Taroa%T9p@JRKgSSiBPd`@TJ{+WGTf&I;-&&3VAB7Yf z^2QD(yw6EEWv;i&Imj$HRk8AI{`aAWATs~(>m3KOOunu7qo62B-_v~dA;j!mRh}+|Gg&gPs{elXgR&1&^jv(7xMXczPy@RDw)Ngs-Y*GUlT&Sf?ueUZ8ngw_7t?4ifzfBmgh)Oqo%LW$tEFno&?(g^F3lqaLWcf*UG#;); zc@j6o&_3#qD$*E13|vT!>>(Y9DB9He>H~CM^y>0g_$u1Y`I0>s43E2z$i*|&hEOI9 zpOQgg!+?rHkb*+2+e+;;UOei`dh)g5RaiR=3T|5cWQ;A1{Q%gWw^27%_T^A_&ORB< zrH_qypEGWiTedo)sCSF>(mU(Xck79jSWb#CB!GJ!KG)|#vq~x6<(Fe7dwVW*#|w4e z&g0VL@ht?u=kT2KIG1dm(fU(OzjF~!M)@)y@g>9Gyr&asO=x=+ZEEjktP}lJLNDT} z_-tkGoUjdgZHk6}EP^rq=J_C+^ekW9D_v5UsHR+-w7{h23BKzcFLJ#i%#;!lkl1!nzkZL zlb1xl4lnx%B9$?7ywAfo_9Vg9+}A#97oye_9Z7~{$YB-;3&Udfb7*g>O*TX^whTrr zomvBDH2_K)w>}t)4nHz8k2=Y67b8O9z<0@Rc<-~FWV`CYN(DeyP58nEYN>mfc6Deh zev{6awo7-*h880dWJLav!;aQ(;AB@f+uW!#Qc{sB_rpS%ME#EK91BjtVkX}hX^^ra zr&U~1;;xXOgsH&*{+w%%I^>g<30fm#m$FgV6&Q&~v6pqtvp1YyLp(sGP6)!pp?~_p zfI5;}kYcJ6sfM~F#cRL8)-7?`f=V?nZ-!5kE6(RQY`qf+?>K~A_Koq0Zs7&B;z`Bn zg{8j}TE2c5A=WK zxp;tZCH#LtYDk#>v?2XhQ0o7?4gC+4x`r3#pQdT~bV_hYPWlH7Ja|NP5{xmi9WJu8 z=#PM4VboL*j4emYr_SoShlHh8>uPjYq4qj z&i>fxmZxOGX7JhFI^J@b5!e)X*}^jXoIOd!8D@wbQ)}hkAeGQbZel$`Je{Y}! zQMcASyAxD9ZnC<43semdl9QRT#lGg00;Y9{oBKH)YU$jUn$?uPGg;)u`3Tsx63h6Y zw79S=opy)c^VWQ}GlXu0X3&J^F(L`=uy)&nj9z1jWFZ`>X`cs`b4tS4^z>o_7NBh(2l{>xIcneJ|c(jNn>a+GHL&c2IYB=y7K`GWf-Bw zb64ick>qfAf=k(xidEZm@Px>n_2mZk!nJWniMKO#*|z4?h2Yq-Zy)X1g>YNHXvl|c zOBv-t6?A)W;()hfI`k{!kMGu&;}8^f?_y|I^=m!`k*IVXH25)VU7Zdi(gNm_1eKg9hQbL%1-XduegR5q|RxrvR=E{cC#)&gV{lp`(}) zGI4i5A)v)mYS{#q!@c++36e1|VMUsl_7^AcGF?IXd1MeJP6&0ak)nOQD8ooz$#g1P zVWBweV8H17BwZiZ(I$}$dVNB(KzMBtfpScY*ykJ#axMyNBgaQfZ3FiH zd)f=71GQSXj-Hx^Gi3NvM~~a(sVCKpn-mj!77AHa*d?oa>?!;n_WCg$vqDk#;uCd$ zkOch1S`&qCj~Cf#C0FKDsOm=PtG>StU2XCFR}Jx$jB0DqaHvkz8-&4ZwOHS*guf23 z@*3}ojh4u&5yeIge>SVFL4*~r8Y%!emjx{rVH>P*E-!-(l8(4$FcpH zLyj+V2scJ!2gX8*O+2~`dR$%-l|ihT%GL=AlN|sXvR6)QPAP(_jY_jiEhQ_5K|QsQ zpT5ZVyZrSFNJ`2T+|4jN-mPMsev@X3A>!x}TQ((q$`RD>Mze|)Fu^@!qm!$AJ}OJ* z+4ApB=Mw!9R|kQRSz+|#AE9s-Zo?HKs=s}CBTcN?R!nMx451=>RkHjJC#uKA+1c>NRG*8vcv385hapa_#s8W+b4ClWl!mG=1nmu>1$9uGtkniirO1<*})E> zCRHTK)Z+-r*H1WbE^7C^eK+|R08_6-+5?asPAFYtFRm!zDKrK_6P)Mc8oMKjW#7>xVim*!_k@a$d_s$f_c z1%KeI-0P3tbSJsng9M7tlHk6hRr$4uJq-uGzfwny9A-0zO!P9gWJq?C1|w#{TcD_vi}Q zlmjfU!C&gPPiTeSQCKTU9_M#dr5c6lsdw086(PX&=Dc{Vd$rH#?U#<=pL;*4p|DO> z#Q27a?3#Ri2Ad|EZ}CUG1pmG#oEWYDjm#s1moq#{Y?_9S&VW*>23m+*btokH4y<9SawBF99{VC9&!~CD!;iPU63awQ zi(>73rQ7>SW@#Gwgn{8Sbd)h!_01pi6UbVN#fD@hw81Fve#9)P^C{999kt!n7Wdt} z*9==&v|-}vJsrp^}_Xf*S64^q2jagX-6P9x*@94ON3IBF6Yulsk3%G}MoD*EgtOwD4M0vbC z)F2T|eW^xkOoHe~&*kelvQqtO6q=U*j$ftT^OH(d1->Mav!)~+ADj8!Meqx6;lsPy zfuMO)9W`}z@{8{^S_=G<^Btt9;VhOFG}v*Rwj=;=p_Jno%;$g>@} zIhe0*Bz4!UI2TP~O2+wr$Cl%ki=X_jC?$TOtQ`+;V#!I_Tc=X(rAGdZv-yP2i${+KGz+jH@t(eVUI$d!6K+E)la& zGJi1NRo)mz)qA6IWq-xo);xA881xxjS4?4i<=FgA+t_9BhU$Y5|6K=LhN}ID6uvXi zl9zs~`X*5Rj8yT8RQ2V6(JOULr1BxP>{qvOtM=hOuSBwb{w87%1%e397X#ATg%r5F z4bd7JWONG>#piOwL9jPZFDZAf1I9-(+sp5&a zv6ptVQdFN3xiGnB@4WTPiGg%0@H;SQSVa{cBn+B}I-f9%afCY*wLabp3B}tnaj@7VYSWqrIw`6~@e-xJMNFk3 zrTm^HJ@AfQo}rb;UW&K|u9Pz#t@M7$`r7|oQO_7^%1Jk3&+m*hpXRbzk-G;ha>TO~ zd)9fQahkvhGC;a=eR$Pt=-PH~Il2P{w#835+Z>c2dFZev(jaW=tj3oP&1x8uzGewU{0oXZhZ8qlBFk5XPu+F! z6H%L3{P37~WzCe=6WjeNfAok$yzYh#@vuaw-Tp zHjq0u)WwNjKlsoHFE(s*4&uc~kU#XFyBuzh8guaSET9d5>Juz+$CdqK_rR6?5I(sc zJ8Vy$AL4XRJ6o>EOFIB#@XL05#AOavD2Qr&`_F#g=P(#ubx7PE%|l!am@on&;g`M{ z6yaB(BqU4W3o-V{nGP&>685|;(o}ND8AD~L8rnUPuzc^Rjs6w{93CvZlOjuudEJxq(qT6eaQ&Sb^Thd=|ym+NmM8BnwW<{X(&-qyK~T*ruBx@ zQSSv4P3#Y&v`6L(=B9hVi1n|^HA7Eqa@7h4s`MxVG%L}{^PBV2J<#KSu@iVJ4u=Dvii7Nxg+AU4k)oxONMQn(l{pnCx=apgBe zU+Iqc``^%N#61v^ox6El(jc^J*16BBAeSeQ%eB89MZQNW_)kfQV2QsZ2-C(684TaJ$hA)Vn@2{o01#NF~FibMe#3zli&^mJ(u3R zWYdu5!#f>mfMbZ(`48ssd0TeYM2VT8-FYDUytSZIwmF+|FJhmTeG;7}$VyiTfhLw- zcIpuGl(ozm@7y&z55xM2qPFQq586Z|L)e~FMAV(U>|M6YDs4nB+6?RUO+dY(#GN(t z=(cDt%UwDr2?h1MgO+Zn84n!lo7iitm!?#Xn0s>QozX#?wa;k2fj*UQfiLOnLMa5HPiRUBdX962m%wKX=tOXr! ztp;?RZQ?tIn?S_=8~z*Qw_6)Y zg5U~tQg)|H$7Sn^^=)Eo2$2d9ifDB#JFXaYzb^4D0-01q`C-cr=*-HsjA?r*htn(V z@*`LjsKZQ#M_I#Bs;rBnteBUGOU~EX~6>*9B!))Ts(3m*qav;dBQKXriJVf`9 zt8e{B8M(9Y3957Bmlt3PFoK;REB15aF=lK8pz*AbNwhOq`C~#yCYWW1bS9WfA>{&; zSrjESRvN|k`!8Lr3&e38?7|e-O<1T)THOXu6xRl`5)o!)I`u5o0N}5fIn`}6V?A;& zmw7%eb!HShrwBzI$sj_^s@45oI6Eh&SKp+ z)QMW6C@XHryz+SzjCCj@&jE1buxg^HTIG!FNrTGWzlfNhkqdW1M#z2&q<&F5EtL>%Ms1YIeR;%q7s}cfs*3)dX*=>+vdo1QkU9Wa-Mk{Tfuo|rT71 zhsFzC3aVw=+Y1QNjk#JF6Lhcj145a&OLdXh1me6$lJKAlc}z3^n+T`U_viLn;>2F! zj*37Zu|S{AFkOR*iUh1Cho@ z2%Hq!@FZ}YXM#ZZ1q?IwO5(B$%BqjEuPwfQ$ujVCmY-TtcGqi9;g9nby7H6^k?+)h zUePdZ6N+YSFOo2t|`t3%mgNrJLm_p1_%3{r^`8=e^d<) z^uLDp6*&fESw+N%PL7z|(v62uJY|KN{W}C2_oXewhP^y15gR&w4;MK#%krl%I;75u zv|Z6WWPVK;Y+^w{0oF*kqvsEe(D79#g9W*xM*y^8=Y`DwWHB{1DHRQ1@Lfv%VhfMh zaf}3HMncgboKs3Zlp)7975kj3=Y2$xjg0y4AISRcM43&kl%alnIAMO0Mc%eF5J2X8 zwjhM{J$Zqq_L^1pzU9PRY@x1}&WMpM=pf_svy37cE_?+^cUNzljzH62)$+d^xww_B@^t%%~!4O!|X=_u=|%_KkQ4j zyaGV}0qeWsn(o0@6&nvP1&_eetz&4NuF;2>hw$Lba3ryJ%siv^;raTeTMpqZab{RP zgZIneZ<#-%_YFe-z~8cT&pHL{pThSUy;2O-Vf$SVLDAny5HZr0PySQOucw{QLu!t? zLCCfR8mZ!)EtzaSEn9HfpW#5*EHHPltl3^!l(pC`K+4LaRp2Zy0D2~+&rF==ce0jH zVZyc@%`~$%R)Tk=T=mf9Ia!Z~t_>Z3)8=R>6PQ*7uACv-mtg|UW5k1#$DGfb9W2Ol z+}&bQ*LRAZm`ZuPW7;dsU953Aog#)(wf$hGqoq2hs|i;Zqly~TSrdU7D9($EU)E$r zQtsz^8DmSP>*~CyN_br!RFGt??~F0mK~ZT5@EX*&^YSs{=Rv3o0V%lwC)c>a(I~x-5b;;naG;<6C;U;(`2P zw3Zgv;G(t3Y!~A@rX>i*_P9@ayLDNuEdvjuL9qX8MgHi;)5*4L3 zO?WDcT!#XaM7SKTS(~bC=x31p8`9kShr&aI{MEEizpj*dFJncV{${2Rkb*^7=W=nLbv>hy&5S`U|Mi z|480B+tVu`3FC6Dyz%tb>|+MLN6PmV*q7JrYTWZ&Vi;LE@KW!^)ajz5fL`*a2Ru`} z(&4eE9nzL8t?Pr~2Ia{!>-2tKiMSYXv?b=BkK z=;eoWNB{xt-*BOdSJE5R`6xb&sqb&Cd=mu6ezvu$1LC2e*T~2)Y{G#e+FYZxF(?0h z_pO2h(C1&V2ED<-k$yfp5}_oM@uq9Q`Y2<6<9K7Pp&s}bmaW-(sM5eoMh1?B8irn+ z6~}E6I@S7z$UgLB=rMi?^jCMAi0ocJyb{#E?yS+UZjL8OWg|J~+eBX55<+h9V_xxFa>K%G`Y-NisP`-RD+dt_ zkM?1>hO(p(Fnakv)xjT>E6OLyuuF55+l@#6^5YKX^5YI6kl-%5>dQA}I0>o``m!&R zqV@**3A!4y!t`W{8_1!}N)UZfuLmGTR+M;VW4^Mt&OtAu2F)JAnE+k&isyXEm&D9H z!Kbs7j7^$*LM(&=WEh6hw+#D}70A*%I~tDBOP`u&8H~I?SRS6CIT*@G_@(>Y5epD! z7nl-HS@4+hF_a_3V@xEcOXAf07X8txeHdsb-na0}sYH^)@YR{^iLU6Eu63 zO;)k3c~T4<|yVyG8b$GGo1hNnaHrN879p zXOv}qvQ+1Eu10t!^lp>!zx}*EVapUcp3R-3YzMEsnz6tbh^udlaIs{c8zfnsVvyor z5*qW4F3|0juM%H9SOTJckd7rEh+asD>lcUkgcJKxMIPYV0c6q>ok(I1dU<(&+#0`j z*Y#iW*d#57&-5k7FRhc)WRa6h_+P*<3-=U9a$cVwNU7&JJ)QI_1K{BT3 zD;n^jw0c}@-&m4JuPuAxwI=iASop34qcK-Hp}yo+6eM2}`m+MCoKhprxhsQ7-WX4( zQ%kz8px9U;zH%Vj+C;kkgKFK5H0w~db&^t#1c*C1&WUiisMv}ZZf^*qS2WG3tg(tvI9%7cctj6BV8w@THh9T zkE2`v!T@6O0pUqE_hnnlMD5V)hrRex;2X>hOoIr66KmusmxVoXeTU0bESM-Y6F^f0 z$~6gzOM57Q97a^D{+=dI8-*Tc>Ea668nNOv{IWiAF-hfpvU!3h-s3rwhesPq`cR|$ z-rCN-(;Pj#E=|tk96byFhzceGf;NL}X9`E?&gsG3{IT(4XVyb#LJma6;)En{6*$h& zJO{K#Fdig+W$~uuN3YzXxyhor&KL(CusH4*jk5;f7wFEZ!P$6HC@->)>)NX zKEjq)>q79G`Euvt(Nxihx}g2$u395@@L=dUkorB^3`gW0|{giUH_V%{( zQnzw8H#YnKp2{@!Jkb8l;FM;VCAwO%*z2m^C^O42sR$>h{wkoL0JoEqi^M8DpHq~v z7&H^L#}H3N`U{fh<9hxO0wt1FOCd+->-1*(33}mSvCzyuf4q>^GrMm2v$yAE-ST8r z$j=*QPk|rCRH!z%9?4o{^k3peO!nHs{5ekBPAG}21>S)&+!d$<&O*apI($;9oP}v7 z8Lwx2C8;=2z1KE$HvEgEI}U01;$K`qJ%>I8k${E!2i6tB1A|^VUZJL3F5E1&8A`V@ zKLf5pW{h(x#5gyFelvl%grb=@s|&;UxUT{=UzDWIV2At; zZRrFCTS-=|1Ddvu62qlSMYnmT_fEsrQlNcxEvBZbDdCG#jLm^v$hc@}?-h`IxGgZN zJiRoWBim{`(jt+epechhPP=gbcbx5L<1LHUDxg!Fc1~ZBik<*BBYZU3|dot$`0Ql>I&%qJGbNFnCT{ zxBV>V(O`mp;-(i8Kmo(ox`7D2FJLh;f)Y^VUkHnq8i{&SRj;DCpHFIh`ixrP>2Hof zWGpdI85!nTe4xg!d5^=`RI2bkz{z1x52s6)Jl>z^bn@HaQLElCPp>c}Sgf}E02^YT z;%9^XyP|y)UiA0$v@I{~mAf!qifhuUZ9cG^3Rk>E^3M4>qU`&e`%F7GJP6BCy*N~L zC8zo$S0XEfvQ^V&t6a#?dCS*R6y0#)vCtfLzPf7cDhA5?y62GL1P^;*T2`fvBkXV2 zfx@U5^&3yexz}ni+kA^bna2X)`irBsbe;cKaem5VXL@!-*7{XQ6wXeH0m5GaJr(HD z^7R*XFRTmig7=~RjE%9l*kG_v-Eot_SBk`u_>NEM7$P^XIBYy;p(ixy#Akq(FdT>f z%n@&~*)Fbb;;)rGxf_F^&*%rt$0YZ8*!0p9c+vI{&ZD^i9eCx;$19d_^u1beM4$l- zIm3;t(VfaWWM8u3k)zcqS)M28?;D;UzL(0iPkqA7ZL!J^QqAfpvCWB2*Hxl1S9dG+ z`dagbBQt(CN3@2QR1xGZ{E4^K1vTFvyf=j4(tng$;?(87M6*~6P0!$C)+Oc_>Orr`SPzN>i`Ijf&Co?$8io4Yg!5x5Jjk+FI6 z8OJvHk!Mr=@%TwUb00qxAqxY_zisj3fb;zgBow8efk7-Kk+okx{X%X|&oHwLc11Dx zDTN4N{RrcGKmKs-s!4W4SB*29B59x+FJLTah~L4m@DC#ss$8;+zS)`If$L0^-GxN? z1ojc>JfJPXs(vts0&rmqxx?7Fr*fcsx#L;KQ# z(zE}@hAjW%*bwJ`Gsh@x>|kbR?)*PPL*^=SNnHhLH|-8x{8SHE&0V|yzzehef#|3&&J(sG#lvqBcpTiX5*TW zOxW&6hm`6(nf9m91C}CKE#y+iuVhiJ zD^vJ1Q%6z6mN*m!ZsPc-&wvAOeB%U-o5qN${+5%2g4pY1cxZfuO&XzM6VcdmtVpVg zvfK$kp72{>4%1AJelc?xRxBAwROAvFfNOd=zr1itDylM*(D{R!k6*b`@vNaGI&&_Fu}p2lr$v_ zDLD%C@f2i0l7NMeLg8C5@7)&|HbymzSI{rCoO7h}$7|ULHPnq}wNWxp~rrm7?Ysu2ntd21>+_3;0G~;aLdQ7BoZs0K)t0K@-ebkhd zFzr4#n#!D?;?NprcHC2Q)Mabph&0xRe7;bYcNnhJ$`Zi}55qY1xJH@b9MAHvSSp&WiHeo?A2;)f7z4CSB(C6g|w?l8W;pz|OKyP}a)6Ap?JU ziCvvcQNgo%LMEZ3wjbtL0=^(yfS*J}Chk-R$QHiJY?xNB&XkhQu{G^#Lbdl5+fg(1 z*6>KGP)_jYUk`3R_8d_zqQoH&qSUz6w+`TfsyU6F5hSedJ2pgP#UYcz<*hO+RSWoyI$L&^w&QGx3za*jA_e>bm!Vd zejIiu>Ny_Gcf>fW_*)zF4Jl-a`Y7-7TPN^?$X5VkTZpTfRuqJ1d)XQ#YWpHQ7ky}c zrQFe}@>hOkrfwFaGXGBQ(x<67l(VtwpE!Iade=cwplF~tLq&&vE;)AZRP9s5lggw! zT(YrGQ)++oq=byZlu~4sG}H^7k3tbtW7i?y(5vJ~+pFTp%WFXGfN03>o1J@K>RNU< zr{g;6^=?%mSWU7(>5`sI&O%rb*p+rhM{XoKk>eW@jm}`=Mb70c0SRBHy{N=`YuRtw zBt@HV-E`{6ZlJ55nCW8E`K2SP2iXFym^Dp;%h9AOSW;TvKbs=4za9a#$&&c_nyLVs&Wd}8J2D|PLzCmt}Ya231z_)fBk3x*c_9%O zsUjlg-g8!)XM^ExSWz)@T)J|C$f>wsCb8Hhg8=6{OM0tH;U3+A!SO;^Os)FhIEJ1; z=$LKw0oEM@LY;w;i70J}M1MvTj<7;aHDbE1BO12Cs^ip%+5o$^Jdq^;$*Lf#M@-7QM-x^k_)OO+x*)?&r$O2G?ar1>?% zWE|vN@nl&)R!Q3+V@8D`ceHd2MB4j{^0By54*(m9RLXHwAyjle{ANFtIEm@_RbGRr zw4d6HG+tm=Q0?2EI3)`)s_|^d2ZN)lUnF{%IA2YQm>gb42t@xM(%vb`vToTLtyHCL zSK78KZQERFuVf{v(zb2ewr$(CReAF}`}}`v=i%&j_q}Vbhxt4sMvUGgdPG>?@-XSM zKKs&m6-(q*S)kt&=y`)*v(FKr`e)R7LMq&6apXfO=$@ zd-@5v#hDAp*Xt)^l;cj*&ke%w@WUt#_LRh(K;arp&5|{TPb38!TrfAPL^u1h#T-g& z;Nz7`z~WQ(unDLoRXZznT~xhZc#`B>;5s0lnztn(ACy^afa4=TKZS83en9_&Y#{O9 z+LFJ2`&I@2@2cRB{^vFLJUI5+7EJ%_<>W9P8QI z*HY1HT2gB^%tUkq@T(TLC9M#f)!~+nao>8+O(8eG%`k1djH>ye0Sh?@^okUUmaFE_hc^ z^YHL+=X{+uZr9u0H(ro|kl_8<-MfF=ZM8~m@l}AL*ko!*5^|+SkMdYb6RDsfzBvc* z6R9Y{=(mBQ8I^KUK7%{Trx(@b+fuS^Wp&Vs=8Y4EA8K%#oG0=JLXhcTJ*AM%%XkKtqGS;fjp`} zBN4jlOT{nnUy&;~h+n2qzO+(g_2OhIwBVe=GMC3p!IGG`6tu4r6}6vjJK|t*e;-p> zu%DZwsr@v)urF z>bnOcM;~fMqGYFQ0dufuWF336j`z058chZ#$t4*{jd4_Mr_iU-rJC`$a{Npd77@?0 zG>c5bi}VCpZR;X;-V{n1Y&?WQixU^3aY}VFF@$u*f%iW#Vk$fI9tSNN*Cy8sBVS6! z#2A5QLrO*ju^VtTOO+t(@Ul-TWE5U;{t2!k;EB_nkYTly;v;l^ua8vHvw>vsd_-mS zO9NQ*EP?6qQ%hTX0`)P&gpz2-ME4j<_P%!!E zM%rwe)~FQ{94750C1i8n^X(EW3+lA;Q}jZiX@QXf`NVWAV_uqq`hlZKyRQZ*D4rOPYRBO|&AdMqL5%Volgbl0C6UwB5XJyhYwiZcGdhYvtI)-RSuS9uLf~ z8c{(QD|9EvxdB<6C(3*CoEb4&c89qrI#4U>HX8Kxus5{!F=8ueBF~>3VG!Qf!{?d4 ztSbB`K0s{EZ6Du<=CoW!4VgyF1|2mVn9aVo^>>*bCcHx0?IuxIT=e9|S(5xV*&cKq zvZg6%JP3gy1~jKUibzB>9plxm{$O83cPIQg7*jVVFm-g#{yfNP&Fr_jE#r7>GMdNm zjNFU#Rjv{olTIy4i3~YQFO86lru|<&pq3E2U|F|ZQVudl`;g8mQy|Vs#d28(OY50& zXg`1s(g&tue?w5^Twc@!HP;rtfT|7U+vSh% zu3mW?L!4g|MqwXUKUlZ+E0vR1tk6>Cs|xwzW9J`d&aLX{i@PYC!HCh*#7Gm8#aI`r zZ+BUZN{(4el^$H>@>Xs4N`_fcO0eg3>X4h1(sDWYuil%BMDsjZ{dV+-&=ETRd=Y_7C z{rohJ?iQsT1U7?By`j~+!F29Z9p_|rEsRrBf-L%e+Ut;aCqZ2U2o)kAS+_wh96A>J ze;ay}K9=i=H~Zi1kB)gl|1t2fMMu8Iw|Ccc4VSbE-JHLd5=tPFVNr zs5HqMYvW#!GSs*=n$`QjeYw5jKU^TVv*a<tR+-l1cEPPkZU8G3ZUrJPNf=yc~ z8~%Wf=Th^!foIVY@*QSRj638Nn>L4@-LHVf9Hu|t9ByKhWJknUa8GNb866OQ<`}}i zZ@57|)PKs%>XVA0sdikpTXJKo@s!V>9^dU=m*`vfJRQxo%)z;xSewI321 z!=5Clq?=!JEnJL1AVi4YyT}|A?NC#zH*V*ot3FwZ&;Lov`#Bt{c|qTInr}72Nv@MG zU;GLzp`SG*Bd*G&b_ob`KZ3h_=F<{u#{uSoP&q8TMz)x_&_ykS%e-P0hEGw2x3 z)t0bErKnMsF-YQ!2ogb1k|CyWO5P2ZZJOvD4kg$iW=$tfoj}7VimB7(msGD6=G|+p z-XN3XNa=g4)HY8xJ}RBn0IAqjEJulY;oZ0_v2|62-RF}>Y=*%#{qTUj zS>_3b7|V29ggC1NI-Bwz0up0QF(~kMX^>}fv?!YR8xQztRG}{7 z0;**&$6(0N5o23%q)LP9GUM=f)G#_t-dbN{y`n?L0PB2ve%23ylbLG}s}nvA13v9b zKIcZm(i#&RG#UqEDSaeO)5F-^S$Z^i_lSD^m3ffKs2Taaz;O)T-ONWWnE+kI3qgv{ zko5N>W;uTODTBe*KUIO8EqodopE$cF+ls%Kg0NbTv7eD6f zT#q*X?xGTk_4fsDpWW}8hEtrc#QjVD(3Q|GGsZZ^ool4yUgfw zDmpnc*wj)g<4XD|p=F>tsM)=OVoZ1&nJi8jl#Q0h7?61j&hE;Ic-jl31Jme3tRc42 zwKlA(qNUA4xwdiNnantktw*P{Mq5M?Vr`co7R0oj9^5Bt7NJt{D_^2{9cVRS&jAgR za6yGdbiRZY+BrcCC9Rf8T;_xXnma$(&E}yGRaGyZ-C`z}7M2N7T#4M`O|`pDx#rrqKo&8mVgzZ0Ze|*IPzU0M+gpy<%LI&<-Pbx+tVhl8q2&;M z=frwB%0MFm(5amHuqxC-KSk44FfO0*v-)%@94%}W>?ZUq}MF?;^(dKbe!u4tj8&;;75o-WUhYJ{i$-4kitE~ zcYDGyf^&;lxYTss;*lILSpwrYRns_S&Z4FK@D$c01~^+ktP2G{PD3i1FK_=mRE1}O&wMj7Kj&DX(<`j?5NWBQJ!|2 z9$Q`=c6ZatPn(DaEn3)vd#twjg<+QlOEr&Enld5bHGC{2*CK_CnnshQ9Ka zZa>+xVke6F%)8CNJ=w#jb_C(G5J`NEK|7K9G1+)Yvk)O~g3I+`NJ1GPZ_sm|OaD|s zKmWqo>gHhclwPz8nhCt}zt;7X@9bpQhQ#s48jQN$Ln0WE?|r87CZGLH|LdJNTz^;H znG-V#`nh5IL+sicxBtrbxx?U75aE-O^fw9{A?CFiygbxZ7u0jv`iE@amfy2D(kI-m zq~MD>*5}}F)_3(jWt>d4I%g)8j!fm1FWu{PDcF-=I0&cH8e8`Qu#rxudrO9ngvMXhvPDnwC9RYDKCG8 zh}9XtQ$0xqyl$kd%aI)2>UpW!F|*7jFch|hJM|35Fxxp@u)8>sv7FS$(3&{v3UdLk zHs>=dePCvvCD=tJSu6$%MDxt=(>x;Fetl&63Kq`U$ll#JF`I>B0&x7v&_Gdkw_k&vVz1 z09t6`Wb*0dzh+$W1aG!u5OvSy&NnI%uh9UKHxB=6a@m z-ww!hj6DD-WctGaCaMY8J#JH1gjmG*FzXWyli4HPJ7hQy)yyO+ zl8G^#xF6rhZHKXNHqE&1o95%#S;=zS<(YR!cuynxC?m;n*A8wU2 z&Wdk}WZ2KW*76h6$Og)qb1C{_*L_{D7%qG zL+32paSy!3n`@LNe5>^b%?O@Z{u;vIRup<%V~oCone~7HvPC}yyD{L`ltFCVFt*+@ zI@Hwb@EYYNL=Nr~L+6`X27gZ@?X0tz^D%H?J@7h_g;U!K`%5%SOQSkWiiu&leQv8^ z<>k~8(vGD$lv9qN*$^S7q3H7lFeTdLlCS;QFm_3*s#b;5u{4`W_P-00rE$_^-0Kcy zJbk%EIq=mD(;{J!mTEM+13-U4=#Xa1cNc)t3wK419a#PBMhB%IBkX!hNWmJbn;mVKd)%I#Bj5bRug)!0=#e-G*3BAr?1tgSfe(Z@~PMkkYwVBXTT zvnT^zr4su>bj8LH`XrikGFaTy$6Z1*i%v?xs-{(oPG=WRP@)cuEbdsEoOGSbSezO_ zIZjU9OT}}HrKl#8bOz@VSaUl8*0Tv6i%QFJ2N9K%DrOd^*7!|(NJa5Sj2<` zoAG1e%JFRb)#s8ulDvwHgMgUMM1?szS>hkFtW(`W~}4La3YGHI+2uf=dEqdvpwaBo^10VBH#@DYJXr zM?7wmzBz(XU6})hWFC4EPZ>dxZVP;g2tUJ>_;u~k(?f;!R$GkS6!>5EiuctVxFGM$ zAXR$3;S34Q_$fzr<7(xU93m2m9&N1~oMEbrjRmWXN@|YQ8`nX4;aPxkyPfeT#$b1t zp1lOWEA!$#86p~cy}T4369n&&%~_DrW-78e{~KoPBODn_Uv4s-4&Jn>1aE13qa}6K zwZB7i&w;so08CMQ#-~i2F=dJbMa29FLIJZUe0f_r!=`Je(2>eIP5w@L4>pmFtH8_0 zbXqh9tL=DQT2KH%^&4ac`6s?Xnv7ax=0acASqL|KRwP_;b4n@9gjS_ zHLI!@y>5LSZ3=WE>HQhDFMn7*LzGA02Zb&~=905}EmB$<_b5Ia{Z)K6X2IBG4gIrj z;fNDorBH5)wv%j!=3H|!kvDxs9EH;!T@Cr*ZH29DwXallPSiKD@a90MP;>2{$j)I!D+<8JBrV zz9&48VJjGWNtRnxFpPj^J&-v(X>We5p^%AA%Cge6_Er|}$K;K)F#hgOrxw(*X$Y-n znAhrirqknGxy`L^pFz@`V44_b3TX%4l|gWKQ}rk(m8j}Tbq38EZq(}eYAKz}R5)fW z{TMXzK$09{Y(6+-PkmVl<=vL2P6MZ|mpY%jfWi!iFJg6Z`qKN#h|?mIwWTYx$6pZ1 z`{4oYWG=JHJ2sH@ClEE+=dDGcCz`K2+G{nIGtG@?yk{Zu<7>vNaOJsfq%{+{Q#P%3 zSv22Vj7@;yK2=Q$@>qC0tqs5utPJ~$wiZxwkaYdFwO_d|_JjdncJ*7|?Mu5jxb;+P;h z<)c3T$X*1|MiDB0iaXGGhZ1`S@;yUT4l&&P+S~{qqFrOiRwXC#hIe7k!?|%BgGH(P zuywf5ps0INz)pn4pcLt8hKpg-SiL1LMgDq&R*nCwI7A9uef&> z@gk$e34T?3&HMZ20ouT)B@zaXU~Dr_IMb^BJ+B9H2D{)S40F>FDJ;@3#9Gb^F}Jqy zEwU1B!*7|1*2+3EP>RzgON_&__K_0sqzUg zQ^YP(4yDQ=rR6Y8xx`fReD7eO=Rkd92vfz`G>8P?sfVi(>@N4QJ8>@~sJLf3Z`6uth*Dt-fofi4^TjgpL@;-WD9+*QyI(j?{=Y$Zt_G{^xZtRMmHl{ znJw*(eE-}+itU&=`DKJ#hANg>%hkb|CQhRZpN?o7&X(fRZ;&3fGaUj)y~c(>hQ~Cw zs%uj%(>sle@$V7n7?zzR=O+ui9O|ssVof2NxoOBK;zk|pd{bsv)$n1ygAla^p?2ZWUJ|hqLS%vE3`s)rx?XESY z{ZYR6OetuoqS*$t3V?S|>W=@T$}jFZ_C(BWW0JVZ-Nt?w75_7odx~srMZ7HCrMcHa zamnK9mYr3hVjZ$%eMU0AZJ6nPW3%0Jp&biVHPwG90E2<-vk&NI1BAPvZ@O$~Oj#VS zp8Q*xz}~6XDZQ-F>+T|4_1N8kPH^nPXCKtG=)9oyJ5lSmElLF>9^(4Rgml&61C+a$ z1&W?JXZz-!BJ8=>#-V}+nw%6zhVfjw$Y*z1ZZ#4n>#!H`IxpN#0f|Jn-u-B^@oFP#s>$^mCTD0h zreRhN@oqC8#$d7kPPsb|@{}*GP0M>==2L~I%FYmQ1!p>AvP{Kddhr=50tyn2f~3}D zk_xqwMWDk~jryv>1B-{uXsUX~+8Mia^>~`e!Lk7w$Qf)utZ*mTjGlAqC;NL$YRgov z6gPu1aIcLPy0r?0tZ&!vuH7b(#v-eE3a*GfUOMA3w5ymXDe>3ThUfmhb)w8mDhJl- z-43duSUX30bpLcRNod}hHp0a8dzKPUjUHXBPEF?D&J{M+0%)!M(OD%^1Ii!z1;nDh z#0zAlqatI$!8S&)*>%1b0$K?gHt=gi-*emQF%>>R|FIG4`LhG-mwg`ot&O<<6C24{ z*eN*LxmcL|A2Cx#oUR>;AX?xSm3F6;O@Yuy@nWfJ@rbQVcJzp2 zCyRhUT4|aO;Y}^sc{juMM{(>e2vCs=S-Zn?_ajeUGt);kMgHO+? zedgYG&ZIEX>#T!>$51+u?5y>O$8il_TrZv4Fz|*-r&kDuYCJCB2f5%lbg(265Y8y_ z=XeSAfy+?XjyDWqv@}r^yw4COwuHfnz&mMXal;|;u!H{+QU34IgXcf-OnK+8&1+8Tjuu~Ox_^a@ip1accmV97uC#T4 z-PI#bEP0Y1)P&+!7s@@Qgi`FRlyDw&j!$8Je5ez!NwRU{ywJk~8k(B20tSY-(a2{c z94atZkn-0El<)^rj7Sdo&>HzHxTP2`5%VnSa2i};c$HZIgF=_c!N-IIl!OgZVKZp0guIS z(t&h_He!Ucj)iSQOgdgoOr>jF>b~=IIYwcI*q3V12P1_b&^~fJdD6w_Y_wixwoVGJ zE>?cz9;F@^^`;2skwlxY86d9x!&2sFvTJ!I){{~viDf*-kueL(sILapHrk1qE;bZw z=UB?hhbE;AN0A4f9O(#OCG?cBNT*2ic^0zu=ySg82rH_wYGsQqmbBBRIY{TG?75oq zYOmRarlY_>^WqY5A=Wk}`Q8LVODUn1?QH+mTyiph*Y&i;A)UU)=7C4)`|_`WA||>M z4x-E0z|Jz%vRMUhg{=5!%Emvo%%1n#7+$diq8;wuMHdq0lw1QCxKI|AWl@nWPF=mX zLX!y_=5-a31B)(f*Or4W|Jz%*o%DT-cPu?ICLnH#%Cd`u7vD zhHA+I!A5L*oFmknSnJ7bFrE>g*0?AtT(LpVOB2#<(ez56vG^-@rK}ZZ!eyBURq%XC zNXmLeaMguUSKs*-2!&YWE$ zUfR7h>dpXh6W-F@HMj7iEnuj_<)wD6R_{SZVGn8=V{J%}jtjFP4|Gz@2q_kB&DPbh zo6dmiKxfo$^70cq`j&8!#tk&|lKyN-lKqOK|Lb=|g*fzmk~FP-kEh@~E9_XC)xN%7 zOX1p)A*v%BQ>lCA#}YledSfQKvY~qiMM_ZJ4IWpCV9Yc+R!(X-qkG6+OHIgp;+}qcUeziTg%+$#BroCHpZssbY?^}peg6X zt9hztkYT;Aj?@iCY)M{#1V~ii7wBn1(+;tzc1M^ULmRb6&qCKT!{r|-I;Hs$Lf!~d zCJ)=t|Fzgo0kn65jzZDJgy5j=NOO5dGx$a88Ljd=uSH(dHCsHG^%-wjnr9h+X|iH} z7?Q4th$E}#&>dWkI9Ytafz<0ob=czwsZ{M2s%am&M2(77d6*=1C>2L#QtASvgim8r zOL3DrsUa|)Js?zdh-q`Yv6W2)H+4`80hp~;34dXiV21J6u~{e-a_R?vRKtZJk?J^Y z`vM-~sQY|9wQB2^!+$-Yu$?n3vuezY_u2Daey2O*I!xEOUOudDZ>e{w1O20* zQz&M8Mt{6Orh%{G)Ae7@;WbONs2c>n!5Iq^2j8b-t9kATk9+vdK)XG`UrYf{4upS4 z!>;VoU*tF4KM$>AHi!=Iug@-*Pz^#0nKsP);l@}yjr%j0|tFBaQs@aJr$UY%@y6-1e3aB%F0il zh6)yOW7-K?1qTmiNMR#%4WkY2Iu0UMafmdt+#H0@*79~kIi_Y=MJ<1&64lG@7vRiB+o?oyjHvOr_iS>&`$LF{bHknqA_MZ=1^L% z=yTpCQCfd@%g)EOq+vqWd|S*d!v9*2DbfYeKcm`gQ$*GU!{L@KWUu;&TBXIX_hx3f zIWBZ+rPriUb*3-4;@E-U;nXEQcU4uoq8kwVxl-V}rJ*5JIjXD7SmW40=jlDkvi70> z4e#Q_7ZOrpSeUTjubxJ3YE?}&4@Wn2StluST%U}RKt=+nkd{gZXJN~iI zw~Rq8b}+pkNIST7Ln+4=rd%Y;%g9P#me;Iu?!sT=`KL1WN+g5p0d!I0Lo=3y?HC_7 z-U|dXS5EzB-0$|dBGp+Kb6~qZR$oBbdMAB+T1=Biz(EIxL<~=#{fUNWb=l}W@lIuEK1 zcH(mzV_IqLyT(2cnPXtf95=;O1)G7p7kv zh+vWrEX6y-9j5pk9jx57PhO-SIXl`AM#{M@=LuB6TE_W zq8Tl+SwMIZKktlBj!&ki+?fAIHBW|h*%`bZv#m_qu7F@HMCE=mG~wJUHU;aN!I=;l9TNOVEPydd!({)Q zi>8MnHc5Glh~T?4sr*|Wyc6xCU-q5zrsFN$tS`y?_Rn=On{2MFM_RUPFA*l!mhqBW zD-Y5P&=si~kc0Wlw)#S>a~7Ca$-Qk#Aqi!gl#+|kLRi+|2=KOt(*7L-;79Y7e4v^_Md0%LWo7L4;S=m?qO!#pD5f_+)=72Gh6e~dM542Y4P0&4&pKFRG_+$E!q{!lMCQ?7Vx>%y_+wlP7^ui&fi{G`ow@zFj4He>lkF7Ns;U_H zy}3+k$G|}&f}tbY_DYQrAP;Rq)o{tZYaA&VAm6UYH!N;@Fr{Zez%ObNYSEsmZ>%{v zB5e!8ThOwb;h%74+Q!F${zY@F|E)9r{Qu>Q|Lub6x?gH)uKRJ>l~no7yvMH3 zyf=xs8CL%Kd`u?OsPZrsQRT|K{t-b6X11#MEg@{_p|w>%1hi>sIHlSu~u{ zI%BkGvM9H%#mf7xwd<96lC_%OvMGVV+wOFrh1B^mvSol>FGu zykqJr8`EwqHE7c{ismpinvmx0cSTge$zc=dWOONL=O!qVpED2WtoZ?Ae)41}GE{@r z({x3}w$cQ9xfd8(qgaJ!a?mup9WL&NGIJ^y1@(1tr%UAyrS2(G8l!lH< zgSN__t@gibO39p=h^>QJZe2kj43Ey0vY+Fo9sFEhPzm%Mcbvjk+5GqZdnHO_J#VA}x%nw&^*6EDtv`DQ#SX1fC z{sx3cm?z8(nxIn3l^rggnph8dp;+=4QVlPM+AufXwH&T_X_Hx}){4;)%VvM-y{_J8h0JO|;5PX(o348`zB3I&xU7 zMNafZ;##K(sIa3t=uG~N`pk^in?P$a=_J@mc@ zbzM&Bg5C31!+niZXpgc{?XG|vh~1d<7xj=?Xe{=xXD4jhR9N0{Bapnbdlk$DM3y}KjVNx-ZJ+70M?H8_qH2Q zgl*FA$6d<~?U4krrM2zd2=}0e;d!#3dDW9y?9%aHN1C4jvNemb6>JXi-#luL+|X;nNB zF)fa%CB=-WsHIep^WEdv((~Tclj(7Gd@32Q9Wiff z@Qw81x}b3$DKvM9GUs*5SaN&Df%Yb=f=kjNuc6;6M1H&UF`W0OBtgOmvvfA?4@jqU%{u!;vGZ_u@Hx_Bo44nP@O=){Jk+hf-veu_o&8 zzH;xr3g^%8<0G&ZJ`~aUMb#>l?d!^J)5x1v9*P%sBsYL1#le@_bK=CfDjT-BQ))_O zBDNli3NejPr2<3JFaV`ND~$ZGL~Tk_->@qgapfr`l z%X3a(M4#CHspQqS);=*zDiTp?Vu@P2kukqa#>XnN$rB5blE5CZoYvL_rLg(+r4L7O z84MO6JZ(W|%FG!jASQooGt@uOuKbz=lr7e%hT(Mpt!acNyyokj=W8AqD_%SkEUZA8 z=0+dVG~AJE?_@qkK35gEe+)&S6m04|4B=ahlO$y=jeK|_ZMrT5&; z(hm-8nVkk-(}pPhilQh=3m3XS|7**~@+hYZ_E)PuBF4XCoxJ}M40E(I1^|I}jw*&g ztA9bT4CN8WFBWhiDI*de;ARN_Mh#X21)<{!LmCgC6I%M;ss%mvDJg6!Fk#x`$>0E=Pu7j^k%CQ#Cg=D zR8Qm=6?_GEb!L$Y?D$EPEQ#uL|0MCu!o{%br3-6Pe#=0+>g5Z2n!AEL(Lvma5k(BeAS~kMm5jFJD|o`Qe*c$) z;u!-tzIejjzvT)4QCj4G?h{W?9Q&t&+5utW7W{|d-QO?={!9}~BUwU%RY<4$3@#~$ zb1qe`r@N@-8tk2NFXJ_wMyH;F>uDW0Wuw29ssAk-(u^S8&Hhv{NKjdWCU>A>2H7-) z9S-z2+DW__&48jNYm}Jja2Df!j2a9{8GKa4x@{c%r)^sBInnWE+!oyDGx|rmUB5Xb zZkXSKXJo(2`=vS6qAyL!i#(BmLY$Nq6-tZf_oPoKmd5X*tMW!R`MUW%PN|5tW`urq zf3=21{GnSCJ=IHN4XG2VMHVDo_@wQLl_{_eeSf{D<%SEoyAiOOMXCGt|AyXf6?8K_TO}aLY(2c@jp&g^0xYCeGA$olC2VCQ+WuI1mcMf`+ zws*S@ku~SC?jz!2era~}2A6SlZ=thD*^7k}2Cg)(eA#KJWKWLguiM?!hotnlnD?y&r7Tq;r zhDxgFEjS$I43wLt@xVTnjN0Fi?Ug9NE|rARq2#z1-M(=xaZNd7=9tx%j%iO0DrFym zWRQv_<%qMEtJGqKiK}PL2}JID7}zdvp9Z{~Uft5vo1yQOB z)--v{Df{_k9rh4zM={UW#|4l5GN5O;nkZA(RqgWre1`sJx8n@!qIE6R{mUnRetXVs z*FHRxb!8jE+Qg5>tD<0zKS@7G-Q2v(mD)gXW!;LJ1jgKy;)B!$nBTc19F!E~!rWUd zC9R=C)e+{w6`K3-!jFmeNp)<>@~#>-xrH&rq`=ry)1f@Blw|F2OgnYUrE|-YWzqoz zv1!~?$6awxXtNAs7_O4|&7a7MQaw0n5n*GtI#+L_RfdtnsCW0X$5WVlHc+S?`I`O= zUTC}^)0{;}($Jc9B(^+`KytFUq=}WqhQq^JgU#|W=kxE5A|inlD26I!UJuEcn=*bt z;8n%6A^KzCE$lLjA#K>KGy%aL=_=@fE1nc;yF7o2xQEA??S9um``AgKEC}df_UkHq zCnjt16ib>P`5gu?gn`bV0skq>PL(@$S_&PX1%E5H-+Fg)6H8W|ARAvwPr&I-(Hyxo z*?Q-H=}zQ(!%vgGJb>h@dE58{zLyjP1xiKx7js=49w$(a6G%>^;ZdjMQM2%?pu)`xm!UrP2N6br z>Y`FI2P=XDRH*Yyg;&6*iK_IIe+@`Spn%}>DR=hN>u0guhkEA1o@PdqzF z2Zq>#W=J(8_Q6pH&`83P9~eZ~e`tp4J;Naxi5BEWNAd}ae2YbxgQs>4Ti#oK5JrK| zgo_`n8Q%p67HGzAIMH`43! zQ($k$#@l;T`YfvxCgjjMUOa*uKNeuM`5GLJG-Cnb6D4|-QqF^iaW7Kyy@ir1<$_2C z5K?f;w0j=bbA8z!;9&)evPIHKwVAn9LLLvEiWCfgYKfULM@y(2UgQty#89fh=HI?8 z(6_G{iATdMdU{%&VKPTQQ;yT7uVgP}nm3_9hU&yaiD{ayl92e;*$?WkvW*Apuwc22 z$2q(eL^8$-TTqZ4PK@EjNDLLgF7ewYllz792)V+l`1(8j7%F^tfZ*xBV~vmq@Y~nW z20Ov9uVXQFgZ)Z^pf^{QU3Dh>_C;C7;HdLQcwDofpl^j6nLj1owTZ1%sW(mvl{Y9O z+)}>z(Rnq5sPc|fMXkZ4zwW(6q|r7Tm=gVSv&4ZOCDqC*Qet(_*RC;fzCx023zrqW zYRCB{*$CgoTD=CMg4)}kkVb?3ifam8z&m%hh_lRy$E7%U?@uVlbs-GCB6^k(tC6r>^bRGj6*MJL zLOT8y$=tYcL@J!p{J7!H(89?oxz^o!Ha9U}S;`!msk}(ml}7N5i@rEHAw<8QA6>lL zd%!zfcTGUIk>gBkUqOtvfy62lQEU@gI&9U0{CG{TmQOWg6;b$kOy`0k_q~V{m zfnTBn$h)P5)3io&Zm*`0Jtn-Kp_kO$nrhw{_d`J7KX636{rU|-BQlv8eKd6DQqcPT za}muniAqWv3~}-lVvWp>oo_~ic6DoIW~nWW<3|>64XVz}w1>$HUAJ+o`%Y8nYe+~W!@*Pg-lUhm6iC+>#E z5YItJ`xRX;b$vEE%;jD=c-jmd564#DElbY>yPX&A(n`t8CY?6Tkksfi+fJQd9hA7} zt5rJ`V3lQM!Yrk!86v~86dS_H5OK(HWxs?h;YS^!s@C0C)vLST{`z?X^1}VTrl+yw52chb&U01>#K*9ON7Fy_ zuiHzT%g~M-JLX>Qxa9Fqwc2i;DDH9rF^wIaY>6m#0Q*l*df>0OBl69bj&kZIw>H*s=*`P~{(2C1w)P4f}XO$?#s--q*4VEbfA`Gxvq>5mZ4LC4u=| zfl#R1(x?dWD_XNvq%gog1FfMoR6jqJT$BB!Zy!5%;aQy8P=i(lTV$p4@Tr^?M)pl? ztNetHn~)2QOPz+~1&DQ780sCH{xR7jT2cYYNz68?^=lpmv&RaKZEW&8WcBYFskmr! z!p@W6jvx0#JpLT=OYnrK!;C1B>Fe5UYvva%SIAsk2wZ0Ot8ez6Z8O_5ZM6~i zK{H#=j1np#vJ!J#;OH&62KVctIpB_U*VTgc$e z!eZ~ikLo<>0b7mnR@LG#my?ryTR&tINhm)2s;-g6tt*eN>G>n|afs4%@FSn*eG%AV2ZgZGbO=?i@3iD~KV$HuD@`u|ouiU0o;Pyg*V{|kTpKP7aj)?fes zY`rQqSn%YACcC7@hUxT8rTn^$ke5g*DXb)if)-beNnLg2wBW$Bwu+Xk{;}fMXJ^kE zlewgytEG>Z_TPZ3Mc#e%X%7kZS?*8JaF1~x^>I=0q%ER zTh?zlq~nzWG31DoBtJ&4-r$iTGGS@Ry`vnz22otCsd_OP#7e=&`WcoG-< zOJE9a<=QY-Dr@|8v}V*{!7O}~U97bNc=&gO!C98+KJeW<&Z@}>*)y-jKGKlDF11#Y zz)aXELNGqC#s2niID$FoC;LB_(#mO0Wb4rj$43^H;ePboq}H44O&x*JcH0SL=AeyM z7)D`J$A`_u@L`ynn!yty=%n_(_0 z_Q<-7aW-5bYRJ!3b6Q{9Z-*N-I2cV65J>CU+}!TpEzOXF?;rsM0)N^~+%nIzwa|RN zlfR2=_|*&!7G_>6*+(*`HwSou9MT@J&W432jnkjBZAQL@<6frpPwqbEZdC$mE(#q2 zI3&l?HH$7-U-U=H5ejzPkz3)UTcstKx9(q{yc2IVzz8}&tg*nmh~arh%a^77+M|rX zfn@9irysA`ZO=olc(h7Pxk=6cXuhd^@2%Q**Jrij!^DK4?o%L?1UO)R{FhqZ24@dCP6gnP*0qe~GYVF>=|UOCOSsjrvu$IMc(pX<4nK zw{D{`L4G3s^yqY}&QzM)F}d)H*&W{s%V1_E6$tR>(bd#1{OozyMTjx23hTO$NW=fm zt9bcJ!ImMrnD(^B;=kec@O{q3*^NZ0wPcCCpu#GEIq$e(XqaINhdIE>=|==lj|(|* z$~BiY_XGXOV^mM9d!D^RHPQLLHm)5%jFWO+Xhug=4$PtIGq#yEMXeGMW^(ORRQ>D5 zNH)Xh-glwj?>J{3suB*j*TxpP>c$i;@UHFwwglC zCb~vt2T&#p_-|Wl`leIrf%eU{@tO|V+n@@`C3uawT08K^)K$Ac;?q0X?3Pik%)px$ zlo)z5e}-P)d-%rqUYQUoMCbZP6O`tW*>S$(L#-?&@?uw046C{fI? zx89lgq`Xi8;6ezdl;gFig^Q*ArkwCYJ}Cs^+hiBumHx6IEm+QYq>OcHzd|T?`utxV7Uhfp zw*G^DH;eMW<;VX=dFlV&XQ?s#5}+}(BW8al+Jk6KrP zY;4#8x+tW3*;-N+-F^@yCtOIQW+lHnc6u{#{Q7v_dSB4`?BAbGUT^ZFk@L*seNk&L zke}22?CKwBP!Qgyh`*r$>Y|o;bu}tK2=+DHJ`e{UZeX%QMK>_Tp@SQk{LsJ+OnDd} z+5Y1NajZQG7>m4*am7k~$l><(4ZIIA5C^A245Yz}5Qijk+#eFlqlE^SP~ki&jdI#` zxAe>O%K!^be%_?Ua3JAWdo(b2tUVm4Ki00Ktrw_TQByp6+R?E1MY4937_uP;HiT>_ zfrTL(3gAG91EsYf|9$H9Cw@mr*x0Hmo#2==?csSx!-OiyO&``id5ow7UFTTPpehOV zJG-PW@P&5NHw7pR5t0VaLxhT<->ok|qV_{^13v%w8C!-ZCPZs=VzB-5fw-f-$-vA} z-)x{Z(!S=EG3B8r>3V6`PO2Zh^U1hAq&KgktN7n7{W-(?4SVku3I91@?MufM`6Fra zbv-IUno7V*fBC|swaA0mBXF)q^*%NT>p6v^S3Znq-#+Fo7U*2@)~aDjy8o67JjY0T zr`!5Fjw-?@scTL5PW>*!@QNA!CIg-p*~i`2u6iNVeEd`X0{VAfS;!Fvl81~!=pYpl zRi^ZsBRN&#^j}4^em>DLquW=}NT<@}`~!4W&|}FjE^?6?{44{=!-aEHYG}K49NT#t zPF?j)*|mTU9=37z$r+X;wf)uq7%j*+ySa@W?*X2xUR^Zof+UH>VBsiYt3m_p@&&Ra z9y|03tHU*lMpYvp3Q<{DJS#vb^NTxt>Yibs1g?dF0J6&Bq#q|XZo^5bVqhJ&;bed! z*vF0LVIkV?t0zyiMCuqlwKW1iU@ZF^*u%{#i8B?b3rSOJUKP1(^W)>zR0bgcshU$H z-08gQKqRIW*B+idiNZfwW)>-JF_zUp;SeSYYbJh77xqe--{x#J^@^>9O zBld+oBv1NgKOyQTPtRS(JIE#N@{Cr z{%VhA@Rw)X%QNl2mCbN=yt1HK2vOff6l+()B2Z9{Dw@KwBR_O;)1u6*w8vP) zTx^B_OR8yU8$52Y3=I#>vrqgO+!?|pAi!_Rl>CgNx^m!S2v8iH4FO7nS0O-2a61Gj zqs+|h*|SJ2fIIVprKBm=_Jj-7Io~?$Q}zpbW-_7|4M&rKYQ+PYCIng0r3p z##dy)G;Vd&hXT7xe?2`LL7QSoA6(k5e76=nhG@B48iSkvJaAH|jJv$-5mZ6?n2YNR z+#=1I-FY$2r5N6-!+9NkxR2iEP?oIJTavJ6)Q2MEEjO8TE%ChKO&iLy&ttwn=2$N3 zqnirXkhtR}4F8BL1(s9`A~)wfe1uO&?C3=yNJQ!p6)^P&B2-kJ__QK_npxjwf956;a zRjC9j1?B;HM}1R)t)srVz`xOC%SoZPn;`l%h4^lTskcwonw$+w?VpXLd#&$uUJGw&;4)|4H=Gchxc zh&LmvP zjjfrvWhA+CrSs9K32HsY1G|rGM${HdBfPpmkMwPmGgU~nIacI__7k?{M%Fgm8t&ns z#gjF8L;WE#*S8yA#PVrr%+S}?IU$5eESQ-8`g*NY zeG=f17vmj^Q*b`|`|21R0?>XSB!Korf{VUt?gMFR>Cu%H(M8>2+7sI4+P``>)52Dv z?_j|B0Td)*5)y*7h->bbdDv7#k>8#^h30pyVn!}K6TWZOq4J+Lihkh%|mxrf4hcW5aW0EG^cdXfPo@5Y`L=hq*NYp;4t(?K~?kQVNAb z*}2i}oOXYq0k4{jz+=B|ZacVc0g9@uko}rIijtaP_!#NFGEF{w#vJH3yJ~!6cTICk z7rjDoFU}YJNb@q9R0*KeU5#h`Zluf%=V--!fsM?Ni6jz6h+gl2wQQgcc8xO?i5Q2;ZN&D1&5JCNqb+g*vf$WnE{mS31F>dK zeopm2y)`VV!85ouj!0oqJ#S^Ig??4uPDtx(LVqUe=0W33K{l}95*T}F$58H1jr21Z z2=L#mlDgthos7s9@EqVxzcXMsYPq}bF;N9s%-G&GBVV(D54(kCROjPry$7UnJZ9BHR2wTcHXzRMkNkTpsg_~To}&ulz!8#s``_b3YA0`YLFSxFKFYqoDy=Gdld~Lb zG+i8j@v}88j1x_d?ElQyU&s4J<7L5*@)7!_rgRu0GYcykga}B6m^u;I{J39oBbK-p z^F7r6tbvl{S7fWE!e=ukzo7%S{>eZvQMyg5bO`P0YIlXB1}i<^R7ZEunTj%TpCg$_ zXy!Uo07(yZRG13ijv{7Rbj(EDWXbf(R}s>=HMlRSqZ(OL{`tzuY-VY#hs7)Et}`vc z$csDs_7(Pyq(!N7=7uoGTOv<{@*P>|m!Q$3jkkd@FE6sHR&>63I#!@dL&X&DH*+&9 zy;=2O&D%?2i>D=v>k-cr+VB?^{?l5VTL=r3vedRzc;z4fNI2RglS(suomrqkY;*^e zQ&1Oi>F5yZgkoAIN}|;u!Qx5KoY2%@@WT*sTx}% zFQC>+2N@#wI~%D@XTz}bWeBVE@01VWH1N@RuHE35%4D$W=;?{LgS#4F8yV14>9~fB zo2!JPU=;1)fl(>0jy6xx@y+Nl^{enD0>3u4)R&2L->HOuweRcq{1~o zI7PD8h&2xA-vz;btyOFSA%qU@@RX3VOow3Ao78q2d>@y9RQ3dGoQ?HJWv zToeN1HtkE7MyXm$1v;komPp@-p>tOkWyNbLTs25;+@WTtnA>ZRauz?4I$Jva+A!lT z4~S#)&kv=nHzps9RBjF}+17Xjq8# zM2!UL>O;KDV&~RT0>-pM*&phej4d=>nWXnRfqE-5b}7_sjnw>YI_CSEt%z`0@{K-`KZUqujPXp8Nb!@eicXFq{NI_@M`r1QlT z#x-?NvWQwkdXc(#mLv#ncCK4{C17u1TXMF0CLJi{xYB@a4csO6;$nBMvyl=O8*N*% z8RETOAqN^eAP?lM+r$=Mp_t+j*Lw7&+W$5_$5Xo`XX;<+D5;<0GuOaS_pJ(hB5|pr z!n}IBv7=q19y(IvLq~bs`)73pLL1i4mfv?jUf6R{RHD02bnqx8Xr7`PhgXS^988a1 zxbzsqqMT6sgLBn2SNvkEZU?YA9qA`5XoaXQ`6;Hh9ThFBR}^{m^jv|Phqp9 z*`o%t3$4E)norsxto)KUWLR4f-Kx=8C#C(&zrek)D`~3iT`U)0A3y6wf(FsmCoMr7@Ni9BkZV!a-0JJG zG)kbS*yVAwO~dksZYwy_-WG!eI>O11w_r!+6k~KM*k{6Ipe;JNKeF8$%~}NoVjjV7 z66g%Y_!ulp>}9eJKCOd*?|p(oJf#2`onir-Qg*z5YTv7RK@4Jg0vX;I8VKZQ?IIs8 z7?t+SwKVia-{xDwe#`jFCxU@BFdhnMbOZCDiw#!PQgyDx&(9hf{&_PVpr`G@n(dLq zqanmlP@XjlSf@iPva@6n#qlkErG}`;{ywFbp{G>r_W@&x^eQk*T$Q}e);9UszMH|# za%&_uq;A5mAlx_KbFw8(X-@1RASPlcR=i5zx%fmW_#mSU&VDL^@AH_ooWKTrGxwWj zFpf~@L)8iN+bFkW8SHP05XmTd-^MSj=)4su%J;n7x8<3sVv<3GLZTc5OSPt}To%~Y zscAFmOAX8U>&;axc>T5|&xv$^ne1FUsZtm>SNCwqT7|0U_;TIHdhJ|WZlh?8xxlaE z3LTi9Dg7_P<+1STUzXFpXw3)w1QYr4m`BA*#{z@Si!67??0=ltdVQQR@E+|Qj&14P!jSH zMwOA+6%y_*lV>=9+<9)dt)+i)x{Y-CB!2tE+o!=%wwDofe=vRb#8j{Y?jFnvF!|Fg zA)ZMv2B0CUVpeY?Kg7D&_omDr+-1>+zvJK&hkFRAc~a&a^Jwvz#sn|sH=v#c@dz5( z@$3@r7P+T`t>xLG8Y+VmIfn$c^l0B~#RZ5<{jv6+luYyr$DG)+1zc!Kq(g4fB9L_x zU73-M#&#JPo*aJc>Hsf*w#NpMF@XyvY%}gD!X%>Vc`tOzaeJuJBY!WTQ@|hSS_$$B zjvDO!@0}CyzBIJD{p<`@>}LUQWMKDU|9xLux&&{5lYCa<*%G|U4XI88Z*7`NoFXwV z4G6!MdDkRbv~==nZSjov!61Tfaw<+^Zj=rn)3?{& z%IZ`wv^@ItRE!fn3d&v^7gsz}98`Lk+PQS^3!<*B^hqz#`WJ8YHf{NtxW?ihcUl@9@(1kd;o4;!PBUs*wZldcGOgUS&V{Ii1?pB15|kSeH~FGsCdK>FVkVqyD11 z%WdpbGGOQGW9ewEt?;qpVO6W!={ZH4ct<3WkU0M}9L(nT19;2g+9v#+L3-XashYR5 z7&q>j)RA5O0?NWvlr&dp^t}JZU}FwILv5W30C{@OIMn4S9};bBF-ujpGI%{%zzvBj6kEciAIUcHF8XTTdO;bdQl_ZSt9cHUa5ynT-vD;`FAt18OylxmhA&8lm?YU=G7~yG)&?aPX*Yl!wN8rPdMQv93 z+GIkpmM7i;YCAw#?K4321Xunt%@nTRorJ;raf?LECpup_!&m!TV)NLeBHN$ry50yB zigo1FylrW=B#gxy>v0t`3MI0v;GV!OPAR{>|4bysOe1mUVzlYWrC;nm4%INVmUON0 zEyf>mG_+p?U%nJ^(22Z0_YWqFGMTkT=i}!tKA=3_qTsvIWf_T*v^rIH+!Fm4Cnhs> z@>V4Bi1IE$j!Y>1GVTaoWnR;fg85C2|P8tKXQX%fk|+**IX+YzQw^2;a$7wryKYufn z#Fz0?47c;EVpLQ87GB?w6Mj|}Lw|m-vz{GHm?SMTYeW)$$>~~99TAL_^wsw?au#`nHK46wRX# z!K?|ja$CDQ$md8RwVz2CM$^Bc$QjmZ&R#||+0!Y*U0PO7sB;M)RI!>d$~$bcWG63! z$dsI|BEJ>O=V=S{5+@L3U9Iofr0G@Pu<@5JbTZ%o}cx2mY>YdVd6r5CQO4QG4^5Xf>BLt^hvGd zBd&pji(4pi`qvHiV0hmae>w*J5i9;JUBUXu=9Wa~&1Cz*9G{`6y$x=AqDUExzlcIT z2jul<=}w9jRhS1gJ&%1jSQ8$~Bf7DHiKG&#PV(!e&*&lRc=Ks+a=v9;I^(>h=yS3F zfjFQXM6s+%-K{KzGk&fNU=xuxEr!Bk>?F@w8eGN|3*@jR3(fa17WI&J4>Tl4&BOaz z_@usWBHvgE*->w&*Ho2EhfIRJ4pZDeOCKh4764%(L~>xYIWxFDLE%837Gvy+GJw9t zn@8>D0s+JipeGNXQ2y-|!bDjf1GIC4hA`2Ve|2k4P67I{3Rb`;RprfFrX z6C?NL1IhT~!?r&oaI4WtDRW9|1CFQ&`t{tD%Z}*h1O%qnG)M|!^>OnZa%q<$LZr<{ z5(u=pHqw>=j{w_*VJ`x^o7yl12cfHWyopC*1dgnLX!<<*yl{tY2Ha=*k9URej!uMC z(y*+#$F!~K^z&QCNP0uMJWF|8bYd1-XhU(3{pjk4d}y0TZ>RwFgczuRtr)yv`1MEI zr8^eWoXS_hZk~ADV!WlD6}h!@#AP@O1WKo$YmZeAgj!4ih;pbW1T5XO5Gg}@_U6Sa z@XEZRTF&NMyp-6Ia>Zl$V+Merrr=bXmpyH^8)(Tw zeneI#ckMW!P9{Hx zot^ifj@#S!7k#FP+SrGbbC|RCxCUD$q|=!sft$TH89)Fivi z!n==trQ6{ZUTH`lXe;lmaGyKZ3F(SV=*pMU%G5c*&Q?cPX6A{N>?Y7vUMK5ykRK@7 z!4jBAiyWQKokO#&s53NYxV?e~FeD+kUdPsB*3ZOtM_KHBDQi(%42}}6&lUCTxgm_Ys_AH|Ei&2Tz+)K0 z&RLCyua`<(#xSSP4mlawTKetjeGx_UH<~=uTA!<312<`!bJnKTm^-|xEB}=JF|(^3 zv>8Bsr1?+R^lwJ#)T=+klPVLreX7r3?aqyo8S8MkX~(fFLAq$s{*)rPt=4C)K6g#) z6h%W#>tj(6XYp&XOiflw?6@pl>#Wnn!kLD=qAv!9mPj5jTWYs+w4IQ+6qWxq>g7Ib zt$Qu7%%i!fZ=r=ea_nQylEYvq32wgfEb9vY&+G-6*b*LRHfp-WymU|T^gB@P6sokk zvV@+#j6+8}!>L%;h%zr~{5_dGhxge+mU7B#mV?IqTRH9QTMs)|6NjvJ;Y#wKw90Vq z4W*d(t}=`95p>uD+J;jyYg+!(wJoLNf~FkooG$=BaX)l^)>fW0LWFG+zBFG@f-O2DbsU4U&dEG(ZMz`ARD+2ei`Ejb`D)^vt>g?I4F*Ed6S(EX) zC!GS79nyxc!5x&4y5|i@_~9Ev&RQs)WOHOvK~tpM*{k+?Ae|jxWWoU8ALcd7D$8XY zL;i@gyXCjW>y+liv2TYzG)_0iluy0%YV_2Xc4wP-vSwa($LFY`lJw*F#l?)rdr$?5 z^OCiDKSeBPF712DoAr44EOdUjU<5}lP{3?bI1Q($^bw1B=i{hldY02j(?~g*%WacI zLJ6yxFw;CxVH^Pd8J`WOSDgPve9p-UQF12;Ymt54bT7MMKDDimR`s0A8cxO)^4e8)R5M4TeBZNV2zX@hwd88bCc3>g#a|@lIPh@FfBX7bP@(ql_ovcL( ztIDw>Jmv_HWr4PZ=Q+GO95%Ro>b7Im&si-oYyX}T-mYzO*E0Sxmzl>M=BT^|5v|wO@ZgB zAz&}WL#&*nPw77BcoblPL-+e7V zq^tWZJa-Ko{aHU~@h+ZYd!96+;GtOms!<~|`g-+`i84N8IBV{+Z4v!)@@}sCr)PK# zt=QaU9yl65(LSt{_#r6;aXiNOSx+|4GKHw$RovdQ8o3GJhP@K@(LgW!Oi*Z}1$%m2 zi&ZW+-$YzFN2p{-aqdk!pMHf5UEeXnuPt9-tZ5|H3I?iee)VbvGT;V7Pc zQ3TsoV2{2J1!}2C$b4K#9RKOpP+8HocVY-pxG>>rniob;s3KSEWCWZNb${CMF+ z3IeyyOb&RYc^LHa{n)q$IS9<8bui3Zgmu2LicyYuAufI)2m7Ts>msklnOs+kUs|(YBv!PgJU0dg!B-GOq+h(cB-Tu zRbV5rFjno)4d_;*;-HE8sy4xK?~5fr@D)|`w4fyF47GRUTb``CQRHvdJKS)ZRpkZK z&+_&gJeB39becDe{M=L3%2@msse(gcviIhoSn|o3PP2WmwjF5bPFyTE44sUfuJ9E$ zi!D*P@rb3`aWwvDXf`ys(XZF1lrXeUz~3WWCx-EFMGN<5eTh3b$}mz_C67A@t*oEQ z@k@4sUcymt{ataYz#my`d_0tWtB9_zB{)knw?u$*&^=e_1cZl(x%Z#D5my>GH+O<@ zKZ1!+YC{#VzLtFDILW45^4C218_j!CgX*sYMDgcAy7X<7qI(J_xkQ%3xiXq}y@^3u z#yV=$x>^bK%OJMf%?i4scDL@z`{ci#-9Ibu=bv-cVg6|5((zX5SLF=(Ees_o*?uyN zDq1U@25Prh$UT|?_>D+^bZQ(bj^I~#-ZWyAiKxn4TwRcxn+-ZZbSrYz$A}_Ldaqd~`w3Z@aG<8PmP^iZ#>?dpW>)yrL(| z%ihsnLFp36dNj0Si*1j5y+i*FOl2GcWs1@?!C9d~r=XYSL{0j?bGtb#MDW3p>{nh1Fk$%jH8w~@^I^m0l_hGR2P6O?dMFev>)=V`mIBnRChS(;A*C7;Fz&V^w(O%WRgq# zB%E$^U#V6mio>;DQ;DB{h);uuUyrv28*J=khj8hWO7q}@73?#^p zy>DX1J?X2x0@#mg>{A^u6zdaFnpL;xrBn9=(G8D?ZH2emKlfwAXUSg;K5>Zs2x9&g zb`wjgdvw^X)ETt@$y+*C=v8=Ze#brYCM(g0qTu|dX+#F|Sm&%?OORFMH18RC3{28R zFPiAw$JJ>eOrR z^Ax*u3Z--n(i3$dS}z==SM25x=UZ6o5oi9%Z>Z>{(8H0^&&LP5%Ob~r`69EqUgJVl zUg}^Dlf+4$i(88pD78Rd_AJrd%IGVlJZ^DOQL?GIt(uR2Ye)@7Z(g33*P0xLIVIVR z`wDM%V`7iHbenjH5}ozb1viK|@E&O$wjNYQJ4D#5*_b!KW1atHaxTgsLHOzO@|)k- zo5c9HKbp=j6nshq{gcrJm%K19|EHcQdH|}&8x?vh!>SfNd*s3zL*&4llpoz_Er}e zYkj@yBw35>%E&x?r)Q&ji}MNU0-DixTXG}AJ2S*M9>H*{i<+nh>A>oGV1E8&Yk?fy zBLSDZ!J357ZcMc+SpwQ1r9nP?gSVx6njdvY8Iig4!t%r3dDA&lxcS!iYPOSz`-oW* zy}^opDOZ#?R@AG$qk?`6kp8f7Qo+5%?=PT#DxiMh*qJ_f!{X?Hd=IBH9t(`FVe<{B zyGTTPybcpJen6CZq?8T-HAOwk$i=qzN(tmVkHEj{9P^#AV)G^7-oEr3)4VY3Xd{Y} zz3lh@L~qlQZSHzcpJO2TiFth6@4UTVo=i-g$Q$!S8|9Pwn-t@CN+?g%{`$dg=V!7q zCj+3gOUj<7dGB94*mS3{cD_;O>GVefD{?@|x!`=1#+F7E`%J!%iR zpWp1mgYqtZ;=WnUZX)+@QM?eA=KA#VUbjgdq;B*o+3i2JUf(!0q&Hn|MIU<)#Tiq; zz>xGr?u})fNgK~7bf9*mHh=mw@w@4C?)6CI6B%s?w1?rd#T$yr?b1;y#HCQ4+ zKH*zJej+{`|JTP#q_y8NmClP?-D_MTJP zYlVcGr}+grv0rr`>3eua51f?0>m~9WWfv?}Bl`iSHeNiAFe7>#XIQsvLf;lX+3la=XV%j>${4OYv{ztY?EFl4H zND%|rYy@>7m%pHB29VicT7K`iP)>&DnvicG$qX>N2yGy6yYMdby}Cd*4MhJUTpCDq z!4X2n{f)RXzP{4`QM;(ena)@Cof_~6W;nA2V6!|mHL5I zg@1H+G>E_MSLN?85gWEv?J5Zcbx+2?Nl*3HrG5W6Z0Xj?;>~hPFaKFpru|`=GV@lD zX*^Z`Kw@(@(z?_~+Ro}uvYsY+xg{^Ky#CR{W5b~u4~3kn=5=F2o9ev5FKpm~*lf~b z6}FsUQ-&fks83T!2Gtkjo%3M|%^6K~#22%RpOnmQMZzjkWtOPyKjV8S2C=ebPKdv-tHDmn;Ht z4Wt$lU)U^BNQOk~(C-=h9l+?e3WL^fa!rF5VWd#6l>}AoOG?Yq-_@*hOI1Zs$yP|F zP}~I_mtOEyjVak{K>Zk9hejCXc8(J*B|rRjPIO!1*tbp552`N7C`4(l+NJtqzE0i! z)p2E*<=9aKiduFW4JpOTJPd8R3=I8Z}1luFvcEt759l+F5G8 zR5m^3pLwXuJDSqhAPr;@a{cHx1Pkf&-*dMqn=6GkMpKv%z0+Z-pzqpm0gA#8jA#$R9ipRWJ zw69PK76*8Pvv*_(EnhB~IH(UT?%*)c73zZ@1$TB|*bG8~GIzHuAMRUU;Fl)Q8O=H< zkhI-uv`vqz*G*vjmYe#*AG2D?kqFmKFe8qB>StYFc&dn_%CEvMvz9#xnsEAI4!B4% zI>FDz{jHf~rbx|69dMzXHHDd_pr%IRWws0N+wa`Y7=p&eIM*6X_tHmdBcAEd|DoFN zBIvh2&YbiOZGtqU*3sol!awDhJJbO~h;`(S(+!-QzKgJ`z^ORi*4O(a8?DEtKe=9{ z%CkHrn`mhTtvdzWthC~+_MPdezmrn?(mKUrfYA7E1W3u9{dDbwib;(oWkBR>2$2rc z{STUUTm!1ZeoZ&hHr+GS*0Dg4=Gm9`q%ZxsZX{i-s1ZLQ0S{U%VWj&M50WI~T)ub; z88QuuzE~3(GL2AIc>W2lukzD7DHPefGdYe122^oWUKlULnlZQ~xXfkgIArrQChZtn zHT7o1Bkia38(Xe_&caTI=;YPuqIXT(dUYu4FFqnctERQTeF%hoL z5AIE0oEJmaprOw)6aubi&o6F#Qy&{jq{jYa0aWuHMc@_Vyq7th0_p%|h4~7z#WDZs zMa5@bzeF#exR)X?AK;5(DRKTbR5NjY$tN$v4HSPV7Z*Vx>X66N3oh7m$sGx3TdJ`3 zAR+bam)ITgKHO?G*wXRpzb{=F;L3+Hx(H`={mBNR4CBe42D0VEuI6tUSM zt1Bfw^DmzYS5XaKIK~b?RxKRU9w?LDgC4azgdF%DrSW^Fx;^N^*^Mfmd;a=>}&w;{7&ND^|eO^8QXarRWyv?F1GgPY7 z$e@9N3ok5F9(5c@EZPn=oit1M=G9h`Jxk=yReHjv%u4rpv;R-@ZqydPphy98ujR?J z4@=^M*<;U@V=JmL)&Ow^5=|5`(Z}I=NE0{2vV^$agJz zW|<{ppVMfvFgne)nzbH3`^RshQ0kew`8revc`;eGNO%pM7UG=M4FbDWb}FffHwW%o z$2BmpU)Z{O(LGAB_pe@EPIwYr7}B8PE#W@TGD{9+zL44BiRYpWCB=EP5gxmsT8!U| z2l)yrrj!1_zhbe7{bIs%QlWTD?Z0usiTc7I|8ScTLyaZF4ul2sg9z0)~mnn9DU2XixUxf5CwtrO zHi8MXfsr{{v*pd0+l!;$2W$dJ|MvZ_y!TrN)GD5|2QeN+^JDGi`V@AG#;XRUHJdth z#N&Bfal0a=ds(-tux6y122kk?e`N!B`<|dT;NKacMlLDq2B~XR0lqUNDE8rVp_%ed z;Xt!nubGC0KSO%tGFO;5Z^lDf8Y)rOa0ZEp`OYk3o!i!vPo+iNdR1ukuMFfcZW)hL z2=VrjTkKMlpx)Wji%973`yC6}q|e7~fvKViEzYvRrF_W8K0j!Jh=>MWOI3$n-7i%G zm@{bK)tG`<3}6b(pPDb&?n%Q{+TQtJVxMsUWY(10JH8+Nr5rn%v|PBy4QJYCyh^Hm zo47>DULAJR`V^!QlYq)OSS@<`nWB=uN_jY7oy9=AJZhW#@z-TKUl-=5W%_QD%(*Wl z!wy2!HhK&)&-?2i(z5;;^V zqvBOtmlsL~27i(p5${+x`%FX<<9t5fv5vPF)CUL>Sk37oWiE=UI-9t8INla%7Al5G zm45DEOf@Owz#rp9m*a(%PpfQ!&oDtU)@>@I^|c!`mNkySoblZ?c@T#Z#bg7Y756JL zZ%bs@!W#5*E|`vz{*Xv`8FOUIewpK;qZaK%ZWx=k3#|!xVdGpgp&BxF z4qYB2mAKadhR@S?G$CgcO=GO-Ko5Os?K9~)>7SJO?vzE1qtoET{P?VTkZimJX9<~h z2+f8>x-f#gCV8yXyZi|~Sm7I~UKA44lM8gybWP|iN23~(Qz9kn)S-OksgVE&zjZ8G zJ{<0T=#C3zRZm71r@^{(xlz@q;z$&`Vb!SNP)f3hTM6N?XeNXrkE^$dUrJUtAf0Je znMA51ccy<5DrJhqO(*aHREBqt%ljDX?(=1SH&N(9E&0hdXl7Nx8fZ#Mbpf4L!Ic{5 zYQb?>%xvNUE|h&UQ#33hN}NTX^#@v*X;6PIn?tIUkChz0Z?=5lZHfEYH%ArjKaS~N z7iP@zIN{`2S!pr0*-zf92K5? zdKRFPS)+X=?0iy=+mL_!@Qm%g3H{_s)$)x}Wow87cb?+3C)BfclohGbNzLqP9ep1m z%|Lr~Z;;{cXs+~Kp0a+2YDN{|Wwi9S%G|pYZf_Kn%dBiqdq7`-9GQ*-XU0QC>>aQU+Ry18IV9jA8OiE-l zF%kEWYD|tRbm*scVP*;b>+;nARXBZ$O{^U%CXJa*z8#&0fw#|N->O2@DO`HokuLT8 z2gAN{+L*VvY&)*9)>-I$+9}EhogDx{QvO15JAD_h6=NCYbz!NlOyNW+ zIzz;AwnQ{|fKYiQUaQvXz1DR}{GhCr{Z%dOHn0n)L!#%@Q4sbcJb0o@XmE`)uruKo7$qX%Lw_> zSx0BagT{0R%IQ73EnheZtUxQv(O1PWtfU6! zPgnLwozdQU_DI_?{0Qwqyd%0{A?Fl0WAOmcR_u6I>`yus#UNDWzK!Mwe>+xDx!Bu z-C*@9i6GM|qW8R?EG^aJ_gsY#I{d$D{|LQ4aQIvs2|E!IO@qT7k!*XF>b>@vorXjl z(rha)-VF4keEqsj!Z^Ah^RlUR+GVG2Jyr2bom-5~DWxZOCQ4fx&OUqxO80fv!Pe44 z63zlAaBU@T-X3H<^8{`ZZ=4y*XiXcf$&EqYDyI@WIi$NWnI&r^z-k*uWI@TNN}G`a zWBZGY61ksa<6-#T#&xNSp}>};uhw8!l67NPstW6KQdr9A(eNex6IzUf#TpVzLiV!3 zoRuicD5lMstRY*p?6$rte{0H``HSG|wIjlEz>JE)Mio|!vtpi3%?CH(K}ZOI%D2Gc z7T}InRTYTa1x}nQsjrZtXCq*q%P3dmf;}v|Jx>_1o>S^8>s73}V_|2&<>rOm)kuWN zCdeJ=qiDM_YbqvSk#NYTQzrsyoOwUE-9@-(1(JWR01$@uk*(^8c=fTh=g>#DZ| z-|#`IHkKhQIW)+-AV-fcmX^>5)CehJ>98``{J6;aP=!}!x9_*SxyBdwE zooO@jqL;YYc_(wb$_Pa9CIe7$azNVwg0>W0Q00v~xhDsZ>LFP9monaopRd&eCA%EU zthN=h=*vK_S~v963z=HMHAwqJX{q8c>gErhU9b&@U0&nZ;Z3DivyHe?`LfH~hi$J( z9L%?D=h)UsNThrdPPGKRi|I!7p=KBEu&jTZ^~MbD#yV~yb(SN(ZGk@5AEz>OtKl?=3Ju*m15# z?m@i~#odKL_s9RvGnMqUG)L4p2Mu~ojozu>+&?xkyF_5}BTLw3>q|cM8Rj9pz&>WX ztBPn>U*C&i?s$I(=F`LgX>pC!dso?H8;NFJd?nCGV;OEWEL5ZaCXrZ1_%+?Gr>Gv} zmsEo%GjJx=;%wOZoeDVUOzR7|Q*S*W_`xIQhqbVD0<_B=yV{2wS2q+*^@5bFtlQ_j z!?QEpTC2#%f^52Ca?RO8!H6CQ z2)_5Z#H8DT(5hZAx9~98=ptu*0!;BZ+QyCwOXSTVZmz`*D=4^ONn^vqd-T&5Cu7v} z4~6K{$!Af1pU|ijQi2CcjH>1@cDsXIiO6GSn+a7?C?qPz#u?aR=H56r4K-hd^c?9s zX59@qlc;4ap0tw7h8hglYG-GDyfCQ$c3g3wV7`A2+<%**L)b*cQ#YaP|H89pKBq&Q^qD7ow zip!FNq3f3IdidZg)+T$Db_BM|=KcEXp6yauAjsAfx8@8ony5a+SoWa08BSz|{z@F# z-2cSIj7Udp>=z`v!m{ud;yRK3Ya+1bqV=#n%W+fI9*Z)5In;UhyM?o`dQbqU{Yw22 zF~(;zL^B-x$8Y%VqA%ymVPNNtf=LHfZ(bP z`V=%(e00cGgTcOzTk@`b2~f7v8CNXSYhyY-ubSCNVV z_LHspG=tPT6;t5decU#bjP5U_n^}V>_R{3FaZ20Nj7Z5KT+RlZ6;^Pfv;Zg!!wmbZ&NNB_^vKT5Ib4P{=ks-oIx5%aCyzM>Ps!tu#~(qVY!wLQ+TJH<`#GlbE8<168^SjI zHA?{_p-zeJc#Cpv=^&+#Kj|D7<=$3Rwrg4Xj%Bt87H88UCk#l^vvRwxSHXLVkg0M1 zkje0MWrF@9`@8V;SpEs^dgYV-Nt{ph_Su|gE2x0tu{ezUd6je`-nD`~tagG>u($A8 zJm(1C9wv7}Em#5$Pv&h$QHglMKdG@`RUVNSv^`|!ZFTXFt4Q-t>dXV(%&Y^j@-uGr zSuAxXzm8F)fN{uDKM+kn_{=-#Q(lK!F|k>58bu3{dM}e8n4WsyHQ82S=0AqJfKqC| zaF}QVRy66tf*7#_vAO*Owh8e=qoi>6Zg9(0dM3bD)$5Ka?L97wq6Z$w8;<;}0$5Nc z<{rtMhly-;Qr%_@}61v&lck zd?sj_I>@|Uw71hLW$Ky`6>l>61+i8VXJYBYtROi3eBvDpa=rQvUp1hU&*=mgBwAj{ zGyEvIS6q5T$97U>yOkH-!o915&ZJaC>#^5@s>k9zy^_vM8n!3s{Fd;H7~o_K)S3L( zmC3#6teZ)Dpxz;@X#$r70vB)!WqfDfapfS0RLToX#u2<@0e#%q0RU?cSOEZIp+Osm z(IfVuoO7svMSK%vx+vq{eaZTIh{d#CN9+YYJuxT04d0w`Tt zNvH0uKcxSfk>+C8@sje;y{^4M!cK;@`m}vc(N|xSfYmpFwQp*1ik)jYu1#r4J1)&8 zn?-(WF3nT6AtlDm#fRa}gO@rl0WXE?x3%DML9rAfwP;$EM*(T$zunrNXyR^~xaoy= zuvK-Zj_~50jylc01mm4(9)nBwSN+o5vii*rP@g&lfbv9r*9D85T|`fU-nM;$)0}Oh zvvA>l?y`re$53~3W_s}Epj))KMy(VEd-xJYTh=&_%w04FYgrO&poO+=%v}@)Yq}C^ z;wqdh)ArGtt?J1fCA!sv=IL8Rb+;NS+%&4(G}G4+ny)jW{)Q!FS?>sb#D8Ql zJ+1o!1%LcxCQx#tfTCRrLrRfkB`_lI=O2O|!;P$;ln$jNLsVpK{F##gdJ!w%-hT>* zA462Xb_&~u`)O1)kAKbVOk(>OI2J2%Tb%%1haGgz}6_wo7F~e#sS; zVH#uH$dc*CGFneGD*k7O+9-6?m2)Y5It;hOHi#uO1()q|;~!}G<{~yc+H{lH#nl|4 z`)RCn#Du$LdQLRIm2SiAF&D(}Gu@Fo;acw2k+IK##IjONtzl6B%?bL)?Xn z1)MQRZP4d+>O4mjhHdUq-RQKeLli3QCOa)<;WGmT?j7}vAx1z@;fSE+h+Sc)2|Bf< z#zy=NHkrv>@iR%(jnU)Y+?|h>`9DT?hr=Y|N!X#av&-I92mjSp&eojC1L9hV)|{56 zcg)-BH{r2LyTWrv`X%>(%Dp&skBG`TlLA8M^3EocWp|Y)ZTcm9b-U2O)Tj42*JqC> z5+K%8*DB-1BF*#e$B68}2eVH^u0`S=_Ul$F6)vKT^e(S7XAtu!H|S&xmfnHQF8zUN z`-T>DSM1^*{DJ)INIQr>*G!;LjEi=yQ^RkpU&1>PJ+K!hO26@Z6#JS=!@>g8z{~C` zNU|JS{g8iM^5+I!T^hYD1++*ku9I5v6i1K%Sj*$kqftsvlqFqa|pk9XA!X4Pe!}K4geRD41=>bb@}hX9#%S zH)d_a%^)_9*IHrqD_mjKe;{kElEwE)Hk|g&CH}-3ajUc343GB5C&$?!8EGeWM&Pe3 z6dGOyJ&4KStYtqn+F8NaX#ca`u87?(Nm4w91R^8IOzscH>K<&&4;DFEG`H-D@KzwS z>WPNL_PpwtNZ=^B_Q&`sw=5xn@oB_gwoghF6Z%(cbl>gBLCL zh21xR*v_OF6659=WRt-BXy0-{-#)X?g4=+#FNl5&GRem4_`GXe?8OhIP}V7hgjs%Q zx6HP;?4t#c*g9ZvZ(I?mB>To<&j#M9{e{r#pBJZf9m;jyp{^R0>sJ4PR{z*VjUvkn zc_pw|XH;sDds5&MW8RU^=|Cb_D_|P%49BV0E+~sGk4)0nzS}>KSGiBg>p3g<^Lg0c$E42> zdEv(EEB@g3m_K~O4$11xZSbRyf44suVfl_i?q}S9|CmwVLBmescelv*biwcGKF@rZ z?>TXwGsFHC#Kk-C2T$+Qfp31JO*)gutxU0jkmLM@4o#`KlxQ9&gY+RIK{7~(5*l4b!op+s0ZEKs9H-HZF|L) zY+uG-y!EhIUzS^#z(LJMNw`1dF+n?&wvU~j5_T7=d<6so$j3L1A~*$zNL!J7fZQ)b zR*YL~Tp$=b!py$G+0RJ#;2&chXs3OOD2PwHJmr-Kk#kSre7z)EWVQ|>WOm&zO`2O` z#IakkPR6Mow>yM#K#z3~f%)3is_R-=Ap2FWsz-oNT&efW{LYa+QOZll*|{5W$=p{B zC2buhx}LaZjQ-#y$GzI%<a>$Sm;$s9_^FLcAwJ|%D&aq*AMoY*_dpNbAasZGKYCXw>P?{ z%M<$DLW0Ep`eqA>r-r%E8QbTV6YqPzCG@*v+oE}t-|+9^>dW{h_Q{<}tkNc>!OKP2 zw7-8WQl0j{4Z6#%jWkyLhp~h&|9urE?hsj@c7lo5 zRG-wZYx0~=BZ*VH#WzrJ1Jgd~lF7$C4vAFbI5RvkAx9u$j}ZtT>}M}Cn1usK%-%nU zbObfK_j(#&kZ(PLt0716UohZRRp53n=G@8(4EP-JX;mm{uR8O9CUlaYNcwqI_*pNM z)-E4t++FDENH5}Z^r{nX1vqO!SZ*t}orP+F-|Nd`-=JF9V z!6>8CEtaSim0_dyEs_$dHP6HGoJYr9bQ4OBqQL(QH5TSxG}1cAP&&@i9J zw4h$UT@os;y*}5`$1k>{<=w#7!iE14LXX1?{B-baE9uyHBieW)QPd5OY~615_=i(7 z_FWE--ul$XZ5O)_Ek@b5T(LsBQoijo%O0+K2L3_VrFo$({c<9BoKIckxi&>OaT^Y(WXU9eea+ID8-Lx+uHZo7T$ap+ZTmEo3(f91i2?x z0?60{+Su(&g@S`uKh4?=@3?0*N5 zcn#&8NCh|2{xQqxOervfNoY9NAvnektp~0+ zykvL;V|){AvQ=+j}3Q zZ5k^szc}{aP;J?+r4+&X3Dr~VfrJjWqO{kKHZ1g65P>`S(?n0KV)9>H=|Po#BT9 z!~Ia@bWhY6rEZ8)as#*rbf)kFw7P)IVY&jrJ6cQG?)BcyF{6lq(m=z1IZP3v=`>#? zH&UuG;SF%q2=RPlBBi7FI6V z+Lg^3jfHOKyIGz^R47|67;D#)ZQdH3-BJlxL?apmBZN+pEJ`t?1L)Fm_~To-!oJ(W z&YQxmB)}`DfN5-DG|WXCQ2kSTcx1-NJ#IUOLm`R&Wb#>&lrHGyYo2n`o9|X2e~2(q z9QYwAOF5%#)Jpzy$A&k?hBv*U?&Fu7vTj8#Hqd5k|4e39q{Itc`vU470nCdN31|WV zbfp*qAHT2%%=&;${OI%s_1Z!_G=sR8{ni~JTNI#uE?8F{{`f_%aHkLarN2GEfeh%e z529^-MIf6>)raW(upuN6XzKH@0pJ26qmD~C1;BKfP?V|d+>!gA!xo2g0sq+p3`v1? z`yf09AZKS=e?UBRcYf;bj9N`Gt)Cz9lm}jm_?_^SZ-3+M%6u?^{k`jNWs|L?0uI;% zgnYj1w-8P1@yBmq4&%9n!N8;ql>mPk0hA9A3$ysrz3>qgLDtqz0rc3yZ$8(7koExB zTwy5B9SY3$Kynh`A-Aw~HF`X2y&9CIc_kH4L^d~#8fPCWF;cj56jby}4jB};`p~C^ zV{=Obs}=KRFz8_sF)cLvp1Q~0#Rqn4{9tl%P2mngCKfxh zo3ce- zix$HDqH8e-a zZy;|?cPDYEV$wo^3+O)~${a`>bMvI4` z$e|ID2uVqKf+75UAvg~;GwyJ!m@iJiv=vJF^nlbWHCVJ$Yti+~ocAWE|LhmZKR$SZ!K%B*>%`CkeSDPkg(V2hPkcRM+286*ZGziQ{=-yvwRUK?|nonj1q{{;{n$wDdH zstE!ja`e9e1dILu0nq>PU*P#-4)*3&7XL#is156hzl@r@w)#hBdpOdW+v$449gPmU zLrL3UBg$+d!ITdP)|kv8JJzfQsL_yPFoz{d&A^b{noJ~2vqwz+u*EMdu+IvJ2!%qXM0XK z-)eUe|Kq)5jKbByo+8n81NKhxTYh~x(*GIGPS5fPD* z8u8H{i}~ciqj`s-v^iB== zRQu(HBd4$SJ=_|R_(FWu4+-r-AQQ9g_j$f@*?bKx`5K3R4SubjsNrXm3z4p(T+P90 zZWKWBobSO9J!oYqU5|j_uiK83#UMo)%oE;250WSapE|&iaCiF@_aw5>j(o$>Fcb{0 zuaL&LRy7n;jx?LoWG13sA`%&L|G-AkUq)ze&HU-xLbZD8))KbmZx~zFO0x^+^&uDn z8&hF`fj`7pSEh{sJ=9@)^cr z9X+afg61#igc9>yJ+VeXg{XoG*~i1aXny9i%cfgBcUcL&(Cf8kl9AKpbVpg!S|87! zy>USB`D|$+GGq|7lD5r9#fBy5BqY-vCuktX&gzBXeDf1wt)086yB{u;jd?C%KlNBi z!k=&>eP}eBIE;Dxsr;ypOn{p~L{j%Bs=1%VYO~MKl`$PTM%%chm%%o$AYclc++mLB zWkai8F_LB-Dg@Q+=r@d)eM_t@-E(4O?~fBj9@Ip4Ni+AQr3ehWR5Z9DE92Z&T^Ul_ zN695c3sy{*NfrggVRTtlclQat98?ahB(ls*$5yIjzxP6cnS6p}*n%xsZR?_>PB|kB zcU$qB5;SKM(by?ig#?-F&PF!O?$nylq%Kr*9noPe<=D*AWcCI=(lHK+*aY{iQrAgq zSutT`QGY!J%iWK zWpe24AeMiSlCDtO7EzgPw8>J62R!V7>2TL{CH~Q0>${fK@hIuIo_y@2V`Hq6=i3T% z2aQ&)-;)NFGHO7Sg6D=}lt}l_%t4Hq^@5z`S*u>d?(-!A_b(%^lzx*G+C0;ih-wj!$H)*{gL5s>9YwA_c{D$JPLs^kJ{EWbU6}gN>VhB7aP~nO~Z^f8LW+&uV*TCB{gV z5P9%6QnVW5&!9UBrow8)VS+LChr-CYq*@vPz!;6$a(HHoWv-k>`(=-1Jg)C5C3#Kl zR7B&(Ck?#j6}RT26O%z9UH6Sa({@!s(^v|!!sys(#@3-^`J*Q${9brXd3qySEtnMa z2BM>P#I?Vj&N0uu!qq;oKAq9-FKAD3CqlGC8{S>S2R z_VGYh8n+C?FCaGqAg7;i*s&|I-+um(T=kM@!ST#fj_Z zjXm$`lu`L)5`tLkX+O@}A5-?G-H5v#0nZ0^g|^p(>w$E zL_^BQ4X%2B0)cjV_CKu6-D2gFpXI06Jw9#X;3`8XLlzjn$$c%4zCqE0XMDvKDVK)< zF7(h{vg$>R;>$&LOz$Z}eeg#AtoF$SLKS1{7f(xn0SeM?I76J)tT|-y*ngBi_pQTE zSl1cI%%ex{FUHh2(w_@xd|D|k%+ejlvlVBF)+LAF<-*~ZrS4&nu_UJli_oT3lgam; zMN}IpjPgyN9e++D9dNqi5Q<&oUHVTG(UEz`O+aywTr4AADH+LM|8W(*rk~2pvZXIM zvzA0AGLySC&G{kx6fhk0vmbAfNxxNcKnGHVa_SS)p22@L*Z`Z{eJUZj;nSq)8)~%O zb{Q^b7W66nF2)_9hBm@UI!8E@mxdJc;g5S2O=@*?EP!PKM(zCpmw_r#mfSKy5i3)H zMZ%=-mshuelCtZ&-?E6exQ|d$-k)ykRjg^!YA05xYc=zK)k zx8kbuv0zKzagX2+7G_^>x%Lbc>Z-9puM1>vP+d5%9{pxUpMiu0p%kOJ41obOqwb&9 zVVJ_ZqimZE#Pn?im7#9i4KNNyLGr=gH0;KP@X@a-a9a-$4d!4GkX7qAGVHZOMu*Hc z?RpQw!rKF~n|C=vIN%LLxy=S*Ltbtk0UR|*CL|(ty zE5mQG={-sIm~?K%2Mrr{?|@RD-`4ugKZ9D)I$`}I$|NA%Ewyg0O_+)?tZqS*8E03t zU0Uh~7=F^jl*}qjrgK^FMKCJzz+)6v&kD3xo7g`Q>gVUcE1283L4$g}DA(LIZ#jYs z%9lXlFG-zONtRw?vDEF-zmmG1qs&C%Gi)`YHz%Jq` zcl^-8AILbfvEAyh(4P7aS}n=nQBek3YtU8RMo;QgJMPs+=!(4t1s-oduRiOqsjKVq z-R!wN?_tMAV=`k?C2XDBUGG=ndWw8X&H;yBg!Va%KTdOsl&?_OAXKQ9xUJd1Y#6{U z2y$bDl_Yn~^?&+>8RXriYL;=GKEis-9m2;4)FFSoDVs=&6^*dz5(Faf{3L-!R`b2b zKu168X9{_$k6cGNYT>l*I=j6od$#6=;ZpNq;)hdGey8mQzYzn?-Q{K^hHKYh9OqEO zKjv-6Y0=-5*aY2Q1c#js#DdGbke+%fK9O8-1(zp{blJsP@T8*;-}uQvK)U4td>%^v ziVMJwOThFPMB-L#-IV&Xslf9@G^vXWR7XzKj|Z9|tKbMCX!akN?j@1m;WpmWB)+jf z4mO!yxtQL_ncl&(zmf7IGbJ5OKXZ-0t?Yt(5()-#IYD%XB6(uV?FrC_BRj$RhFt7H zMBTDL?FzLc3J$oxVjLt>cA`27VeOh(4$&oy+0>&T8>4Q=kGx{=-ty27Xr2w#9^=v27B-*qZxK;I(q}U;9s^)85T2`*D5FA1`q7=61%xM;Io+^?lX-W*7Bb5 zH1t?ZQg+>&Ku0%zfRi+53x0!;?^F!5uLpaEL=^}5j1*o*OHStuLKUQ3SnwK@&s`W* zav-wOz8^vM`tPF$g>U#V=6r?#$j&kaec(-klqIQNN!Hir*MG6gZn`UIzS0epBGwoYe_}B;m8Qc{kDrn@Dj0@SL_@RAe-J*2`A(6hF7pf`a z-QU8yfU-PNw8@xj`eG(~Hz$GU^YtHUxf%lvw!v??uzz#&{-1eywf^5oPEkhbza^>W z>TG6Y_uq1?QP)*l6vp`1iij9Ot*)$sqM~9VvIw?)137OD3E9kckFk$cXtf}t3i=g{ z-1~ND=qQurrW471F136uiGmbp z8!du&;9M~33Y?fC5*y3h#XB9$R-YA%BWYm)UejMukvR(&gvd31u?40yD_y|vBcfn; zzlr1J@w*;n$Q-(`N6naStwfcQ$@;3-ac|>{+=HyYM-f~L)AzKJIQ_Tusr+LJG1=7` z#x!)|aYpn+%Cbw%hVZt6#}RMOwr4)7#j<0H%@@)p;d7GedMhkp_JsP}g$GdfmDHy= zV+@26n}1jWWe7bSHODYY-KKYQ=T3>#?%JTm!mBAUACz3)9bAkW=h4{{oQmV|CQ!^K zzJzdw+zT&K#e<{Gi%AyfH;#=~)23ACEez|yM&u{!hfCIOt)AY#Gs__0Ld7V2bz$y%dqd$?-XWa# z4c`=(nJ$ua@sz;ghpEB=|~nLAWQ#Cm`RV zcFCNpuGB-nL*OZBb9uprpkcg$)?}HzaIEmg%sm%LiMH*7 zc$aw4Atj~`lPqBJ^3e}HEf48eplh({&uY#+dXzH_zf~c$`24Oxl`T>3fq0_2OyIqg z(@AQMi`K0sZ2^0N48zMhE)7+0-n74LSr8U;V1RY|iRoQof1xwby1?5+6ou$J#OX_g zBxE$_7mhnbkt!ZYlUUPUzw3c9Mt*Y#b>q~CkMC6`@^n$R;?O+9mvZ(CzSZl>dxak_ zf(AjEin$`EUnWCY?H^lo56UU*d8UzTqI9KReO{2t$Ga`u!}oRzrc@imZDn%aYR_M{AA+Lu#(YivHJ6{0J7Ks)My=?yw5 zd0d9+J(e*{8-jO!mBiVJ+12$_A?iaBMuFKghG`<{CIM_XlfROKrfSv04t^|5jHE!QfM%NINleVpc&RI)c7 ztcS?Nif3R{Xlq$A8H)DcZ(s!=DDTKKbO==w(7Q%<^AS4ng z-ReNt-g~+}tfc`%6Ay~DGnKbkyEOYfT7=4KL3Ae|HzRJN!*x@dFD#`+ej_4}bJQ{z z`%g{`W?u7jlZ6^vNy06dcDwcJy&tOO-(R`+sWM{tT=X}GKrapN>?TBHUy{Q82;pJI zNqODN)`|p@2zjiWH5{A1VBauXGJ)+HB^G@a?82`YdsD)s>#*C#epyut4&#jJss*;%@+0sXsrUL^U4UNMI zbLu80V9T|<`i0@aqe(nN?hqR7(eQzA+F^o4Q@)({=kE?AC^zDz9P3BVK`bv=Rn59> zq?xt&ty_OO%%c0}SDhV;dj`oWc$-RAw}-&i%o;QWn=x}v$-_O)X}&rn!dQ9axZJZ? z8()5~H)5QNhKHPbfKYgxJ8<%3b0+dlDCWJ>>4~jUD7<@vS7WedmM{ zu;s9wle#6K9Ag|hsja7DpZ+~1L0fgTiIm}0Y;9u81(sXcMf&fs9)==Vxvq)blOthO zhV;Wv4XqqG&essimKIOc5NX|ZrfcZKx6$~)`$Fo_j=1mPGzwDC3Z(0J^V#vnvCOcV zmC5IvdyLUqg}Y_YEoK;r6hebtbmQsB2xK)VFtyU@$0n!d#@wtB{22tvB3Bso%nW7V zPGHsc!Iz_F>gWGa(5+FA$8Tpf?EM(`up7E)hZwVA(srYKw6!*MQ6FS8tfkxG!dl}l z6YZPd{+l<$s+2z0W%@^U&Dh9|!tsJyx8_F9>BO+9*6YRJhC|njI4@Z&p%>%5Z=@1F z8aDmD?`n#1J2#`&98n>wG{m}$4hCWq+g(jvJ|Xt1zcr(Hk`=O8O8@FoQl>wDLFoQH zdoJ&K0gyI^sl++QVx}ILWaqe`25`0%l{`^a>M)t)ypezvRkla&5>zgyzP%mtTOR{z zJEZxzYmaGuW)nxEYX!ZG5bS^X+|bQaRMZyvSa+zJQ_74^))b>ha= z5kmm>*%xH#3+eSB{n;bhH@mpZ6WrMYZINpv=r6>vRROo>-!$C=5IvD)t5~xKaJd$` z-4PyJQ&prI_Ab( zs<+6Vr(z*@52TDsse6NajX;JYz^@UpKFUJ}dvG3|0D_l_D(|Jvow5;%UaLHWN~-GH ze^DlfJ!d-!GksEQ|N7w`q%_inFxNDuR*%DDzK(OB>>Q}rC)|*~u78{K;H8trRvkO$ zB@a5UQpbKd&qJ#x^LwT!5xuhUJYYlZ*I5qljHmY%VSe@dy;9}8VWU4eq&9tF@U(4t z)M80ZaLkrqd4$j0v-F(w-iu0}pChP)3VVw!3DQ!U1!K_X zCVvn#H1A(h^YBxC9vbDGp$VdcG2)6@k0o@-jtTUJbsyB4w)-MBK`|ZvO!~E_j%eq# zDHIQFpWnJC@+DhXo_&4LMO4CmmMObW(&ntr^31Z*2J*#Ku=ndfUcVwj9eWWp2*?b| z|K=D7{$Du;|K-w)*jhL^Te({Pk8dBV@>>y~1&2WFCkZfBmHMlVh*MR)N)=f;8%|ZC zSQ>!kH2#}~xJxeE&6KZZu*hi_)RTIN$-D@wLi*CkLV)k!JC)zJ^B2f1A~ftX+9iB* za}Ah!ft)%KT;MmR4yqP|w0=@ng4`rdl{z4Bt9j+3xvT9wEm7U-=#G5u?)5lq6ZJwe zZYJfS`aSWV=0m27(WC8#|HvP7Eh25=^DT5K??S|pZcVU@8N5YJZ<rq`2Qd~69V(JnP!a2d z_ZIJ!jj?|Cd3GIG)>9^i#6QAn9O7@kGx!j~D#t)6DGR~*J>}d1rU6cTW(Cb|fH;Ww zP=pQ#SMs5jDIz+y#KJq4(SBMxu@-g%X%59sSV;e-fF8_(p9MiE1KXBsOAy2L5`nOKFLi&U-hx|#073p2y@JKk@6OgTYMf%s@|3j|6|djblYJ9zjt>W z6_LX9j7wm*d3wxXj8QRQLDR&37pLfO~JK=#}zDKqD%tJIA;} zt=mOs0GBw^u^J=(;fbC}>Gqy{ihl%ZhK9Rt*9vk6?N-OcNkP~ZHd*2+q-2Dhjf9!6 zor@g}j+{XNZ}n$pK?6X*h9bj201aMSCdsw)VWJu_EOt+r6c^r-MUL&DGPCcUtb|W(bW=PQnKFswYk@%{Leiv-Ji4eMh@+Vl*jUgcwVu6zup~S$I@GT3AJl^& z&om*5hXfZG%xLdAQPaR%g;jnYssXc?rgv5=DiVRti09BfEWLmt6>bx9MyOtmT!#Qc zLavdzS{P}*TOc&6l)4iiC=m>;jzepCy(QS{g#g{d zNK;VQHCvdj!f9Nj9`MPyoNCK@89~K(3o^bg>UVj7Ky3}mWqd~464{X{DGJ1cx+Zg_ zf=hwHr$N$E5*C)>)r9oAnL~3cK~SS00a9$ICnRJh9VJIMLe_)pF7(GE0+^`d(!nl~ zq0G0oI7;>qj46L_Gnt`sT1S^Qp;=I)bf$qC9UDp#Ls*#eM&6!rhuk3fMvgwvnqq@~ zWtfv{^$rKQvtDx;SBuo(Ws5+si<0DyUl{9o$M7b*q0l8O%21%u{gIEqXcAC{_N+F!Zl>qmdjAF!&kDrNBguZ021Nqg^ zJ)p`zY+b#=vdLar!*q5)K)MxgDLP7ah>^R8Y>+;b2d{7H!nXH8&Z;k|t1&5?$u;nUOq{N!L>_`{;n4uh$*fXm1$vxao2vFu8A`wL-vVru%)P-olr zg0c`K5B?vp$h*Rf?X?s(#7WR-O(OU7dZ#f%09R{I8hp}Vh%IMx)xaCMMc!7r8;<#; zp%}5?@n(F=3P)ObN_eE%P11F=@8~e(XLMszFzapYZ7c}5_W(7&Pp8vi(+LDI0mm_m z7pJy0RHj({(<^pQNT@JO49E-f`x#*z$}d_f87vOx9j{VZin0ojWz;#OHshqBh2ul< zU4Sd6J$B721|aa z-vwBnCQucNH6D$~piB@SNKo}}jbZCt2~ySv*BY`brN_>6K%FAG5OcOk>1SYlgKOQon0; zGPy5mS4DU|b}owBbnH+-v>fXpcHH%IHKBeNdnI)^HcnIIYWf_!bDMSS9P3aW_86G_ zCC-l?wt6JcoffEUDKM|OK!QIJVF9U+GXphjtC1Q)DQUVK(JlAN@pOBCraNk$(bv3- zG1GV2-;Pv@ETP!{x|sb}mXF^bI;dk>I2jY4Wwsq0uStg<4%vgZQf*$Nc{Rlg?!d8l z+4-78B4ACt6_b&H!H%yk5PUHE`u+%U@@4WME9qQ!6Y914gENPco_lo4Qb#rUP_F%7 z0ZA}zLWA!d?l&3A+;jR52@ESdbX*j@5OxaOia{<_D8~!p54Iu`*e~9O0Qk~I8-B_gjPJe<+n^nNRCvp32YIe z8_F|hmTdmdRz&$>3B&Z`oH5f7NdC$o0&+R>GFd|Njf14Pz)#x3tnJ1`AErX3$!vBG zL9VdD4>NUS8DehBIVVf37>_DwskEeKB=7izOkWBHHq(=8=S4N1Y zY>`1CwK0$ua`$!fEyj_}g;O3F;VzN=-9r?(U0dA+QEjV@&I%Tuzrqim=ITxJwq`GM zk_h$?H6h0pz<>X4XY<8KYUc9lXFa+>Ckf%ZBc&LU>j(lZ4^|)Jr!3lto+IM8u+NDf zL(j{!U-YG)4OOp&c+7)>68arJXiN#OQ6vALo4FFUE`-~s&+!zFjfUKAE4mTXug?+{ z!eL0u4Bvcq`pn#s3ELfz_Pc&KobX|yE8n(-l2u&cF$Q{DZbQfg2Xa~K0l;0=dCDa& z>6m^LdnA4%KW^V|sA6Z@;Ll`v!N5Wqk_Q7gx#n_!!VTbc?A`Sz?msY~qbwD9HpH)A z&uIS+1G4|881QGd)6vM)@xNeTyoStz?C;@k6B)R@B4HHhRf>hZSP+x zeTc~9WuGU*EwoG^h!{9KxwP@*nK5)XqP+=zW}uVK&i%SnH!ZFGw3^$@&yxMlk%?Eg zoc>oqzC`KO8dp)f!BM@LJ|68^mktKmEYRalSk@p_CJmhLH#M7dC>#Jf(CJcF#5G+e zO$K04(5q)JpaRyTn+MQ^ZI?I6yVCw1=f?R`fBc=6e@45DOv3+qra(1WX6s#T+tgUU z*(7VqV*@92tnBrMY2KMSeMIC*5NUmuU(tzC@W5;G3}Tl*4TObBcwuzNenv+@8hUNl z18q&7$*xt=#+5`GW<#?R6VBcPg4qK$nmQMgK7{?Zb{i;+&@lr0P9!G89S(lC2fZ(<@`H6B(8e zRq9AV>btsM;fxEqjkuLxzG1PP*2|xskIzJlM=L9Gy#l73fUg3qO~#lU+&9|jW)rUB zsU>pCionvy<|cZP_x%nUWr)ya1Vw|`fuhew;MH+_DKoi2qaNy=x3l&2tLKT8817Em zgA)57){NRm&3hBoN`DEHe0#GYEk=hImR6$Ut7r%rvjtJ{sI4@HDm=n}O93C-=0cAhXf+!*8g<&!Egl;y?B=k=IdXOhMnNNZNe}Hh@jhY=U02VSF zz2fWT4sA@Vw>l zoN@8>_PPJ(mt~JJio9)dFk?l1Vv4T^`U+l*a-+HiA@3P*5%Ib`*XA9&ySHe(Dp(3$ z^SXFC06!iD8I3xOT6}gLuU`+Fn3?(GQPPBM9B*&&dR3`S+T4B9oMMw=Q#?Trem#pL z1QEEYKc!Z2}SnNg|nC!;YmdvCcyMO_Uc_9QxCA zaB%Nnc}4BG2Y)5|uLkAD{5uWSz`lD``1q7aM!8}W5Y7r=-4*Dl=F1UMP)V$A5rHX< zp&oqrHt!t`f_oHea)1v0(Edq~c3`4P@T3V0`>?g|c2|d}UK1G3nU*AB#uZaFDP<$& zB>|(TN%M!I716!l?!=?z*g~$_ZgT9%e4ci)pF!ScadsR@`!3fa>2lW|pljmRI zd}|^3En(rvF>u!A+M`XK2#n+&A%qqPh-N55dci!PpI4c+ftw7KMi$BGY3Z_Ya{!A<@v;jPFO$Q-vK7@d=(E=4R!{4logEx zwKFTY$uMjK{a8H0IFo%~H@OkAH@~FmR!1*bvaio!bR$Ux(e(L4$d$C8BUi#|vRQ?v3U34umI52|%KPljB-f8*xZzf;-S8!4gf1JfB&h@3wg-zU2EsIq%H#qj zb^3uMQyy85$BH~9>#i8^esew$WYhX>>!7(@;lKQo+nv_@ZIJnMk2^ol|C!qr`;SiH zpHc={8yia@S0e)_M;m)tGg~7|Gwc6qfmEtkcp@z#e@`37uWm|a5#jwN(uYcqv;z<_ z^%F$kMd=e@=FNrUxQH6SnmQqEY=VEg4CkTaF#Y{8-Flqi@f_K#)A36eemi8Bd;_yrVS{JVBP(<_-8HFrJ8Wlt!~0Lz@y({Y{xg?#R`f2?5c+{*#1qfx zyUxxjx-xTbzL@pY-SYMQvIBevTJI~k7v5eWICaQNZb&$RHp*?7&rp7ydD+^?O-b&^ zYThq=V!Wi}=vJuOjds*94AfOH4*HityK(Ium$!yNrT7 z>D`5=E@NR5kEirku#`e)hf)v?;UHAe zvq1pjPUPS5kus@VoSII0^GDaqwiRKdhvmka3e^A%~WlIM?KP=dl&+>+OL(HjB*BPv$U zCv~3M^{wv>ZCJDPgP9^Eb*zhDbFh#5w-l>XXex6n1Dn1*>x+fk6W6#Q$2wGu6C^lI$zoIB!=$myK8YW1QqgD?t zTFgFrQX>S_NcEXl#NOaoySJY18&k1-Zfy8HA~4^R1~LIAP2QmBUf_zY_(U!ml8=VE zD)mL%iSy{@MOq}N74bPP?(5JBt8_MKavW4@GzWQ)E0HUzl;SY?ux zcTfw=vxhINO`|#F0J92AKpdRX3d=xOs_V=|@QTtAUGb|V@FL3vPF3*|;#*vu7g(1x zs9^YmXa^x;t2&U5;58ZG<-aZdg6&1K2Z!(#(uwdDz$4)b%>73)h*MaF=A#?P0`!zQH@6GgbHiupKjXK;MJV4Q!b2TPMYMU*=^nAU-3yF!q4 z(Arg);;S)ZC*_`gb;mueUzeKox}@f$;uJif?O8;R@vpfLGtF6YA!ibXJ=XLwJ=k0b z2h>2aci7qr}%tMOk0){hWye}g9`kt(RfZq5br7~O+T;um7!jyPVJTJs< zFF}oQX4@3;R(oA<8bBAs;dAALH?BOE>yB2=+pUiwnc=+`&RV{qamSEaV95|+sBWC8 zPV(AQYlzcxAem7nY5V20kmVBs_Pf{L5%^CnI9$9!*3IwrBLqz6&_}uH?L38nv7E?~ z+$S@@zd^j&kH3VpayF@FV295yp&v*!OkW?N*GOiyK{LbE&9nc^C;+>srF8i)XWaTU zx9@n2OftW)%0bA{th+i)>)~wr9JCbIl)ZCSt+}AwYoJQ%<5xOK>dz8YS!+qoi#cWu zF&)r5W`TRqEg;1vF#nVuq$CUQNhQ77d&3J9GYy5Nvr3wsm8PC%{h>!rB8_FWV98YSW52C7jC>mIzY`CYqll#0H=tlmIFw}Q!8uJ;7nzlbPd&A-gOLyd| zo|v@C0KuCz_4$Tf@dujVmyFegSj7)d#0fP+1}C1&vVO8HFg4Q{Zt=z*i`n1X` z(T#~UL1ns+?5aiKjqAPUCKV-Gsb{VE7)uI4)`jiheYAYnK|~jP={3vwd7DbJ)|&|x zc}QrRa^5~0IB0kx8~!WDSc3LtYuYxrK-t0;b2!Vkt6J94{k_Bat_wt3Od@s@a`_6e z_)xVq?*z)0*JfI5N?jfmcbol(>&MWU8FIY!y1Kry4LgX;0p}5cX#I8)hx~07Yz5|{ zdYVNRrjLYI=oNJ_5cV6xZz;pWeoz!U(!;~Jo%92lN_gByyq+6eB+qpvCA=BF-RQZ*mVH&PojHED1)NQgoQ<-A2hM1!Z-!4blV7zZ!+--#wRtCsTP-0aFR-do#vRpbj1bvH-cUQdxjs&8!mH zzht-EG|W>iU@2P49%9|vdB2VfLIR&LvI2rT=ZT&d(FLPi?b^EUeCyC%z{9s-~b znl`od`Res8^Pc1Q>gf90>l?A>*92|bjXMQL!N=9Wy<+l!?7TMABcyxPUm<}5*oo(SpQ>RfPu;w^d^kk zd#)#)rw!@sAqX0EHy z%Ars5Rho1;T*!(h4C@q`L4=}`fAv2OK(LyV8cjJtm#b0@%t_E+0;va~@E0)QU!XCm zaFfH}A5w z?;X6h;HR8#$XIsYsMrBam%E}&m#X%Fk?*nQ?_o_r4d#X6aOUfZ4H7?4v=r_!b1UA! z3y8#@DP|1LLvkzMLO6o3A-f?V#dx9%1=U-?Ks;2pSi4<#WhHC%Hz8G&(AoyqS+Yk! zj|nDf$D%~O?Su}8=KkdY?q5U<%r}+?5^>V5GgJKtC7vzmBHSnr!jHi2FoFge#<3#^ z0WEmLK+BnBy=u^APZFs7^e~CWk6~$*_889Et$;adBs7??Q-CyQ1e0o4Mf%0n*n_-G z%Y;vi(^#>9!0&>H-921-{B=88N*Ba1*%1iBHVg+Pc@2O-8$ks7$i1>&)U3nU!7yw2 z+ct}vTPp|Qw~vk{|69!K;NLioP5w2JL8ih^kqwzOeO9inp%i{P#h5WHEy2=T?*W21lI z<8k)tg3)BS1$}7!l_nNYkRUp6>wSLf3HP2dv`HqSVAAe8O|(=bjVeI?MTpRYK&BX%lc>(`(@{cjwfFx2A3bXL_hmM7JIORL~dx84X#=|z(U$MJ@RF7_kxvt z3j%se{8{`0$s)=eX>&HHu-30-WgGq_i1Q(T%ql#o$4NekWiLDAtw)Hpo{DI*ap?g`d zz}ta!-ET?KlR-2*4!2)#I83uWXFYD+ucSY7{n{~1{4vxgTo`JO=)BL${7UMXj^V{b(N5Za&@#e~GhvG1^_HR&+Vok&bY!6$rSP=uW1?E$ZzeLR_qsa4a#3blatVwTTTMV$UBdns96;f8#{V zY`tJ`IfOFia^epuG?@;V4&+6+XJc-G1$`zr9}+OCWxg-qYa8vYMPP~X>3&qlfrcNK zK0w&ZoyprJg}Wr>-5y9V%jjXJX5#|}LpC8jYg?Za8D1QsKy)yAC4m`NleJ}ck+I}P z54VSzKBMUN>1&%KqQgL~Z|r6=Uy!jERpDa>>euPs+*kXSgCm(@b}gjebb7+Iv$<2TRTjREKBpaO=MUojJ>f3~?R3eUW4ZVl%j zMIMp#KD&JsOBMs+mSTLpfVRgJelZE%nG>0ZH`FaB7U(fU7*6GAlFb2la*LV8QUkK+SJ zMg|p3M%o<}yT~17_@ot^GfW@I)eu)U7}~?zovs4?JU22h-+kRoA7I~$H#{AugBln> zyoJ*obYYB#F`eNCW^f{xH=}sAcP(Q=3KY%IIERZh@D#|>TwxW;s-7#FfGX=(Mrv2FRo4SY@Ig z#%F0uDzc6OHbx8Y1!>9D<tJdIK%7C=l& zLLnO-wbr>TNt#OD&$u`C!W6{CHP%Hn8R8MuvIUii|j(9p`SV;%8kaTw=0`&Nw=NiiTIi+yL03$nZE;NRdZQ!}ein zvK;hqj1`0f7KQJgnazc%=CbLboB<_?IMM(?uB^%rgTHv|Jm0ohr?xk#sONIOh#g|2 zEh*o45f->=d6`t(duT-vZOxC<=jrdDIk>9N3J%aU_9>e<_1E@dcfyyX_ZBWgdWu+8 zO0=G=7IZRc07cv`1Zh~o77@-Vw_dujMA@WKVzGtdxvwYs#D^b{Kl!F7LjXpj&)^M9$VZ z(|{w6Sc7g;d!&6MKaBJ0(uRx8&&m%&I7&)g^$+Ax@$@dvU@ff0eJ5!hSy3@B&VGws z89FSq16k;vxk{`AGXh7XZfW^iB4Bx-I}!sjc!H(3g}~t_DVGP&mI^I}*kq_g9%bn2 z^G*PfbirTYoekesLe|nDg^Nz)bt39ziyl#;qF@v%;!oJ_#~Q9 zx-xOqH_M7ICE=b0*wnavtj<;pMWx z7HO)X$Fih*_pjs~&_*nlvc!z)A*nOK4gJAg;UV=u8qLaCoBi`#zKsDL2QG5)PB$?M zInGt|Bnr1@vd0EorzsF;noYsj4S^y~^5gY8f=z3@lbEB$rH=_-u!L`#_N}5k!Gs<( z90m)FQyZGCEeo}gy@nv;9eS?iu=+{JFjMS)fzZi!9&&bY`gEq)k0+h`RvL=21Qo=!FZ~=1w zaSf|4jtw`FjWAKe%@&}-`~V&Dgj&CMSk2VwNoouK#!G(y*EZDd5Ok|nn4@Tct=@A! z>c@7CoN@!) z`ZNYMKT>XkA6ART#NN!^-O`Qb|ND-A4tZERN*Y<4IGX-96+@*8l-diWXrZPtb0?a?(4#!)cvplZZy1(7F-0oza zxxjY_UjpG6VjuNE?ZxlJo5)v-4BO+dnVsKudjB}xHZxb<<^rqXRt=gY+`F*9S4=sR zwMvg3C%AM@S>MEZYL7-TckT2`wXBAB5A(R%hQqbnmE&|sjiNq2BqwZCjnkZ8P`KMf zPd$;pmPK-SvNq?u<2pSt5x;w$40_?h?&M^>xkFqHuvk90*^UI;>}lX^9QNvAx~#u6 z|H(vN3B8zeIP>I8w-77XD<@2~%V&(jd?v%vB`7HeZVkXF23x-%D+c{NOe5$O0pYUSsh{F4Vu36ru05 z8htYD_>(MJOggp9?WyvcwNjKXaJJQWz>?80;oC8^0Wppa=TW$wzU?ej(5(+$#h+vU zl<2RSwfw%hlSn9hGbc`Hsk{nfrera&!GeX4h7N(B#6q>R*m6!4)eKo0IAViwklw}u`(Q4%w@Lg(5ln)c z7^B*QXl5@v^h-nWL9=Uv*AbIeSVqalX|xi%MyoEF@R}dFgA7bZLh*x?H$Yjo1F$L!(R$X6r@xJ5!lmftXIQaC(j1F-51)KnKP>{ zi5tZSUYt9_SeaU3iC&gH;=KjWQqq{)_xpUDhWqbcoDtsoV#pjMv8tBsReaW}ayAh(O6KdD5lGY|e}Ra7d?jkXM{Y79*`xkV!C*LIT+9fh zNIKRE>A7Mw4m>N3@dco{=BELf5Cp$D6vGPR&Uti((w#kEyEgb zsvZK(=g^OC(_Ks)d33`uxBft^tI5`+H+VXcU&&BB8F%TE^s|L#Kb7R~{KG>Eiu(M_ z#*0Z>_Mc?x8pTl$xI4i^a2t?L-L6RkciQBOH<;_rf?T=mDaRlJ%OkB@S?W#f$OA}b z-CGE%F=51u31{lfxUHf)B=+kBeL z3)RVlpy$PW=@QmQ4l^)}t{3te3=9?~Jp`R1hS$BPT;XsM6DD=~N!Im9`(Q;_%p#jGp|7$@r1$oAvgKNEXWGXVL zcNnz};iexCPvF zEo`rr6&K?$QzF!C?#IWW)8n1X8TXk`rlFx8wJ8GF-@{kI;a$+yJNEgDOVMor z3p6E_q?;@+_Ev#5+dC3`<+zBGUC8@Q>J3$h9dpe$(`byWw#8C1~jQ9yNm)B{y3eBasMITuPqc8*@d61n2f zf?F9lVAAwpEJ^pX22tvlgj>-u@&dWQNSoXYj??WiDuSHZ45tW=0o(AHwFk|CEJXdn zzeI#gAqT4J6gs5t!>sJ)F;(#H`THYPG0K2g(6M{803Gbk2d>t|(jEl+IEahr%6RHy!-0+xozP{{RsCh;=%~wjBQ6tw$S(q@-mD-vOw-sd2qYaJ_AK zxyeY_EtZeU76b7jOMFo&?du*z>!3Ec1(oX{+`s)(iV~ecY;a&Xhf#XC?M5$WJVumC zd_01cN;yd{q&(hQCq0$SY<5sRm*Y6fc$x%7L^ywl(JEWDADK=}*?hN@Y}j;hILTpD z^)TwmMhJ^dAfkR3mG=SP{CY?S(;o-|%wH&-ABS6Q10(VeDqx!3Fo zXu*0vA{PM3AeFYe;9i-c4*M#zl`0Xgeg|pwXh&jD?wJbF<%6~yf0@j}yNOvOBXKD;z(bX|PNt#fqP2btFFca6T)Fl}K>8MTF%)nMKy zX?5j_t1NsM)_SKdX{Wiyc4js5)hzEBqgkqkv(MxW)wto|0Hm?7Lr* zcoviR3&T`RvCU1WZXkrW%8Et6Y>tYldnJ3mk_QvhG#$w!ePYT^qdHtiyXG7iZfPu& z`0TB2U>d^?(^9G`pGD9&wBp*JM9);sX7Pel=#bD~|F1MIRaPclH7j+g>*3am&*RBk z*8VLYmYuvXBcE2U>W!g_Ey8EHwa+<bh$?DzLp&LC9_7`rK4iiE5bOW-1C>2AqPeRTDzgiRy!Mb@ef^ZX5| z7`IUq6iXp|ttpSrzNPRVN;;m6iMLr@zt+pCjw5Qy*W76@s%8^PVOk8pX6c!9r&)bV z0hYO84%7hF&7nLf5e2S*SiQ}A>c6d25r4IL5pw&X_VYy=mCLj|PP1Kn(jhlkn-_$#?GSyQuS+A8 z-ioReE-nYj>58FU@_CU*~a#Vt3@G97-%wbh}%IB8Xa(TnZIy#fv6zQ z2D6@JCBbjU>J`3)+D2eHtulGCgN>-{OJexc$F7nDV(*x4@%8E4oplqk&_4KY}_bt12AW3{Z6OzzAdB`3~^FuWQ* zeewLGs-&-7Hh27S_1gNk{I}%)vf`7rk=3(zFtaxK@711?mczQ@Z?0v#ycIdobVeyC zBvP^POQdqDLf-g>Nf$}2KSb7ODSGsEo(2>naUyYM^WJkhJy387xn{oTL4R;wTG*gT%Es=i+Ck97bv`~4ZE3Df(?4(3vZkQ+OALOd}*tBTBQwfe!# z--CkSm^LI0z*iZ$d#MUD(EIR=nI_CysA#*|>J-$sS5vk($P<)ZmX0JO1`nltXZNyR zBh6TgG#Hxrx1B8*0QPx#TEfss`k-Zs_vAj4|IgcyztRGSZ-zC7aJkGcZ#xym>T+!x__PD*s9t(R3a* zdP-ESh^Mf69dtkn46{z1wfMJV963?y$_*nVfn3FM$XtEEyJT&=rf_WUPA#u*@OdrL z`RfkCp3$lNp@gAeSFSC}&DmGjKx}#QmMO{)c?UH3gXGWqYGm$1Ofe~(5edQ&qwsSM z20UE=og$RKCv_Bq6MTc>qMR&GUZB(2n`BW`-IxkVYu>`9`aQ*-R2#|5L0G!5pO7ss z7k->Lo!pgI+m*+k#oS16&?VVm{^y41!lH{~5fK!-CJ zC$!p0Oa>xpXx%m00`M5z1)Z#_Ic5Ob$zh{?d~-eJKy&o|6XSS{a(K*5J+p9{sGGTZ zA7+mhsUs9h?!;!c8v96!TPY><^g7>wG|G3R4b6b`@47-~XFpO+)hPRFZ_9k|Oc5OI zhud8{8Yy<^_{4-iH7ynBynYRt=9v$AEcC;%mtYx7Q8fWtr`7N5Bm0bp_XcGTM7GR8V*QGzrUoP()0*ofW>S>1v@O6 zQ{eM+Ab`bIdiMP2FqzMQ4lnHM*bM3Gr-<7bwWga zq<}A{x}v>HN$x0u(xkFRiXken8sv>EF>08oWeAK8xHV}Hks%sEr?mJ0`1X2RvigUU zX!lBjR;Q&11-9Lm#qJb;O<9_s^NM&n*2h~nP)_j5!rd^#t|1{ z$4JpQc$^hEa*YI4IB4Ps=RZ`9AaB-7bV^X)*d`%SDG-28)Nf?fKsvEenPyYmdd4$P zqW}O@cm-1)1{fyEL3j(e7CiBGE&mvezQ>$Rr}_Nb^`QAUXEE3f3;v}j`V`9|t{x+e z+!g#H9Q-bZQNZWI843v-V>Be@3d}YK2uAlCF~n(14AHqcW<^j$&lRd5zCs~g6tzpB zXdkw1WO6Eges-^i3N17qv&NwkEjpZ?%zC5G7x2BES#O|Ank&hI&U{Pot$f?thyW1G zp%RK`C)cL7-D5hI>OxA=GUr^^g0j`u(fjVWc7c|dq<_+XcgF_f$i zTshrK4`If9};MjB*s?$$ERJH>w zI&N^h)x!qe5@t@UW4OO9fB0W>bdd6&o7q2^A^+cMqh$WKnZZ%d(MU?q!1PBa@!xZU zDuiRg;?D?1w_)69HZ3q9k)bLO3E`-ZxFI4jKCdCTC}0Q_YwBw%w6yUarKO*r@1=h6aAjElp_O$&Xfa2&YDpamM!u<;g+hF{YuV;`BSjC zAAV+Gvj}vMAw_bGe7zdx!;9cXxe$6B1g1?4wvlK;fufR(cKFFPdZ{PL;l_b56qjg} z4{$@|vzive<`uQOZIYTcB6Le@HPWP=_=qf!Ry^?I)(F`(+9e%qn5iv;K^j&qlR@hc z=<$BLx}NlWRAiYlGi3x`@iXIy(CLk#MW77o*H++kf2I*{-30DCXLC}DQw9>Q)y}kz zoPs-cecIgvr!Awv2zNs($hOcT;EmlqV@X^n;hocWThOhdKn;pKT32_Tg!=U6QKJPn zeNAl_%VxxzS&%{m{cnegQrfAnBGcOGAqs0Ts;*Qb-%z2=EqQfp5B0Y!(_+nW3C6tb*2Y} z&Ky2JSg>A+alK|UC>Vy*PZ@I!nllWW`GTXjV_o;lx%QXJuIE{M zt>5Y<(PV?cJ%J|*=-wv{l4doCR#|bVIb2?lCRHnZSEsx7S)J*oNI7)m`Z~J z1s*gjlCmevjo}DG+qrfbe6fFH!Snl^VHd$~2BQ|XsjIfCq>|?b8A;i5JoD6@?e999E+9V71U+DX zSqt49shuCMdqF5pF%A(ClNvG_7l71zK5}02lP|%FkW^2O_pn2xf18KB|nuARlr@SR#($`F1 z_^$gjQKm)4;51vKwQ=Ww$0NpQFogOQlgmv>(nXM)(Wxg7>Wj;c%LyaJ6!iF_KN2e#tfd3KCv_z;9?BETG4 zYrI2KxreHK9o3MH(85ljXJPly0v$!=#OAEQ+egjvR=w1y1tn5ks*%`9Tyh_zl!&yC z6Kah_NhV<2fmQG;as*5P$|>%IW^a@53o+_77Uj5cRuG>hn#X(rU6zBYg@VhyM`M(L zsz0F`l{%K3Te;L2v8&T8U7bhV zeMNLiCfsX*_+j8Wa(7Y%yXL+ z9|<1m!MbxKf|$4j>50@28&|C8;ztB9lWv@*;!O$#!3p6g5w+PdPzikUvV4s%IG=_1 zNR`8OVl9A{YO)Vcgg_2|xb!@!y5D^^CrWu-Y%cmI0ZB8ZHK0?013&fMxjeOI_mep7 z+&Cf*b|A;}Y;KJh2Q{qYvR-NGC#nwv4;PGXD~kXV5!E#w)TK(H15$>wsdtEk-3S>-c^{vUcv@F&T!t0F%Qn)hw8z~xc`o*4;C#9 z9^NI)h^S_USvMzaNkp$+2x67gC#xQy?Ldv4h2)mSz9r`Qz4<`@H1qSKcw|P_YgXX< zEpt~y-~(Dte(NnY?rzU$%pJb!$jvVw|I`yJoD#cR#_ZloNmk$DhaoG;Z@Ov`H&(^q zc9cdp*u|iB6#KU=iqURKnt;lMeIAo?e zyoz{z42Mwf@p=WZe_URKIilo}*>2PCXg>z&hK|P>-ZlQ<_$hSvqrY2vmxJn+YrJHx z!T24cALO19yi4)G=vA7$gy&Xjn>%aTR$2wF0hWPJS)&WYB-kBDcC)to)vZr`7CZLbiX1#D)E(kJ4;p0 z`^bb|L}r#(8ZAGZBdF$sTgqY<#uglCif7h#QmSW75jEdGp|+uHXNHfSJ5oqLDt4q1 zx4p!|Dy+`0UyD}G-xN5u$~4b%Ws{k?Dh*$A&8WJ}gK6$^j(iZwMCD--1sWoouFPmyKTYMsT|ly!RSR<1>#D}I&NEQ2qldQfmK))kF>xNTCe zC9d`5_~U|4Gb@BLgN(AEHm9i33=|<9NzJZI9`imu+C`up6w%hUnX}#PC{38C`2ECK z;a+rVGJ33DZHlKxUw$SURpLM*EdOv$A9zj}Jc8~dlSB>N*od?gKbA^+EOOzABTPd{ zCB=~NcWytBP;&4b1Bqbh+)h>L_G+L$q{T1*tAIgs}5lf$J~+A*KBY9jy@Ny z(}Iz_mJ}m}f{QnO(j#${m#>PY3z}DFMf2GQs6(?+wzgR(R z5?stO78Zm63oxA~YWg4b(1QH#A`vGADo-&+B(zMfUmcH6nJaaIhJD{}6vEEa2`fOL z(CTh{{%knmcj)!_e1PuY*|I2%G=sAtS(C2(qUL2@3K9!?ow|yfIccvat@;_YSZlT_ z{szV&$^7uNL7kYS=TOhRVmr$JLno-^&g+XV9 zK{Rp&tYe~V*KB^j^Ztir`!DB@ABUcAwnxdn274f>zD$?dqqF^>XviDHIPb9}NK3xD zKXMT!r{5#G{BsQ8eEfdomG`S$Oja9pn{ypO~BMgQIoGJAWxc>-GR(u=AvtMw{ zzONPY{|Dje|K_UxZy;f{+8-|zH_T6OH#0ZZ%rOBZK|v%WbMj2M)#7A4@E;^WM6UVb zpcL}KV^_qOE7=-mrv5t$=c}Geg_Mh+Ip)>SbKshu=GDrTsy^?tZ+bIg`1pP|w?1ZO zW^4@kO>+0#9^21eUC#_}XMVXp-+FD_X(Ar&D{fd(FtYUR6Z$A1=V4`;+~EVC8QpWE zp2ZY&ydU&Y@Oy<|c`=F)L(^XEQNH+u>8}`pp?|iByk8x3eFOT)Fuf!CN-@1d`U+ur zsrH=|s(usg-zzxp!T{W<1Lzn(6v6dOy-5Q`F#Uo#{F<@kcC1m3?Q{B;jlFe-*K-k3fPn6^F%XshnA9Vh-P_2YIa~E9L@{mi!x@qltT>?a9<{e)=V+-`t&( zz?r~~BwKSY=mS41W!&jGS)p<1%2lw6;`_Drq%4YTP!{j|j`CHB`MKUn)@QbpOtqdm+sOg&{NJCGGS$_)EdJE zdU#yU=I#vL2|5Snxytt>F+MPrE#$Fzi4%!rG)$SeYV#vHI-(I2WG2wwOHM*YjTH=I zw)4>vduXG^7F}8NQOc-qsQh%Srp#NTt!vh z+W0A5@B8p(8?J^=P((PHMxa|q$HFwdrf~h?>@s+U9F;iFO`Q0-4wtK_?BB|pzL-$Q zIG7ADs+#NhPM}THaiLJYr3As7(699heWZ|?n6UIK{X2M&T9~kgnE`~>2pB$*(D|JW z43sOu2AFabFTA2C@4x%FZfPO-21PJaQQm)~qH;%LLWE*ik3g3Eq)HnSfl#Z{>r>$# zn1v>?*) zEZeb-Ii@LLNteI3^pun;nzWdoMT$u;bafCj%(R$kqsP%2rbB&)?kVZ+;qQRD@Q!pe zloh_h<`cEs4l_G)ptj&@owq-J95EoCOgW!ohC@0_rp#s?ru5P(uYKHZLNbxyQsyOC zk}Us*Zf0g>{W4?tx3R^!nO)nXhGwgltbvndLBE^-S#Wg^U0{CWt+-PqU68jDJ+!xB zrC>AjHIHBG;%4WjKvBqfe3Pl_=sqK!A~tM%>F?*}MrC{S{S|tk_rTj_w+IZL7*1o` zPzxQq$WqtrH1unn0&XZ}KR$z7*I10q6lv;}s+_}Ybo!FRBv)M|**e_Exc!9V8wHIH zxhaVc!Hk*ICO|a^3D2mFd3Zo{!O_6DTYs~^eD8{O{d z=67hT`wJet-6Q=Z2s(VbH?eI$ZAr}-})HA4t2Q9Y;9m* z*$5(aaLD0k0Wxa`Lo^J)mz6fq((y1a;K zL8Z+7u1huf+_SEe2@3)~km*D+-9apXuxii6_{FboD}sHHVESGp?o;V#1$K?oHy@su z8QktgQKZTmBZ@)|YD}Xn$9)CDhIHv~xE<+EaYQepphWn{Rck~72d;xKGK6ef`dMir#@77_hq+79>RCRxumq! zcdwq9%1+HYBSL&nK{M8;_)ps+M0J%BXBX(2B~6G@mB9Ub65T%iHQy88-{}~Sw$;Nw z+wNTBWfu>OSmgvG<>GO+Uu;|DgQOfz!L`r6MTp0}B*iyf7N z$0^OTLn=vw=@InQW*Yl?>d-G03oelgdR!M`A7*bxX9p~Bi3*>gPKo`)0QWrQRH7c^ zIV7zzi|7))I$sHnQwQ zC|f*Ff_Rp2slB3xj&irMWBZFsU20JPnv~5I=U}uU45wT?MLhcloRmjMl*f$K0oKd2 zwlL(O?9>PH7G#{`da3z@jEA*A(z+ndw#Hs1k*;UVre9lMX@&<1EGNhw5S?L@ZkFUW zgmAl|+edYA58VkC;DM`E*9CFZ%oeX%*M(aus_hMkrH?c(Nqgkob!}^o6|xoH9ug%U zm#sY{B^RY|gU=J#(973utkq_6qz}^rFWHv(={4RANk_C=cSUL2`7`}YV~-`@i>_T_ zA;^T8g)(#bHy1FYEFv}jQ`6i#8PF4%lzr#NLKOjFI z9B>3RsYAbfSL!k3C(*ki0Odg5hY|T`e~cJI`MwE;g}t;L%m^cl+8=O4&@m(OvB-u@ zSR)cy5wq(S5N0TViXCd9>LY2h#|M<<`x+Cbi_`h)@TA1)68EJ;*C|$tO!ZNB_UaZFY*xsfKDE5-!gYO0vO0#b@ZLS@jQ8P-g{3wD;4$g1rPvjS<7 z2zD3GDoa-N5mSRVE*E2;n8_5WxO;kz#YwmkuKqdP;5lHI{(&1n#fYzKeW)ukLi2Sy zFjk#+mg&qYmZVG;h0v`m714`JyA;ilYy$={R8v;u7zgK+IH$wA3U_dXqNOtC)JAbb zHp4^R?A&#$l!%G?dEjiQ6nf>ecdz17EhK3VHS61Xt0M;&IW{hJVWX!&Y-xu>?3-yD zg?GD!@5g6Jad5O@+X#Nr)?5MtO`yRz)MHXCOVc*&3)IxZ;50n6jzi(%cS4F0)@c!n z4VhZX+;K9Mt@#r{3!((n7--RGQ|@Olmz00!21G@`(4%N8J3y60KpCT|Q#!T*>kI@A z)N}Yb`y%sDRBcdyYD0LSer>>pM0kZ$P%G@AFCH{@v^7l;tcY_cC8)qMcQ`c_Knxp3 z$ETYbLg$q~I4({7 z$J2Wp6AqDCo%m~82y7(&Gkwht8M-COWA+VzczGJ5{9EG^@I?aQhcTso8=+t(EGAM5 z49VD{*kVk)YGOKfac)tY1-ZxgUOg^5$pG8Y=I}&!tW+ksbOO+P+WM;C;#bO_hO>6j z;U=-FlX8VbnywotA}^WDD$#*-&E0oji?s0V1|{fdxE*-VZbMO>iT5>o&tkxbISA>VQSbSrBQRzJ5HJgtR(+nq*uHc^$Dx>n#?^ZXvWksGYZf8R^} zYyIjP24?HTg?V&^=dcnZ!A$|ZAAPsKhs!SESwVZ4*vDLSR}h>vJivRaSMBcfaH2#S zjHroAHmlHlh~l+?Ct5bE&o@g1ekvay3o?J+?1Wu`UB?PD%~?;Uq;q@-)}mWDH7LCG zbj=eTjkhQ^d_Mxj3mIY_%Z$)v9eYC4by2LOeROnb zPvuj7xZ{vi^61E*ln&GrKUy}KBRPts_vRnx{`?o+HNwQg%=ruXxA5f%`~Paq{@4G= zzb<-nM>|_P7pH&M6aKsC@!tTDf9eTwL{L7kTrt%}38cgc0-(1b9Wm`BPz;gK{H+@h z;C}cIPF&1f$T9-uopztNyl43k?l7eK<|sYx`#$$850{xH&?G=8CJI{KfbEaZ*-jmQ z?yvRyzTfbsIG*&AVTCxE_lm>F?q?+Ms+^rmcH|djVu?DL3*=)Oad?N^;*ip>256BV z*<-t9C@8*tv9VMqbl`HWUIgghof7g%*|Z5cwW^QLo>O^I6T(M1J#KX8mCrp0nSk< zkE)rz&Art(f-z;nWgn&-q5%rLfN6oDdTg0@Xd?>$drOwRvf675M5k9o_JmN`8Mr5vQgG7IVAzgz~jv^)zKUH6CBR%^;Q^$2W%`f*Vz{)#_2NK-b(HD znbAi`<_%%I!jr>gd8`m#03`9;xqF~Q@s==4J6B1?={Bq;3mc^R64Hl zyi;b&>=U?I2-CXx+1Le~nNsBw^BeV;a|Cm*o?Js|*%XNfY4{l$BHF1_=+e47dNJ6K zXimXEG$H|W{ko8uyk!u?oYJiP>R>+IEv%&;OLg=!b+=hS^eh>yn?du-?4Be5I zTi)mIi{LK3oAFrlb%D2MbGbwB?|)@+g=7U5G#1dVE-{WX#0XbMBuoIZu4yQJW}^FG zg?RCbS#iyZ$m30zSytG&M7VNJUwj9(-nj^8rawcSj)*5-?fh7hKQQ> z7<^RCT{!4<0~F=fnB;|=5k`{t?VUf^a0nfQ2NCDZvX@x)R$kC?)Dm&<|J`0I*0E-& z_XPtv{%>mP7J{#qB2?A_B!4KTcIY>EN}bPX zYE|o0ZC2V;&wTM4D2e!G&jUf$}g7r`K%58S?V4a4*tX)0bXUt;9{8pIrij*7H{z; zEr!Egc;ML?m^cQ~O{eUew;PJ(TeLd@EvmJgF-3ArXLo&~+oDLg;o#ps8$}E>mMfZY z*&EA23$7q>WjxG~a7#`X*U~mFc}<*c#No0mR&1HKDPbiCUWKi7#Vd1S)+f{)K5*P7 zp{^QNM+;vX&qZ{!AfGzyX|)i)64^B9xI(#Z%cr%6!ZQVdYDGRB{UWqEryO%H*CFRn1c~nR1v_vndsAEA!{R6e5vUYpbMIr)#hu>Ylfz|nFD1cxm#_WbCQn?1k`>lRV+DCoiL~Yk8qVJf>IY4 zW|drf5|vDwol6B?OQgh>oEK&3>L#2Hm~V-MZa!H*)m>jIJXs^Co0rm0gU(O8fcut_ zdxZG~dA0XdYZg!Ah$Z_t6SM{-tL3i2{8<58$Li_XU%cg~6KF=u#XFV)7_jdugsxU=%6jbNj9F+J2e*s#)mq=5C)pIEX9!5P;%3$!;g%+6iE?VdM5!}Xqd@uW z;Wg0i%>MMC3agHlN}38pJAq!QTy|Z@wluLmD_1Loc0A5uzr>sCpg_3)i~-q3L4r3p zay)(fm3rjT>_E6{AMk>$0t}E6%c$??E~d9@qkUjOB~#4^7B9r9T;4M8Vmbk!EUqGq z9Ts~G#3Xo|R>-0jPU6$HQm2*GaHux%QHB=*STb(z<6PQHtPTyMIGUKU#icRtZpO-|E#0Sjrw@zt#P7KaAbrEpVIRVr zNvGy+sK9zcZ1lT;0P;%RemiD>^-e3}J=c4V-AlZ1xIfVF*8us^=ka&LcAs#%=iNe8*r zTicgZg(H#t*q5TF#>GrlAca_-U^A8%L9VXDrQ)hV5b_8#v^tEbpdDvwy60T46)o+7 z+qMptPj6y9v?}BXwYj6E+LdvxbyNRn8j4cpJYTPI)o4X+k>a z?yxa2^ExgEjunF#BR-!$j6-(-F9I?TZ~tsc1zckZrszCUqB}&p0*m7A_wxK~Dh@{98`efTrM`^nmsdov=F$ zXIu!ZY%3%Yn_~H5h&*`nhtf~JfC`^79b~+&?_!%|$X*PhghWv$Icta;3dXgS^5K;X zKbPZ1o6UP&(!$SY1F#Qztf4QOM@v!m)t^4B zM(tywVk$)g5x6==Aq}n|ADNG;4OmU2{<^C&}48hN8OC zepSeo(5vkFN}qG*JJ7{IVg>{C@g3lpYs;9^wtLuMjU<6pubU z9&rTXp?m6@l+~UEelpk&9EuXy@w1BqO#1|zK+w>07-XIalARSBZoaYK0R?4%Ox--S zFu&d>%he;m)gys8rvN=i6gkJho>xu3P#j8**x-#-Q=B_rYiXqko8?bsfmb8log(1C zAbPCou3k7{kVx`TAstqA5IeBkKfaOayULMFw<5nq5d1!B#K%!=d=?G^pZ7b#*|X6T zFLTxH0sVgMDJW< zNU|N#)*v_1C?#`>8Z|^}p%J_6y)D!H1U@5gso9u>?VIA_EPEI-R|cd#l91_fgaEJu ztkDd1$M{2b7k6|TI0+28XSz2Ly(Curom!HytoB--w*S~jKW)a7`1E@YK^}D`DaKMI z9LwZJGRm+@)gS{a9GPNTaWSphvQ9nNDZMg8JTqMsY(cz;Cdt%m?mKrS?a=r1~e#V zIenQ0ggh!oSp?34D(QTnQAG`TiLz06nqpK@Y%26shhes*bGN-L!{GPXj){4Z zI#ExCwumrnjAf`P-#M;hrGHPd-%chQmA*J2kpFFB>pvxuu#bAuCE@PxDZVm-r42sn!Y+Z?)@{RN-ld~%;KR~N_t)j~k z%dUC3Nq5aWF^*;SK+REh+G6@N_DS!p@c6;(t=4aycN=&SY{Jpe#OM0d3An!Jxi;B) z&fNa{HW2%5BS?y2Ic3GJ^lb^8iOp_ zp81d=?8r@>H+R8~0z@o@J9mgFcm9q9gxpa5H@(!@Qj#Sm2kuC_(Ge%;oYaZ!sC_MW zfxbwj8xp9OOZM)->+#cP6mPwncm5gxwOFnA>AvHG5C(0-((KXJ|D=q;#=>@K7Q&Wpdz&k%#Y`!^DtV4Z z&Fu(>sIc_tFfTtmq@Lyu4+sf=Q2Ahl1on+ABX8^lx7rM8qZh6N2D;z}25*rSK6haa@M zjg^1JQqa4{0m2+QcnuX)4!+VlZe8Qjfq!rl?=e=(Vwbl0%y?VIAy&qQmdYseqs8Qf zjFew0G*qImp4QKVI)|>_;e;lyJ=<6$Wd ze;pO!Irsu^A#HeKm10UgdYdWKvfO3Hz#&BexotWGC+8)iiBh+TwY$iLjOMX11}}RN z!nM7V#wP`z-g+}N+ZJO`I+ZevNgFDu5biP)PnYayZ!M~YbWcaBF(m)>3Kk}DIuBoM zDiOyIB!9yvh!E=*r$fK9syEg^_Ipb)SAccy-9= ze|?q*5i6iJw6p(;l-(te&FI*4kw0K+#A1y*%JQc-;P&9z)+!58F?X}uVfoe+t0^mN z>qFbnLSSb)TzGgO-m{l^6u#5W#pR+^T~#a%zE4UQEMp459RFpMs|GZ)RcjX$nKl8# zx_3O$rO}q_4rQ>$uQoT*8fA1jQN-lvN=yzf%PRU56J;!{9b}(nu^tMwm;O|S-!ZC8 ze~;$YS7zg3c-37dB{4)r?>roTP&YCq+1sLIPx&U9fY^hX@_0qyZw!L6IiW4Nu%@KM z$Y8mW@y8%}k1T(u)gWy<@PZBJ`l!|L2itvXsr8hoV%qjFe&@Fl%HGc(=2We{+6HY1uysEZF~K&K=s*4Z|u=+ z$_)~$j<(H)1Lh{~7>=gkiTFVs2{`D`)Luo6y%c-sG;~%k8b^ob4pNKjqHEK_k-f|h zvd{b07$staVNvf8zCS(DM1OMok9wQFdBUb0Tl;g3oK%Lkf1(`X3BceL4;!t-jFjJk z8+{P(KQlk(B>NygeB z7c*=O3i+pEma3WGIUw=)Tis|%P-}rFOfMEP`So^h5H+r&j1&U z=Xvr!Q&+vI7?oHxz7X)>M~_ZooC3*sBxA0WD40Wlu8FXH$?$=NehSMz19(+oWmSQ9 z9>mW&=sllrdunPT(#rhr$cUfsP+?f4po2Le3<=`2mE^ojdTES)G<^{$b-#2;64fo1 zaPg@QC;J+P(7V#y5bbWSNrKB*eZWf^N#ye6^@Ida@;7CPlf)Vgs~TTLH~Nd7TAEsCaMfs9sPYSnt1?o}3l&`#`HxpR zcGX>g>Am}@sVUopN%*;3zYDhQTfAv6pY2X~fa9JlNF>TjJ!lF(RXp{fbt!D8v7NYS zr_aiMD4o;OPkh?v#4TNblIiu`?q)+ z1jdZnSH^kkgzPgGd5gc%SLJcWhqb^B7k)8i8=0vL2T`ca*?`?~Xv_V7Jx3WK2QpA4 zHRH|6OSJN*rk>&-CQy>JF~UWvR3V1^OD3VYE2Hpq1Wde$OWcURce*r6oyRzqmTdm8 znw`wRjBjo{t$!tgg0Q(XFrrTq9~MNZ%5-2#m=WrHxRU>>7=HMw7|!QqYA};?b}Qqu z4Ep}7zIz68{>OQEkU@>JYe&-{$gMl*x;0LKq<=&7DdBt=TJ%N!Z~~st4^)&>A?T7O zyJc6){4!C0oxdgZQu+#Eevk6%v5~=0__j*&mhonfvIR@C+hU%O3GE7akt&+Mh!XyD-#9%*m>UxBDLswok>;zia>}7LHA~@i3eFue z%?rDU%E_vNz&m6PmVTmftE`Q#v*FP>B_F#O5Meep{Mk=XAjKRx=m-e*F9}x_vnj|c z67dg*LK5;R!P~+`OZ~$YU4*%`yz*g1uKojt_$Q@mp-u=3rRwf4R5ApGdfgPaJRt!e zypX#3^}2_+{a>hGaw|nAg21n-iW!xS@I=b1{#F#`Sd#PBs+R&0X*f~l5|K+3jr5Dl zMHy5#n25!fmWb<}PUxfD6s|-mjVCY0i|2|j6}HkHWLxQ$08jCj9#7%cr~c}@`$8yw z#S5Zu)gIYPc|^57sx+8Di^mf@wkQ8bb+bxXX&==_!wFjNpF7#*s zUzt0UufiRVuIyx(6_qZ4;ueWh84$%+{=)Q8uvaVi$+r5&^^w1q+wh(W`ze|m@u}Y! z@j2e02l$A9EhToL{ovDCflkS-FN%E7rNL}wJrEP&qKlRv)ntlD%)iJ~*G zC@FqkVKEU??0a}}i1at%9&`SBA&LqJN>^$x(zvmL3+y$8fR?ZM0fR(XXVtMbn>%(X z`xcy`5k?0y)O|PptKAXn(J;5={YQNU+mR+x)nao_)m(tSPUG4InF`C@nY_TsgXcX= zY6R6uW{dYpBaFr5cPdM&v1Z?(BaYw|(UXQQ;qGYLmEqe8qdeS5?abcHWXPLratV4B zml83TBZEdeGq1=a<(Rbsf1eotbhlVK1ih$!I$IOHr3&iHChj%FTC#8rGzQw{8~)Vt zV2i0arkV^{9!tBMVIzQr;=;)}GTqeZS>rbDYBHrwt6aI0r9aaXor3CYMoY}1HxIM} z3`BZqG+CM)9UDp&bks!la>DGl4L#L5iAFDIkJ3NFq?i?qlMTczfv%A%nJiOBn%iC3 zyaY9jRBqdp>WuZgz}-Ywio(dh%KBAkZ`Dho5B76&V%^cDKF6p@W}LB8#@x1PLGA+j z(tFu8-yPhGBTf9SB{`p?R>${5`^O(G!P>h=X?C=y(4?>9O)^Pp;G?#2Rc8;o;=AEI za7&hbojtxFzD)6#o9>s=MYkKIlXf1&E%O*NY7gcPQmqhk-5Zng8KWc$9(IEZosM0; zaBnn|zUFI0P*Sn0sepGMUOd`hYjO*&aBj#IQz`$O8z zd0|X>#3z^`j!})jst!+%(N`epwxU?47GP1g!lbM%tdDS@QsWiPOCduQP?QzPzlsBI zq_^Sq=;7>Sjlov^TaiXdlM<=}ss-Sf7YMB@%O=7clt-;`Im?9OX=fE&*-U=Kxz8m2 zI^x<{=Zun|NOC+oZlZ=@anI^u9&cBvPmWalpbS+=7G!C)Y*{-VVMvEuE}2tcB>B{X?Sw8koXVWw7&y0J{x5Ki+d z>O~&5O+`z9U3w$4uCX?8vO3=#@5-Y4W!9~RPoa{x7_A6q)pGonkK1;->Tjn2H&>hQ zD$@rEfSm`RWEh9`@MBFj8Tw8Qm<^1?p9X>fW6#5HA%R2DKXwVGMr1tN=k|^yVOn++ zxztv)xw=uAhmh)b07uLt`{dosH%+28D|y%|)xE_1sqg?{Aa(fsrE_PdT#Sc9Y;u@5Cf4DRJ@N^P(g*1q zcd#kN|V^|XA7&QVQ?CrzAO4p^#9sv(HCVO%KYt1u1PQDWkdQTnerC5u>Bft5z!-GZ{{mKJyeL9{d2> zxUvbrTzjuoaQg`XKt#-Bc>CNdCMKv@xwlsNaIDhh5bll?8>ZwXMM3`zCV;`cIr<5j z3gDikmb7|9=`?&B0gx$h55?X+j4?2|D`5tYRB{)R)ei>OOBeH>Y_jmht71e?u}~uW zw-1rAPfMlft8O9lzh%_^N7~eXjfej4)!<{GYoOI)i#bnATTe?* zsUP3|KD+^ewyc>q@eqD1>Cc|s)6X6`&pumbPm7;CUXZ;iFR>x0;>!9Qu46>y{c{L+ zVv3ZmR`Lc?Bk?JfgwZ^AC)j~s1b%~_5U`iB2rc8uYD!xrht3cz{GFe0_ygHS4(L}Y zS0gIkf&FbCBLj1P8@Tb}>uX2%6+CcKM$}C97(BdX2KHY%ZmCkHbVH){>~Gl0KwUt2;t^oXyoqfmgw54M7>HHaD{B-a~S_wpYFEYFQ-HMTHIZWoTC- zeSt|R!M3>%VdvmI?`LJ&Wl*%=6nWvJ%8nGMoeV?Jo0v5=R#}g_jFc!FadXOL?}Fp~ zWrnKU#_T+RccyGFgBWi)9pSM{!Q>M(gbv1!#8a}4)>c_khQJV?7D2HFPL4V9S>_dR3Q}SOjExt@^XQ2I7NyBY`=nx&_ zVm?!kW%cD}k(<91@yOnFo9wEIF~ZRAr{Fa#_-u=T-y_AH-U*5jz{Sj3aDXmF)t2l1 z@r_96HzKI0YCVVGh*o#akZk+C2zd{Ju#}-9ag6)*dY}&5`HZh8VS* ziU|CZ7eZY;Qw7@VvX}T6{CzS?-->;fcj-QBGLQ%VUonXYd$P6l^FR*4p=prPm zD%>7XAvACI;lwaM@e#W()l_CkD@Cf|&zr^w_Dgll_U<$12f>M7Qubf6L6>(8O*_eR zy1CcNrjL-G%9qd>zwyzYo0OQ#xwE*$8N%w;TRU8;`iiufoM%oYdz*T;aQ>G9LN`50 z+hJJ`#@JCro6c$Nv6VC$#VKG2#R@=#aJn07ZD-X17=jlpz(WW< z=+0eONpsf3N2Lchfzi>+ix?jTO!zL6sK7|CIDZ~l|7j@-gQ3vsk?2j)#qojI56QKI zn4rz#U#C}~kjlE?*~p;5BVCGaiw?dfzTRqhPHW+7n?=a;0mx$DPh5p#QKMkMY`olPFmtJ0ub)cXBl)!^YlYCB!^Ii!%aS7r?0lL|=`OE;QK z+zDS_S!wV;He$BW5ZI+S20O~0{ssZ(a-59kVJTY8Mnb9r;cuvcCZ!(Z4TYhjt7>UT zVn`}-efLYMtE#9}JQ1hw2l3E{M!RQps|XO^1r)OHSNZJU>42<-iw-vwB$?z*hjnZG z3i(QnVJuf(LfhGjw)r&a;?0(=rgf9YTg_VMfD*PTA6z%h`KvmT{RXLbs4aJg($zh+ zBof)JIFwq)$c34O>Z7Zs)3!`&s%%SXS1stHpW6ovR=I~6v;8j2UPoNDdrRkxMjLT4 ztNO)>+#aTmUtMkiNDSiF)QBFr<}IfsmqocCXsDPHuc&G_1FjG~cT#@@rY91r=-@FllmT3lbzH~2<0C3&8xu}Pfs zJ##XRL3(V`vssx<9=t@%1=eKQHawZ6g00_)O&PO-(h$|oa^ZDKM>7?SQ@D9kYx8MU zdEwO*$Mnq}9{|{`0ogGD>h#<`X4leZq76srRNRrnMJ6<3dx#O!r$TEFae%65ZE$gX z-^I5+nB3tkq*3`x4&daDBtz6Mmr{l6SSJhj-^#QD+E}-`)F#eq2CDkDFqSV(d4wY9 zD`~K)RL}O8xZ0bc^iPV0d?vQ}3*W8+v@9-cn6F)}`?9I)t_qy4N)C9mU22bWhM3h{ zC(r=7C86QX$%M%uxIb`;4cNfE!8Vnn*@e7`R=s=I&43v1E(cFbSX1I*lmnPR>~_0h zkGf~2n{QXK-|wF!O!6p+S@PgZel!Ue7^xFW{`8Q|@%urk2lI+(dBnBnRw&?hgt+iv zWO|Qy@;7bC5!?i3ijf$TntL?N*j@!PGA0C4J_af+X2N0!7AO>SO zoPX!5+Iv^6^=JL)RkfLuk8=krQtFUkL}ai zz7$buj5!l&c*C%(zCvhDmq;t~&T2Z|88b!*GpyJnz$Ogqu_&@fXz?pr^foC0udB!D zjluf9!nU~LZ-bg8iXQFpr~{`2PnPNfQJpc9Ujb%I;_7&q3iK4dD~Q4qINq6Z9wgDS z?oqN_@}Jc5o)}Hd(P(hX39%EkLd3R*NK|7;C#JKMq|A|AwK2n53GQ#aBBXC&ySiCP zu_97g)P%QN3ZduMsu%D7;W@g+M3lgOufY2L#}$~||4|4~$;9eEZ2$jn74{#O^?w(; zX?l7oKO}x-jl@U-VFJN=afqqq$o>8f3nQ`y2G5WZ3L+9z_U)6maHirMZSJU8FT9pi zFTR$UTUV+WE#&>d6RBw3psTlOa?$fXZ``=3a&dOGc5d6~Y%JVzJThg*BL6)taQMX8 zwRP3*dz7*DF@EOjae@YNx4**ZaU;fM?iza%fir{X~ zoj~#j#|=HE%*jW_19xT>5-;S21}F{gDOTlQOJGp}tD;ip=j}o1_ zYFe~<@vKtR#_cJ@lxajp=h~7(s@SH0XjRJ-;vy5C$htPmr!_tgTuuTbN~Ck)O zZy%=57klt$D5HGXvOohIHN4AI4$l&UtVAkpEqb$!+yQVQIjkHak*Z``q25b^?!3bDC)*5yecu;%fa4Q;j#g#CJ zTUS$uby)nxOWSDJa}j#t9>_sER3PkgNJB;kw|a;}WSK2I-6={(fE&6aM@yPBjpIO= zPjP8u>q@gBvT~{g>2^#vlx(`zCbGJJ{MkKgu#wk$hO*40Mi*b)(xBCN8&Z5Un%{HZ z=Tc6C<;W-Cb>9#5M4={73V)RI>h*Qw2t0}zW7}$2J5gTOwg$K}7P`e{=lf$X`(;8X z+QBwU1n+wV0A79y)03)e)&mxb;M)69puMd{SEZcH+i_Ub=U0FgiOxW6(lh6In_-BS z<(SCtO{TPQonP^FeNP&|TY{ct-=U>9CVE)h*{P6-X$3j1nF!BKmC?Q=EI^H{slHdr zWgi`O@FX0tPsWxY3*|zMqSHJQV-sbUA4SV+Ijq`3O$sIK5x8v1{-g$(P;M%_h{*PV zU9KR25Na(^t!*tK70t7Y-Hg^0L~1?EzB0M}*@Mzf#H0MiW0Fin5N`?Ff?kbzYd;*d$SGzJIsQnX?HCyv!3X~Vvc{-P{l!?yp86&t?rIEHUwA%5(L!M}-N z&sLL(K07ubdjWrlD?&g1r)idF{8%mw*se#R!U`$=JO7xFd9G)`9fvR$#^x=W6E%mQ}3blpj!ex0a-d(E*&5G#B#lqU5!`*q+={O#t6#G&Iiv*kp zM!J=^z>>cpP6!lQXCL4`7*l;ZvDWtn^nOnBv);xlC6J><$@nth1Av9gG20+q8T)J( zvHh~z$}o;hF%F^n^IjWo9Ikp^uU?)s)Zv$$J{g+f>mxnN2D%w0%uR=;3sWGQFP)RYRvuVmQKVH!7@jz^_9jSGIu0;QxDGBC!? zbKnv5OD{y}MW1)@k$Gv-|K8oS2R_1fGi zU4QMQ+P|yTuuRHs=5|0kHB@T0bnd$(6UxeQ)Ma%W6|CA{tcQ=I3cBm<}Pg`SS1=+W`Clvl7s_x=2I_LJM>T62*mpges|Rbke!*m-F7 zGb|s{klVPo&dYdsZeT-NdKK+tQjVoz)5+t7pS^CgfZ1}`=~lM|Ur`>(BJXF6eqg0J zutb+(B91yj_tkJT=+w`$jgUD5c~wBHNGz@&Bq^vbgp-T3EMX?8ZZqO4;!K=Y9^7Cm zo)?lVx`n=4HOktX)3@8K4p}Ap>L@RhO6=deaea>X%Y4)BC(SKo^Y;2T^AJSy>YHAh zDS-;nupVAOyj8Ly4m&r4DTk{L?368|JRCo0W8>yPNu5DvY4zaEqRcif>aX z!@g`oJ9CVdfRA^G;P~sVQ@SftN`rxQVskLCVdCCM+c8eXFZ0~)mEpeI5(r@48A=)% zf;P{UjXYaRTU&%o1EP3^`4}i|-Ck;Pr{2$+s!%V^dD`3h>Ch;dCV!(0*jD%=G!oWk zaw@W0UK@mebJ^MpWFhIY$;Ym$S!*|BDY$5JYrsmTaPTJG+IsIC6_Y2GNJh>#v>5k8 zb7ci_!-+O3@)c)Ki&aYUmfzqh;=2D>#Tr^64uMZi2=}VH?-YDm>#*l^X|H%L4m;I8 zP}6VAB;Zud@*+&ldEsp&afN!Ur?b zGG@%=o@ag;e6WQ~EM>=_e5f8+^2gl91444!$Jiwk#-L-GV)(oof;rs<(0AD>ePCY2 zO0-g*2;-e-Mk_+GN>)}6ZDw{&GV(-^>b-tkbpX3^&4v)3Qw}Wo!IcPjDqId<3%E1f$nf)it@JpVnUMow7aPNr@ z7gAnv7m>{)9Lg9MIY}w1wN|GI;!Lr~B6(zQ3Z5V{AnY5MF`Xn=uql;s<3Bk_0<|Pg zO=Siu@mH{kq4b%Fn%sbChw%$D#gHgMwgcAuGi}~^;RtzAqm{Om6e}yM<0CnOZ!K8k z<-2hEDN=F7d+klDJL{mVl@t9+ZT zN1&lmQ{X9IID?bvPsmu3r@-mv7?~xi@(Q=y+Bt1Hk*X%~zd9UeODsPf7}d3o>d?&Q z%Z>dw{tM^xuXNF~5jdVPrN`onaqYVE7n}SJ0z`oDfZ(JH{FqT-Q2jmd^ckT0UP|v^ z6nHsLunMmLJ~}5wZ0nBL(=iiAy8so8xJVzMYLPq8_GL-4G=p6Z)fv+D;C}tcEzk4A zfhmX^U?h-zxq5il8VLNknOEf_XXX)He#K1x?(gY4uyJJou_=z{6AAGSJo1@}?;0R} zhnIa8mJ48^oU!4R=)^b>+h0p&D9O&PWd@%l$8(M)p`N>}zzk**%8Eyij0@(&Sc~Zy zz_PMBF;boa%7wL-ik@b5tIL-pCMGj3KNy&*vOtin)2>%((I6NUxCH8~2LCF__0;+h zR*QJ%=C5rLxoNP4Uu-hFp5eE$Ol+iOnez%7h}u+jg=~;2Kwy*h7j2S-KINB(b`bG< zWo$?s5?V3pVHc3HRnV*SjDn~(CcGRp(ar8Y(DlX1)F7EQg4iB37N}BEo))!1jl2Y#hcUFx z&NF)|aLokbGC|3%db}S$HOL!TQ0&zHw}t(m@3qAEAc6_K&)|pcC~rI2-AzFQV@>oVw7YxF(w|X ztsegTQj(GU2=6rjV=m8RWc*@&{S#mPkvF;@BvuhTEFPmxY~P~T>{{jP+Ce}gLF`QT zw;>@m5RH22T2VVa8B)rTHqj#}6M3^QK_$d;G{=HI{LEvw)c{hviXv;9>zs~QIpY|p8KER1m79FcYU3I_Ulnfy{8XR_~=9K1}C@;NC6Z3_`}FRn?k^C z{5D?5sV|$iZm(Hyk-gT2>c)qZ@GCvx_^?Qy@Ih7F;Z?X4IxbaGeJ?J);6De?y57wG zt4>Pe<)3jWA_#~d)&Eo{^}mJ7`1T>1IQ?%GNs0dN#9;nc^TPl2lK-4E6a!d&dl&y# z=%r9aS_wrE@e^oOE2)kTfh34Hpw?@tf*2!$X!NH7GAY+ERF^%y^k4J2Vme%P_U=qL z2E9I7-mkGbfv{RLl%TvgYGnA6%ZrnfA&!kqfgu6kA8vn>4eGb$ST1+7BFr(FV4;~w zjX1%;Nr)nZ;C6jdtO$TiKzpocW0~O;W5^Vj+-^Kz)_q!IX(`zfqe?DIg@4-P*3>@ z6+h3uBwg^Gw8Bh#W*0VVG44~vNK#zm-m-&R%cG=Q1$Y8W#Ym8JSAk*7_I#@gvd?7)cRTEwn#$Yqp3p14XSmkS6Dy+NSd+@$~4*xcI-J?;=LdE_#JpML4zyz&|@8S)~*K7M1Ag z3l;6hl`q_4jfc1)Cl_V4WzXasRI22OvK_KaPHI|ay+GtvP0P8N_Bj7THqASi*8*YY zD&g0;v;&o)O=M{X`o{hJmhcI?Ii+dussk(!sN1wPOb$S4)8E`gA3j5gW4&&1=19sJ z_*ZO_$&j~ST>%&I(}80mef@sm5^h0qaS63ZRXO3DJN}np0Sv}_6#TsRpt7)CJD%QP z0DI$S#LuZ~X-_?*)FgO90zynEXX#+bx5xH`Ry#O9srDaWp{A6V%$deilRRNJezcqU z2sD`e;tbLDVGH7957VKfd8*9FiVT_4VZ?e%Gx9!Kp<9HIUi+TgzC9nhWPiN^4{c+f zIvhlxe_Rnt-Y5O)yXg9_VXIO!M}P3GCuRR1?GwWPhvVu$c2YMdQl|eNRq;CVD1xZK zEr6w#l*;cOc}k(!Mo5|^w0Y$aI5Y-E*?pT<9>9={S=xpuRo4g(18gX{$5k|QmWJw2 zWeKCT^T||}JN_dhGoO#oN6>EW3?}V92Y5gNGv!fCy%AXe8qjGuR`75s=Lcj89C7Ro)?wA~$TQgZ zMJnhP+S)9;*{ybss`!?JblWJHV$)X0KcjZoto@p>243djLna^qD1<6xzu|H!70RyW zNrW)4m`mfq?#f+2;{B&=?{tz;Sse1WsKZn^Z*|LKLe5~vd)FA^S^3)m_ulZ@=aGz-0?kfn!MTYfeb??S)Yn7bW%=Q*+K0e)1~K{D0KJI z#pr?hX0UHlB5d|WVPUO)s+DIHG5LDdS^j~KrXY=UNtEhKiEc=B5;&X#*Od6tSiP7) z(hRtdMV_g<#my|XhFxxZMWS^1c&7yYS^NAT?KVTNc$+qNVDBsP>TirOll%y0bREau z_gJ=ck;RGLGxXFMvU>Taxi|B20=jxx_GS_Kk2SKB)P-kxJc7nV3Y-;_yq@FpvK|36E$*WB2$*`T2bc>wJ+rWm`j0@ zSlpk36s)MB-V>4DkV1>}^Pz@ZV_VPfs&cf#UC>xYVS3!Kph)xiWAbTs|7s4@vnXt+ zBGq-Qlh7c=6EGIXIZUdhrl7r#h7qTVq@jrZ-^6jO7Oprv#tP$*#k--aSt9$RH2K23 zv$l}nomFg4+9o#0;r*6<<6`3>i4@ zO0nwPq-|E%*!qCd#6PCzSRthI`gKTfa5u-IfdHPo8#@B6oNol+c|_oXYwvu@-a;I3 z+N-w0IijE!RxY}qophHEiX_#^B7kwgAR&BCY;}7?`fliSC~rOvu?rqMU1)@#-Rn&P zdvB)ZkJ3EfL##UKLU){UB$&^cKOLB>QhWM??jm|97T(Dxo|vJMx%fPyd}y%n3|+2> z$Y!OWYZ*tcRTVyl8th6!4F#FUMBzkI)3F{SQtv~$X2Nv5$9XPXt}=sgv4tQ}(-Q{{ zC{%zoJ^t~YXu8bMyzs_GB-R#r#)0z2E1nu7PPtfA2)&NCf8=c}!OF?6iRrvMcKB5@ z^qh{I>DSu883F=UT0%fZ>~eC{pN(|-TX&D9C6QBu8e6Ho`Jf6UCiUk`y?{9l z@6ydcq*EIcZ+RDq6?C;n$oBLu#L4WG5MqN=p#{7NbJMEP+WX57# zQD-B%b7PHa9qAz`CIunMWSD`XbcZ^&2PUCK=9H-ktSUSDv5tdYY~jg;(2-wXW(l_v zR*aiw`)NjR&sOWq!*yy6o#p;bA#uj^1`A;9yQGyRDFA7NqmXUe6%=*|W9dcrmXp?( zlyuA(jj&RZ6Z$O99qTJWTmx+U$ zdbez2=E>N=)|(?WvI6zLg-Tn>CfnhpI4WXCQ)R3>HDN*uKH(aIz}}7z=m`2r-S(m| z+gocfKekG0BY6kI%7)aY1hzwtu7WoSO6-=nCxMTRd^m;~A#e8sK~s*GQzeB zUUH6CTO3`nO&%q2T&MU^_$SnV0k?! zeEC*2MW+Svt~*uvafvhBQhQ8muw41x_yJ?mj8zEYm7O_dorN|9XB?>1f*+YTPQ+Ff zp&?qb_UN18#*I(5@*fO1k?6xpMpbd5-6$>8gwgFs?Gv|sa$WI9%P$QdEAe? z5O|XJj#PY&>>5M#q)xE@bS@t7H@zKMQD-LMJa*}FAEN|LcS7pPe}-&Ke|jFg=GS1O4V{!5;!B^$+JRL45c0cKjS=IS{T` z)rSm(CoU13S&DCdlQu{cBOpq*c>L7acqao3X{cVjfn+MU?EB!>3CMOo(ZrjYan^0s zEylU_&a^4$(4LniL_fI~%=JW3g9kq~$mAFCbbe*jyTZW6p>r9>>EO7-T%`R@dVvU zgIs&RF#5y^N3_GKP0n?iA0AGYoLwe8{Scj$5(7$o_hvJ^A8+|iufL947g6r(a+3Tn zF3%ZeZzA`Gq^tXhO(wrw_Vi7ey2H5v3Bw$da0PU0Fkj*$jAiwNjKQS*??HGKdTE2=EkI;PQh4Lr&fcC;Uv+G8=>;nxi zuAI3eH!?orI|2FVQ>Pf4Nqu?_8qX7^%+BA@jzmV$3*b&3{#o-UR4b=|)uTeQt346nB1)(|H}&NRKSzdFr|Yz#Tv4gh;7iVkJ**UF z$*7r!P_gwIdiz_A6qHt-v)Nu$!KujLijXP0@^wjEKDvB1(>#?a{R9<8;fDI3=ZXTa z{SxkYDHqDWtwyIwFi<#({LYWDT|~jQcTNnB&09v!7AC14TZ3IT{VtL#GluvGtTOwA zLTvIkDWYY{a;?I#>a&J<`r^ZhE8{bto8A2`!N^PtVhIPCNade%q*HUWIAbjb$4SXQ z^G9$E2NvWDMhxzaTesNk>t^xCs*HXY4p~LN^t?+$!3>eJAZYKa`>}cT^uyTns-V=| z1xDMq^I@g(YL^A&SqbyuTRPw0;867I{SZ*vs3NIAuzy=;plDRxKN#%fLyjDk^aT_# zs9bc`&-MPmNI3fyH)~TL)f0s#(`U2HGY1NK6UgnrunWPLz$kC*xRx^a3GY-VC|z&N zF~|b#7R6NZdv2k*Ccj}%$fg4NgG-)Vl7IJykkUellGtI-dOhkE-8K6Z#vYF=^gr$O zVWgz!6*sKp(SptuE(7K(gqW0In(1FTsC7u90+38TbBq{u1t7{(>t`iAt`c6Z(ym39 z>z~)}8>egdK1a|pk&b&sgUzl=S4--5E!#V7dLBfc8g<0Rh_ zZ~9JKXnY88o!}hsjo@u)InXU$=509q09#A<8-r(rTvBy!NDsS487|;#WiZnT;%IGj z{K7gF?-L+FV8lu18B%ZRa1-R2`RYLsbq`;rSGc76$6}8{#z4@C5bh9idxQu5PlkTA znNYPG1zjXY_r8f{(GP-d@f=?2I983m+x9`46+sxSu+lST7mR6l#c^-LH}lirIlsf1FtY8diexUA$IDEVS#;a zLh_M)V3A#8cYyuIQ=E*SFZ-E5KJJ+pKti`$U3a_RCD@496JapU>pvPrlA?l=!55)) zx}JEMtl$A#*OWBH6`_<}J=s2y*tGJ-6r_=+t#g7emU9MDRN7>e(v+y+n-;;;R7_Cc z0$1B9$p2i5iB@2Qo@mG~D~cxDx5A2Yq)3)_f@)P%mnbqOGieptxbuUzgmh)_w|rf@ zk5xCt4dYz(Z00w6f`qFq(aIb51_6!C_RGvdn$AJCuXca>7AF zjt+7fJIjN}qC}+zW&Z|bj9R9db02(pK%iK?qCul#faJVc4&9OtePgy-iWVDntSN0V{ja*YYs$`?6u8y#s`^x& zQW+CwnpXBBfvOC1YC=^<%(6G8<auM$Q9xWq>$*bAJ|#EJ)Eu~}5_4*K;u?t=e_<;z3Yj(9(BQ=R zK*lfpL8LKb9J=mT|Ali?>AL_-ogpvXtKXGVhkYDB8~AY=#Ba_ef)QU|;O*}udHM}- z>m;@SxpXDFKYvwW{Hw@6G(l~FpX~gF#ytASYbNlH>;SZ{;%R$xQlP#t16>byX#L(? z{TMtHX7Arm+aWg}3L@+*+4YZ7q6;$Pf?b`tV*H%hkJ*bZidZsgJ9l{ebvo?U5A-VL zyDd5q3WfX|D- z?~{4`DVIOA5}&1yo+ZM^H;{V`sK_;Nnl;cC61T(R3unX&5S&_R)`}8UT{a@J3c6SC z$w?62b{u^hz2*<%NxpDA^il}nI&;TIkz{FZTOQ?(2sdDj_`6YlJ-sA{jl&T2v+eHI z;AvGd&Sh*T-DDoUXn&`s1O1$uc9|+XBb!NiLV|~ha!f^2-J`0lw?ofvloWeq6$3V3 zvcelzP|{_BA*Zmar1qF|$$ToOp!S$@(fqi~sjh+kJPylJoVXQKDYaz@YsOZexnqRf zH=JcVn(OBmSom?Vx{N>{^D9^SCx&^Ro)KtAU+Oi-vRs!a#|J#EAuyr)&EHA~MSU3w_lE6mzI({nwZ+z0 zHA%awGM|-MDY2Rhm}n#Fa>rc7BOkYoU)wGqI)zXZpiPHC;xu9{hpx)nD(uNB&{_R= z#Wb54XljX(*=o%p&QwwKBR%q#_`D5(c8vi_OpgWn@Y=1%m95Uft=ib-ipwua>yN3! zMJH@u6fZc4BiOw>q?KdLMf;ge^5<>hvX0siwgm;M!dg^_vzH}LR2KAmKc=>ku`kYrTch}>4sUC`iBm=W0H)^xk5 z?Ns`%x<9?0Q`ys_!1~Pa{s`waH-1D)QtR4OSpFD9>-;7pE$U)GtP%p<2gjD$D^g!6 zg#y(z3VK8hZrk!}?jT&Fj1jYqwTg%LmmF{Q!uJk+Rr9%CHNgUd33ctCvgMGw=C9R; zhh~|zzfYDpNQ>Oo9~nb7*VV8?#I&N3WdIS-iLxRj5ZATUvqlSS0(zC#8LN*J8Ui(@ z*0$eOzCl{#C>nQeG8wMJv(n;`ge77i%JC{usfDNOB-6?y*lyV{Y~)GrY|v7UCi4|n z{0c9|DuuG zuwnC7K~9P`EYEMwjFmi~vtAJYXN{SR%XyPu(O$MWT@|F)2Cvj`#w6bM!wlegq0ScE zbB8^&D8t(-8kDAVW1Xm5R}~Yga@cfLQt+DXg8M55?ra5d^| zBnWTttdVJpR`3;|sQhJD^N7gZ5R4bJV7g|PUOAteI|n@)zJfY*2VFkl;`UiZcO0IS zBfE#_REs=c4mN=_=Cm!YQ4v79XhgfXN4tnZyU0SjNQ53v19icO-H;D&pJw%67q+#1 zQ50hF2t8G&*&cP?IpjDKpIw{Nu7lDq9%zdziv55SY1~x3Ueb#(*ph1fMwfMaAd^`? z)*!Cu+E?!r3~s2oJ6YW00~20o^UcSE|X^7-j94fsw()C#FCR^eTDz_Oe;AbaH_-Jv)!sRH_!t zp^Qs!%xKb>No*oh3(MK4WEKyp`(y>p?(8#_Q!4z?ZO1~hw z=yJjyUR1R?$W@M?@sOPi1>xCzHg50|6*(DrLTInRuKekznFJ%v zQL%;Q-+(N`D!qlNt^dSxM>%y74ZcgSVL1P%%%af$VLVsV#_U^w`~PMrG9zW-e+VK5 z>Am3q14-1?&&E~H1N((&GxY06%>fIue8QY*L79!0 zHLkjuG8ZDWLO!}Us=Y|$e1_tgK>spw~`Gg-3nf+GVf_V#0AHHC30;3wGuXde*^SyqtpLCW?JF@?kg$(r#k(Qt*zB} zX2%p@_TN$PZ`Aaf80x1gjYcg^2-32w?MWoN{y8RO2Uy73JlT9C5$d`VaFUTEd_cjF zR4q;`*msuyzLdrNMA}qp_5@TQr>i)*Np4E&FTjpFHLf#*@9iYRb}DP^bg9dS3xqL% zVRqP1Hw>H#orSbYN?}AF3=NdP_?oB+>sg{o1(X0so!O2rz{D#rzi1B_#Vx!Fm(1I? zg1!c86)(8u+yUn*KV3!c>cX&6h^{jgNe$~|c#9sO`OpN#r{>C6v$|m&mO~_oSryFG-ro5Csp#ZGZ!f-P7ah6XXh-LJRdl+)^InAc2`)&Kg(EA{=GNy2wY=M}v;d znr`{`(Wt5=%@{ST3*fGk{vyCgDtPVo{dW+YT66jJ8!179s>WK^o^`6kkeSX9|u`XV`&?qzrM(uP?=}yz#Gnx(naCF6u(s<2Y1T$(%21V;m#vqe= zZ@ZSNBlWYU?smDs%=3KTH2drJt4HtbZc6fV9JmFCYrm0563@5eDM{YlkLf^utEi62 zc7v_Ual<<~SCHgXk=7i_CKY~_`V4!y{haY?@f-9kr+?E8 zm|Wm_AKkLjF8m1_Zg$e(%ZLvbf$p+O&!mUTx(j+3EYYu~(}uUW>t40G6TkWE)GwA_ zGyks^u|6ZW3nKI?e@~8DGZ_hUrVC)tP|5 zHN7MS&|U=XIhO%w5#E#thSeC7ntvoe;L2`!W=9DyRX_Ws1JgqpbO+08=-5 zM*e$DC=>{+QRIEbcNFDs)1=fm2_E(eh9Ns^Q6EX9Wlql;IfoaP0{+C$2NLP1=%gW#veWm0(+AJmEamFW(wqTN@_5nbd z>tmktL4aV8n?NWaT0dTEdDm!p$Gw?1xb5A`YsnciVGVh+J6&Xf&=}WNK{tshu*vBB zlBrR2c>psX7S~kV0wr)pUr-+zoKoWtnN)CMvrxHExme=#YpMJQs?w6 zgq~W6qLZ$y>GAl;dMUIbe8CTnEL3+2UaIlY?vNwqLwNTP4*Dw9XQ=lfKUT?yhCpD( zR!H{t_l%(h^_@3c5I8c8OO?@;fCR&YL`EkvCaMqwB_@JpjEf}w+hc)C9?!@;-k%Dk zRVhu=P+4i+&?u@^-VoMk^A{|J+6Mf|0;6(q)#Ce}pm#~W^1bw|BZZYh=J)AZcfIm{ z%JO_X=-eqqz;_D?F{O%*N1dv_tFWTpS#inQBgL6Y=+Wkxa*W%+RbFxL44ATui=Rrc zZwSB`cFfJ3a!}-Fi0fII)v`Lm#-bfL)YLuIZ;DU8aY)r5iX7@W8g?vXb(U+*I=fgW zoDu`1;kJK^>YFvv&;gp6>dl&})irmTSmUS_lMRmP@uO~;nN#uc{D(Q&BV%_52jH`o z$%nnTkGCE?Z|Cc=6F!$tv%HrMc}+bdKRSmeaqw_af2S8fjc^&PEYtOcU*N{3mc%Dr zTlnERDu#F#tYq|Qxs}^lrqgcFcSMh^lgWL8=}}LZ$aQ8^4-c-%Ll4W3w9;hmAK=Zt z)w8Ne-eCdwX;OUT7Io;h1+EGn-of4NBkwyYI~bsRyJ$NsFT64{yNGQ~r5rn0^%BWR zBgGypx!#>OQ~NlsBWJyY!9HZUjEggE;~YE5VrO1$g*Y@4px?4py zFJ|Ass(Boqb9puWSI9HFq695BYyxq3fR8U+Yrn^q6tGIl*sDy%n4| z-}>UAw@;sAw=RPjAIj2Gfk6`hWIFrGjoGI=|u#yE^@9 z{pk4(nJ`s)7sR0=<|&l;`DdKqBnm9=bCmA$A+eJY^D;b$BvB`}`|+a3I#G6!9E36i zRDEM(C-OzBG04lCYoqy-*lKVT_wUotdM>^9YHz%N>{WS%>?OoM16@7Ze=7((1MgZ! ze*)rAsekk?p@f1kx(u|@w9mjjY}%Yp*g!c2wbx`pPA|K}t)b&r^8^rg3%T_WZ|}_C zRc;=OZ42;%$Exss;uF<&eywk(kW(CkI(k!4ZjTo!feIv&--V$2{;4+AWTgzb`2bNz zg&z8u`6HVH9Wq$eO&Cvb>=CCuov`aXrSY?*H~_FgXsm&OE_rHCiCA@Sef_gizkaqK zM7-+Wb}lgTeCBmSVJ$gG3&Q&_reO#ts8VCK&J;3k-j3R`z&b3@`_r5iSF$964)f94 zm|9l8s69fJ{cR??J801$gzu$hkJsS?vBF!*_g6GYEjomd-!gGgMBItxUlZ$Q(9syR z-~%|m^u;&9?$;bWT!rN$xT+hmpUjQqiM}*S_F=zy{gn!eadw?;A70u-FMD@L@np<0 zdBM94^Skot5hDwqCAF-CLHtKArCPg1$>xF&!7}-BL%Lv&LelkA9NNRNao?Mhn9$M) z4KT9?l_!k{dpCYOyOS*B!iIe{14EKCj$T^YWgr_ue9ifU0 zI4kmH^@pDem-dg@`m$3G4(iXJ9HETe2ppGUj&!DTR0z~suv$nN;pPII&TrK^Izp>`Hl15srO!O8zNRKi|<8hv7w-9f9{{JOo$rH?S4Q zKIMG{4hAP4WrdM)c&{d0NZ&G|d|a$4cnt=*`j5p2b>^r9M{p^mh8dUpavAT!Ia)(K ziFkdQ{E+0iRZ@Jzawrm}M5_A-=RSv4oijlilDx^9Lh1igPi*bkV z>}7pc`5gE?&Cid=_{{c6cACj*Qqa@2dj!`E$^Pv886;Re!%*nHF=>nWZs~)f(4`kU zJ%lYoQ+sC%>l41o{%rkO*>iP$b^cz}({&`!FMpxsCD@rYZEDPmH&E(^Zn?)$MUO7` zIkPQrlMUw)Xv5@2Ezk1I_X!hk_SZ}O^y>Z*Y|h<1;4*&$;w$mX^cuk1v)y&~=JFZb z^R-`NScSOV^}Ge~CGPQc@U`*+8W2szj7npohLxkV0_%}&!{Wvo&7@4u1Dgm=zDwt^ zG72ccO=VH8$_1A427HPWU{dSBaVYy?83rDK#?G8Hh%2*Iq zeIwcM%v+N&RT}#lj&MVvfkpOQ~13r}Dmw%ChCjLNlf_x&*&C0e+z(4k|T{{}Bb!&B(z z(>sb2??^B)w|Bc>3ffx*ba7g^ml$3k&TCl2=1!`H51{KyNdxgolw>F-)=mxE%KT^! z6ou(_YGi2ScOnTY6c?B$21l_#xcXKBgHc!nF2Yu7(r^c=W3c!`q9JJ~L%!nEy`EvzCpA(;ivv256*sd(Io@%YiqKkw|SdMwL z5Q+TcDHhUl%{&vy(N0a8{*`lQC@2}so`*6;MY)K+?}gRcrTsfoFJFJJBzv=Iu7?ub zcu(kw1dE9@^qBc37lfpuSXv84Q_|APHT8Om2n4{PEWm-5c!{RL{8OEcMJ&%bz-&@zP>_&8~Lo~H}}H)C0^J;2eEgXzt|yo z8?HRDJx_ikDb*b%rPm>8;!Yig#6_InCN6c!iftdqJCe-J$VN(xf%}JPxjL{KdtFZb z7h;VKs2WG#uvlSr>Ve`mYNCS%AJJW1qBhRMgf4kvMt`D#55X4%2hkSW1Th8wrKQPX zg%@UzpTk^=0`mthrs~$2n8;n6qhgbWYYe@ucrXQ6l`~O}_}gy!LF7PtC)~E?Eiz}K zxi>2Bp1Ha4>r-Q#^D0~T81!*@XTn)M*wvcAE41|=(|A-V)8;xQIck|BbitnMs)E>o zmUewY>>1a(=Jw+oL=5=u-)}!q>CuOe+A25vLQF3eeWzit&_w2BRtYUuKvovj1ym%~ zDUbTQ905q#U$GSgs~sk>Sj=(-1{C)0&?oz%Z+hK_qHk-ei(+4m=%L>lSM79tDI1VC znUFC#op=X9ZM%0`!!ZckdO-q9m=key+%S%iuxb38x5k%(e~xKIwNNs>wI*2*O`lH0 z?ok>qXqlWtNXXWi+-~7p=Z+s-zq?kxPVe_WOuLlsc0))b?#F-Z#j*+nr>Kpu9W3F4 z+AJf<$}CGc{Tn}p)KVMjZBJ5#q(fZA-8`;7xpq0LuC0Ucf-!IX^0-o+3n64A!G>|A z(98DX!r~Y*(FHV(G~tw3CJXQr==itvRt1KgwinW$Um%X_c)vT3(nxA^_aWVFURAKV z_qU>)^T6X1P7oB>{(whDWrGhGm){i)W`CKtjI*|5O|P)rk!W5c2(>;-PA9)qm|IsG zV%gP*L#h^Nz;bPUvrZEwD+nox8JwMPf?@L3@|hCT>w8{IxPjZxyPCERy}7`=lET{Z zyUF|*+>*ueMc8Xo9CQW!W!f9`6l58;o6ndboaI2zY1j#_WuS zmbxnT*Tt?0zdd{WvxASV!q{4oJV?6J9Jf(Jo?wqHHG_}s`&VvFat?kbke!cm@uJ^f z66+1%fY&Y4vvpEvUUUfoMN^upIwuixEsQu5fj`3_xNSy-@a-4Wn>o4Xo+#otw(>wJ z-|9_s{kLbWDcn`~a8GZYw>78wN^+4SFvoU}FY>|<_K5&_tB1Jmd+h$3wg|R@;~4xE zX|g@i;biC@<-VK!wG{o-$s<;mSwqT^O*mBSG8Z6D^@N!CcmBi^fIawhLSO}5)dv#K z8Bn_{_L3ora$jxk>Jr+0$l`q#U=N?mFQB^*{IGgM_&NTu<= z^U_wUw6q;^KC95#G=rh-DUKtVsMI}yu@aH zbD?X@y|p!?2Nus(JizoAd(!!z09T?LUKW`&>t=Z8s&a9$O11WzU_VnjNdOma0&^); zTha;A`1#>p(9+Rh3+0)}`l>HNNrX`i8gS96&%L3M7O*ZX-=ZFF38t^eIIBSuRM^n3 zE42S$@qnv9G!R@MSwkw?JKq^FfFox9CGpGix# zV6-z6g^DOIsj4>SP9f_T|DatHF(b$uTui6Wq%CtW!Ox$qp7?1#Dm&(6!Y?gVTiu+R zVtJvhpZBY3oE(@pJEK&LMeRgS_$6;pq|FN+v^623Ek^bj+;Y#~y%j8zc z)2>&SIqz|Mj#@wPFpS6We3QrBj5~9CceA6GV$$1%4IrzpOJa;)gv+#M@>Yr-dkA3x zro_jQM3C45s#TJ z-3>4ARo9YJFuKp@?^;BGap=JX+FvCl6;%rZ)m0zOU>75lb7>UIp1#T`>ddM!UGsH` z)HY@W`39QAUu7nAah6q%%7UsDG@xf05yC$^|2#p`LA3s^4|J~n-Bg6;DW~PqEahyc z!;pPEHuM?$IQN29eWBYf2)?SfD$y^hr=8Bc+$|N;JRXlx&Gr`j)X_7;Tspwb=z-@g zEg&<$B66s2A9jIT%o`IIS-=`&#OnX6G^%CBdP`EJGaCJF*n&zAIJqrg>5jqzFDLsQ z4Elx*b)R8Q<=vz`$8C<|8NEH$uITNBr!m)U7Q_nz@927V-;0B9^6v~xXQ=K$*8}yo zoZSt`13kg-zb|jn?}TReBHBHn9hWzv=%2_%GjxpK=vm?MNXHYTPd z>LKlWCeuzdZ}11!OE2Hx-LlV4(l|PETK$zn82mivl&=B{G9uFZ-iHoz9L#6;krIMv6ix?;nRK3~5x(%kLLZd7L=J0*q z@o|0g3eq8FErL3h8e$id&qA_sky*w_XE7>{V>IDRA(v5mt2UD@(l7zW1UZuNikP@Z z#C}mVCpykBoSYU-cK8pZyxtXzK+LYUuO|_V`GZ$CtEdB8my3_db?!d}J~+_rPP8V{ zf0N|3C&&*mguvzj2bUDgf5bHGuTmCf1zcPB%`pyD%}#S@&TGvNEm*^=L5j(on|yR3 z=Ks*=qhyOuO3099W&mEwgN8~K9m}A(WmM)!5A%`PV7Qq>kILF+;yn%&R2nrWDRQ|3 zfzPDZ3d^a=(dWs^L+F*HEJ7XU%@!Qnv48z3oXS7Hc`w#XpCLnVlvWBfRmxn7ht2qD zwKB@3nQAL}^F==C0{)rWkWWWfEp;@d?I3jrHk;s+T_p9A_n~-;O7)t%m$g7WvnK6P zP9|1!hf;E+RU*6F*{bW1W74}71dEhJBvw5Ym3bS{iWQ2jU%M`IY`h-*=@@?zZ^Y2S z+{8O>EAXVbQqH=sd!W__F`3X znW0_$j<3U@Q^P6M4JOQB4C_vtQbTH&e-! zE1=4g5HCVPQct-$c~{qJ@IPx>ZyS*nshG@+jrY8byD4~dHHXPrMvkz&f#n8Z#R!?| z+7$(Pc4~d=pnLuZ3rHbjwYe^wA&)7iDmJhEpw|W;cHv68hql*;K)qLD)zN_(e0L@u zJ0N!WPGz;al&7`$@iE^P3l>@$&cR z;Tmm?@tO|(LW-58LZ|kuYORrg_p5!|$b%{5mY0zVQ2}&y`Aj2pE_ErIFH2taU1f>N zYgvLsWqVA-!XvAKcXDxQjZ*NM1j|A+>rZc#gzoV2#mPqHO(B;vS@Cyz&7!L!RTmCY zUj&cED^Ld25@qUh6kPQhBmVQ88(|{IcKPeHPRcpEI1oZAIdp?!9R9H6{nimpu2A)w zN!m>*GYYy1Dr=?KzCQfY+0LXH@kSCHa}tJr4X*MvG3Y8eKph zAE5B}WG9DmL^T*h6{)+ddj4KMIpUN@1=8sQiA_TcM^tfPS?U8N1r+VA0X>7-F; zC3*57<$5I0pWrV&TCAE~aL8K{qW!ao{tH5q1ggJHAm{f^OP%A)$F31#)Ux_MBku9J z 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

9Is}j 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