From 09aa7bfd0aa75f3ab761a65a16ddd3df3fc231e1 Mon Sep 17 00:00:00 2001
From: Andriy Dmytruk <80816836+andriy-dmytruk@users.noreply.github.com>
Date: Sun, 15 Aug 2021 16:36:45 +0200
Subject: [PATCH] Add support for Micronaut Client (#10063)
* Create initial version of openapi micronaut generator
* Update validation, authorization, query parameters and time format
* Move micronaut to its own generator
* Add micronaut documentation
* Refactor and add tests to JavaMicronautClientGenerator
* Refactor model mustache for micronaut client
* Refactor model enum and pojo mustache files for micronaut client
* Move micronaut client generation to micronaut 3.0.0-M5 version
* Generate samples for micronaut client
* Add hidden files of generated samples for micronaut client
* Add and configure micronaut tests as maven profile
* Add option to choose between junit and spock for micronaut client generator
* Add tests for micronaut 'build' and 'test' options; regenerate micronaut samples
---
bin/configs/java-micronaut-client.yaml | 9 +
docs/generators/micronaut-client.md | 297 ++++++
.../languages/JavaMicronautClientCodegen.java | 327 ++++++
.../org.openapitools.codegen.CodegenConfig | 1 +
.../java-micronaut-client/api.mustache | 70 ++
.../api_test.groovy.mustache | 48 +
.../java-micronaut-client/api_test.mustache | 47 +
.../auth/Authorization.mustache | 40 +
.../auth/AuthorizationBinder.mustache | 72 ++
.../auth/AuthorizationFilter.mustache | 157 +++
.../auth/Authorizations.mustache | 21 +
.../ApiKeyAuthConfiguration.mustache | 79 ++
.../ConfigurableAuthorization.mustache | 14 +
.../HttpBasicAuthConfiguration.mustache | 55 +
.../configuration/Application.mustache | 9 +
.../configuration/application.yml.mustache | 62 ++
.../configuration/git/git_push.sh.mustache | 58 ++
.../configuration/git/gitignore.mustache | 21 +
.../gradle/build.gradle.mustache | 51 +
.../gradle/gradle.properties.mustache | 1 +
.../gradle/settings.gradle.mustache | 1 +
.../configuration/gradlew/gradle-wrapper.jar | 0
.../gradle-wrapper.properties.mustache | 5 +
.../gradlew/gradlew.bat.mustache | 89 ++
.../configuration/gradlew/gradlew.mustache | 185 ++++
.../MavenWrapperDownloader.java.mustache | 124 +++
.../mavenw/maven-wrapper.jar.mustache | Bin 0 -> 50710 bytes
.../mavenw/maven-wrapper.properties.mustache | 2 +
.../configuration/mavenw/mvnw.bat.mustache | 182 ++++
.../configuration/mavenw/mvnw.mustache | 310 ++++++
.../configuration/pom.xml.mustache | 195 ++++
.../java-micronaut-client/doc/README.mustache | 39 +
.../doc/api_doc.mustache | 68 ++
.../java-micronaut-client/doc/auth.mustache | 25 +
.../doc/enum_outer_doc.mustache | 7 +
.../doc/model_doc.mustache | 4 +
.../doc/pojo_doc.mustache | 39 +
.../generatedAnnotation.mustache | 1 +
.../licenseInfo.mustache | 11 +
.../model/beanValidation.mustache | 52 +
.../model/jackson_annotations.mustache | 26 +
.../model/model.mustache | 48 +
.../model/modelEnum.mustache | 61 ++
.../model/modelInnerEnum.mustache | 60 ++
.../model/oneof_interface.mustache | 9 +
.../java-micronaut-client/model/pojo.mustache | 330 ++++++
.../model/typeInfoAnnotation.mustache | 16 +
.../model/xmlAnnotation.mustache | 6 +
.../model_test.groovy.mustache | 46 +
.../java-micronaut-client/model_test.mustache | 49 +
.../params/beanValidation.mustache | 34 +
.../params/bodyParams.mustache | 1 +
.../params/cookieParams.mustache | 1 +
.../params/formParams.mustache | 1 +
.../params/headerParams.mustache | 1 +
.../params/pathParams.mustache | 1 +
.../params/queryParams.mustache | 1 +
.../params/type.mustache | 1 +
.../query/QueryParam.mustache | 78 ++
.../query/QueryParamBinder.mustache | 164 +++
.../micronaut/MicronautClientCodegenTest.java | 250 +++++
pom.xml | 12 +
.../petstore/java-micronaut-client/.gitignore | 21 +
.../.mvn/wrapper/MavenWrapperDownloader.java | 124 +++
.../.mvn/wrapper/maren-wrapper.properties | 2 +
.../.openapi-generator-ignore | 23 +
.../.openapi-generator/FILES | 123 +++
.../.openapi-generator/VERSION | 1 +
.../petstore/java-micronaut-client/README.md | 49 +
.../java-micronaut-client/build.gradle | 44 +
.../docs/AdditionalPropertiesAnyType.md | 16 +
.../docs/AdditionalPropertiesArray.md | 16 +
.../docs/AdditionalPropertiesBoolean.md | 16 +
.../docs/AdditionalPropertiesClass.md | 26 +
.../docs/AdditionalPropertiesInteger.md | 16 +
.../docs/AdditionalPropertiesNumber.md | 16 +
.../docs/AdditionalPropertiesObject.md | 16 +
.../docs/AdditionalPropertiesString.md | 16 +
.../java-micronaut-client/docs/Animal.md | 17 +
.../docs/AnotherFakeApi.md | 62 ++
.../docs/ArrayOfArrayOfNumberOnly.md | 16 +
.../docs/ArrayOfNumberOnly.md | 16 +
.../java-micronaut-client/docs/ArrayTest.md | 18 +
.../java-micronaut-client/docs/BigCat.md | 26 +
.../java-micronaut-client/docs/BigCatAllOf.md | 26 +
.../docs/Capitalization.md | 21 +
.../java-micronaut-client/docs/Cat.md | 16 +
.../java-micronaut-client/docs/CatAllOf.md | 16 +
.../java-micronaut-client/docs/Category.md | 17 +
.../java-micronaut-client/docs/ClassModel.md | 17 +
.../java-micronaut-client/docs/Dog.md | 16 +
.../java-micronaut-client/docs/DogAllOf.md | 16 +
.../java-micronaut-client/docs/EnumArrays.md | 33 +
.../java-micronaut-client/docs/EnumClass.md | 15 +
.../java-micronaut-client/docs/EnumTest.md | 54 +
.../java-micronaut-client/docs/FakeApi.md | 417 ++++++++
.../docs/FakeClassnameTags123Api.md | 63 ++
.../docs/FileSchemaTestClass.md | 17 +
.../java-micronaut-client/docs/FormatTest.md | 29 +
.../docs/HasOnlyReadOnly.md | 17 +
.../java-micronaut-client/docs/MapTest.md | 27 +
...dPropertiesAndAdditionalPropertiesClass.md | 18 +
.../docs/Model200Response.md | 18 +
.../docs/ModelApiResponse.md | 18 +
.../java-micronaut-client/docs/ModelClient.md | 16 +
.../java-micronaut-client/docs/ModelReturn.md | 17 +
.../java-micronaut-client/docs/Name.md | 20 +
.../java-micronaut-client/docs/NumberOnly.md | 16 +
.../java-micronaut-client/docs/Order.md | 30 +
.../docs/OuterComposite.md | 18 +
.../java-micronaut-client/docs/OuterEnum.md | 15 +
.../java-micronaut-client/docs/Pet.md | 30 +
.../java-micronaut-client/docs/PetApi.md | 270 +++++
.../docs/ReadOnlyFirst.md | 17 +
.../docs/SpecialModelName.md | 16 +
.../java-micronaut-client/docs/StoreApi.md | 134 +++
.../java-micronaut-client/docs/Tag.md | 17 +
.../docs/TypeHolderDefault.md | 20 +
.../docs/TypeHolderExample.md | 21 +
.../java-micronaut-client/docs/User.md | 23 +
.../java-micronaut-client/docs/UserApi.md | 226 ++++
.../java-micronaut-client/docs/XmlItem.md | 44 +
.../java-micronaut-client/docs/auth.md | 26 +
.../java-micronaut-client/gradle.properties | 1 +
.../gradle/wrapper/gradle-wrapper.jar | 0
.../gradle/wrapper/gradle-wrapper.properties | 5 +
.../petstore/java-micronaut-client/gradlew | 185 ++++
.../java-micronaut-client/gradlew.bat | 89 ++
.../petstore/java-micronaut-client/hello.txt | 1 +
.../petstore/java-micronaut-client/mvnw | 310 ++++++
.../petstore/java-micronaut-client/mvnw.bat | 182 ++++
.../petstore/java-micronaut-client/pom.xml | 174 ++++
.../java-micronaut-client/settings.gradle | 1 +
.../org/openapitools/api/AnotherFakeApi.java | 48 +
.../java/org/openapitools/api/FakeApi.java | 280 +++++
.../api/FakeClassnameTags123Api.java | 48 +
.../java/org/openapitools/api/PetApi.java | 163 +++
.../java/org/openapitools/api/StoreApi.java | 82 ++
.../java/org/openapitools/api/UserApi.java | 132 +++
.../model/AdditionalPropertiesAnyType.java | 103 ++
.../model/AdditionalPropertiesArray.java | 104 ++
.../model/AdditionalPropertiesBoolean.java | 103 ++
.../model/AdditionalPropertiesClass.java | 457 ++++++++
.../model/AdditionalPropertiesInteger.java | 103 ++
.../model/AdditionalPropertiesNumber.java | 104 ++
.../model/AdditionalPropertiesObject.java | 103 ++
.../model/AdditionalPropertiesString.java | 103 ++
.../java/org/openapitools/model/Animal.java | 137 +++
.../model/ArrayOfArrayOfNumberOnly.java | 110 ++
.../openapitools/model/ArrayOfNumberOnly.java | 110 ++
.../org/openapitools/model/ArrayTest.java | 184 ++++
.../java/org/openapitools/model/BigCat.java | 138 +++
.../org/openapitools/model/BigCatAllOf.java | 134 +++
.../openapitools/model/Capitalization.java | 244 +++++
.../main/java/org/openapitools/model/Cat.java | 103 ++
.../java/org/openapitools/model/CatAllOf.java | 99 ++
.../java/org/openapitools/model/Category.java | 128 +++
.../org/openapitools/model/ClassModel.java | 100 ++
.../main/java/org/openapitools/model/Dog.java | 103 ++
.../java/org/openapitools/model/DogAllOf.java | 99 ++
.../org/openapitools/model/EnumArrays.java | 204 ++++
.../org/openapitools/model/EnumClass.java | 62 ++
.../java/org/openapitools/model/EnumTest.java | 350 +++++++
.../model/FileSchemaTestClass.java | 139 +++
.../org/openapitools/model/FormatTest.java | 507 +++++++++
.../openapitools/model/HasOnlyReadOnly.java | 106 ++
.../java/org/openapitools/model/MapTest.java | 254 +++++
...ropertiesAndAdditionalPropertiesClass.java | 173 +++
.../openapitools/model/Model200Response.java | 129 +++
.../openapitools/model/ModelApiResponse.java | 157 +++
.../org/openapitools/model/ModelClient.java | 99 ++
.../org/openapitools/model/ModelReturn.java | 100 ++
.../java/org/openapitools/model/Name.java | 165 +++
.../org/openapitools/model/NumberOnly.java | 100 ++
.../java/org/openapitools/model/Order.java | 281 +++++
.../openapitools/model/OuterComposite.java | 158 +++
.../org/openapitools/model/OuterEnum.java | 62 ++
.../main/java/org/openapitools/model/Pet.java | 298 ++++++
.../org/openapitools/model/ReadOnlyFirst.java | 117 +++
.../openapitools/model/SpecialModelName.java | 99 ++
.../main/java/org/openapitools/model/Tag.java | 128 +++
.../openapitools/model/TypeHolderDefault.java | 223 ++++
.../openapitools/model/TypeHolderExample.java | 252 +++++
.../java/org/openapitools/model/User.java | 302 ++++++
.../java/org/openapitools/model/XmlItem.java | 986 ++++++++++++++++++
.../org/openapitools/query/QueryParam.java | 89 ++
.../openapitools/query/QueryParamBinder.java | 175 ++++
.../src/main/resources/application.yml | 32 +
.../api/AnotherFakeApiSpec.groovy | 41 +
.../org/openapitools/api/FakeApiSpec.groovy | 295 ++++++
.../api/FakeClassnameTags123ApiSpec.groovy | 41 +
.../org/openapitools/api/PetApiSpec.groovy | 258 +++++
.../org/openapitools/api/StoreApiSpec.groovy | 79 ++
.../org/openapitools/api/UserApiSpec.groovy | 151 +++
.../AdditionalPropertiesAnyTypeSpec.groovy | 32 +
.../AdditionalPropertiesArraySpec.groovy | 33 +
.../AdditionalPropertiesBooleanSpec.groovy | 32 +
.../AdditionalPropertiesClassSpec.groovy | 104 ++
.../AdditionalPropertiesIntegerSpec.groovy | 32 +
.../AdditionalPropertiesNumberSpec.groovy | 33 +
.../AdditionalPropertiesObjectSpec.groovy | 32 +
.../AdditionalPropertiesStringSpec.groovy | 32 +
.../org/openapitools/model/AnimalSpec.groovy | 39 +
.../model/ArrayOfArrayOfNumberOnlySpec.groovy | 33 +
.../model/ArrayOfNumberOnlySpec.groovy | 33 +
.../openapitools/model/ArrayTestSpec.groovy | 47 +
.../openapitools/model/BigCatAllOfSpec.groovy | 30 +
.../org/openapitools/model/BigCatSpec.groovy | 53 +
.../model/CapitalizationSpec.groovy | 65 ++
.../openapitools/model/CatAllOfSpec.groovy | 30 +
.../org/openapitools/model/CatSpec.groovy | 46 +
.../openapitools/model/CategorySpec.groovy | 37 +
.../openapitools/model/ClassModelSpec.groovy | 30 +
.../openapitools/model/DogAllOfSpec.groovy | 30 +
.../org/openapitools/model/DogSpec.groovy | 46 +
.../openapitools/model/EnumArraysSpec.groovy | 39 +
.../openapitools/model/EnumClassSpec.groovy | 19 +
.../openapitools/model/EnumTestSpec.groovy | 59 ++
.../model/FileSchemaTestClassSpec.groovy | 39 +
.../openapitools/model/FormatTestSpec.groovy | 126 +++
.../model/HasOnlyReadOnlySpec.groovy | 37 +
.../org/openapitools/model/MapTestSpec.groovy | 54 +
...iesAndAdditionalPropertiesClassSpec.groovy | 50 +
.../model/Model200ResponseSpec.groovy | 37 +
.../model/ModelApiResponseSpec.groovy | 44 +
.../openapitools/model/ModelClientSpec.groovy | 30 +
.../openapitools/model/ModelReturnSpec.groovy | 30 +
.../org/openapitools/model/NameSpec.groovy | 51 +
.../openapitools/model/NumberOnlySpec.groovy | 31 +
.../org/openapitools/model/OrderSpec.groovy | 66 ++
.../model/OuterCompositeSpec.groovy | 45 +
.../openapitools/model/OuterEnumSpec.groovy | 19 +
.../org/openapitools/model/PetSpec.groovy | 71 ++
.../model/ReadOnlyFirstSpec.groovy | 37 +
.../model/SpecialModelNameSpec.groovy | 30 +
.../org/openapitools/model/TagSpec.groovy | 37 +
.../model/TypeHolderDefaultSpec.groovy | 61 ++
.../model/TypeHolderExampleSpec.groovy | 68 ++
.../org/openapitools/model/UserSpec.groovy | 79 ++
.../org/openapitools/model/XmlItemSpec.groovy | 229 ++++
240 files changed, 19920 insertions(+)
create mode 100644 bin/configs/java-micronaut-client.yaml
create mode 100644 docs/generators/micronaut-client.md
create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautClientCodegen.java
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/api.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.groovy.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorization.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationBinder.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationFilter.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorizations.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ApiKeyAuthConfiguration.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ConfigurableAuthorization.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/HttpBasicAuthConfiguration.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/Application.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/application.yml.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/git_push.sh.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/gitignore.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/build.gradle.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/gradle.properties.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/settings.gradle.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.jar
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.properties.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.bat.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/MavenWrapperDownloader.java.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/maven-wrapper.jar.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/maven-wrapper.properties.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/mvnw.bat.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/mvnw.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/pom.xml.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/doc/README.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/doc/api_doc.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/doc/auth.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/doc/enum_outer_doc.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/doc/model_doc.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/doc/pojo_doc.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/generatedAnnotation.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/licenseInfo.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/beanValidation.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/jackson_annotations.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/model.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/modelEnum.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/modelInnerEnum.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/oneof_interface.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/pojo.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/typeInfoAnnotation.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model/xmlAnnotation.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model_test.groovy.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/model_test.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/beanValidation.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/bodyParams.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/cookieParams.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/formParams.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/headerParams.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/pathParams.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/queryParams.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/params/type.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/query/QueryParam.mustache
create mode 100644 modules/openapi-generator/src/main/resources/java-micronaut-client/query/QueryParamBinder.mustache
create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/java/micronaut/MicronautClientCodegenTest.java
create mode 100644 samples/client/petstore/java-micronaut-client/.gitignore
create mode 100644 samples/client/petstore/java-micronaut-client/.mvn/wrapper/MavenWrapperDownloader.java
create mode 100644 samples/client/petstore/java-micronaut-client/.mvn/wrapper/maren-wrapper.properties
create mode 100644 samples/client/petstore/java-micronaut-client/.openapi-generator-ignore
create mode 100644 samples/client/petstore/java-micronaut-client/.openapi-generator/FILES
create mode 100644 samples/client/petstore/java-micronaut-client/.openapi-generator/VERSION
create mode 100644 samples/client/petstore/java-micronaut-client/README.md
create mode 100644 samples/client/petstore/java-micronaut-client/build.gradle
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesAnyType.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesArray.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesBoolean.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesClass.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesInteger.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesNumber.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesObject.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AdditionalPropertiesString.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Animal.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/AnotherFakeApi.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ArrayOfArrayOfNumberOnly.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ArrayOfNumberOnly.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ArrayTest.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/BigCat.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/BigCatAllOf.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Capitalization.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Cat.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/CatAllOf.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Category.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ClassModel.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Dog.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/DogAllOf.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/EnumArrays.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/EnumClass.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/EnumTest.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/FakeApi.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/FakeClassnameTags123Api.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/FileSchemaTestClass.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/FormatTest.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/HasOnlyReadOnly.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/MapTest.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/MixedPropertiesAndAdditionalPropertiesClass.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Model200Response.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ModelApiResponse.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ModelClient.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ModelReturn.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Name.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/NumberOnly.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Order.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/OuterComposite.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/OuterEnum.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Pet.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/PetApi.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/ReadOnlyFirst.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/SpecialModelName.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/StoreApi.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/Tag.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/TypeHolderDefault.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/TypeHolderExample.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/User.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/UserApi.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/XmlItem.md
create mode 100644 samples/client/petstore/java-micronaut-client/docs/auth.md
create mode 100644 samples/client/petstore/java-micronaut-client/gradle.properties
create mode 100644 samples/client/petstore/java-micronaut-client/gradle/wrapper/gradle-wrapper.jar
create mode 100644 samples/client/petstore/java-micronaut-client/gradle/wrapper/gradle-wrapper.properties
create mode 100644 samples/client/petstore/java-micronaut-client/gradlew
create mode 100644 samples/client/petstore/java-micronaut-client/gradlew.bat
create mode 100644 samples/client/petstore/java-micronaut-client/hello.txt
create mode 100644 samples/client/petstore/java-micronaut-client/mvnw
create mode 100644 samples/client/petstore/java-micronaut-client/mvnw.bat
create mode 100644 samples/client/petstore/java-micronaut-client/pom.xml
create mode 100644 samples/client/petstore/java-micronaut-client/settings.gradle
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/AnotherFakeApi.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeApi.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeClassnameTags123Api.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/PetApi.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/StoreApi.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/UserApi.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesAnyType.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesArray.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesBoolean.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesClass.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesInteger.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesNumber.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesObject.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/AdditionalPropertiesString.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Animal.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ArrayOfArrayOfNumberOnly.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ArrayOfNumberOnly.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ArrayTest.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/BigCat.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/BigCatAllOf.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Capitalization.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Cat.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/CatAllOf.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Category.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ClassModel.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Dog.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/DogAllOf.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/EnumArrays.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/EnumClass.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/EnumTest.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/FileSchemaTestClass.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/FormatTest.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/HasOnlyReadOnly.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/MapTest.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/MixedPropertiesAndAdditionalPropertiesClass.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Model200Response.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ModelApiResponse.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ModelClient.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ModelReturn.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Name.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/NumberOnly.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Order.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/OuterComposite.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/OuterEnum.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Pet.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/ReadOnlyFirst.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/SpecialModelName.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/Tag.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/TypeHolderDefault.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/TypeHolderExample.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/User.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/model/XmlItem.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/query/QueryParam.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/query/QueryParamBinder.java
create mode 100644 samples/client/petstore/java-micronaut-client/src/main/resources/application.yml
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/AnotherFakeApiSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/FakeApiSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/FakeClassnameTags123ApiSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/PetApiSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/StoreApiSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/UserApiSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesAnyTypeSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesArraySpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesBooleanSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesClassSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesIntegerSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesNumberSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesObjectSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AdditionalPropertiesStringSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/AnimalSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ArrayOfArrayOfNumberOnlySpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ArrayOfNumberOnlySpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ArrayTestSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/BigCatAllOfSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/BigCatSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/CapitalizationSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/CatAllOfSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/CatSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/CategorySpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ClassModelSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/DogAllOfSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/DogSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/EnumArraysSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/EnumClassSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/EnumTestSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/FileSchemaTestClassSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/FormatTestSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/HasOnlyReadOnlySpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/MapTestSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/MixedPropertiesAndAdditionalPropertiesClassSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/Model200ResponseSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ModelApiResponseSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ModelClientSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ModelReturnSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/NameSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/NumberOnlySpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/OrderSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/OuterCompositeSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/OuterEnumSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/PetSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/ReadOnlyFirstSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/SpecialModelNameSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/TagSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/TypeHolderDefaultSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/TypeHolderExampleSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/UserSpec.groovy
create mode 100644 samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/model/XmlItemSpec.groovy
diff --git a/bin/configs/java-micronaut-client.yaml b/bin/configs/java-micronaut-client.yaml
new file mode 100644
index 00000000000..35a356d8756
--- /dev/null
+++ b/bin/configs/java-micronaut-client.yaml
@@ -0,0 +1,9 @@
+generatorName: micronaut-client
+outputDir: samples/client/petstore/java-micronaut-client/
+inputSpec: modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml
+additionalProperties:
+ artifactId: petstore-micronaut
+ hideGenerationTimestamp: "true"
+ configureAuth: "false"
+ build: "all"
+ test: "spock"
diff --git a/docs/generators/micronaut-client.md b/docs/generators/micronaut-client.md
new file mode 100644
index 00000000000..14a2292f04a
--- /dev/null
+++ b/docs/generators/micronaut-client.md
@@ -0,0 +1,297 @@
+---
+title: Config Options for micronaut-client
+sidebar_label: micronaut-client
+---
+
+These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
+
+| Option | Description | Values | Default |
+| ------ | ----------- | ------ | ------- |
+|additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null|
+|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null|
+|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false|
+|apiPackage|package for generated api classes| |org.openapitools.api|
+|artifactDescription|artifact description in generated pom.xml| |OpenAPI Java|
+|artifactId|artifactId in generated pom.xml. This also becomes part of the generated library's filename| |openapi-micronaut|
+|artifactUrl|artifact URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
+|artifactVersion|artifact version in generated pom.xml. This also becomes part of the generated library's filename| |1.0.0|
+|bigDecimalAsString|Treat BigDecimal values as Strings to avoid precision loss.| |false|
+|booleanGetterPrefix|Set booleanGetterPrefix| |get|
+|build|Specify for which build tool to generate files|
**gradle** Gradle configuration is generated for the project **all** Both Gradle and Maven configurations are generated **maven** Maven configuration is generated for the project |all|
+|configPackage|Configuration package for generated code| |org.openapitools.configuration|
+|configureAuth|Configure all the authorization methods as specified in the file| |false|
+|developerEmail|developer email in generated pom.xml| |team@openapitools.org|
+|developerName|developer name in generated pom.xml| |OpenAPI-Generator Contributors|
+|developerOrganization|developer organization in generated pom.xml| |OpenAPITools.org|
+|developerOrganizationUrl|developer organization URL in generated pom.xml| |http://openapitools.org|
+|disableHtmlEscaping|Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields)| |false|
+|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|**false** The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications. **true** Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default. |true|
+|discriminatorCaseSensitive|Whether the discriminator value lookup should be case-sensitive or not. This option only works for Java API client| |true|
+|ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true|
+|fullJavaUtil|whether to use fully qualified name for classes under java.util. This option only works for Java API client| |false|
+|groupId|groupId in generated pom.xml| |org.openapitools|
+|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |false|
+|ignoreAnyOfInEnum|Ignore anyOf keyword in enum| |false|
+|invokerPackage|root package for generated code| |org.openapitools|
+|java8|Use Java8 classes instead of third party equivalents. Starting in 5.x, JDK8 is the default and the support for JDK7, JDK6 has been dropped|**true** Use Java 8 classes such as Base64 **false** Various third party libraries as needed |true|
+|legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C#have this enabled by default).|**true** The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document. **false** The mapping in the discriminator includes any descendent schemas that allOf inherit from self, any oneOf schemas, any anyOf schemas, any x-discriminator-values, and the discriminator mapping schemas in the OAS document AND Codegen validates that oneOf and anyOf schemas contain the required discriminator and throws an error if the discriminator is missing. |true|
+|licenseName|The name of the license| |Unlicense|
+|licenseUrl|The URL of the license| |http://unlicense.org|
+|modelPackage|package for generated models| |org.openapitools.model|
+|openApiNullable|Enable OpenAPI Jackson Nullable library| |true|
+|parentArtifactId|parent artifactId in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null|
+|parentGroupId|parent groupId in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null|
+|parentVersion|parent version in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null|
+|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
+|scmConnection|SCM connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
+|scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
+|scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
+|serializableModel|boolean - toggle "implements Serializable" for generated models| |false|
+|snapshotVersion|Uses a SNAPSHOT version.|**true** Use a SnapShot Version **false** Use a Release Version |null|
+|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|
+|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true|
+|sourceFolder|source folder for generated code| |src/main/java|
+|test|Specify which test tool to generate files for|**junit** Use JUnit as test tool **spock** Use Spock as test tool |junit|
+|title|Client service name| |OpenAPI Micronaut Client|
+|useBeanValidation|Use BeanValidation API annotations| |true|
+|withXml|whether to include support for application/xml content type and include XML annotations in the model (works with libraries that provide support for JSON and XML)| |false|
+
+## IMPORT MAPPING
+
+| Type/Alias | Imports |
+| ---------- | ------- |
+|Array|java.util.List|
+|ArrayList|java.util.ArrayList|
+|BigDecimal|java.math.BigDecimal|
+|Date|java.util.Date|
+|DateTime|org.joda.time.*|
+|File|java.io.File|
+|HashMap|java.util.HashMap|
+|LinkedHashSet|java.util.LinkedHashSet|
+|List|java.util.*|
+|LocalDate|org.joda.time.*|
+|LocalDateTime|org.joda.time.*|
+|LocalTime|org.joda.time.*|
+|Map|java.util.Map|
+|Set|java.util.*|
+|Timestamp|java.sql.Timestamp|
+|URI|java.net.URI|
+|UUID|java.util.UUID|
+
+
+## INSTANTIATION TYPES
+
+| Type/Alias | Instantiated By |
+| ---------- | --------------- |
+|array|ArrayList|
+|map|HashMap|
+|set|LinkedHashSet|
+
+
+## LANGUAGE PRIMITIVES
+
+
+Boolean
+Double
+Float
+Integer
+Long
+Object
+String
+boolean
+byte[]
+
+
+## RESERVED WORDS
+
+
+abstract
+apiclient
+apiexception
+apiresponse
+application
+assert
+authorization
+body
+boolean
+break
+byte
+case
+catch
+char
+class
+client
+configuration
+const
+continue
+cookie
+default
+do
+double
+else
+enum
+extends
+final
+finally
+float
+for
+format
+goto
+header
+if
+implements
+import
+instanceof
+int
+interface
+localreturntype
+localvaraccept
+localvaraccepts
+localvarauthnames
+localvarcollectionqueryparams
+localvarcontenttype
+localvarcontenttypes
+localvarcookieparams
+localvarformparams
+localvarheaderparams
+localvarpath
+localvarpostbody
+localvarqueryparams
+long
+native
+new
+null
+object
+package
+pathvariable
+private
+protected
+public
+queryparam
+queryvalue
+return
+short
+static
+strictfp
+stringutil
+super
+switch
+synchronized
+this
+throw
+throws
+transient
+try
+void
+volatile
+while
+
+
+## FEATURE SET
+
+
+### Client Modification Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|BasePath|✓|ToolingExtension
+|Authorizations|✗|ToolingExtension
+|UserAgent|✗|ToolingExtension
+|MockServer|✗|ToolingExtension
+
+### Data Type Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Custom|✗|OAS2,OAS3
+|Int32|✓|OAS2,OAS3
+|Int64|✓|OAS2,OAS3
+|Float|✓|OAS2,OAS3
+|Double|✓|OAS2,OAS3
+|Decimal|✓|ToolingExtension
+|String|✓|OAS2,OAS3
+|Byte|✓|OAS2,OAS3
+|Binary|✓|OAS2,OAS3
+|Boolean|✓|OAS2,OAS3
+|Date|✓|OAS2,OAS3
+|DateTime|✓|OAS2,OAS3
+|Password|✓|OAS2,OAS3
+|File|✓|OAS2
+|Array|✓|OAS2,OAS3
+|Maps|✓|ToolingExtension
+|CollectionFormat|✓|OAS2
+|CollectionFormatMulti|✓|OAS2
+|Enum|✓|OAS2,OAS3
+|ArrayOfEnum|✓|ToolingExtension
+|ArrayOfModel|✓|ToolingExtension
+|ArrayOfCollectionOfPrimitives|✓|ToolingExtension
+|ArrayOfCollectionOfModel|✓|ToolingExtension
+|ArrayOfCollectionOfEnum|✓|ToolingExtension
+|MapOfEnum|✓|ToolingExtension
+|MapOfModel|✓|ToolingExtension
+|MapOfCollectionOfPrimitives|✓|ToolingExtension
+|MapOfCollectionOfModel|✓|ToolingExtension
+|MapOfCollectionOfEnum|✓|ToolingExtension
+
+### Documentation Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Readme|✓|ToolingExtension
+|Model|✓|ToolingExtension
+|Api|✓|ToolingExtension
+
+### Global Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Host|✓|OAS2,OAS3
+|BasePath|✓|OAS2,OAS3
+|Info|✓|OAS2,OAS3
+|Schemes|✗|OAS2,OAS3
+|PartialSchemes|✓|OAS2,OAS3
+|Consumes|✓|OAS2
+|Produces|✓|OAS2
+|ExternalDocumentation|✓|OAS2,OAS3
+|Examples|✓|OAS2,OAS3
+|XMLStructureDefinitions|✗|OAS2,OAS3
+|MultiServer|✗|OAS3
+|ParameterizedServer|✗|OAS3
+|ParameterStyling|✗|OAS3
+|Callbacks|✗|OAS3
+|LinkObjects|✗|OAS3
+
+### Parameter Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Path|✓|OAS2,OAS3
+|Query|✓|OAS2,OAS3
+|Header|✓|OAS2,OAS3
+|Body|✓|OAS2
+|FormUnencoded|✓|OAS2
+|FormMultipart|✓|OAS2
+|Cookie|✓|OAS3
+
+### Schema Support Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Simple|✓|OAS2,OAS3
+|Composite|✓|OAS2,OAS3
+|Polymorphism|✗|OAS2,OAS3
+|Union|✗|OAS3
+
+### Security Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|BasicAuth|✓|OAS2,OAS3
+|ApiKey|✓|OAS2,OAS3
+|OpenIDConnect|✓|OAS3
+|BearerToken|✗|OAS3
+|OAuth2_Implicit|✓|OAS2,OAS3
+|OAuth2_Password|✓|OAS2,OAS3
+|OAuth2_ClientCredentials|✓|OAS2,OAS3
+|OAuth2_AuthorizationCode|✓|OAS2,OAS3
+
+### Wire Format Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|JSON|✓|OAS2,OAS3
+|XML|✓|OAS2,OAS3
+|PROTOBUF|✗|ToolingExtension
+|Custom|✗|OAS2,OAS3
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautClientCodegen.java
new file mode 100644
index 00000000000..047607d4903
--- /dev/null
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautClientCodegen.java
@@ -0,0 +1,327 @@
+package org.openapitools.codegen.languages;
+
+import org.openapitools.codegen.*;
+import org.openapitools.codegen.languages.features.BeanValidationFeatures;
+import org.openapitools.codegen.meta.features.DocumentationFeature;
+import org.openapitools.codegen.meta.features.SecurityFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.*;
+
+import static org.openapitools.codegen.CodegenConstants.INVOKER_PACKAGE;
+
+
+public class JavaMicronautClientCodegen extends AbstractJavaCodegen implements BeanValidationFeatures {
+
+ private final Logger LOGGER = LoggerFactory.getLogger(JavaClientCodegen.class);
+
+ public static final String OPT_TITLE = "title";
+ public static final String OPT_CONFIG_PACKAGE = "configPackage";
+ public static final String OPT_CONFIGURE_AUTH = "configureAuth";
+ public static final String OPT_BUILD = "build";
+ public static final String OPT_BUILD_GRADLE = "gradle";
+ public static final String OPT_BUILD_MAVEN = "maven";
+ public static final String OPT_BUILD_ALL = "all";
+ public static final String OPT_TEST = "test";
+ public static final String OPT_TEST_JUNIT = "junit";
+ public static final String OPT_TEST_SPOCK = "spock";
+
+ public static final String NAME = "micronaut-client";
+
+ protected String title;
+ protected String configPackage;
+ protected boolean useBeanValidation;
+ protected boolean configureAuthorization;
+ protected String buildTool;
+ protected String testTool;
+
+ public JavaMicronautClientCodegen() {
+ super();
+
+ title = "OpenAPI Micronaut Client";
+ invokerPackage = "org.openapitools";
+ configPackage = "org.openapitools.configuration";
+ useBeanValidation = true;
+ configureAuthorization = false;
+ buildTool = OPT_BUILD_ALL;
+ testTool = OPT_TEST_JUNIT;
+
+ modifyFeatureSet(features -> features
+ .includeDocumentationFeatures(
+ DocumentationFeature.Readme
+ )
+ .securityFeatures(EnumSet.of(
+ SecurityFeature.ApiKey,
+ SecurityFeature.BasicAuth,
+ SecurityFeature.OAuth2_Implicit,
+ SecurityFeature.OAuth2_AuthorizationCode,
+ SecurityFeature.OAuth2_ClientCredentials,
+ SecurityFeature.OAuth2_Password,
+ SecurityFeature.OpenIDConnect
+ ))
+ );
+
+ outputFolder = "generated-code/javaMicronaut";
+ embeddedTemplateDir = templateDir = "java-micronaut-client";
+ apiPackage = "org.openapitools.api";
+ modelPackage = "org.openapitools.model";
+ invokerPackage = "org.openapitools";
+ artifactId = "openapi-micronaut";
+
+ updateOption(INVOKER_PACKAGE, this.getInvokerPackage());
+ updateOption(CodegenConstants.ARTIFACT_ID, this.getArtifactId());
+ updateOption(CodegenConstants.API_PACKAGE, apiPackage);
+ updateOption(CodegenConstants.MODEL_PACKAGE, modelPackage);
+
+ apiTestTemplateFiles.clear();
+
+ additionalProperties.put("jackson", "true");
+ additionalProperties.put("openbrace", "{");
+ additionalProperties.put("closebrace", "}");
+
+ cliOptions.add(new CliOption(OPT_TITLE, "Client service name").defaultValue(title));
+ cliOptions.add(new CliOption(OPT_CONFIG_PACKAGE, "Configuration package for generated code").defaultValue(configPackage));
+ cliOptions.add(CliOption.newBoolean(OPT_CONFIGURE_AUTH, "Configure all the authorization methods as specified in the file", configureAuthorization));
+ cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations", useBeanValidation));
+
+ CliOption buildToolOption = new CliOption(OPT_BUILD, "Specify for which build tool to generate files").defaultValue(buildTool);
+ buildToolOption.setEnum(new HashMap(){{
+ put(OPT_BUILD_GRADLE, "Gradle configuration is generated for the project");
+ put(OPT_BUILD_MAVEN, "Maven configuration is generated for the project");
+ put(OPT_BUILD_ALL, "Both Gradle and Maven configurations are generated");
+ }});
+ cliOptions.add(buildToolOption);
+
+ CliOption testToolOption = new CliOption(OPT_TEST, "Specify which test tool to generate files for").defaultValue(testTool);
+ testToolOption.setEnum(new HashMap(){{
+ put(OPT_TEST_JUNIT, "Use JUnit as test tool");
+ put(OPT_TEST_SPOCK, "Use Spock as test tool");
+ }});
+ cliOptions.add(testToolOption);
+
+ // Remove the date library option
+ cliOptions.stream().filter(o -> o.getOpt().equals("dateLibrary")).findFirst()
+ .ifPresent(v -> cliOptions.remove(v));
+
+ // Add reserved words
+ String[] reservedWordsArray = new String[]{
+ "client", "format", "queryvalue", "queryparam", "pathvariable", "header", "cookie",
+ "authorization", "body", "application"
+ };
+ reservedWords.addAll(Arrays.asList(reservedWordsArray));
+ }
+
+ @Override
+ public CodegenType getTag() {
+ return CodegenType.CLIENT;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public String getHelp() {
+ return "Generates a Java Micronaut Client.";
+ }
+
+ @Override
+ public void processOpts() {
+ super.processOpts();
+
+ // Get properties
+ if (additionalProperties.containsKey(OPT_TITLE)) {
+ this.title = (String) additionalProperties.get(OPT_TITLE);
+ }
+
+ if (additionalProperties.containsKey(OPT_CONFIG_PACKAGE)) {
+ configPackage = (String) additionalProperties.get(OPT_CONFIG_PACKAGE);
+ } else {
+ additionalProperties.put(OPT_CONFIG_PACKAGE, configPackage);
+ }
+
+ if (additionalProperties.containsKey(INVOKER_PACKAGE)) {
+ invokerPackage = (String) additionalProperties.get(INVOKER_PACKAGE);
+ } else {
+ additionalProperties.put(INVOKER_PACKAGE, invokerPackage);
+ }
+
+ // Get boolean properties
+ if (additionalProperties.containsKey(USE_BEANVALIDATION)) {
+ this.setUseBeanValidation(convertPropertyToBoolean(USE_BEANVALIDATION));
+ }
+ writePropertyBack(USE_BEANVALIDATION, useBeanValidation);
+
+ if (additionalProperties.containsKey(OPT_CONFIGURE_AUTH)) {
+ this.configureAuthorization = convertPropertyToBoolean(OPT_CONFIGURE_AUTH);
+ }
+ writePropertyBack(OPT_CONFIGURE_AUTH, configureAuthorization);
+
+ // Get enum properties
+ if (additionalProperties.containsKey(OPT_BUILD)) {
+ switch ((String) additionalProperties.get(OPT_BUILD)) {
+ case OPT_BUILD_GRADLE:
+ case OPT_BUILD_MAVEN:
+ case OPT_BUILD_ALL:
+ this.buildTool = (String) additionalProperties.get(OPT_BUILD);
+ break;
+ default:
+ throw new RuntimeException("Build tool \"" + additionalProperties.get(OPT_BUILD) + "\" is not supported or misspelled.");
+ }
+ }
+ additionalProperties.put(OPT_BUILD, buildTool);
+
+ if (additionalProperties.containsKey(OPT_TEST)) {
+ switch((String) additionalProperties.get(OPT_TEST)) {
+ case OPT_TEST_JUNIT:
+ case OPT_TEST_SPOCK:
+ this.testTool = (String) additionalProperties.get(OPT_TEST);
+ break;
+ default:
+ throw new RuntimeException("Test tool \"" + additionalProperties.get(OPT_TEST) + "\" is not supported or misspelled.");
+ }
+ }
+ additionalProperties.put(OPT_TEST, testTool);
+ if (testTool.equals(OPT_TEST_JUNIT)) {
+ additionalProperties.put("isTestJunit", true);
+ } else if (testTool.equals(OPT_TEST_SPOCK)) {
+ additionalProperties.put("isTestSpock", true);
+ }
+
+ final String invokerFolder = (sourceFolder + '/' + invokerPackage).replace(".", "/");
+ final String apiFolder = (sourceFolder + '/' + apiPackage).replace(".", "/");
+
+ // Add all the supporting files
+ String resourceFolder = projectFolder + "/resources";
+ supportingFiles.add(new SupportingFile("configuration/application.yml.mustache", resourceFolder, "application.yml").doNotOverwrite());
+
+ // Authorization files
+ if (configureAuthorization) {
+ final String authFolder = invokerFolder + "/auth";
+ supportingFiles.add(new SupportingFile("auth/Authorization.mustache", authFolder, "Authorization.java"));
+ supportingFiles.add(new SupportingFile("auth/AuthorizationBinder.mustache", authFolder, "AuthorizationBinder.java"));
+ supportingFiles.add(new SupportingFile("auth/Authorizations.mustache", authFolder, "Authorizations.java"));
+ supportingFiles.add(new SupportingFile("auth/AuthorizationFilter.mustache", authFolder, "AuthorizationFilter.java"));
+ final String authConfigurationFolder = authFolder + "/configuration";
+ supportingFiles.add(new SupportingFile("auth/configuration/ApiKeyAuthConfiguration.mustache", authConfigurationFolder, "ApiKeyAuthConfiguration.java"));
+ supportingFiles.add(new SupportingFile("auth/configuration/ConfigurableAuthorization.mustache", authConfigurationFolder, "ConfigurableAuthorization.java"));
+ supportingFiles.add(new SupportingFile("auth/configuration/HttpBasicAuthConfiguration.mustache", authConfigurationFolder, "HttpBasicAuthConfiguration.java"));
+ }
+
+ // Query files
+ final String queryFolder = invokerFolder + "/query";
+ supportingFiles.add(new SupportingFile("query/QueryParam.mustache", queryFolder, "QueryParam.java"));
+ supportingFiles.add(new SupportingFile("query/QueryParamBinder.mustache", queryFolder, "QueryParamBinder.java"));
+
+ if (buildTool.equals(OPT_BUILD_GRADLE) || buildTool.equals(OPT_BUILD_ALL)) {
+ // Gradle files
+ supportingFiles.add(new SupportingFile("configuration/gradle/build.gradle.mustache", "", "build.gradle").doNotOverwrite());
+ supportingFiles.add(new SupportingFile("configuration/gradle/settings.gradle.mustache", "", "settings.gradle").doNotOverwrite());
+ supportingFiles.add(new SupportingFile("configuration/gradle/gradle.properties.mustache", "", "gradle.properties").doNotOverwrite());
+
+ // Gradlew files
+ final String gradleWrapperFolder = "gradle/wrapper";
+ supportingFiles.add(new SupportingFile("configuration/gradlew/gradlew.mustache", "", "gradlew"));
+ supportingFiles.add(new SupportingFile("configuration/gradlew/gradlew.bat.mustache", "", "gradlew.bat"));
+ supportingFiles.add(new SupportingFile("configuration/gradlew/gradle-wrapper.properties.mustache", gradleWrapperFolder, "gradle-wrapper.properties"));
+ supportingFiles.add(new SupportingFile("configuration/gradlew/gradle-wrapper.jar", gradleWrapperFolder, "gradle-wrapper.jar"));
+ }
+
+ if (buildTool.equals(OPT_BUILD_MAVEN) || buildTool.equals(OPT_BUILD_ALL)) {
+ // Maven files
+ supportingFiles.add(new SupportingFile("configuration/pom.xml.mustache", "", "pom.xml").doNotOverwrite());
+
+ // Maven wrapper files
+ supportingFiles.add(new SupportingFile("configuration/mavenw/mvnw.mustache", "", "mvnw"));
+ supportingFiles.add(new SupportingFile("configuration/mavenw/mvnw.bat.mustache", "", "mvnw.bat"));
+ supportingFiles.add(new SupportingFile("configuration/mavenw/MavenWrapperDownloader.java.mustache", ".mvn/wrapper", "MavenWrapperDownloader.java"));
+ supportingFiles.add(new SupportingFile("configuration/mavenw/maven-wrapper.jar.mustache", ".mvn/wrapper", "maven-wrapper.jar"));
+ supportingFiles.add(new SupportingFile("configuration/mavenw/maven-wrapper.properties.mustache", ".mvn/wrapper", "maren-wrapper.properties"));
+ }
+
+ // Git files
+ supportingFiles.add(new SupportingFile("configuration/git/gitignore.mustache", "", ".gitignore").doNotOverwrite());
+
+ // Use the default java Date
+ typeMapping.put("date", "LocalDate");
+ typeMapping.put("DateTime", "LocalDateTime");
+ importMapping.put("LocalDate", "java.time.LocalDate");
+ importMapping.put("LocalDateTime", "java.time.LocalDateTime");
+
+ // Add documentation files
+ supportingFiles.add(new SupportingFile("doc/README.mustache", "", "README.md").doNotOverwrite());
+ supportingFiles.add(new SupportingFile("doc/auth.mustache", apiDocPath, "auth.md"));
+ modelDocTemplateFiles.put("doc/model_doc.mustache", ".md");
+ apiDocTemplateFiles.put("doc/api_doc.mustache", ".md");
+ modelDocTemplateFiles.remove("model_doc.mustache");
+ apiDocTemplateFiles.remove("api_doc.mustache");
+
+ // Add model files
+ modelTemplateFiles.remove("model.mustache");
+ modelTemplateFiles.put("model/model.mustache", ".java");
+
+ // Add test files
+ if (testTool.equals(OPT_TEST_JUNIT)) {
+ apiTestTemplateFiles.put("api_test.mustache", ".java");
+ modelTestTemplateFiles.put("model_test.mustache", ".java");
+ } else if (testTool.equals(OPT_TEST_SPOCK)) {
+ apiTestTemplateFiles.put("api_test.groovy.mustache", ".groovy");
+ modelTestTemplateFiles.put("model_test.groovy.mustache", ".groovy");
+ }
+ }
+
+ @Override
+ public String apiTestFileFolder() {
+ if (testTool.equals(OPT_TEST_SPOCK)) {
+ return getOutputDir() + "/src/test/groovy/" + getInvokerPackage().replaceAll("\\.", "/") + "/api";
+ }
+ return getOutputDir() + "/src/test/java/" + getInvokerPackage().replaceAll("\\.", "/") + "/api";
+ }
+
+ @Override
+ public String modelTestFileFolder() {
+ if (testTool.equals(OPT_TEST_SPOCK)) {
+ return getOutputDir() + "/src/test/groovy/" + getInvokerPackage().replaceAll("\\.", "/") + "/model";
+ }
+ return getOutputDir() + "/src/test/java/" + getInvokerPackage().replaceAll("\\.", "/") + "/model";
+ }
+
+ @Override
+ public String toApiTestFilename(String name) {
+ if (testTool.equals(OPT_TEST_SPOCK)) {
+ return toApiName(name) + "Spec";
+ }
+ return toApiName(name) + "Test";
+ }
+
+ @Override
+ public String toModelTestFilename(String name) {
+ if (testTool.equals(OPT_TEST_SPOCK)) {
+ return toModelName(name) + "Spec";
+ }
+ return toModelName(name) + "Test";
+ }
+
+ @Override
+ public void setUseBeanValidation(boolean useBeanValidation) {
+ this.useBeanValidation = useBeanValidation;
+ }
+
+ @Override
+ public String toApiVarName(String name) {
+ String apiVarName = super.toApiVarName(name);
+ if (reservedWords.contains(apiVarName)) {
+ apiVarName = escapeReservedWord(apiVarName);
+ }
+ return apiVarName;
+ }
+
+ public boolean isUseBeanValidation() {
+ return useBeanValidation;
+ }
+
+ public boolean isConfigureAuthorization() {
+ return configureAuthorization;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig
index edff28e636a..df636589cd5 100644
--- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig
+++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig
@@ -55,6 +55,7 @@ org.openapitools.codegen.languages.HaskellServantCodegen
org.openapitools.codegen.languages.JavaClientCodegen
org.openapitools.codegen.languages.JavaCXFClientCodegen
org.openapitools.codegen.languages.JavaInflectorServerCodegen
+org.openapitools.codegen.languages.JavaMicronautClientCodegen
org.openapitools.codegen.languages.JavaMSF4JServerCodegen
org.openapitools.codegen.languages.JavaPKMSTServerCodegen
org.openapitools.codegen.languages.JavaPlayFrameworkCodegen
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/api.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/api.mustache
new file mode 100644
index 00000000000..4232340e520
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/api.mustache
@@ -0,0 +1,70 @@
+{{>licenseInfo}}
+package {{package}};
+
+import io.micronaut.http.annotation.*;
+import io.micronaut.core.annotation.*;
+import io.micronaut.http.client.annotation.Client;
+{{#configureAuth}}
+import {{invokerPackage}}.auth.Authorization;
+{{/configureAuth}}
+import {{invokerPackage}}.query.QueryParam;
+import io.micronaut.core.convert.format.Format;
+import reactor.core.publisher.Mono;
+{{#imports}}import {{import}};
+{{/imports}}
+import javax.annotation.Generated;
+{{^fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+{{/fullJavaUtil}}{{#useBeanValidation}}
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+{{/useBeanValidation}}
+
+{{>generatedAnnotation}}
+@Client("${base-path}")
+public interface {{classname}} {
+{{#operations}}{{#operation}}
+ /**
+ {{#summary}}
+ * {{summary}}
+ {{/summary}}
+ {{#notes}}
+ * {{notes}}
+ {{/notes}}
+ {{^summary}}
+ {{^notes}}
+ * {{nickname}}
+ {{/notes}}
+ {{/summary}}
+ *
+{{#allParams}}
+ * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
+{{/allParams}}
+{{#returnType}}
+ * @return {{returnType}}
+{{/returnType}}
+{{#externalDocs}}
+ * {{description}}
+ * @see {{summary}} Documentation
+{{/externalDocs}}
+ */
+ @{{#lambda.pascalcase}}{{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}{{/lambda.pascalcase}}(uri="{{{path}}}")
+ {{#vendorExtensions.x-contentType}}
+ @Produces(value={"{{vendorExtensions.x-contentType}}"})
+ {{/vendorExtensions.x-contentType}}
+ @Consumes(value={"{{vendorExtensions.x-accepts}}"})
+ {{!auth methods}}
+ {{#configureAuth}}
+ {{#authMethods}}
+ @Authorization(name="{{{name}}}"{{!scopes}}{{#isOAuth}}, scopes={{=< >=}}{<={{ }}=>{{#scopes}}"{{{scope}}}"{{^-last}}, {{/-last}}{{/scopes}}{{=< >=}}}<={{ }}=>{{/isOAuth}})
+ {{/authMethods}}
+ {{/configureAuth}}
+ {{#returnType}}Mono<{{{returnType}}}>{{/returnType}}{{^returnType}}Mono{{/returnType}} {{nickname}}({{^allParams}});{{/allParams}}{{#allParams}}
+ {{>params/queryParams}}{{>params/pathParams}}{{>params/headerParams}}{{>params/bodyParams}}{{>params/formParams}}{{>params/cookieParams}}{{^-last}}, {{/-last}}{{#-last}}
+ );{{/-last}}{{/allParams}}
+ {{/operation}}
+{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.groovy.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.groovy.mustache
new file mode 100644
index 00000000000..af4469421f3
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.groovy.mustache
@@ -0,0 +1,48 @@
+package {{package}}
+
+{{#imports}}import {{import}}
+{{/imports}}
+import io.micronaut.test.extensions.spock.annotation.MicronautTest
+import spock.lang.Specification
+import jakarta.inject.Inject
+import reactor.core.publisher.Mono
+{{^fullJavaUtil}}
+import java.util.ArrayList
+import java.util.HashMap
+import java.util.List
+import java.util.Map
+{{/fullJavaUtil}}
+
+
+/**
+ * API tests for {{classname}}
+ */
+@MicronautTest
+class {{classname}}Spec extends Specification {
+
+ @Inject
+ {{classname}} api
+
+ {{#operations}}{{#operation}}
+ /**
+ * {{summary}}
+ {{#notes}}
+ *
+ * {{notes}}
+ {{/notes}}
+ */
+ void '{{operationId}}() test'() {
+ given:
+ {{#allParams}}
+ {{{dataType}}} {{paramName}} = null
+ {{/allParams}}
+ // {{#returnType}}{{{returnType}}} response = {{/returnType}}api.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}).block()
+ // {{#returnType}}Mono<{{{returnType}}}>{{/returnType}}{{^returnType}}Mono{{/returnType}} asyncResponse = api.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}})
+
+ expect:
+ true
+ // TODO: test validations
+ }
+
+ {{/operation}}{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.mustache
new file mode 100644
index 00000000000..a3c3e48e44b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/api_test.mustache
@@ -0,0 +1,47 @@
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Assertions;
+import jakarta.inject.Inject;
+import reactor.core.publisher.Mono;
+
+{{^fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+{{/fullJavaUtil}}
+
+
+/**
+ * API tests for {{classname}}
+ */
+@MicronautTest
+public class {{classname}}Test {
+
+ @Inject
+ {{classname}} api;
+
+ {{#operations}}{{#operation}}
+ /**
+ * {{summary}}
+ {{#notes}}
+ *
+ * {{notes}}
+ {{/notes}}
+ */
+ @Test
+ public void {{operationId}}Test() {
+ {{#allParams}}
+ {{{dataType}}} {{paramName}} = null;
+ {{/allParams}}
+ // {{#returnType}}{{{returnType}}} response = {{/returnType}}api.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}).block();
+ // {{#returnType}}Mono<{{{returnType}}}>{{/returnType}}{{^returnType}}Mono{{/returnType}} asyncResponse = api.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
+ // TODO: test validations
+ }
+
+ {{/operation}}{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorization.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorization.mustache
new file mode 100644
index 00000000000..ac5f7f979fd
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorization.mustache
@@ -0,0 +1,40 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth;
+
+import io.micronaut.context.annotation.AliasFor;
+import io.micronaut.core.bind.annotation.Bindable;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+@Documented
+@Retention(RUNTIME)
+@Target(METHOD)
+@Bindable
+@Repeatable(Authorizations.class)
+public @interface Authorization {
+ /**
+ * The name of the authorization
+ */
+ @AliasFor(annotation=Bindable.class, member="value")
+ String value() default "";
+
+ /**
+ * The name of the authorization
+ */
+ @AliasFor(annotation=Bindable.class, member="value")
+ String name() default "";
+
+ /**
+ * The scopes for the oauth authorization
+ */
+ String[] scopes() default {};
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationBinder.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationBinder.mustache
new file mode 100644
index 00000000000..fad44af0f00
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationBinder.mustache
@@ -0,0 +1,72 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth;
+
+import io.micronaut.aop.MethodInvocationContext;
+import io.micronaut.core.annotation.AnnotationValue;
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.core.util.CollectionUtils;
+import io.micronaut.core.util.StringUtils;
+import io.micronaut.http.MutableHttpRequest;
+import io.micronaut.http.client.bind.AnnotatedClientRequestBinder;
+import io.micronaut.http.client.bind.ClientRequestUriContext;
+import jakarta.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+@Singleton
+public class AuthorizationBinder implements AnnotatedClientRequestBinder {
+
+ public static final CharSequence AUTHORIZATION_NAMES = "micronaut.security.AUTHORIZATION_NAMES";
+
+ @NonNull
+ @Override
+ public Class getAnnotationType() {
+ return Authorization.class;
+ }
+
+ @Override
+ public void bind(@NonNull MethodInvocationContext context,
+ @NonNull ClientRequestUriContext uriContext,
+ @NonNull MutableHttpRequest> request
+ ) {
+ List> annotations = context.getAnnotationMetadata()
+ .getAnnotationValuesByType(Authorization.class);
+
+ if (CollectionUtils.isNotEmpty(annotations)) {
+ List authorizationNames = new ArrayList<>();
+ for (AnnotationValue annotation: annotations) {
+ annotation.get("name", String.class)
+ .filter(StringUtils::isNotEmpty)
+ .ifPresent(v -> authorizationNames.add(configurationName(v)));
+ }
+ request.setAttribute(AUTHORIZATION_NAMES, authorizationNames);
+ }
+ }
+
+ private String configurationName(String name) {
+ StringBuilder result = new StringBuilder();
+
+ boolean wasCapital = false;
+ for (int i = 0; i < name.length(); ++i) {
+ char c = name.charAt(i);
+ if (c == '_') {
+ result.append('-');
+ wasCapital = true;
+ } else if (Character.isUpperCase(c)) {
+ if (wasCapital) {
+ result.append(Character.toLowerCase(c));
+ } else {
+ result.append('-');
+ result.append(Character.toLowerCase(c));
+ }
+ wasCapital = true;
+ } else {
+ result.append(c);
+ }
+ }
+ return result.toString();
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationFilter.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationFilter.mustache
new file mode 100644
index 00000000000..021a5425d39
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/AuthorizationFilter.mustache
@@ -0,0 +1,157 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth;
+
+import io.micronaut.context.BeanContext;
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.core.util.CollectionUtils;
+import io.micronaut.core.util.StringUtils;
+import io.micronaut.core.util.Toggleable;
+import io.micronaut.http.HttpRequest;
+import io.micronaut.http.HttpResponse;
+import io.micronaut.http.MutableHttpRequest;
+import io.micronaut.http.annotation.Filter;
+import io.micronaut.http.filter.ClientFilterChain;
+import io.micronaut.http.filter.HttpClientFilter;
+import io.micronaut.inject.qualifiers.Qualifiers;
+import io.micronaut.security.oauth2.client.clientcredentials.ClientCredentialsClient;
+import io.micronaut.security.oauth2.client.clientcredentials.ClientCredentialsConfiguration;
+import io.micronaut.security.oauth2.client.clientcredentials.propagation.ClientCredentialsHttpClientFilter;
+import io.micronaut.security.oauth2.client.clientcredentials.propagation.ClientCredentialsTokenPropagator;
+import io.micronaut.security.oauth2.configuration.OauthClientConfiguration;
+import io.micronaut.security.oauth2.endpoint.token.response.TokenResponse;
+import org.openapitools.auth.configuration.ConfigurableAuthorization;
+import org.reactivestreams.Publisher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+@Filter(Filter.MATCH_ALL_PATTERN)
+public class AuthorizationFilter implements HttpClientFilter {
+ private static final Logger LOG = LoggerFactory.getLogger(ClientCredentialsHttpClientFilter.class);
+
+ private final BeanContext beanContext;
+ private final Map clientConfigurationByName;
+
+ ClientCredentialsTokenPropagator defaultTokenPropagator;
+ private final Map tokenPropagatorByName;
+ private final Map clientCredentialsClientByName;
+
+ public final Map authorizationsByName;
+
+ public AuthorizationFilter(
+ BeanContext beanContext,
+ Stream clientConfigurations,
+ ClientCredentialsTokenPropagator defaultTokenPropagator,
+ Stream configurableAuthorizations
+ ) {
+ this.beanContext = beanContext;
+ this.clientConfigurationByName = clientConfigurations
+ .filter(Toggleable::isEnabled)
+ .collect(Collectors.toMap(OauthClientConfiguration::getName, v -> v));
+ this.defaultTokenPropagator = defaultTokenPropagator;
+ this.tokenPropagatorByName = new HashMap<>();
+ this.clientCredentialsClientByName = new HashMap<>();
+ this.authorizationsByName = configurableAuthorizations
+ .collect(Collectors.toMap(ConfigurableAuthorization::getName, v -> v));
+ }
+
+ @Override
+ public Publisher extends HttpResponse>> doFilter(
+ @NonNull MutableHttpRequest> request,
+ @NonNull ClientFilterChain chain
+ ) {
+ List> names = request.getAttribute(AuthorizationBinder.AUTHORIZATION_NAMES, List.class).orElse(null);
+ if (CollectionUtils.isNotEmpty(names)) {
+ List> authorizers = new ArrayList<>(names.size());
+
+ for (Object nameObject: names) {
+ if (!(nameObject instanceof String)) {
+ continue;
+ }
+ String name = (String) nameObject;
+
+ // Check if other authorizations have the key
+ if (authorizationsByName.containsKey(name)) {
+ ConfigurableAuthorization authorizer = authorizationsByName.get(name);
+ authorizers.add(Mono.fromCallable(() -> {
+ authorizer.applyAuthorization(request);
+ return request;
+ }));
+ continue;
+ }
+
+ // Perform OAuth authorization
+ OauthClientConfiguration clientConfiguration = clientConfigurationByName.get(name);
+ if (clientConfiguration == null) {
+ continue;
+ }
+
+ ClientCredentialsClient clientCredentialsClient = getClientCredentialsClient(name);
+ if (clientCredentialsClient == null) {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Could not retrieve client credentials client for OAuth 2.0 client {}", name);
+ }
+ continue;
+ }
+
+ ClientCredentialsTokenPropagator tokenHandler = getTokenPropagator(name);
+ Flux authorizer = Flux.from(clientCredentialsClient
+ .requestToken(getScope(clientConfiguration)))
+ .map(TokenResponse::getAccessToken)
+ .map(accessToken -> {
+ if (StringUtils.isNotEmpty(accessToken)) {
+ tokenHandler.writeToken(request, accessToken);
+ }
+ return request;
+ });
+ authorizers.add(authorizer);
+ }
+
+ return Flux.concat(authorizers)
+ .switchMap(v -> chain.proceed(request));
+ }
+
+
+ return chain.proceed(request);
+ }
+
+ protected ClientCredentialsTokenPropagator getTokenPropagator(String name) {
+ ClientCredentialsTokenPropagator tokenPropagator = tokenPropagatorByName.get(name);
+ if (tokenPropagator == null) {
+ tokenPropagator = beanContext.findBean(ClientCredentialsTokenPropagator.class, Qualifiers.byName(name))
+ .orElse(defaultTokenPropagator);
+ if (tokenPropagator != null) {
+ tokenPropagatorByName.put(name, tokenPropagator);
+ }
+ }
+ return tokenPropagator;
+ }
+
+ protected ClientCredentialsClient getClientCredentialsClient(String name) {
+ ClientCredentialsClient client = clientCredentialsClientByName.get(name);
+ if (client == null) {
+ client = beanContext.findBean(ClientCredentialsClient.class, Qualifiers.byName(name)).orElse(null);
+ if (client != null) {
+ clientCredentialsClientByName.put(name, client);
+ }
+ }
+ return client;
+ }
+
+ @Nullable
+ protected String getScope(@NonNull OauthClientConfiguration oauthClient) {
+ return oauthClient.getClientCredentials().flatMap(ClientCredentialsConfiguration::getScope).orElse(null);
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorizations.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorizations.mustache
new file mode 100644
index 00000000000..1ee37c7c1df
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/Authorizations.mustache
@@ -0,0 +1,21 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth;
+
+import io.micronaut.core.bind.annotation.Bindable;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+@Documented
+@Retention(RUNTIME)
+@Target(METHOD)
+@Bindable
+public @interface Authorizations {
+ Authorization[] value();
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ApiKeyAuthConfiguration.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ApiKeyAuthConfiguration.mustache
new file mode 100644
index 00000000000..969da02fabc
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ApiKeyAuthConfiguration.mustache
@@ -0,0 +1,79 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth.configuration;
+
+import io.micronaut.context.annotation.ConfigurationInject;
+import io.micronaut.context.annotation.EachProperty;
+import io.micronaut.context.annotation.Parameter;
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.http.MutableHttpRequest;
+import io.micronaut.http.cookie.Cookie;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+@EachProperty("security.api-key-auth")
+public class ApiKeyAuthConfiguration implements ConfigurableAuthorization {
+ private final String name;
+ private AuthKeyLocation location;
+ private String paramName;
+ private String apiKey;
+
+ @ConfigurationInject
+ public ApiKeyAuthConfiguration(
+ @Parameter String name,
+ @NonNull AuthKeyLocation location,
+ @NonNull String paramName,
+ @NonNull String apiKey
+ ) {
+ this.name = name;
+ this.location = location;
+ this.paramName = paramName;
+ this.apiKey = apiKey;
+ }
+
+ @Override
+ public void applyAuthorization(@NonNull MutableHttpRequest> request) {
+ if (this.location == AuthKeyLocation.HEADER) {
+ request.header(this.paramName, this.apiKey);
+ } else if (this.location == AuthKeyLocation.QUERY) {
+ request.getParameters().add(this.paramName, this.apiKey);
+ } else if (this.location == AuthKeyLocation.COOKIE) {
+ request.cookie(Cookie.of(this.paramName, this.apiKey));
+ }
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public AuthKeyLocation getLocation() {
+ return location;
+ }
+
+ public String getParamName() {
+ return paramName;
+ }
+
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ public void setLocation(AuthKeyLocation location) {
+ this.location = location;
+ }
+
+ public void setParamName(String paramName) {
+ this.paramName = paramName;
+ }
+
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ public enum AuthKeyLocation {
+ HEADER,
+ QUERY,
+ COOKIE;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ConfigurableAuthorization.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ConfigurableAuthorization.mustache
new file mode 100644
index 00000000000..2d649c3a3be
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/ConfigurableAuthorization.mustache
@@ -0,0 +1,14 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth.configuration;
+
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.http.MutableHttpRequest;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+public interface ConfigurableAuthorization {
+ String getName();
+
+ void applyAuthorization(@NonNull MutableHttpRequest> request);
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/HttpBasicAuthConfiguration.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/HttpBasicAuthConfiguration.mustache
new file mode 100644
index 00000000000..189613b4f7e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/auth/configuration/HttpBasicAuthConfiguration.mustache
@@ -0,0 +1,55 @@
+{{>licenseInfo}}
+package {{invokerPackage}}.auth.configuration;
+
+import io.micronaut.context.annotation.ConfigurationInject;
+import io.micronaut.context.annotation.EachProperty;
+import io.micronaut.context.annotation.Parameter;
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.http.MutableHttpRequest;
+import javax.annotation.Generated;
+
+
+{{>generatedAnnotation}}
+@EachProperty("security.basic-auth")
+public class HttpBasicAuthConfiguration implements ConfigurableAuthorization {
+ private final String name;
+ private String username;
+ private String password;
+
+ @ConfigurationInject
+ public HttpBasicAuthConfiguration(
+ @Parameter String name,
+ @NonNull String username,
+ @NonNull String password
+ ) {
+ this.name = name;
+ this.username = username;
+ this.password = password;
+ }
+
+ @Override
+ public void applyAuthorization(@NonNull MutableHttpRequest> request) {
+ request.basicAuth(username, password);
+ }
+
+ @Override
+ public String getName() {
+ return this.name;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/Application.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/Application.mustache
new file mode 100644
index 00000000000..ad59c5fa124
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/Application.mustache
@@ -0,0 +1,9 @@
+package {{invokerPackage}};
+
+import io.micronaut.runtime.Micronaut;
+
+public class Application {
+ public static void main(String[] args) {
+ Micronaut.run(Application.class, args);
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/application.yml.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/application.yml.mustache
new file mode 100644
index 00000000000..4b0dd5f1c23
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/application.yml.mustache
@@ -0,0 +1,62 @@
+base-path: "{{{basePath}}}"
+context-path: "{{{contextPath}}}"
+
+micronaut:
+ application:
+ name: {{artifactId}}
+ {{!
+ configure authorization from the parameters
+ }}{{#configureAuth}}security:
+ oauth2:
+ clients:{{#oauthMethods}}
+ {{{name}}}:
+ grant-type: {{#isCode}}authorization_code{{/isCode}}{{#isImplicit}}implicit{{/isImplicit}}{{#isPassword}}password{{/isPassword}}{{#isApplication}}client_credentials{{/isApplication}}
+ scopes: [{{#scopes}}"{{{scope}}}"{{^-last}}, {{/-last}}{{/scopes}}]{{!authorization url}}{{#authorizationUrl}}
+ authorization:
+ url: "{{{authorizationUrl}}}"{{/authorizationUrl}}{{!token url}}{{#tokenUrl}}
+ token:
+ auth-method: client_secret_basic
+ url: "{{{tokenUrl}}}"{{/tokenUrl}}{{!refreshUrl is not used}}
+ # TODO Fill in the parameters for {{{name}}} authorization if needed
+ # client-id:
+ # client-secret:{{/oauthMethods}}{{/configureAuth}}{{!
+ do not configure authorization, but leave hints for user
+ }}{{^configureAuth}}# TODO configure security features
+ security:
+ oauth2:
+ clients:
+ # An example of how oauth client is filled
+ # name:
+ # grant-type: authorization_code | client_credentials
+ # scopes: []
+ # token:
+ # auth-method: client_secret_basic
+ # url: "https://"
+ # client-id:
+ # client-secret
+ # An example of how to apply other authorization methods
+ # authentication: bearer | cookie | session{{/configureAuth}}
+
+{{#configureAuth}}security:
+ {{!api key authorization}}api-key-auth:{{#authMethods}}{{#isApiKey}}
+ {{{name}}}:
+ location: {{#isKeyInQuery}}query{{/isKeyInQuery}}{{#isKeyInHeader}}header{{/isKeyInHeader}}{{#isKeyInCookie}}cookie{{/isKeyInCookie}}
+ param-name: "{{{keyParamName}}}"
+ # TODO fill in api key for {{{name}}} authorization
+ api-key:
+ {{/isApiKey}}{{/authMethods}}
+ {{!basic authorization}}basic-auth:{{#authMethods}}{{#isBasic}}
+ {{{name}}}:
+ # TODO fill in credentials for {{{name}}} authorization
+ username:
+ password:
+ {{/isBasic}}{{/authMethods}}{{/configureAuth}}
+
+jackson:
+ serialization:
+ writeEnumsUsingToString: true
+ writeDatesAsTimestamps: false
+ deserialization:
+ readEnumsUsingToString: true
+ failOnUnknownProperties: false
+ failOnInvalidSubtype: false
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/git_push.sh.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/git_push.sh.mustache
new file mode 100644
index 00000000000..8b3f689c912
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/git_push.sh.mustache
@@ -0,0 +1,58 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-pestore-perl "minor update" "gitlab.com"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+git_host=$4
+
+if [ "$git_host" = "" ]; then
+ git_host="{{{gitHost}}}"
+ echo "[INFO] No command line input provided. Set \$git_host to $git_host"
+fi
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="{{{gitUserId}}}"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="{{{gitRepoId}}}"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="{{{releaseNote}}}"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+ git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_host}/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/gitignore.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/gitignore.mustache
new file mode 100644
index 00000000000..a530464afa1
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/git/gitignore.mustache
@@ -0,0 +1,21 @@
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# exclude jar for gradle wrapper
+!gradle/wrapper/*.jar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# build files
+**/target
+target
+.gradle
+build
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/build.gradle.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/build.gradle.mustache
new file mode 100644
index 00000000000..a654fe37133
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/build.gradle.mustache
@@ -0,0 +1,51 @@
+plugins {
+ {{#isTestSpock}}
+ id("groovy")
+ {{/isTestSpock}}
+ id("com.github.johnrengelman.shadow") version "7.0.0"
+ id("io.micronaut.application") version "2.0.3"
+}
+
+version = "{{artifactVersion}}"
+group = "{{invokerPackage}}"
+
+repositories {
+ mavenCentral()
+}
+
+micronaut {
+ runtime("netty")
+ {{#isTestSpock}}
+ testRuntime("spock2")
+ {{/isTestSpock}}
+ {{#isTestJunit}}
+ testRuntime("junit5")
+ {{/isTestJunit}}
+ processing {
+ incremental(true)
+ annotations("{{invokerPackage}}.*")
+ }
+}
+
+
+dependencies {
+ annotationProcessor("io.micronaut:micronaut-http-validation")
+ annotationProcessor("io.micronaut.security:micronaut-security-annotations")
+ implementation("io.micronaut:micronaut-http-client")
+ implementation("io.micronaut:micronaut-runtime")
+ implementation("io.micronaut:micronaut-validation")
+ implementation("io.micronaut.security:micronaut-security")
+ implementation("io.micronaut.security:micronaut-security-oauth2")
+ implementation("io.micronaut.reactor:micronaut-reactor")
+ implementation("io.swagger:swagger-annotations:1.5.9")
+ runtimeOnly("ch.qos.logback:logback-classic")
+}
+
+// TODO Set the main class
+application {
+ mainClass.set("{{invokerPackage}}.Application")
+}
+java {
+ sourceCompatibility = JavaVersion.toVersion("1.8")
+ targetCompatibility = JavaVersion.toVersion("1.8")
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/gradle.properties.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/gradle.properties.mustache
new file mode 100644
index 00000000000..4804e049014
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/gradle.properties.mustache
@@ -0,0 +1 @@
+micronautVersion=3.0.0-M5
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/settings.gradle.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/settings.gradle.mustache
new file mode 100644
index 00000000000..b8fd6c4c41f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradle/settings.gradle.mustache
@@ -0,0 +1 @@
+rootProject.name = "{{artifactId}}"
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.jar b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.jar
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.properties.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.properties.mustache
new file mode 100644
index 00000000000..f2e1eb1fd47
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradle-wrapper.properties.mustache
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.bat.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.bat.mustache
new file mode 100644
index 00000000000..107acd32c4e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.bat.mustache
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.mustache
new file mode 100644
index 00000000000..4f906e0c811
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/gradlew/gradlew.mustache
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# 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.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/MavenWrapperDownloader.java.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/MavenWrapperDownloader.java.mustache
new file mode 100644
index 00000000000..fc435c409b3
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/MavenWrapperDownloader.java.mustache
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * 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.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.6";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if(mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if(mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if(!outputFile.getParentFile().exists()) {
+ if(!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/maven-wrapper.jar.mustache b/modules/openapi-generator/src/main/resources/java-micronaut-client/configuration/mavenw/maven-wrapper.jar.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054
GIT binary patch
literal 50710
zcmbTd1CVCTmM+|7+wQV$+qP}n>auOywyU~q+qUhh+uxis_~*a##hm*_WW?9E7Pb7N%LRFiwbEGCJ0XP=%-6oeT$XZcYgtzC2~q
zk(K08IQL8oTl}>>+hE5YRgXTB@fZ4TH9>7=79e`%%tw*SQUa9~$xKD5rS!;ZG@ocK
zQdcH}JX?W|0_Afv?y`-NgLum62B&WSD$-w;O6G0Sm;SMX65z)l%m1e-g8Q$QTI;(Q
z+x$xth4KFvH@Bs6(zn!iF#nenk^Y^ce;XIItAoCsow38eq?Y-Auh!1in#Rt-_D>H^
z=EjbclGGGa6VnaMGmMLj`x3NcwA43Jb(0gzl;RUIRAUDcR1~99l2SAPkVhoRMMtN}
zXvC<tOmX83grD8GSo_Lo?%lNfhD#EBgPo
z*nf@ppMC#B!T)Ae0RG$mlJWmGl7CkuU~B8-==5i;rS;8i6rJ=PoQxf446XDX9g|c>
zU64ePyMlsI^V5Jq5A+BPe#e73+kpc_r1tv#B)~EZ;7^67F0*QiYfrk0uVW;Qb=NsG
zN>gsuCwvb?s-KQIppEaeXtEMdc9dy6Dfduz-tMTms+i01{eD9JE&h?Kht*$eOl#&L
zJdM_-vXs(V#$Ed;5wyNWJdPNh+Z$+;$|%qR(t`4W@kDhd*{(7-33BOS6L$UPDeE_53j${QfKN-0v-HG
z(QfyvFNbwPK%^!eIo4ac1;b>c0vyf9}Xby@YY!lkz-UvNp
zwj#Gg|4B~?n?G^{;(W;|{SNoJbHTMpQJ*Wq5b{l9c8(%?Kd^1?H1om1de0Da9M;Q=n
zUfn{f87iVb^>Exl*nZ0hs(Yt>&V9$Pg`zX`AI%`+0SWQ4Zc(8lUDcTluS
z5a_KerZWe}a-MF9#Cd^fi!y3%@RFmg&~YnYZ6<=L`UJ0v={zr)>$A;x#MCHZy1st7
ztT+N07NR+vOwSV2pvWuN1%lO!K#Pj0Fr>Q~R40{bwdL%u9i`DSM4RdtEH#cW)6}+I-eE<
z&tZs+(Ogu(H_;$a$!7w`MH0r%h&@KM+<>gJL@O~2K2?VrSYUBbhCn#yy?P)uF3qWU
z0o09mIik+kvzV6w>vEZy@&Mr)SgxPzUiDA&%07m17udz9usD82afQEps3$pe!7fUf
z0eiidkJ)m3qhOjVHC_M(RYCBO%CZKZXFb8}s0-+}@CIn&EF(rRWUX2g^yZCvl0bI}
zbP;1S)iXnRC&}5-Tl(hASKqdSnO?ASGJ*MIhOXIblmEudj(M|W!+I3eDc}7t`^mtg
z)PKlaXe(OH+q-)qcQ8a@!llRrpGI8DsjhoKvw9T;TEH&?s=LH0w$EzI>%u;oD@x83
zJL7+ncjI9nn!TlS_KYu5vn%f*@qa5F;|
zEFxY&B?g=IVlaF3XNm_03PA)=3|{n-UCgJoTr;|;1AU9|kPE_if8!Zvb}0q$5okF$
zHaJdmO&gg!9oN|M{!qGE=tb|3pVQ8PbL$}e;NgXz<6ZEggI}wO@aBP**2Wo=yN#ZC
z4G$m^yaM9g=|&!^ft8jOLuzc3Psca*;7`;gnHm}tS0%f4{|VGEwu45KptfNmwxlE~
z^=r30gi@?cOm8kAz!EylA4G~7kbEiRlRIzwrb~{_2(x^$-?|#e6Bi_**(vyr_~9Of
z!n>Gqf+Qwiu!xhi9f53=PM3`3tNF}pCOiPU|H4;pzjcsqbwg*{{kyrTxk<;mx~(;;
z1NMrpaQ`57yn34>Jo3b|HROE(UNcQash!0p2-!Cz;{IRv#Vp5!3o$P8!%SgV~k&Hnqhp`5eLjTcy93cK!3Hm-$`@yGnaE=?;*2uSpiZTs_dDd51U%i
z{|Zd9ou-;laGS_x=O}a+
zB||za<795A?_~Q=r=coQ+ZK@@
zId~hWQL<%)fI_WDIX#=(WNl!Dm$a&ROfLTd&B$vatq!M-2Jcs;N2vps$b6P1(N}=oI3<3luMTmC|0*{
zm1w8bt7vgX($!0@V0A}XIK)w!AzUn7vH=pZEp0RU0p?}ch2XC-7r#LK&vyc2=-#Q2
z^L%8)JbbcZ%g0Du;|8=q8B>X=mIQirpE=&Ox{TiuNDnOPd-FLI^KfEF729!!0x#Es
z@>3ursjFSpu%C-8WL^Zw!7a0O-#cnf`HjI+AjVCFitK}GXO`ME&on|^=~Zc}^LBp9
zj=-vlN;Uc;IDjtK38l7}5xxQF&sRtfn4^TNtnzXv4M{r&ek*(eNbIu!u$>Ed%`
z5x7+&)2P&4>0J`N&ZP8$vcR+@FS0126s6+Jx_{{`3ZrIMwaJo6jdrRwE$>IU_JTZ}
z(||hyyQ)4Z1@wSlT94(-QKqkAatMmkT7pCycEB1U8KQbFX&?%|4$yyxCtm3=W`$4fiG0WU3yI@c
zx{wfmkZAYE_5M%4{J-ygbpH|(|GD$2f$3o_Vti#&zfSGZMQ5_f3xt6~+{RX=$H8at
z?GFG1Tmp}}lmm-R->ve*Iv+XJ@58p|1_jRvfEgz$XozU8#iJS})UM6VNI!3RUU!{5
zXB(+Eqd-E;cHQ>)`h0(HO_zLmzR3Tu-UGp;08YntWwMY-9i^w_u#wR?JxR2bky5j9
z3Sl-dQQU$xrO0xa&>vsiK`QN<$Yd%YXXM7*WOhnRdSFt5$aJux8QceC?lA0_if|s>
ze{ad*opH_kb%M&~(~&UcX0nFGq^MqjxW?HJIP462v9XG>j(5Gat_)#SiNfahq2Mz2
zU`4uV8m$S~o9(W>mu*=h%Gs(Wz+%>h;R9Sg)jZ$q8vT1HxX3iQnh6&2rJ1u|j>^Qf`A76K%_ubL`Zu?h4`b=IyL>1!=*%!_K)=XC
z6d}4R5L+sI50Q4P3upXQ3Z!~1ZXLlh!^UNcK6#QpYt-YC=^H=EPg3)z*wXo*024Q4b2sBCG4I#
zlTFFY=kQ>xvR+LsuDUAk)q%5pEcqr(O_|^spjhtpb1#aC&
zghXzGkGDC_XDa%t(X`E+kvKQ4zrQ*uuQoj>7@@ykWvF332)RO?%AA&Fsn&MNzmFa$
zWk&&^=NNjxLjrli_8ESU)}U|N{%j&TQmvY~lk!~Jh}*=^INA~&QB9em!in_X%Rl1&Kd~Z(u
z9mra#<@vZQlOY+JYUwCrgoea4C8^(xv4ceCXcejq84TQ#sF~IU2V}LKc~Xlr_P=ry
zl&Hh0exdCbVd^NPCqNNlxM3vA13EI8XvZ1H9#bT7y*U8Y{H8nwGpOR!e!!}*g;mJ#}T{ekSb}5zIPmye*If(}}_=PcuAW#yidAa^9-`<8Gr0
z)Fz=NiZ{)HAvw{Pl5uu)?)&i&Us$Cx4gE}cIJ}B4Xz~-q7)R_%owbP!z_V2=Aq%Rj
z{V;7#kV1dNT9-6R+H}}(ED*_!F=~uz>&nR3gb^Ce%+0s#u|vWl<~JD3MvS0T9thdF
zioIG3c#Sdsv;LdtRv3ml7%o$6LTVL>(H`^@TNg`2KPIk*8-IB}X!MT0`hN9Ddf7yN
z?J=GxPL!uJ7lqwowsl?iRrh@#5C$%E&h~Z>XQcvFC*5%0RN-Opq|=IwX(dq(*sjs+
zqy99+v~m|6T#zR*e1AVxZ8djd5>eIeCi(b8sUk)OGjAsKSOg^-ugwl2WSL@d#?mdl
zib0v*{u-?cq}dDGyZ%$XRY=UkQwt2oGu`zQneZh$=^!
zj;!pCBWQNtvAcwcWIBM2y9!*W|8LmQy$H~5BEx)78J`4Z0(FJO2P^!YyQU{*Al+fs
z){!4JvT1iLrJ8aU3k0t|P}{RN)_^v%$$r;+p0DY7N8CXzmS*HB*=?qaaF9D@#_$SN
zSz{moAK<*RH->%r7xX~9gVW$l7?b|_SYI)gcjf0VAUJ%FcQP(TpBs;
zg$25D!Ry_`8xpS_OJdeo$qh#7U+cepZ??TII7_%AXsT$B
z=e)Bx#v%J0j``00Zk5hsvv6%T^*xGNx%KN-=pocSoqE5_R)OK%-Pbu^1MNzfds)mL
zxz^F4lDKV9D&lEY;I+A)ui{TznB*CE$=9(wgE{m}`^<--OzV-5V4X2w9j(_!+jpTr
zJvD*y6;39&T+==$F&tsRKM_lqa1HC}aGL0o`%c9mO=fts?36@8MGm7Vi{Y
z^<7m$(EtdSr#22<(rm_(l_(`j!*Pu~Y>>xc>I9M#DJYDJNHO&4=HM%YLIp?;iR&$m
z#_$ZWYLfGLt5FJZhr3jpYb`*%9S!zCG6ivNHYzNHcI%khtgHBliM^Ou}ZVD7ehU9
zS+W@AV=?Ro!=%AJ>Kcy9aU3%VX3|XM_K0A+ZaknKDyIS3S-Hw1C7&BSW5)sqj5Ye_
z4OSW7Yu-;bCyYKHFUk}<*<(@TH?YZPHr~~Iy%9@GR2Yd}J2!N9K&CN7Eq{Ka!jdu;
zQNB*Y;i(7)OxZK%IHGt#Rt?z`I|A{q_BmoF!f^G}XVeTbe1Wnzh%1g>j}>DqFf;Rp
zz7>xIs12@Ke0gr+4-!pmFP84vCIaTjqFNg{V`5}Rdt~xE^I;Bxp4)|cs8=f)1YwHz
zqI`G~s2~qqDV+h02b`PQpUE#^^Aq8l%y2|ByQeXSADg5*qMprEAE3WFg0Q39`O+i1
z!J@iV!`Y~C$wJ!5Z+j5$i<1`+@)tBG$JL=!*uk=2k;T<@{|s1$YL079FvK%mPhyHV
zP8^KGZnp`(hVMZ;s=n~3r2y;LTwcJwoBW-(ndU-$03{RD
zh+Qn$ja_Z^OuMf3Ub|JTY74s&Am*(n{J3~@#OJNYuEVVJd9*H%)oFoRBkySGm`hx!
zT3tG|+aAkXcx-2Apy)h^BkOyFTWQVeZ%e2@;*0DtlG9I3Et=PKaPt&K
zw?WI7S;P)TWED7aSH$3hL@Qde?H#tzo^<(o_sv_2ci<7M?F$|oCFWc?7@KBj-;N$P
zB;q!8@bW-WJY9do&y|6~mEruZAVe$!?{)N9rZZxD-|oltkhW9~nR8bLBGXw<632!l
z*TYQn^NnUy%Ds}$f^=yQ+BM-a5X4^GHF=%PDrRfm_uqC
zh{sKwIu|O0&jWb27;wzg4w5uA@TO_j(1X?8E>5Zfma|Ly7Bklq|s
z9)H`zoAGY3n-+&JPrT!>u^qg9Evx4y@GI4$n-Uk_5wttU1_t?6><>}cZ-U+&+~JE)
zPlDbO_j;MoxdLzMd~Ew|1o^a5q_1R*JZ=#XXMzg?6Zy!^hop}qoLQlJ{(%!KYt`MK
z8umEN@Z4w!2=q_oe=;QttPCQy3Nm4F@x>@v4sz_jo{4m*0r%J(w1cSo;D_hQtJs7W
z><$QrmG^+<$4{d2bgGo&3-FV}avg9zI|Rr(k{wTyl3!M1q+a
zD9W{pCd%il*j&Ft
z5H$nENf>>k$;SONGW`qo6`&qKs*T
z2^RS)pXk9b@(_Fw1bkb)-oqK|v}r$L!W&aXA>IpcdNZ_vWE#XO8X`#Yp1+?RshVcd
zknG%rPd*4ECEI0wD#@d+3NbHKxl}n^Sgkx==Iu%}HvNliOqVBqG?P2va
zQ;kRJ$J6j;+wP9cS
za#m;#GUT!qAV%+rdWolk+)6kkz4@Yh5LXP+LSvo9_T+MmiaP-eq6_k;)i6_@WSJ
zlT@wK$zqHu<83U2V*yJ|XJU4farT#pAA&@qu)(PO^8PxEmPD4;Txpio+2)#!9
z>&=i7*#tc0`?!==vk>s7V+PL#S1;PwSY?NIXN2=Gu89x(cToFm))7L;<
z+bhAbVD*bD=}iU`+PU+SBobTQ%S!=VL!>q$rfWsaaV}Smz>lO9JXT#`CcH_mRCSf4%YQAw`$^yY
z3Y*^Nzk_g$xn7a_NO(2Eb*I=^;4f!Ra#Oo~LLjlcjke*k*o$~U#0ZXOQ5@HQ&T46l
z7504MUgZkz2gNP1QFN8Y?nSEnEai^Rgyvl}xZfMUV6QrJcXp;jKGqB=D*tj{8(_pV
zqyB*DK$2lgYGejmJUW)*s_Cv65sFf&pb(Yz8oWgDtQ0~k^0-wdF|tj}MOXaN@ydF8
zNr={U?=;&Z?wr^VC+`)S2xl}QFagy;$mG=TUs7Vi2wws5zEke4hTa2)>O0U?$WYsZ
z<8bN2bB_N4AWd%+kncgknZ&}bM~eDtj#C5uRkp21hWW5gxWvc6b*4+dn<{c?w9Rmf
zIVZKsPl{W2vQAlYO3yh}-{Os=YBnL8?uN5(RqfQ=-1cOiUnJu>KcLA*tQK3FU`_bM
zM^T28w;nAj5EdAXFi&Kk1Nnl2)D!M{@+D-}bIEe+Lc4{s;YJc-{F#``iS2uk;2!Zp
zF9#myUmO!wCeJIoi^A+T^e~20c+c2C}XltaR!|U-HfDA=^xF97ev}$l6#oY
z&-&T{egB)&aV$3_aVA51XGiU07$s9vubh_kQG?F$FycvS6|IO!6q
zq^>9|3U^*!X_C~SxX&pqUkUjz%!j=VlXDo$!2VLH!rKj@61mDpSr~7B2yy{>X~_nc
zRI+7g2V&k
zd**H++P9dg!-AOs3;GM`(g<+GRV$+&DdMVpUxY9I1@uK28$az=6oaa+PutlO9?6#?
zf-OsgT>^@8KK>ggkUQRPPgC7zjKFR5spqQb3ojCHzj^(UH~v+!y*`Smv)VpVoPwa6
zWG18WJaPKMi*F6Zdk*kU^`i~NNTfn3BkJniC`yN98L-Awd)Z&mY?
zprBW$!qL-OL7h@O#kvYnLsfff@kDIegt~?{-*5A7JrA;#TmTe?jICJqhub-G@e??D
zqiV#g{)M!kW1-4SDel7TO{;@*h2=_76g3NUD@|c*WO#>MfYq6_YVUP+&8e4|%4T`w
zXzhmVNziAHazWO2qXcaOu@R1MrPP{t)`N)}-1&~mq=ZH=w=;-E$IOk=y$dOls{6sRR`I5>|X
zpq~XYW4sd;J^6OwOf**J>a7u$S>WTFPRkjY;BfVgQst)u4aMLR1|6%)CB^18XCz+r
ztkYQ}G43j~Q&1em(_EkMv0|WEiKu;z2zhb(L%$F&xWwzOmk;VLBYAZ8lOCziNoPw1
zv2BOyXA`A8z^WH!nXhKXM`t0;6D*-uGds3TYGrm8SPnJJOQ^fJU#}@aIy@MYWz**H
zvkp?7I5PE{$$|~{-ZaFxr6ZolP^nL##mHOErB^AqJqn^hFA=)HWj!m3WDaHW$C)i^
z9@6G$SzB=>jbe>4kqr#sF7#K}W*Cg-5y6kun3u&0L7BpXF9=#7IN8FOjWrWwUBZiU
zT_se3ih-GBKx+Uw0N|CwP3D@-C=5(9T#BH@M`F2!Goiqx+Js5xC92|Sy0%WWWp={$(am!#l~f^W_oz78HX<0X#7
zp)p1u~M*o9W@O8P{0Qkg@Wa#
z2{Heb&oX^CQSZWSFBXKOfE|tsAm#^U-WkDnU;IowZ`Ok4!mwHwH=s|AqZ^YD4!5!@
zPxJj+Bd-q6w_YG`z_+r;S86zwXb+EO&qogOq8h-Ect5(M2+>(O7n7)^dP*ws_3U6v
zVsh)sk^@*c>)3EML|0<-YROho{lz@Nd4;R9gL{9|64xVL`n!m$-Jjrx?-Bacp!=^5
z1^T^eB{_)Y<9)y{-4Rz@9_>;_7h;5D+@QcbF4Wv7hu)s0&==&6u)33
zHRj+&Woq-vDvjwJCYES@$C4{$?f$Ibi4G()UeN11rgjF+^;YE^5nYprYoJNoudNj=
zm1pXSeG64dcWHObUetodRn1Fw|1nI$D9z}dVEYT0lQnsf_E1x2vBLql7NrHH!n&Sq
z6lc*mvU=W&3Y7tNdrmhnHR-*#=c(@8+WX>S6=v9Lrl}&zRiu_6u;6g%_DU{9b+R
z#YHqX7`m9eydf?KlKu6Sb%j$%_jmydig`B*TN`cZL-g!R)iE?+Q5oOqBFKhx
z%MW>BC^(F_JuG(ayE(MT{S3eI{cKiwOtPwLc0XO*{*|(JOx;uQOfq@lp_^cZo=FZj
z4#}@e@dJ>Bn%2`2_WPeSN7si^{U#H=7N4o%Dq3NdGybrZgEU$oSm$hC)uNDC_M9xc
zGzwh5Sg?mpBIE8lT2XsqTt3j3?We8}3bzLBTQd639vyg^$0#1epq8snlDJP2(BF)K
zSx30RM+{f+b$g{9usIL8H!hCO117Xgv}ttPJm9wVRjPk;ePH@zxv%j9k5`TzdXLeT
zFgFX`V7cYIcBls5WN0Pf6SMBN+;CrQ(|EsFd*xtwr#$R{Z9FP`OWtyNsq#mCgZ7+P
z^Yn$haBJ)r96{ZJd8vlMl?IBxrgh=fdq_NF!1{jARCVz>jNdC)H^wf2G!*f3zl;
zdyVT?9`x`+G$!^eYN@PUum|5;j8$+`cBrBI`k*I0!jRt1BR=3gh&7e8U#!mamgR&_
z3Z&@9rms~l@GlsEKduCfx9Wt{o>y?R94#MPdUjcYX>#wEx+LB#P-#4S-%YH>t-j+w
zOFTI8gX$ard6fAh&g=u&56%3^-6E2tpk*wx3HSCQ+t7+*iOs
zPk5ysqE}i*cQocFvA68xHfL|iX(C4h*67@3|5Qwle(8wT&!&{8*{f%0(5gH+m>$tq
zp;AqrP7?XTEooYG1Dzfxc>W%*CyL16q|fQ0_jp%%Bk^k!i#Nbi(N9&T>#M{gez_Ws
zYK=l}adalV(nH}I_!hNeb;tQFk3BHX7N}}R8%pek^E`X}%ou=cx8InPU1EE0|Hen-
zyw8MoJqB5=)Z%JXlrdTXAE)eqLAdVE-=>wGHrkRet}>3Yu^lt$Kzu%$3#(ioY}@Gu
zjk3BZuQH&~7H+C*uX^4}F*|P89JX;Hg2U!pt>rDi(n(Qe-c}tzb0#6_ItoR0->LSt
zR~UT<-|@TO%O`M+_e_J4wx7^)5_%%u+J=yF_S#2Xd?C;Ss3N7KY^#-vx+|;bJX&8r
zD?|MetfhdC;^2WG`7MCgs>TKKN=^=!x&Q~BzmQio_^l~LboTNT=I
zC5pme^P@ER``p$2md9>4!K#vV-Fc1an7pl>_|&>aqP}+zqR?+~Z;f2^`a+-!Te%V?
z;H2SbF>jP^GE(R1@%C==XQ@J=G9lKX+Z<@5}PO(EYkJh=GCv#)Nj{DkWJM2}F&oAZ6xu8&g7pn1ps2U5srwQ7CAK
zN&*~@t{`31lUf`O;2w^)M3B@o)_mbRu{-`PrfNpF!R^q>yTR&ETS7^-b2*{-tZAZz
zw@q5x9B5V8Qd7dZ!Ai$9hk%Q!wqbE1F1c96&zwBBaRW}(^axoPpN^4Aw}&a5dMe+*Gomky_l^54*rzXro$
z>LL)U5Ry>~FJi=*{JDc)_**c)-&faPz`6v`YU3HQa}pLtb5K)u%K+BOqXP0)rj5Au$zB
zW1?vr?mDv7Fsxtsr+S6ucp2l#(4dnr9sD*v+@*>g#M4b|U?~s93>Pg{{a5|rm2xfI
z`>E}?9S@|IoUX{Q1zjm5YJT|3S>&09D}|2~BiMo=z4YEjXlWh)V&qs;*C{`UMxp$9
zX)QB?G$fPD6z5_pNs>Jeh{^&U^)Wbr?2D6-q?)`*1k@!UvwQgl8eG$r+)NnFoT)L6
zg7lEh+E6J17krfYJCSjWzm67hEth24pomhz71|Qodn#oAILN)*Vwu2qpJirG)4Wnv}9GWOFrQg%Je+gNrPl8mw7ykE8{
z=|B4+uwC&bpp%eFcRU6{mxRV32VeH8XxX>v$du<$(DfinaaWxP<+Y97Z#n#U~V
zVEu-GoPD=9$}P;xv+S~Ob#mmi$JQmE;Iz4(){y*9pFyW-jjgdk#oG$fl4o9E8bo|L
zWjo4l%n51@Kz-n%zeSCD`uB?T%FVk+KBI}=ve
zvlcS#wt`U6wrJo}6I6Rwb=1GzZfwE=I&Ne@p7*pH84XShXYJRgvK)UjQL%R9Zbm(m
zxzTQsLTON$WO7vM)*vl%Pc0JH7WhP;$z@j=y#avW4X8iqy6mEYr@-}PW?H)xfP6fQ
z&tI$F{NNct4rRMSHhaelo<5kTYq+(?pY)Ieh8*sa83EQfMrFupMM@nfEV@EmdHUv9
z35uzIrIuo4#WnF^_jcpC@uNNaYTQ~uZWOE6P@LFT^1@$o&q+9Qr8YR+ObBkpP9=F+$s5+B!mX2~T
zAuQ6RenX?O{IlLMl1%)OK{S7oL}X%;!XUxU~xJN8xk
z`xywS*naF(J#?vOpB(K=o~lE;m$zhgPWDB@=p#dQIW>xe_p1OLoWInJRKbEuoncf;
zmS1!u-ycc1qWnDg5Nk2D)BY%jmOwCLC+Ny>`f&UxFowIsHnOXfR^S;&F(KXd{ODlm
z$6#1ccqt-HIH9)|@fHnrKudu!6B$_R{fbCIkSIb#aUN|3RM>zuO>dpMbROZ`^hvS@
z$FU-;e4W}!ubzKrU@R*dW*($tFZ>}dd*4_mv)#O>X{U@zSzQt*83l9mI
zI$8O<5AIDx`wo0}f2fsPC_l>ONx_`E7kdXu{YIZbp1$(^oBAH({T~&oQ&1{X951QW
zmhHUxd)t%GQ9#ak5fTjk-cahWC;>^Rg7(`TVlvy0W@Y!Jc%QL3Ozu#
zDPIqBCy&T2PWBj+d-JA-pxZlM=9ja2ce|3B(^VCF+a*MMp`(rH>Rt6W1$;r{n1(VK
zLs>UtkT43LR2G$AOYHVailiqk7naz2yZGLo*xQs!T9VN5Q>eE(w
zw$4&)&6xIV$IO^>1N-jrEUg>O8G4^@y+-hQv6@OmF@gy^nL_n1P1-Rtyy$Bl;|VcV
zF=p*&41-qI5gG9UhKmmnjs932!6hceXa#-qfK;3d*a{)BrwNFeKU|ge?N!;zk+kB!
zMD_uHJR#%b54c2tr~uGPLTRLg$`fupo}cRJeTwK;~}A>(Acy4k-Xk&Aa1&eWYS1ULWUj@fhBiWY$pdfy+F
z@G{OG{*v*mYtH3OdUjwEr6%_ZPZ3P{@rfbNPQG!BZ7lRyC^xlMpWH`@YRar`tr}d>
z#wz87t?#2FsH-jM6m{U=gp6WPrZ%*w0bFm(T#7m#v^;f%Z!kCeB5oiF`W33W5Srdt
zdU?YeOdPG@98H7NpI{(uN{FJdu14r(URPH^F6tOpXuhU7T9a{3G3_#Ldfx_nT(Hec
zo<1dyhsVsTw;ZkVcJ_0-h-T3G1W@q)_Q30LNv)W?FbMH+XJ*
zy=$@39Op|kZv`Rt>X`zg&at(?PO^I=X8d9&myFEx#S`dYTg1W+iE?vt#b47QwoHI9
zNP+|3WjtXo{u}VG(lLUaW0&@yD|O?4TS4dfJI`HC-^q;M(b3r2;7|FONXphw-%7~*
z&;2!X17|05+kZOpQ3~3!Nb>O94b&ZSs%p)TK)n3m=4eiblVtSx@KNFgBY_xV6ts;NF;GcGxMP8OKV^h6LmSb2E#Qnw
ze!6Mnz7>lE9u{AgQ~8u2zM8CYD5US8dMDX-5iMlgpE9m*s+Lh~A#P1er*rF}GHV3h
z=`STo?kIXw8I<`W0^*@mB1$}pj60R{aJ7>C2m=oghKyxMbFNq#EVLgP0cH3q7H
z%0?L93-z6|+jiN|@v>ix?tRBU(v-4RV`}cQH*fp|)vd3)8i9hJ3hkuh^8dz{F5-~_
zUUr1T3cP%cCaTooM8dj|4*M=e6flH0&8ve32Q)0dyisl))XkZ7Wg~N}6y`+Qi2l+e
zUd#F!nJp{#KIjbQdI`%oZ`?h=5G^kZ_uN`<(`3;a!~EMsWV|j-o>c?x#;zR2ktiB!
z);5rrHl?GPtr6-o!tYd|uK;Vbsp4P{v_4??=^a>>U4_aUXPWQ$FPLE4PK$T^3Gkf$
zHo&9$U&G`d(Os6xt1r?sg14n)G8HNyWa^q8#nf0lbr4A-Fi;q6t-`pAx1T*$eKM*$
z|CX|gDrk#&1}>5H+`EjV$9Bm)Njw&7-ZR{1!CJTaXuP!$Pcg69`{w5BRHysB$(tWUes@@6aM69kb|Lx$%BRY^-o6bjH#0!7b;5~{6J+jKxU!Kmi#
zndh@+?}WKSRY2gZ?Q`{(Uj|kb1%VWmRryOH0T)f3cKtG4oIF=F7RaRnH0Rc_&372={_3lRNsr95%ZO{IX{p@YJ^EI%+gvvKes5cY+PE@unghjdY5#9A!G
z70u6}?zmd?v+{`vCu-53_v5@z)X{oPC@P)iA3jK$`r
zSA2a7&!^zmUiZ82R2=1cumBQwOJUPz5Ay`RLfY(EiwKkrx%@YN^^XuET;tE
zmr-6~I7j!R!KrHu5CWGSChO6deaLWa*9LLJbcAJsFd%Dy>a!>J`N)Z&oiU4OEP-!Ti^_!p}O?7`}i7Lsf$-gBkuY*`Zb
z7=!nTT;5z$_5$=J=Ko+Cp|Q0J=%oFr>hBgnL3!tvFoLNhf#D0O=X^h+x08iB;@8pXdRHxX}6R4k@i6%vmsQwu^5z
zk1ip`#^N)^#Lg#HOW3sPI33xqFB4#bOPVnY%d6prwxf;Y-w9{ky4{O6&94Ra8VN@K
zb-lY;&`HtxW@sF!doT5T$2&lIvJpbKGMuDAFM#!QPXW87>}=Q4J3JeXlwHys?!1^#37q_k?N@+u&Ns20pEoBeZC*np;i;M{2C0Z4_br2gsh6eL
z#8`#sn41+$iD?^GL%5?cbRcaa-Nx0vE(D=*WY%rXy3B%gNz0l?#noGJGP728RMY#q
z=2&aJf@DcR?QbMmN)ItUe+VM_U!ryqA@1VVt$^*xYt~-qvW!J4Tp<-3>jT=7Zow5M
z8mSKp0v4b%a8bxFr>3MwZHSWD73D@+$5?nZAqGM#>H@`)mIeC#->B)P8T$zh-Pxnc
z8)~Zx?TWF4(YfKuF3WN_ckpCe5;x4V4AA3(i$pm|78{%!q?|~*eH0f=?j6i)n~Hso
zmTo>vqEtB)`%hP55INf7HM@taH)v`Fw40Ayc*R!T?O{ziUpYmP)AH`euTK!zg9*6Z
z!>M=$3pd0!&TzU=hc_@@^Yd3eUQpX4-33}b{?~5t5lgW=ldJ@dUAH%`l5US1y_`40
zs(X`Qk}vvMDYYq+@Rm+~IyCX;iD~pMgq^KY)T*aBz@DYEB={PxA>)mI6tM*sx-DmGQHEaHwRrAmNjO!ZLHO4b;;5mf@zzlPhkP($JeZGE7
z?^XN}Gf_feGoG~BjUgVa*)O`>lX=$BSR2)uD<9
z>o^|nb1^oVDhQbfW>>!;8-7<}nL6L^V*4pB=>wwW+RXAeRvKED(n1;R`A6v$6gy0I(;Vf?!4;&sgn7F%LpM}6PQ?0%2Z@b{It<(G1CZ|>913E0nR2r^Pa*Bp
z@tFGi*CQ~@Yc-?{cwu1
zsilf=k^+Qs>&WZG(3WDixisHpR>`+ihiRwkL(3T|=xsoNP*@XX3BU8hr57l3k;pni
zI``=3Nl4xh4oDj<%>Q1zYXHr%Xg_xrK3Nq?vKX3|^Hb(Bj+lONTz>4yhU-UdXt2>j
z<>S4NB&!iE+ao{0Tx^N*^|EZU;0kJkx@zh}S^P{ieQjGl468CbC`SWnwLRYYiStXm
zOxt~Rb3D{dz=nHMcY)#r^kF8|q8KZHVb9FCX2m^X*(|L9FZg!5a7((!J8%MjT$#Fs)M1Pb
zq6hBGp%O1A+&%2>l0mpaIzbo&jc^!oN^3zxap3V2dNj3x<=TwZ&0eKX5PIso9j1;e
zwUg+C&}FJ`k(M|%%}p=6RPUq4sT3-Y;k-<68ciZ~_j|bt>&9ZLHNVrp#+pk}XvM{8
z`?k}o-!if>hVlCP9j%&WI2V`5SW)BCeR5>MQhF)po=p~AYN%cNa_BbV6EEh_kk^@a
zD>4&>uCGCUmyA-c)%DIcF4R6!>?6T~Mj_m{Hpq`*(wj>foHL;;%;?(((YOxGt)Bhx
zuS+K{{CUsaC++%}S6~CJ=|vr(iIs-je)e9uJEU8ZJAz)w166q)R^2XI?@E2vUQ!R%
zn@dxS!JcOimXkWJBz8Y?2JKQr>`~SmE2F2SL38$SyR1^yqj8_mkBp)o$@+3BQ~Mid
z9U$XVqxX3P=XCKj0*W>}L0~Em`(vG<>srF8+*kPrw
z20{z(=^w+ybdGe~Oo_i|hYJ@kZl*(9sHw#Chi&OIc?w`nBODp?ia$uF%Hs(X>xm?j
zqZQ`Ybf@g#wli`!-al~3GWiE$K+LCe=Ndi!#CVjzUZ
z!sD2O*;d28zkl))m)YN7HDi^z5IuNo3^w(zy8
zszJG#mp#Cj)Q@E@r-=NP2FVxxEAeOI2e=|KshybNB6HgE^(r>HD{*}S}mO>LuRGJT{*tfTzw_#+er-0${}%YPe@CMJ1Ng#j#)i)SnY@ss3gL;g
zg2D~#Kpdfu#G;q1qz_TwSz1VJT(b3zby$Vk&;Y#1(A)|xj`_?i5YQ;TR%jice5E;0
zYHg;`zS5{S*9xI6o^j>rE8Ua*XhIw{_-*&@(R|C(am8__>+Ws&Q^ymy*X4~hR2b5r
zm^p3sw}yv=tdyncy_Ui7{BQS732et~Z_@{-IhHDXAV`(Wlay<#hb>%H%WDi+K$862nA@BDtM#UCKMu+kM`!JHyWSi?&)A7_
z3{cyNG%a~nnH_!+;g&JxEMAmh-Z}rC!o7>OVzW&PoMyTA_g{hqXG)SLraA^OP**<7
zjWbr7z!o2n3hnx7A=2O=WL;`@9N{vQIM@&|G-ljrPvIuJHYtss0Er0fT5cMXNUf1B
z7FAwBDixt0X7C3S)mPe5g`YtME23wAnbU)+AtV}z+e8G;0BP=bI;?(#|Ep!vVfDbK
zvx+|CKF>yt0hWQ3drchU#XBU+HiuG*V^snFAPUp-5<#R&BUAzoB!aZ+e*KIxa26V}s6?nBK(U-7REa573wg-jqCg>H8~>O{
z*C0JL-?X-k_y%hpUFL?I>0WV{oV`Nb)nZbJG01R~AG>flIJf)3O*oB2i8~;!P?Wo_
z0|QEB*fifiL6E6%>tlAYHm2cjTFE@*<);#>689Z6S#BySQ@VTMhf9vYQyLeDg1*F}
zjq>i1*x>5|CGKN{l9br3kB0EHY|k4{%^t7-uhjd#NVipUZa=EUuE5kS1_~qYX?>hJ
z$}!jc9$O$>J&wnu0SgfYods^z?J4X;X7c77Me0kS-dO_VUQ39T(Kv(Y#s}Qqz-0AH
z^?WRL(4RzpkD+T5FG_0NyPq-a-B7A5LHOCqwObRJi&oRi(<;OuIN7SV5PeHU$<@Zh
zPozEV`dYmu0Z&Tqd>t>8JVde9#Pt+l95iHe$4Xwfy1AhI
zDM4XJ;bBTTvRFtW>E+GzkN)9k!hA5z;xUOL2
zq4}zn-DP{qc^i|Y%rvi|^5k-*8;JZ~9a;>-+q_EOX+p1Wz;>i7c}M6Nv`^NY&{J->
z`(mzDJDM}QPu5i44**2Qbo(XzZ-ZDu%6vm8w@DUarqXj41VqP~
zs&4Y8F^Waik3y1fQo`bVUH;b=!^QrWb)3Gl=QVKr+6sxc=ygauUG|cm?|X=;Q)kQ8
zM(xrICifa2p``I7>g2R~?a{hmw@{!NS5`VhH8+;cV(F>B94M*S;5#O`YzZH1Z%yD?
zZ61w(M`#aS-*~Fj;x|J!KM|^o;MI#Xkh0ULJcA?o4u~f%Z^16ViA27FxU5GM*rKq(
z7cS~MrZ=f>_OWx8j#-Q3%!aEU2hVuTu(7`TQk-Bi6*!<}0WQi;_FpO;fhpL4`DcWp
zGOw9vx0N~6#}lz(r+dxIGZM3ah-8qrqMmeRh%{z@dbUD2w15*_4P?I~UZr^anP}DB
zU9CCrNiy9I3~d#&!$DX9e?A});BjBtQ7oGAyoI$8YQrkLBIH@2;lt4E^)|d6Jwj}z
z&2_E}Y;H#6I4<10d_&P0{4|EUacwFHauvrjAnAm6yeR#}f}Rk27CN)vhgRqEyPMMS7zvunj2?`f;%?alsJ+-K+IzjJx>h8
zu~m_y$!J5RWAh|C<6+uiCNsOKu)E72M3xKK(a9Okw3e_*O&}7llNV!=P87VM2DkAk
zci!YXS2&=P0}Hx|wwSc9JP%m8dMJA*q&VFB0yMI@5vWoAGraygwn){R+Cj6B1a2Px
z5)u(K5{+;z2n*_XD!+Auv#LJEM)(~Hx{$Yb^ldQmcYF2zNH1V30*)CN_|1$v2|`LnFUT$%-tO0Eg|c5$BB~yDfzS
zcOXJ$wpzVK0MfTjBJ0b$r#_OvAJ3WRt+YOLlJPYMx~qp>^$$$h#bc|`g0pF-Ao43?
z>*A+8lx>}L{p(Tni2Vvk)dtzg$hUKjSjXRagj)$h#8=KV>5s)J4vGtRn5kP|AXIz!
zPgbbVxW{2o4s-UM;c#We8P&mPN|DW7_uLF!a|^0S=wr6Esx9Z$2|c1?GaupU6$tb|
zY_KU`(_29O_%k(;>^|6*pZURH3`@%EuKS;Ns
z1lujmf;r{qAN&Q0&m{wJSZ8MeE7RM5+Sq;ul_
z`+ADrd_Um+G37js6tKsArNB}n{p*zTUxQr>3@wA;{EUbjNjlNd6$Mx
zg0|MyU)v`sa~tEY5$en7^PkC=S<2@!nEdG6L=h(vT__0F=S8Y&eM=hal#7eM(o^Lu
z2?^;05&|CNliYrq6gUv;|i!(W{0N)LWd*@{2q*u)}u*>
z7MQgk6t9OqqXMln?zoMAJcc
zMKaof_Up})q#DzdF?w^%tTI7STI^@8=Wk#enR*)&%8yje>+tKvUYbW8UAPg55xb70
zEn5&Ba~NmOJlgI#iS8W3-@N%>V!#z-ZRwfPO1)dQdQkaHsiqG|~we2ALqG7Ruup(DqSOft2RFg_X%3w?6VqvV1uzX_@F(diNVp
z4{I|}35=11u$;?|JFBEE*gb;T`dy+8gWJ9~pNsecrO`t#V9jW-6mnfO@ff9od}b(3s4>p0i30gbGIv~1@a^F2kl7YO;DxmF3?
zWi-RoXhzRJV0&XE@ACc?+@6?)LQ2XNm4KfalMtsc%4!Fn0rl
zpHTrHwR>t>7W?t!Yc{*-^xN%9P0cs0kr=`?bQ5T*oOo&VRRu+1chM!qj%2I!@+1XF
z4GWJ=7ix9;Wa@xoZ0RP`NCWw0*8247Y4jIZ>GEW7zuoCFXl6xIvz$ezsWgKdVMBH>
z{o!A7f;R-@eK9Vj7R40xx)T<2$?F2E<>Jy3F;;=Yt}WE59J!1WN367
zA^6pu_zLoZIf*x031CcwotS{L8bJE(<_F%j_KJ2P_IusaZXwN$&^t716W{M6X2r_~
zaiMwdISX7Y&Qi&Uh0upS3TyEIXNDICQlT5fHXC`aji-c{U(J@qh-mWl-uMN|T&435
z5)a1dvB|oe%b2mefc=Vpm0C%IUYYh7HI*;3UdgNIz}R##(#{(_>82|zB0L*1i4B5j-xi9O4x10rs_J6*gdRBX=@VJ+==sWb&_Qc6tSOowM{BX@(zawtjl
zdU!F4OYw2@Tk1L^%~JCwb|e#3CC>srRHQ*(N%!7$Mu_sKh@|*XtR>)BmWw!;8-mq7
zBBnbjwx8Kyv|hd*`5}84flTHR1Y@@uqjG`UG+jN_YK&RYTt7DVwfEDXDW4U+iO{>K
zw1hr{_XE*S*K9TzzUlJH2rh^hUm2v7_XjwTuYap|>zeEDY$HOq3X4Tz^X}E9z)x4F
zs+T?Ed+Hj<#jY-`Va~fT2C$=qFT-5q$@p9~0{G&eeL~tiIAHXA!f6C(rAlS^)&k<-
zXU|ZVs}XQ>s5iONo~t!XXZgtaP$Iau;JT%h)>}v54yut~pykaNye4axEK#5@?TSsQ
zE;Jvf9I$GVb|S`7$pG)4vgo9NXsKr?u=F!GnA%VS2z$@Z(!MR9?EPcAqi5ft)Iz6sNl`%kj+_H-X`R<>BFrBW=fSlD|{`D%@Rcbu2?%>t7i34k?Ujb)2@J-`j#4
zLK<69qcUuniIan-$A1+fR=?@+thwDIXtF1Tks@Br-xY
zfB+zblrR(ke`U;6U~-;p1Kg8Lh6v~LjW@9l2P6s+?$2!ZRPX`(ZkRGe7~q(4&gEi<$ch`5kQ?*1=GSqkeV
z{SA1EaW_A!t{@^UY2D^YO0(H@+kFVzZaAh0_`A`f(}G~EP~?B|%gtxu&g%^x{EYSz
zk+T;_c@d;+n@$<>V%P=nk36?L!}?*=vK4>nJSm+1%a}9UlmTJTrfX4{Lb7smNQn@T
zw9p2%(Zjl^bWGo1;DuMHN(djsEm)P8mEC2sL@KyPjwD@d%QnZ$
zMJ3cnn!_!iP{MzWk%PI&D?m?C(y2d|2VChluN^yHya(b`h>~GkI1y;}O_E57zOs!{
zt2C@M$^PR2U#(dZmA-sNreB@z-yb0Bf7j*yONhZG=onhx>t4)RB`r6&TP$n
zgmN*)eCqvgriBO-abHQ8ECN0bw?z5Bxpx
z=jF@?zFdVn?@gD5egM4o$m`}lV(CWrOKKq(sv*`mNcHcvw&Xryfw<{ch{O&qc#WCTXX6=#{MV@q#iHYba!OUY+MGeNTjP%Fj!WgM&`&RlI^=AWTOqy-o
zHo9YFt!gQ*p7{Fl86>#-JLZo(b^O`LdFK~OsZBRR@6P?ad^Ujbqm_j^XycM4ZHFyg
ziUbIFW#2tj`65~#2V!4z7DM8Z;fG0|APaQ{a2VNYpNotB7eZ5kp+tPDz&Lqs0j%Y4tA*URpcfi
z_M(FD=fRGdqf430j}1z`O0I=;tLu81bwJXdYiN7_&a-?ly|-j*+=--XGvCq#32Gh(=|qj5F?kmihk{%M&$}udW5)DHK
zF_>}5R8&&API}o0osZJRL3n~>76nUZ&L&iy^s>PMnNcYZ|9*1$v-bzbT3rpWsJ+y{
zPrg>5Zlery96Um?lc6L|)}&{992{_$J&=4%nRp9BAC6!IB=A&=tF>r8S*O-=!G(_(
zwXbX_rGZgeiK*&n5E;f=k{ktyA1(;x_kiMEt0*gpp_4&(twlS2e5C?NoD{n>X2AT#
zY@Zp?#!b1zNq96MQqeO*M1MMBin5v#RH52&Xd~DO6-BZLnA6xO1$sou(YJ1Dlc{WF
zVa%2DyYm`V#81jP@70IJ;DX@y*iUt$MLm)ByAD$eUuji|5{ptFYq(q)mE(5bOpxjM
z^Q`AHWq44SG3`_LxC9fwR)XRVIp=B%<(-lOC3jI#bb@dK(*vjom!=t|#<@dZql%>O
z15y^{4tQoeW9Lu%G&V$90x6F)xN6y_oIn;!Q
zs)8jT$;&;u%Y>=T3hg34A-+Y*na=|glcStr5D;&5*t5*DmD~x;zQAV5{}Ya`?RRGa
zT*t9@$a~!co;pD^!J5bo?lDOWFx%)Y=-fJ+PDGc0>;=q=s?P4aHForSB+)v0WY2JH
z?*`O;RHum6j%#LG)Vu#ciO#+jRC3!>T(9fr+XE7T2B7Z|0nR5jw@WG)kDDzTJ=o4~
zUpeyt7}_nd`t}j9BKqryOha{34erm)RmST)_9Aw)@
zHbiyg5n&E{_CQR@h<}34d7WM{s{%5wdty1l+KX8*?+-YkNK2Be*6&jc>@{Fd;Ps||
z26LqdI3#9le?;}risDq$K5G3yoqK}C^@-8z^wj%tdgw-6@F#Ju{Sg7+y)L?)U$ez>
zoOaP$UFZ?y5BiFycir*pnaAaY+|%1%8&|(@VB)zweR%?IidwJyK5J!STzw&2RFx
zZV@qeaCB01Hu#U9|1#=Msc8Pgz5P*4Lrp!Q+~(G!OiNR{qa7|r^H?FC6gVhkk3y7=uW#Sh;&>78bZ}aK*C#NH$9rX@M3f{nckYI+5QG?Aj1DM)@~z_
zw!UAD@gedTlePB*%4+55naJ8ak_;))#S;4ji!LOqY5VRI){GMwHR~}6t4g>5C_#U#
ztYC!tjKjrKvRy=GAsJVK++~$|+s!w9z3H4G^mACv=EErXNSmH7qN}%PKcN|8%9=i)qS5+$L
zu&ya~HW%RMVJi4T^pv?>mw*Gf<)-7gf#Qj|e#w2|v4#t!%Jk{&xlf;$_?jW*n!Pyx
zkG$<18kiLOAUPuFfyu-EfWX%4jYnjBYc~~*9JEz6oa)_R|8wjZA|RNrAp%}14L7fW
zi7A5Wym*K+V8pkqqO-X#3ft{0qs?KVt^)?kS>AicmeO&q+~J~
zp0YJ_P~_a8j=
zsAs~G=8F=M{4GZL{|B__UorX@MRNQLn?*_gym4aW(~+i13knnk1P=khoC-ViMZk+x
zLW(l}oAg1H`dU+Fv**;qw|ANDSRs>cGqL!Yw^`;
zv;{E&8CNJcc)GHzTYM}f&NPw<6j{C3gaeelU#y!M)w-utYEHOCCJo|Vgp7K6C_$14
zqIrLUB0bsgz^D%V%fbo2f9#yb#CntTX?55Xy|Kps&Xek*4_r=KDZ
z+`TQuv|$l}MWLzA5Ay6Cvsa^7xvwXpy?`w(6vx4XJ
zWuf1bVSb#U8{xlY4+wlZ$9jjPk)X_;NFMqdgq>m&W=!KtP+6NL57`AMljW+es
zzqjUjgz;V*kktJI?!NOg^s_)ph45>4UDA!Vo0hn>KZ+h-3=?Y3*R=#!fOX
zP$Y~+14$f66ix?UWB_6r#fMcC^~X4R-<&OD1CSDNuX~y^YwJ>sW0j`T<2+3F9>cLo
z#!j57$ll2K9(%$4>eA7(>FJX5e)pR5&EZK!IMQzOfik#FU*o*LGz~7u(8}XzIQRy-
z!U7AlMTIe|DgQFmc%cHy_9^{o`eD%ja_L>ckU6$O4*U**o5uR7`FzqkU8k4gxtI=o
z^P^oGFPm5jwZMI{;nH}$?p@uV8FT4r=|#GziKXK07bHJLtK}X%I0TON$uj(iJ`SY^
zc$b2CoxCQ>7LH@nxcdW&_C#fMYBtTxcg46dL{vf%EFCZ~eErMvZq&Z%Lhumnkn^4A
zsx$ay(FnN7kYah}tZ@0?-0Niroa~13`?hVi6`ndno`G+E8;$<6^gsE-K3)TxyoJ4M
zb6pj5=I8^FD5H@`^V#Qb2^0cx7wUz&cruA5g>6>qR5)O^t1(-qqP&1g=qvY#s&{bx
zq8Hc%LsbK1*%n|Y=FfojpE;w~)G0-X4i*K3{o|J7`krhIOd*c*$y{WIKz2n2*EXEH
zT{oml3Th5k*vkswuFXdGDlcLj15Nec5pFfZ*0?XHaF_lVuiB%Pv&p7z)%38}%$Gup
zVTa~C8=cw%6BKn_|4E?bPNW4PT7}jZQLhDJhvf4z;~L)506IE0
zX!tWXX(QOQPRj-p80QG79t8T2^az4Zp2hOHziQlvT!|H)jv{Ixodabzv6lBj)6WRB
z{)Kg@$~~(7$-az?lw$4@L%I&DI0Lo)PEJJziWP33a3azb?jyXt1v0N>2kxwA6b%l>
zZqRpAo)Npi&loWbjFWtEV)783BbeIAhqyuc+~>i7aQ8shIXt)bjCWT6$~ro^>99G}
z2XfmT0(|l!)XJb^E!#3z4oEGIsL(xd;
zYX1`1I(cG|u#4R4T&C|m*9KB1`UzKvho5R@1eYtUL9B72{i(ir&ls8g!pD
ztR|25xGaF!4z5M+U@@lQf(12?xGy`!|3E}7pI$k`jOIFjiDr{tqf0va&3pOn6Pu)%
z@xtG2zjYuJXrV)DUrIF*y<1O1<$#54kZ#2;=X51J^F#0nZ0(;S$OZDt_U2bx{RZ=Q
zMMdd$fH|!s{
zXq#l;{`xfV`gp&C>A`WrQU?d{!Ey5(1u*VLJt>i27aZ-^&2IIk=zP5p+{$q(K?2(b
z8?9h)kvj9SF!Dr
zoyF}?V|9;6abHxWk2cEvGs$-}Pg}D+ZzgkaN&$Snp%;5m%zh1E#?Wac-}x?BYlGN#U#Mek*}kek#I9XaHt?mz3*fDrRTQ#~xyeqJk1QJ~E$7qsw6
z?sV;|?*=-{M<1+hXoj?@-$y+(^BJ1H~wQ9G8C0#^aEAyhDduNX@haoa=PuPp
zYsGv8UBfQaRHgBgLjmP^eh>fLMeh{8ic)?xz?#3kX-D#Z{;W#cd_`9OMFIaJg-=t`_3*!YDgtNQ2+QUEAJB9M{~AvT$H`E)IKmCR21H532+ata8_i_MR@
z2Xj<3w<`isF~Ah$W{|9;51ub*f4#9ziKrOR&jM{x7I_7()O@`F*5o$KtZ?fxU~g`t
zUovNEVKYn$U~VX8eR)qb`7;D8pn*Pp$(otYTqL)5KH$lUS-jf}PGBjy$weoceAcPp
z&5ZYB$r&P$MN{0H0AxCe4Qmd3T%M*5d4i%#!nmBCN-WU-4m4Tjxn-%j3HagwTxCZ9
z)j5vO-C7%s%D!&UfO>bi2oXiCw<-w{vVTK^rVbv#W=WjdADJy8$khnU!`ZWCIU`>#
zyjc^1W~pcu>@lDZ{zr6gv%)2X4n27~Ve+cQqcND%0?IFSP4sH#yIaXXYAq^z3|cg`
z`I3$m%jra>e2W-=DiD@84T!cb%||k)nPmEE09NC%@PS_OLhkrX*U!cgD*;;&gIaA(DyVT4QD+q_xu
z>r`tg{hiGY&DvD-)B*h+YEd+Zn)WylQl}<4>(_NlsKXCRV;a)Rcw!wtelM2_rWX`j
zTh5A|i6=2BA(iMCnj_fob@*eA;V?oa4Z1kRBGaU07O70fb6-qmA$Hg$ps@^ka1=RO
zTbE_2#)1bndC3VuK@e!Sftxq4=Uux}fDxXE#Q5_x=E1h>T5`DPHz
zbH<_OjWx$wy7=%0!mo*qH*7N4tySm+R0~(rbus`7;+wGh;C0O%x~fEMkt!eV>U$`i
z5>Q(o
z=t$gPjgGh0&I7KY#k50V7DJRX<%^X
z>6+ebc9efB3@eE2Tr){;?_w`vhgF>`-GDY(YkR{9RH(MiCnyRtd!LxXJ75z+?2
zGi@m^+2hKJ5sB1@Xi@s_@p_Kwbc<*LQ_`mr^Y%j}(sV_$`J(?_FWP)4NW*BIL~sR>t6
zM;qTJZ~GoY36&{h-Pf}L#y2UtR}>ZaI%A6VkU>vG4~}9^i$5WP2Tj?Cc}5oQxe2=q
z8BeLa$hwCg_psjZyC2+?yX4*hJ58Wu^w9}}7X*+i5Rjqu5^@GzXiw#SUir1G1`jY%
zOL=GE_ENYxhcyUrEt9XlMNP6kx6h&%6^u3@zB8KUCAa18T(R2J`%JjWZ
z!{7cXaEW+Qu*iJPu+m>QqW}Lo$4Z+!I)0JNzZ&_M%=|B1yejFRM04bGAvu{=lNPd+
zJRI^DRQ(?FcVUD+bgEcAi@o(msqys9RTCG#)TjI!9~3-dc`>gW;HSJuQvH~d`MQs86R$|SKXHh
zqS9Qy)u;T`>>a!$LuaE2keJV%;8g)tr&Nnc;EkvA-RanHXsy)D@XN0a>h}z2j81R;
zsUNJf&g&rKpuD0WD@=dDrPHdBoK42WoBU|nMo17o(5^;M|dB4?|FsAGVrSyWcI`+FVw^vTVC`y}f(BwJl
zrw3Sp151^9=}B})6@H*i4-dIN_o^br+BkcLa^H56|^2XsT0dESw2
zMX>(KqNl=x2K5=zIKg}2JpGAZu{I_IO}0$EQ5P{4zol**PCt3F4`GX}2@vr8#Y)~J
zKb)gJeHcFnR@4SSh%b;c%J`l=W*40UPjF#q{<}ywv-=vHRFmDjv)NtmC
zQx9qm)d%0zH&qG7AFa3VAU1S^(n8VFTC~Hb+HjYMjX8r#&_0MzlNR*mnLH5hi}`@{
zK$8qiDDvS_(L9_2vHgzEQ${DYSE;DqB!g*jhJghE&=LTnbgl&Xepo<*uRtV{2wDHN
z)l;Kg$TA>Y|K8Lc&LjWGj<+bp4Hiye_@BfU(y#nF{fpR&|Ltbye?e^j0}8JC4#xi%
zv29ZR%8%hk=3ZDvO-@1u8KmQ@6p%E|dlHuy#H1&MiC<*$YdLkHmR#F3ae;bKd;@*i
z2_VfELG=B}JMLCO-6UQy^>RDE%K4b>c%9ki`f~Z2Qu8hO7C#t%Aeg8E%+}6P7Twtg
z-)dj(w}_zFK&86KR@q9MHicUAucLVshUdmz_2@32(V`y3`&Kf8Q2I)+!n0mR=rrDU
zXvv^$ho;yh*kNqJ#r1}b0|i|xRUF6;lhx$M*uG3SNLUTC@|htC
z-=fsw^F%$qqz4%QdjBrS+ov}Qv!z00E+JWas>p?z@=t!WWU3K*?Z(0meTuTOC7OTx
zU|kFLE0bLZ+WGcL$u4E}5dB0g`h|uwv3=H6f+{5z9oLv-=Q45+n~V4WwgO=CabjM%
zBAN+RjM65(-}>Q2V#i1Na@a0`08g&y;W#@sBiX6Tpy8r}*+{RnyGUT`?XeHSqo#|J
z^ww~c;ou|iyzpErDtlVU=`8N7JSu>4M
z_pr9=tX0edVn9B}YFO2y(88j#S{w%E8vVOpAboK*27a7e4Ekjt0)hIX99*1oE;vex
z7#%jhY=bPijA=Ce@9rRO(Vl_vnd00!^TAc<+wVvRM9{;hP*rqEL_(RzfK$er_^SN;
z)1a8vo8~Dr5?;0X0J62Cusw$A*c^Sx1)dom`-)Pl7hsW4i(r*^Mw`z5K>!2ixB_mu
z*Ddqjh}zceRFdmuX1akM1$3>G=#~|y?eYv(e-`Qy?bRHIq=fMaN~fB
zUa6I8Rt=)jnplP>yuS+P&PxeWpJ#1$F`iqRl|jF$WL_aZFZl@kLo&d$VJtu&w?Q0O
zzuXK>6gmygq(yXJy0C1SL}T8AplK|AGNUOhzlGeK_oo|haD@)5PxF}rV+5`-w{Aag
zus45t=FU*{LguJ11Sr-28EZkq;!mJO7AQGih1L4rEyUmp>B!%X0YemsrV3QFvlgt*
z5kwlPzaiJ+kZ^PMd-RRbl(Y?F*m`4*UIhIuf#8q>H_M=fM*L_Op-<_r
zBZagV=4B|EW+KTja?srADTZXCd3Yv%^Chfpi)cg{ED${SI>InNpRj5!euKv?=Xn92
zsS&FH(*w`qLIy$doc>RE&A5R?u
zzkl1sxX|{*fLpXvIW>9d<$ePROttn3oc6R!sN{&Y+>Jr@yeQN$sFR
z;w6A<2-0%UA?c8Qf;sX7>>uKRBv3Ni)E9pI{uVzX|6Bb0U)`lhLE3hK58ivfRs1}d
zNjlGK0hdq0qjV@q1qI%ZFMLgcpWSY~mB^LK)4GZ^h_@H+3?dAe_a~k*;9P_d7%NEFP6+
zgV(oGr*?W(ql?6SQ~`lUsjLb%MbfC4V$)1E0Y_b|OIYxz4?O|!kRb?BGrgiH5+(>s
zoqM}v*;OBfg-D1l`M6T6{K`LG+0dJ1)!??G5g(2*vlNkm%Q(MPABT$r13q?|+kL4-
zf)Mi5r$sn;u41aK(K#!m+goyd$c!KPl~-&-({j#D4^7hQkV3W|&>l_b!}!z?4($OA
z5IrkfuT#F&S1(`?modY&I40%gtroig{YMvF{K{>5u^I51k8RriGd${z)=5k2tG
zM|&Bp5kDTfb#vfuTTd?)a=>bX=lokw^y9+2LS?kwHQIWI~pYgy7
zb?A-RKVm_vM5!9?C%qYdfRAw&
zAU7`up~%g=p@}pg#b7E)BFYx3g%(J36Nw(Dij!b>cMl@CSNbrW!DBDbTD4OXk!G4x
zi}JBKc8HBYx$J~31PXH+4^x|UxK~(<@I;^3pWN$E=sYma@JP|8YL`L(zI6Y#c%Q{6
z*APf`DU$S4pr#_!60BH$FGViP14iJmbrzSrOkR;f3YZa{#E7Wpd@^4E-zH8EgPc-#
zKWFPvh%WbqU_%ZEt`=Q?odKHc7@SUmY{GK`?40VuL~o)bS|is$Hn=<=KGHOsEC5tB
zFb|q}gGlL97NUf$G$>^1b^3E18PZ~Pm9kX%*ftnolljiEt@2#F2R5ah$zbXd%V_Ev
zyDd{1o_uuoBga$fB@Fw!V5F3jIr=a-ykqrK?WWZ#a(bglI_-8pq74RK*KfQ
z0~Dzus7_l;pMJYf>Bk`)`S8gF!To-BdMnVw5M-pyu+aCiC5dwNH|6fgRsIKZcF&)g
zr}1|?VOp}I3)IR@m1&HX1~#wsS!4iYqES
zK}4J{Ei>;e3>LB#Oly>EZkW14^@YmpbgxCDi#0RgdM${&wxR+LiX}B+iRioOB0(pDKpVEI;ND?wNx>%e|m{RsqR_{(nmQ
z3ZS}@t!p4a(BKx_-CYwrcyJ5u1TO9bcXti$8sy>xcLKqKCc#~UOZYD{llKTSFEjJ~
zyNWt>tLU}*>^`TvPxtP%F`ZJQw@W0^>x;!^@?k_)9#bF$j0)S3;mH-IR5y82l|%=F
z2lR8zhP?XNP-ucZZ6A+o$xOyF!w;RaLHGh57GZ|TCXhJqY~GCh)aXEV$1O&$c}La1
zjuJxkY9SM4av^Hb;i7efiYaMwI%jGy`3NdY)+mcJhF(3XEiSlU3c|jMBi|;m-c?~T
z+x0_@;SxcoY=(6xNgO$bBt~Pj8`-<1S|;Bsjrzw3@zSjt^JC3X3*$HI79i~!$RmTz
zsblZsLYs7L$|=1CB$8qS!tXrWs!F@BVuh?kN(PvE5Av-*r^iYu+L^j^m9JG^#=m>@
z=1soa)H*w6KzoR$B8mBCXoU;f5^bVuwQ3~2LKg!yxomG1#XPmn(?YH@E~_ED+W6mxs%x{%Z<$pW`~ON1~2XjP5v(0{C{+6Dm$00tsd3w=f=ZENy
zOgb-=f}|Hb*LQ$YdWg<(u7x3`PKF)B7ZfZ6;1FrNM63
z?O6tE%EiU@6%rVuwIQjvGtOofZBGZT1Sh(xLIYt9c4VI8`!=UJd2BfLjdRI#SbVAX
ziT(f*RI^T!IL5Ac>ql7uduF#nuCRJ1)2bdvAyMxp-5^Ww5p#X{rb5)(X|fEhDHHW{
zw(Lfc$g;+Q`B0AiPGtmK%*aWfQQ$d!*U<|-@n2HZvCWSiw^I>#vh+LyC;aaVWGbmkENr
z&kl*8o^_FW$T?rDYLO1Pyi%>@&kJKQoH2E0F`HjcN}Zlnx1ddoDA>G4Xu_jyp6vuT
zPvC}pT&Owx+qB`zUeR|4G;OH(<<^_bzkjln0k40t`PQxc$7h(T8Ya~X+9gDc8Z9{Z
z&y0RAU}#_kQGrM;__MK9vwIwK^aoqFhk~dK!ARf1zJqHMxF2?7-8|~yoO@_~Ed;_wvT%Vs{9RK$6uUQ|&@#6vyBsFK9eZW1Ft#D2)VpQRwpR(;x^
zdoTgMqfF9iBl%{`QDv7B0~8{8`8k`C4@cbZAXBu00v#kYl!#_Wug{)2PwD5cNp?K^
z9+|d-4z|gZ!L{57>!Ogfbzchm>J1)Y%?NThxIS8frAw@z>Zb9v%3_3~F@<=LG%r*U
zaTov}{{^z~SeX!qgSYow`_5)ij*QtGp4lvF`aIGQ>@3ZTkDmsl#@^5*NGjOuu82}o
zzLF~Q9SW+mP=>88%eSA1W4_W7-Q>rdq^?t=m6}^tDPaBRGFLg%ak93W!kOp#EO{6&
zP%}Iff5HZQ9VW$~+9r=|Quj#z*=YwcnssS~9|ub2>v|u1JXP47vZ1&L1O%Z1DsOrDfSIMHU{VT>&>H=9}G3i@2rP+rx@eU@uE8rJNec
zij~#FmuEBj03F1~ct@C@$>y)zB+tVyjV3*n`mtAhIM0$58vM9jOQC}JJOem|EpwqeMuYPxu3sv}oMS?S#o6GGK@8PN59)m&K4Dc&X%
z(;XL_kKeYkafzS3Wn5DD>Yiw{LACy_#jY4op(>9q>>-*9@C0M+=b#bknAWZ37^(Ij
zq>H%<@>o4a#6NydoF{_M4i4zB_KG)#PSye9bk0Ou8h%1Dtl7Q_y#7*n%g)?m>xF~(
zjqvOwC;*qvN_3(*a+w2|ao0D?@okOvg8JskUw(l7n`0fncglavwKd?~l_ryKJ^Ky!
zKCHkIC-o7%fFvPa$)YNh022lakMar^dgL=t#@XLyNHHw!b?%WlM)R@^!)I!smZL@k
zBi=6wE5)2v&!UNV(&)oOYW(6Qa!nUjDKKBf-~Da=#^HE4(@mWk)LPvhyN3i4goB$3K8iV7uh
zsv+a?#c4&NWeK(3AH;ETrMOIFgu{_@%XRwCZ;L=^8Ts)hix4Pf3yJRQ<8xb^CkdmC
z?c_gB)XmRsk`9ch#tx4*hO=#qS7={~Vb4*tTf<5P%*-XMfUUYkI9T1cEF;ObfxxI-yNuA=I$dCtz3ey
znVkctYD*`fUuZ(57+^B*R=Q}~{1z#2!ca?)+YsRQb+lt^LmEvZt_`=j^wqig+wz@n@
z`LIMQJT3bxMzuKg8EGBU+Q-6cs5(@5W?N>JpZL{$9VF)veF`L5%DSYTNQEypW%6$u
zm_~}T{HeHj1bAlKl8ii92l9~$dm=UM21kLemA&b$;^!wB7#IKWGnF$TVq!!lBlG4
z{?Rjz?P(uvid+|i$VH?`-C&Gcb3{(~Vpg`w+O);Wk1|Mrjxrht0GfRUnZqz2MhrXa
zqgVC9nemD5)H$to=~hp)c=l9?#~Z_7i~=U-`FZxb-|TR9@YCxx;Zjo-WpMNOn2)z)
zFPGGVl%3N$f`gp$gPnWC+f4(rmts%fidpo^BJx72zAd7|*Xi{2VXmbOm)1`w^tm9%
znM=0Fg4bDxH5PxPEm{P3#A(mxqlM7SIARP?|2&+c7qmU8kP&iApzL|F>Dz)Ixp_`O
zP%xrP1M6@oYhgo$ZWwrAsYLa4
z|I;DAvJxno9HkQrhLPQk-8}=De{9U3U%)dJ$955?_AOms!9gia%)0E$Mp}$+0er@<
zq7J&_SzvShM?e%V?_zUu{niL@gt5UFOjFJUJ}L?$f%eU%jUSoujr{^O=?=^{19`ON
zlRIy8Uo_nqcPa6@yyz`CM?pMJ^^SN^Fqtt`GQ8Q#W4kE7`V9^LT}j#pMChl!j#g#J
zr-=CCaV%xyFeQ9SK+mG(cTwW*)xa(eK;_Z(jy)woZp~>
zA(4}-&VH+TEeLzPTqw&FOoK(ZjD~m{KW05fiGLe@E3Z2`rLukIDahE*`u!ubU)9`o
zn^-lyht#E#-dt~S>}4y$-mSbR8{T@}22cn^refuQ08NjLOv?JiEWjyOnzk<^R5%gO
zhUH_B{oz~u#IYwVnUg8?3P*#DqD8#X;%q%HY**=I>>-S|!X*-!x1{^l#OnR56O>iD
zc;i;KS+t$koh)E3)w0OjWJl_aW2;xF=9D9Kr>)(5}4FqUbk#
zI#$N8o0w;IChL49m9CJTzoC!|u{Ljd%ECgBOf$}&jA^$(V#P#~)`&g`H8E{uv52pp
zwto`xUL-L&WTAVREEm$0g_gYPL(^vHq(*t1WCH_6alhkeW&GCZ3hL)|{O-jiFOBrF
z!EW=Jej|dqQitT6!B-7&io2K)WIm~Q)v@yq%U|VpV+I?{y0@Yd%n8~-NuuM*pM~KA
z85YB};IS~M(c<}4Hxx>qRK0cdl&e?t253N%vefkgds>Ubn8X}j6Vpgs>a#nFq$osY
z1ZRwLqFv=+BTb=i%D2Wv>_yE0z}+niZ4?rE|*a3d7^kndWGwnFqt+iZ(7+aln<}jzbAQ(#Z2SS}3S$%Bd}^
zc9ghB%O)Z_mTZMRC&H#)I#fiLuIkGa^`4e~9oM5zKPx?zjkC&Xy0~r{;S?FS%c7w<
zWbMpzc(xSw?9tGxG~_l}Acq}zjt5ClaB7-!vzqnlrX;}$#+PyQ9oU)_DfePh2E1<7
ztok6g6K^k^DuHR*iJ?jw?bs_whk|bx`dxu^nC6#e{1*m~z1eq7m}Cf$*^Eua(oi_I
zAL+3opNhJteu&mWQ@kQWPucmiP)4|nFG`b2tpC;h{-PI@`+h?9v=9mn|0R-n8#t=+Z*FD(c5
zjj79Jxkgck*DV=wpFgRZuwr%}KTm+dx?RT@aUHJdaX-ODh~gByS?WGx&czAkvkg;x
zrf92l8$Or_zOwJVwh>5rB`Q5_5}ef6DjS*$x30nZbuO3dijS*wvNEqTY5p1_A0gWr
znH<(Qvb!os14|R)n2Ost>jS2;d1zyLHu`Svm|&dZD+PpP{Bh>U&`Md;gRl64q;>{8MJJM$?UNUd`aC>BiLe>*{
zJY15->yW+<3rLgYeTruFDtk1ovU<$(_y7#HgUq>)r0{^}Xbth}V#6?%5jeFYt;SG^
z3qF)=uWRU;Jj)Q}cpY8-H+l_n$2$6{ZR?&*IGr{>ek!69ZH0ZoJ*Ji+ezzlJ^%qL3
zO5a`6gwFw(moEzqxh=yJ9M1FTn!eo&qD#y5AZXErHs%22?A+JmS&GIolml!)rZTnUDM3YgzYfT#;OXn)`PWv3Ta
z!-i|-Wojv*k&bC}_JJDjiAK(Ba|YZgUI{f}TdEOFT2+}nPmttytw7j%@bQZDV1vvj
z^rp{gRkCDmYJHGrE1~e~AE!-&6B6`7UxVQuvRrfdFkGX8H~SNP_X4EodVd;lXd^>eV1jN+Tt4}Rsn)R0LxBz0c=NXU|pUe!MQQFkGBWbR3&(jLm
z%RSLc#p}5_dO{GD=DEFr=Fc%
z85CBF>*t!6ugI?soX(*JNxBp+-DdZ4X0LldiK}+WWGvXV(C(Ht|!3$psR=&c*HIM=BmX;pRIpz@Ale{9dhGe(U2|Giv;#
zOc|;?p67J=Q(kamB*aus=|XP|m{jN^6@V*Bpm?ye56Njh#vyJqE=DweC;?Rv7faX~
zde03n^I~0B2vUmr;w^X37tVxUK?4}ifsSH5_kpKZIzpYu0;Kv}SBGfI2AKNp+VN#z`nI{UNDRbo-wqa4NEls
zICRJpu)??cj^*WcZ^MAv+;bDbh~gpN$1Cor<{Y2oyIDws^JsfW^5AL$azE(T0p&pP
z1Mv~6Q44R&RHoH95&OuGx2srIr<@zYJTOMKiVs;Bx3py89I87LOb@%mr`0)#;7_~Z
zzcZj8?w=)>%5@HoCHE_&hnu(n_yQ-L(~VjpjjkbT7e)Dk5??fApg(d>vwLRJ-x{um
z*Nt?DqTSxh_MIyogY!vf1mU1`Gld-&L)*43f6dilz`Q@HEz;+>MDDYv9u!s;WXeao
zUq=TaL$P*IFgJzrGc>j1dDOd
zed+=ZBo?w4mr$2)Ya}?vedDopomhW1`#P<%YOJ_j=WwClX0xJH-f@s?^tmzs_j7t!k
zK@j^zS0Q|mM4tVP5Ram$VbS6|YDY&y?Q1r1joe9dj08#CM{RSMTU}(RCh`hp_Rkl-
zGd|Cv~G@F{DLhCizAm9AN!^{rNs8hu!G@8RpnGx7e`-+K$ffN<0qjR
zGq^$dj_Tv!n*?zOSyk5skI7JVKJ)3jysnjIu-@VSzQiP8r6MzudCU=~?v-U8yzo^7
zGf~SUTvEp+S*!X9uX!sq=o}lH;r{pzk~M*VA(uyQ`3C8!{C;)&6)95fv(cK!%Cuz$
z_Zal57H6kPN>25KNiI6z6F)jzEkh#%OqU#-__Xzy)KyH};81#N6OfX$$IXWzOn`Q&
z4f$Z1t>)8&8PcYfEwY5UadU1yg+U*(1m2ZlHoC-!2?gB!!fLhmTl))D@dhvkx#+Yj
z1O=LV{(T%{^IeCuFK>%QR!VZ4GnO5tK8a+thWE
zg4VytZrwcS?7^
zuZfhYnB8dwd%VLO?DK7pV5Wi<(`~DYqOXn8#jUIL^)12*Dbhk4GmL_E2`WX&iT16o
zk(t|hok(Y|v-wzn?4x34T)|+SfZP>fiq!><*%vnxGN~ypST-FtC+@TPv*vYv@iU!_
z@2gf|PrgQ?Ktf*9^CnJ(x*CtZVB8!OBfg0%!wL;Z8(tYYre0vcnPGlyCc$V(Ipl*P
z_(J!a=o@vp^%Efme!K74(Ke7A>Y}|sxV+JL^aYa{~m%5#$$+R1?
zGaQhZTTX!#s#=Xtpegqero$RNt&`4xn3g$)=y*;=N=Qai)}~`xtxI_N*#MMCIq#HFifT
zz(-*m;pVH&+4bixL&Bbg)W5FN^bH87pAHp)zPkWNMfTFqS=l~AC$3FX3kQUSh_C?-ZftyClgM)o_D7cX$RGlEYblux0jv5
zTr|i-I3@ZPCGheCl~BGhImF)K4!9@?pC(gi3ozX=a!|r1)LFxy_8c&wY0<^{2cm|P
zv6Y`QktY*;I)IUd5y3ne1CqpVanlY45z8hf4&$EUBnucDj16pDa4&GI&TArYhf*xh
zdj>*%APH8(h~c>o@l#%T>R$e>rwVx_WUB|~V`p^JHsg*y12lzj&zF}w6W09HwB2yb
z%Q~`es&(;7#*DUC_w-Dmt7|$*?TA_m;zB+-u{2;Bg{O}nV7G_@7~<)Bv8fH^G$XG8$(&{A
zwXJK5LRK%M34(t$&NI~MHT{UQ9qN-V_yn|%PqC81EIiSzmMM=2zb`mIwiP_b)x+2M
z7Gd`83h79j#SItpQ}luuf2uOU`my_rY5T{6P#BNlb%h%<#MZb=m@y5aW;#o1^2Z)SWo+b`y0gV^iRcZtz5!-05vF
z7wNo=hc6h4hc&s@uL^jqRvD6thVYtbErDK9k!;+a0xoE0WL7zLixjn5;$fXvT=O3I
zT6jI&^A7k6R{&5#lVjz#8%_RiAa2{di{`kx79K+j72$H(!ass|B%@l%KeeKchYLe_
z>!(JC2fxsv>XVen+Y42GeYPxMWqm`6F$(E<6^s|g(slNk!lL*6v^W2>f6hh^mE$s=
z3D$)}{V5(Qm&A6bp%2Q}*GZ5Qrf}n7*Hr51?bJOyA-?B4vg6y_EX<*-e20h{=0Mxs
zbuQGZ$fLyO5v$nQ&^kuH+mNq9O#MWSfThtH|0q1i!NrWj^S}_P;Q1OkYLW6U^?_7G
zx2wg?CULj7))QU(n{$0JE%1t2dWrMi2g-Os{v|8^wK{@qlj%+1b^?NI
z$}l2tjp0g>K3O+p%yK<9!XqmQ?E9>z&(|^Pi~aSRwI5x$jaA62GFz9%fmO3t3a>cq
zK8Xbv=5Ps~4mKN5+Eqw12(!PEyedFXv~VLxMB~HwT1Vfo51pQ#D8e$e4pFZ{&RC2P
z5gTIzl{3!&(tor^BwZfR8j4k{7Rq#`riKXP2O-Bh66#WWK2w=z;iD9GLl+3
zpHIaI4#lQ&S-xBK8PiQ%dwOh?%BO~DCo06pN7<^dnZCN@NzY{_Z1>rrB0U|nC&+!2
z2y!oBcTd2;@lzyk(B=TkyZ)zy0deK05*Q0zk+o$@nun`VI1Er7pjq>8V
zNmlW{p7S^Btgb(TA}jL(uR>`0w8gHP^T~Sh5Tkip^spk4SBAhC{TZU}_Z)UJw-}zm
zPq{KBm!k)?P{`-(9?LFt&YN4s%SIZ-9lJ!Ws~B%exHOeVFk3~}HewnnH(d)qkLQ_d
z6h>O)pEE{vbOVw}E+jdYC^wM+AAhaI(YAibUc@B#_mDss0Ji&BK{WG`4
zOk>vSNq(Bq2IB@s>>Rxm6Wv?h;ZXkpb1l8u|+_qXWdC*jjcPCixq;!%BVPSp#hP
zqo`%cNf&YoQXHC$D=D45RiT|5ngPlh?0T~?lUf*O)){K@*Kbh?3RW1j9-T?%lDk@y
z4+~?wKI%Y!-=O|_IuKz|=)F;V7ps=5@g)RrE;;tvM$gUhG>jHcw2Hr@fS+k^Zr~>G
z^JvPrZc}_&d_kEsqAEMTMJw!!CBw)u&ZVzmq+ZworuaE&TT>$pYsd9|g9O^0orAe8
z221?Va!l1|Y5X1Y?{G7rt1sX#qFA^?RLG^VjoxPf63;AS=_mVDfGJKg73L
zsGdnTUD40y(>S##2l|W2Cy!H(@@5KBa(#gs`vlz}Y~$ot5VsqPQ{{YtjYFvIumZzt
zA{CcxZLJR|4#{j7k~Tu*jkwz8QA|5G1$Cl895R`Zyp;irp1{KN){kB30O8P1W5;@bG
znvX74roeMmQlUi=v9Y%(wl$ZC#9tKNFpvi3!C}f1m6Ct|l2g%psc{TJp)@yu)*e2>
z((p0Fg*8gJ!|3WZke9;Z{8}&NRkv7iP=#_y-F}x^y?2m%-D_aj^)f04%mneyjo_;)
z6qc_Zu$q37d~X``*eP~Q>I2gg%rrV8v=kDfpp$=%Vj}hF)^dsSWygoN(A$g*E=Do6FX?&(@F#7pbiJ`;c0c@Ul
zDqW_90Wm#5f2L<(Lf3)3TeXtI7nhYwRm(F;*r_G6K@OPW4H(Y3O5SjUzBC}|Tm0
zRP=fu|E~4-g)9SuK=BRizYL2M|GUu3d|eQ8*8d@?;zUPE+i#QNMn=r(ap?2SH@vo*m
z3HJ%XuG_S6;QbWy-l%qU;8x;>z>4pMW7>R}J%QLf%@1BY(4f_1iixd-6GlO7Vp*yU
zp{VU^3?s?90i=!#>H`lxT!q8rk>W_$2~kbpz7eV{3wR|8E=8**5?qn8#n`*(bt1xRQrdGxyx2y%B$qmw#>ZV$c7%cO#%JM1lY$Y0q?Yuo>
ze9KdJoiM)RH*SB%^;TAdX-zEjA7@%y=!0=Zg%iWK7jVI9b&Dk}0$Af&08KHo+
zOwDhFvA(E|ER%a^cdh@^wLUlmIv6?_3=BvX8jKk92L=Y}7Jf5OGMfh`
zBdR1wFCi-i5@`9km{isRb0O%TX+f~)KNaEz{rXQa89`YIF;EN&gN)cigu6mNh>?Cm
zAO&Im2f