diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..e84bec6 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +*.* @sgammon diff --git a/.github/workflows/build.module.yml b/.github/workflows/build.module.yml new file mode 100644 index 0000000..e69de29 diff --git a/.github/workflows/on.pr.yml b/.github/workflows/on.pr.yml new file mode 100644 index 0000000..e69de29 diff --git a/.github/workflows/on.push.yml b/.github/workflows/on.push.yml new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..56e6f74 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,35 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..df543e3 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..e805548 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4fb5c54 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..8306744 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.version b/.version new file mode 100644 index 0000000..62581c7 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +1.0.0-alpha1 diff --git a/README.md b/README.md new file mode 100644 index 0000000..c7f289e --- /dev/null +++ b/README.md @@ -0,0 +1,218 @@ + +# Planetscale Connector/J + +> **Note** +> Under construction; use at your own risk + +This library implements a [JDBC adapter](https://www.oracle.com/database/technologies/appdev/jdbc.html) for +[Planetscale][1]. + +Planetscale uses [Vitess][2] as a backend, which is wire-compatible with MySQL; thus, this library is a wrapper around +the [MySQL Connector/J][3] library, which is used for the actual work of connecting and running queries. + +This library adds several features, using the MySQL/J connector, to make it easier to work with Planetscale: + +--- + +## Installation + +> **Warning** +> This is *not* endorsed by Planetscale, and is not yet published to Maven Central. + +| Coordinates | Driver | +|---------------------------------------|------------------------------| +| ```com.planetscale:planetscale-jvm``` | ```com.planetscale.Driver``` | + +**Gradle (Kotlin DSL, via Version Catalogs):** +```kotlin +// in settings.gradle.kts + +dependencyResolutionManagement { + versionCatalogs { + create("planetscale") { + from("com.planetscale:planetscale-catalog:(latest version)") + } + } +} +``` +```kotlin +// in build.gradle.kts + +dependencies { + implementation(planetscale.driver) +} +``` + +**Gradle (Kotlin DSL, one library at a time):** +```kotlin +dependencies { + implementation("com.planetscale:planetscale-jvm:") +} +``` + +**Maven:** +```xml + + com.planetscale + planetscale-jvm + + +``` + +--- + +# Features + +- **Easy Planetscale connection strings.** + + Use `jdbc:planetscale://aws` or `jdbc:planetscale://gcp` or connect to a specific region with something like + `jdbc:planetscale://us-east-1.aws`. The adapter builds the right URL for you. These examples become: + +``` +jdbc:mysql://aws.connect.psdb.cloud:3306/dbname?... +jdbc:mysql://gcp.connect.psdb.cloud:3306/dbname?... +jdbc:mysql://us-east-1.aws.connect.psdb.cloud:3306/dbname?... +``` + + +- **Load balanced reads.** + + Use more than one endpoint with URLs like: `jdbc:planetscale://us-west-1.aws..aws`. In this case, the MySQL/J driver + is configured with: + +``` +jdbc:mysql:replication://us-west-1.aws.connect.psdb.cloud:3306,aws.connect.psdb.cloud:3306/dbname?roundRobinLoadBalance=true&... +``` + + +- **Eager driver cache and solid defaults.** + + The Planetscale driver configures the MySQL/J driver for client-side caching of server configuration, result set + metadata, and so on. SSL verification is turned on, as is auto-reconnection. Equivalent driver options: + +``` +autoReconnect=true +cacheServerConfiguration=true +cacheResultSetMetadata=true +sslMode=VERIFY_IDENTITY +roundRobinLoadBalance=true +``` + + +- **Support for Planetscale's options.** + + Planetscale options like `enableBoost` can be applied to configure the underlying URL properly. For example, adding + `enableBoost=true` to the AWS sample URL above, like so: `jdbc:planetscale://aws?enableBoost=true`, becomes: + +``` +jdbc:mysql://aws.connect.psdb.cloud:3306/dbname?sessionVariables=boost_cached_queries=true&... +``` + + +- **Configure credentials via env vars, properties, or connection URL.** + + `PLANETSCALE_USERNAME`, `-Dplanetscale.username`, and `jdbc:planetscale://user:pass@...` are all supported, as are the + same variables for the connection password. These are consulted if no user/pass are found in the connection string. + +--- + +# Integration Libraries + +There are a few libraries shipped with this repo which make integration easier with various frameworks or systems: + +## Micronaut Integration + +Adds [Micronaut][5] property source support for Planetscale configuration. Effectively, the module configures itself as +a driver (when enabled), and provides connection parameters as configuration. Otherwise the driver is identical to using +the MySQL/J driver library directly. + + +### Usage + +Configuration in Micronaut is pretty easy: + +```yaml +planetscale: + enabled: true + databases: + default: + db: dbname + username: username-here + password: password-here + endpoints: + - us-west-1.aws + - aws + features: + boost: true +``` + +`PLANETSCALE_DB`, `-Dplanetscale.db`, and so on, also work. This is roughly equivalent to: + +```yaml +datasources: + default: + url: jdbc:mysql://username-here:password-here@us-west-1.aws.connect.psdb.cloud:3306,aws.connect.psdb.cloud:3306/dbname?cacheServerConfiguration=true&cacheResultSetMetadata=true&sslMode=VERIFY_IDENTITY&roundRobinLoadBalance=true&sessionVariables=boost_cached_queries=true + driverClassName: com.planetscale.Driver + db-type: mysql + name: dbname + username: username-here + password: password-here + maximum-pool-size: 32 +``` + +### Installation + +**Coordinates:** +``` +com.planetscale:planetscale-micronaut +``` + +**Maven:** +```xml + + com.planetscale + planetscale-micronaut + + +``` + +**Gradle (Version Catalog):** +```kotlin +dependencies { + implementation(planetscale.integration.micronaut) +} +``` + +## GraalVM Integration + +Adds metadata and a supporting feature configuration for [GraalVM][4] native image compilation. Reflection configuration +is embedded which supports both this adapter and MySQL/J. + +### Usage + +**Coordinates:** +``` +com.planetscale:planetscale-graalvm +``` + +**Maven:** +```xml + + com.planetscale + planetscale-graalvm + + +``` + +**Gradle (Version Catalog):** +```kotlin +dependencies { + implementation(planetscale.integration.graalvm) +} +``` + +[1]: https://planetscale.com/ +[2]: https://vitess.io/ +[3]: https://dev.mysql.com/downloads/connector/j/ +[4]: https://www.graalvm.org/ +[5]: https://micronaut.io/ diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..6b24de2 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,20 @@ +import java.nio.charset.StandardCharsets + +plugins { + alias(libs.plugins.sbom) + alias(libs.plugins.sigstore) + alias(libs.plugins.sonar) + alias(libs.plugins.nexus.publish) + alias(libs.plugins.version.check) + alias(libs.plugins.version.catalogUpdate) +} + +val stamp: String by properties + +group = "com.planetscale.jvm" +version = if (stamp == "true") { + // if instructed to "stamp" the output libs, include the output from `.version` + layout.projectDirectory.file(".version").asFile.readText(StandardCharsets.UTF_8).trim() +} else { + "1.0-SNAPSHOT" +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..3e82b12 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + `kotlin-dsl` +} + +val kotlinVersion = "1.9.20" + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") +} diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 0000000..8e15ebb --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,38 @@ +@file:Suppress( + "UnstableApiUsage", + "DSL_SCOPE_VIOLATION", +) + +import build.less.plugin.settings.buildless + +pluginManagement { + repositories { + maven("https://gradle.pkg.st/") + maven("https://maven.pkg.st/") + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("build.less") + id("org.gradle.toolchains.foojay-resolver-convention") +} + +buildless { + // nothing at this time +} + +dependencyResolutionManagement { + repositoriesMode.set( + RepositoriesMode.FAIL_ON_PROJECT_REPOS + ) + repositories { + maven("https://gradle.pkg.st/") + maven("https://maven.pkg.st/") + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = "planetscale-buildsrc" diff --git a/buildSrc/src/main/kotlin/PlanetscaleBuild.kt b/buildSrc/src/main/kotlin/PlanetscaleBuild.kt new file mode 100644 index 0000000..e12df5a --- /dev/null +++ b/buildSrc/src/main/kotlin/PlanetscaleBuild.kt @@ -0,0 +1,7 @@ +import org.gradle.api.Project + +object PlanetscaleBuild { + fun Project.publishable(name: String, description: String) { + // nothing yet + } +} diff --git a/buildSrc/src/main/kotlin/common-conventions.kotlin.gradle.kts b/buildSrc/src/main/kotlin/common-conventions.kotlin.gradle.kts new file mode 100644 index 0000000..0d4fe21 --- /dev/null +++ b/buildSrc/src/main/kotlin/common-conventions.kotlin.gradle.kts @@ -0,0 +1,126 @@ +@file:Suppress("UnstableApiUsage") + +import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") +} + +val javaToolchainVersion = JavaVersion.VERSION_20 +val javaTarget = JavaVersion.VERSION_17 +val kotlinJavaTarget = JvmTarget.JVM_17 +val kotlinVersion = KotlinVersion.KOTLIN_1_9 +val lockDeps: String? by properties +val kotlinLangVersion: String? by properties +val defaultKotlinVersion = "1.9" +val kotlinCompilerArgs = listOf() + +sourceSets { + main { + java { + srcDirs(layout.projectDirectory.dir("src/main/jvm")) + } + kotlin { + srcDirs(layout.projectDirectory.dir("src/main/jvm")) + } + resources { + srcDirs(layout.projectDirectory.dir("src/main/resources")) + } + } +} + +java { + // include ancillary jars + withSourcesJar() + + // set target jvm version and enable modularity + sourceCompatibility = javaTarget + targetCompatibility = javaTarget + modularity.inferModulePath = true + + // build against jvm version for tooling + toolchain { + languageVersion = JavaLanguageVersion.of(javaToolchainVersion.majorVersion) + } +} + +kotlin { + explicitApi = ExplicitApiMode.Warning + + sourceSets.all { + languageSettings.progressiveMode = true + languageSettings.languageVersion = kotlinLangVersion ?: defaultKotlinVersion + languageSettings.apiVersion = kotlinLangVersion ?: defaultKotlinVersion + } + + compilerOptions { + apiVersion = kotlinVersion + languageVersion = kotlinVersion + javaParameters = true + progressiveMode = true + jvmTarget = kotlinJavaTarget + freeCompilerArgs = kotlinCompilerArgs.plus(freeCompilerArgs.get()) + } +} + +listOf( + Zip::class, + Tar::class, + Jar::class, +).forEach { + tasks.withType(it).configureEach { + isReproducibleFileOrder = true + isPreserveFileTimestamps = false + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } +} + +configurations.all { + resolutionStrategy { + // fail eagerly on version conflict (includes transitive dependencies) + failOnVersionConflict() + + // prefer modules that are part of this build + preferProjectModules() + + // fail if non-reproducible + if (lockDeps != "true") failOnNonReproducibleResolution() + + // fail on dynamic versions if lock deps is disabled + if (lockDeps != "true") failOnDynamicVersions() + } +} + +if (lockDeps == "true") configurations { + listOf( + compileClasspath, + runtimeClasspath, + ).forEach { + it.configure { + resolutionStrategy.activateDependencyLocking() + resolutionStrategy.enableDependencyVerification() + } + } +} + +tasks.processResources { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +tasks.compileJava { + options.encoding = "UTF-8" + modularity.inferModulePath = true +} + +tasks.test { + useJUnitPlatform() +} + +afterEvaluate { + val compileKotlin: KotlinCompile by tasks + val compileJava: JavaCompile by tasks + compileKotlin.destinationDirectory.set(compileJava.destinationDirectory) +} diff --git a/buildSrc/src/main/kotlin/planetscale-connector.klib.gradle.kts b/buildSrc/src/main/kotlin/planetscale-connector.klib.gradle.kts new file mode 100644 index 0000000..164547e --- /dev/null +++ b/buildSrc/src/main/kotlin/planetscale-connector.klib.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("common-conventions.kotlin") + id("java-library") +} + +dependencies { + testImplementation(kotlin("test")) +} diff --git a/buildSrc/src/main/kotlin/planetscale-publishable.klib.gradle.kts b/buildSrc/src/main/kotlin/planetscale-publishable.klib.gradle.kts new file mode 100644 index 0000000..77874d6 --- /dev/null +++ b/buildSrc/src/main/kotlin/planetscale-publishable.klib.gradle.kts @@ -0,0 +1,3 @@ +plugins { + // +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..d2f0863 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,43 @@ +stamp = false +lockDeps = true + +kotlin.version = 1.9.20 +kotlinLangVersion = 1.9 +micronautVersion = 4.1.6 + +# Settings: Gradle +org.gradle.daemon = true +org.gradle.caching = true +org.gradle.parallel = true +org.gradle.parallel.intra = true +org.gradle.configureondemand = true +org.gradle.jvmargs=-Xmx2g -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.dependency.verification = lenient +gradle.enterprise.testretry.enabled = true +org.gradle.configuration-cache = false +org.gradle.configuration-cache.problems = warn + +# Settings: Kotlin +kotlin.experimental.tryK2 = false +kotlin.code.style = official +kotlin.parallel.tasks.in.project = true +kotlin.build.report.output = build_scan +kotlin.incremental = true +kotlin.caching.enabled=true +kotlin.incremental.useClasspathSnapshot = true +kotlin.mpp.stability.nowarn = true +kotlin.mpp.enableCInteropCommonization = true +kotlin.native.binary.memoryModel = experimental +kotlin.stdlib.default.dependency = false + +# Settings: KSP +ksp.incremental = true +ksp.incremental.intermodule = true +kapt.use.worker.api = true +kapt.incremental.apt = true +kapt.classloaders.cache.size = 8 +kapt.include.compile.classpath = false + +# Gradle Internals +systemProp.org.gradle.internal.http.connectionTimeout = 180000 +systemProp.org.gradle.internal.http.socketTimeout = 180000 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..bdcdeb8 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,61 @@ +[versions] +gradle_plugin_commonUserData = "1.11" +gradle_plugin_githubDependencyGraph = "0.0.3" +gradle_plugin_profiler = "0.0.2" +gradle_plugin_wrapperUpgrade = "0.11.2" +graalvm_sdk = "23.1.0" +graalvm_plugin = "0.9.23" +graalvm_metadata = "0.3.3" +h2 = "2.2.224" +junit_jupiter = "5.10.0" +kover = "0.7.3" +ksp = "1.9.20-1.0.14" +micronaut-plugins = "4.1.2" +mysql = "8.2.0" +nexusPublish = "1.3.0" +sigstore = "0.4.2" +spdx_sbom = "0.1.0" +sonar = "4.3.1.3277" +slf4j = "2.0.9" +logback = "1.4.7" +testLogger = "3.2.0" +versionCheck = "0.49.0" +testLoggerPlugin = "3.2.0" +versionCatalogUpdate = "0.8.1" + +[plugins] +graalvm = { id = "org.graalvm.buildtools.native", version.ref = "graalvm_plugin" } +gradle_commonUserData = { id = "com.gradle.common-custom-user-data-gradle-plugin", version.ref = "gradle_plugin_commonUserData" } +gradle_github_dependencyGraph = { id = "org.gradle.github-dependency-graph-gradle-plugin", version.ref = "gradle_plugin_githubDependencyGraph" } +gradle_profiler = { id = "org.gradle.gradle-profiler", version.ref = "gradle_plugin_profiler" } +gradle_wrapperUpgrade = { id = "org.gradle.wrapper-upgrade", version.ref = "gradle_plugin_wrapperUpgrade" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } +micronaut-library = { id = "io.micronaut.library", version.ref = "micronaut-plugins" } +nexus-publish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexusPublish" } +sonar = { id = "org.sonarqube", version.ref = "sonar" } +sigstore = { id = "dev.sigstore.sign", version.ref = "sigstore" } +sbom = { id = "org.spdx.sbom", version.ref = "spdx_sbom" } +testLogger = { id = "com.adarshr.test-logger", version.ref = "testLogger" } +version-check = { id = "com.github.ben-manes.versions", version.ref = "versionCheck" } +version-catalogUpdate = { id = "nl.littlerobots.version-catalog-update", version.ref = "versionCatalogUpdate" } + +[libraries] +h2 = { group = "com.h2database", name = "h2", version.ref = "h2" } +mysql = { group = "com.mysql", name = "mysql-connector-j", version.ref = "mysql" } +slf4j-api = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" } +slf4j-jdk14 = { group = "org.slf4j", name = "slf4j-jdk14", version.ref = "slf4j" } +logback-core = { group = "ch.qos.logback", name = "logback-core", version.ref = "logback" } +logback-classic = { group = "ch.qos.logback", name = "logback-classic", version.ref = "logback" } +graalvm-junit-platform-native = { group = "org.graalvm.buildtools", name = "junit-platform-native", version.ref = "graalvm_plugin" } +junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit_jupiter" } +junit-jupiter-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junit_jupiter" } +junit-jupiter-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit_jupiter" } +junit-jupiter-params = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit_jupiter" } + +[bundles] +h2 = ["h2"] +mysql = ["mysql"] +slf4j = ["slf4j-api"] +logback = ["logback-core", "logback-classic"] +junit5 = ["junit-jupiter", "junit-jupiter-api", "junit-jupiter-params"] diff --git a/gradle/verification-keyring.gpg b/gradle/verification-keyring.gpg new file mode 100644 index 0000000..b1183e9 Binary files /dev/null and b/gradle/verification-keyring.gpg differ diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys new file mode 100644 index 0000000..3481f05 --- /dev/null +++ b/gradle/verification-keyring.keys @@ -0,0 +1,4578 @@ +pub 85911F425EC61B51 +uid Marc Philipp + +sub 8B2A34A7D4A9B8B3 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +PXCe8La72ukmaxEGbpJ8mdzS2PJko7mm +=Xe8l +-----END PGP PUBLIC KEY BLOCK----- + +pub 8671A8DF71296252 +sub 51F5B36C761AA122 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=Om3K +-----END PGP PUBLIC KEY BLOCK----- + +pub 86FDC7E2A11262CB +uid Gary David Gregory (Code signing key) + +sub 59BA7BFEAD3D7F94 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE2kzuwBCACYV+G9yxNkSjAKSji0B5ipMGM74JAL1Ogtcu+993pLHHYsdXri +WWXi37x9PLjeHxw63mN26SFyrbMJ4A8erLB03PDjw0DEzAwiu9P2vSvL/RFxGBbk +cM0BTNXNR1rk8DpIzvXtejp8IHtD1qcDLTlJ8D0W3USebShDPo6NmMxTNuH0u99B +WHCMAdSa34wsg0ZpffwQmRxeA+ebrf2ydKupGkeZsKjkLlaXNkTVp1ghn5ts/lvg +KeHv1SJivWKCRmFlbPhBK4+mxSUSOPdoBNAfxA51QzZoPizSk0VbRz3YufYRVLFy +9vqPSorDmYJhCvn3f6+A38FS/j8VE+8obQ2rABEBAAG0O0dhcnkgRGF2aWQgR3Jl +Z29yeSAoQ29kZSBzaWduaW5nIGtleSkgPGdncmVnb3J5QGFwYWNoZS5vcmc+uQEN +BE2kzuwBCACzeGpkd6X/xTfKDBWvXgHOOKIJ2pht9XmtZZKiIj7LIiSwvSds/Zko +ZKxAm7AY+KPh8Xjf968FtoUBQJvHAG4rbowEqT7OOrJae2JcenH5qzaod7TpIPQV +v+Ysz8I1wLlC6LzKRj1X99Hng6X+obsEasnPbmEEkuiZ/Sgi4vVC8SHkDmYt1Dx8 +jDgm53oUeWkEJO9LSI2zcrZhSgvg1xa4Q4gY5UUK7gE4LbmGCjFlATuuW/0sryxu +8zxph15gkn4Nqgk0CPMSjesMYEGOsdDzfQXl2tXbt+Pe6mBoWh67MZ1v5zOq3EDt +oSqDpWPxponAeaCuNDDFX44vGjfxGE0tABEBAAGJAR8EGAECAAkFAk2kzuwCGwwA +CgkQhv3H4qESYsvEMAf/VGyqIEcw4T2D3gZZ3ITkeoBevQdxBT/27xNvoWOZyGSz +GYlRbRQrlo+uZsjfMc9MNvaSmxyy4gLVbcdvQr3PF//GxphJ98W8pk9l+M57jfyH +nnCumn7MO4o9ed+WuigN5oeuNJ6BIq3ff2o1DsrEvDChYOJEOeFuWxv+u7I2ABJJ +ep7NbByM2n9PE8vlGU3zUBgWUBsk6jT+klKnEyHE76WzegPLz3jtElTuyB7jRhjy +QJu1yiJEMbs2zH8aJGObi5f8Jum4tILZuEAdoI0M3c3VRq12cz/vLy+9VXa/s//8 +IsGn88kjyyYqOy8WJEjoOXFh++dpWiM7nZkgQcNi5A== +=ggBv +-----END PGP PUBLIC KEY BLOCK----- + +pub 873A8E86B4372146 +uid Olivier Lamy + +sub 1AFEC329B615D06C +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEdddbQRBADRgstdUZq7ceq3NYcR5kpoU2tN2Zvg1vptE9FxpDbL73gdLWnI +C7IAx+NNjdG7Ncdg+u10UZv6OSmhWAd8ubWcD9JxKtS4UXkNPHxhHFHqVPHuCwsQ +q2AaCtuOk6q9OtthQX6LfOuGqwbv9uH/KLUDn91PrgKuHPVfVveiF30ZvwCggutX +D0jTGRHzUJl7F1wViuckHJcD/2z76t0ObSuTnENi0IUjF3Toe4tv+qO+Ljs0knvK +tu1b8A5Bs+kxNcbEqV+zdIph+6gCL9jy+dB9J+t6uZg6ACJexbIkDPsutNtbAVDV +w5AtM7JR8930dRHfEt26ahFohFi+73V8RiA7LrmMjA8rX4zuo5Pr48xt/RR1Y/VE +8ohCA/wOqul9eHHevxeEMDYoGVjGl2EiuIThg4eYuQDDSisBNb9a6dhE8ECQFFBx +mGz32+I8gXSTKFAkkQUI4HmJmTX35nGJql6E7Bn5yM2OaOG04PV+xkhScJll5ZxZ +BNEccFDL/aI4N33cwrLHyk+wFNZHBL1hnHpxpjFZYv5xfEBjmbQfT2xpdmllciBM +YW15IDxvbGFteUBhcGFjaGUub3JnPrkCDQRHXXXPEAgAyqEz3eBEKiZ7VbAj96Ht +IvGufKTdZ0ERJtrdPO4FUGVBcXpphtnPn+JOWomszUKkKLO4x24OaDCG/SENsPy+ +Ned4wjBB+4uV0YEc5Xn8gts3g4Z5p+YiVu+aWeYPPC5BPU61tVqc996i9ZYkZiYO +s9F5Z+dKozk3KwVcijaCr0IQMjAtJ/N70zcciP23KhrN9Z3Nn54Xm7GezD0nxTUG +P8gM79zKHnVhDBptrxIT/adCzU9/UX3UVAQcdq86FfzTEpqFG3TM75HBTQgHihIk +kirzurE+ivh6aaF3UJwmDBe5Wu3gvxF6Rl0Ja/YBNkkCiOXngXSxwvUUR8KJO07R +GwADBggAxOFV2DfMHsTBu++gKJ94L6VjETfVFEYPo7e4tO2Zn2Unzdxz2BoTJcQY +0j6/M3Tl9hCwhOSVVL8Ao/wp1ykjgXnwV4vz0be4d/ZML+KF15x+8730H7Th+aR+ +Ug6K6Khsp8XIypmLJcYgYLD02PlSnDxCq9Fbv0JDlbr6tbsJiVzoRjg+WNEIB3II +rJbTIiOFrRBhloinYoot216QJ1rI2nQpMEBlSuX6f4jYF6F7X4dAY4V4ohjFeJCb +6SYkKbj4caqBA9OVrj3vh8v/vAUKDB8pqVhpaZicFpMd2pEEYVMEU4i1sLE3X73y +9RRuaJOvPAx2HHT8MlWjsDmNdY2Mg4hgBBgRAgAJBQJHXXXPAhsMACEJEIc6joa0 +NyFGFiEE8lSzVhfcJV2TRLz6hzqOhrQ3IUZkrACcDtB3CttHYgGrF31KCocX/gwC +iYEAn18D875QwNruE4Qkt/W0Rhy/QRIZ +=BrH5 +-----END PGP PUBLIC KEY BLOCK----- + +pub 8D5DB0BAA89FE87B +uid Azure SDK + +sub A2873726B043F3FB +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFyikLMBCAC2ILxO0mGhn5q+4kRkA8n8PkWtHLIZOx0VFqBObS9hLdB3z/44 +tzzu9ofX1LFABniGrUFOrLQkkexRLf1VS0WysvC48AHsrKZE150OIK2N9Bhp5IAN +NDmP8nBe//nL0iFNmv8mxMeB2RGq/J7v1J3jyMShNPKmOt3WLw0jI6f6KPh3Qoal +4jX5jXx0h9VfxRxXPQkuhCeZrB5N6h3URdW8xQRZbofDQ+hsZJs5GjIWoyLujfqU +BBtsGHBGzSvF28QgknU70SUD5D21gc3IX/kBd9p06UlvKlF9xeMr5aUKDjG4SCfZ +WyNoUFaKufbLGovaQg6RnR4qHN7yUhhOZBfHABEBAAG0LkF6dXJlIFNESyA8YXp1 +cmVzZGtlbmdzeXNhZG1pbnNAbWljcm9zb2Z0LmNvbT65AQ0EXKKQswEIALd1ofUo +Kt7jQR3LCN7XoQT/UDmj9VxVBPc6spDDztB6DOgrkMCC6uYCrm56D1GaTGIU8iZC +hvjrIey644YQ2+imCrXZhTJnv4jkWp1fOulCHeARDJisG4NESQY0Cb6ARVokAG8Q +WOOgaZWNoufxBh4i/iFYrfnSZMTTrmSyBl0XQe3hIXTSm9dqFUPAbAvoloqNrXLe +dj4E9vvF1Jl9ieTGghY/yCTSTnx56FUJQieAVCv4vhBg7kDeBFIkT6B1DzWuNy4C +zIXwX0mtLBjvoTS8ZkSsr+HM/8FDeo7gk6CksawNXGWbdkgOXZExQDe9tvcZt7Vt +j2tj0ycTRxRMaZEAEQEAAYkBNgQYAQgAIAIbDBYhBL8nOXX1hR4N3jq7fY1dsLqo +n+h7BQJcopPWAAoJEI1dsLqon+h7PPAH/241LyhLp1HGxN17LeA33EVj0d8a/9xb +zKKHEGpb0MJgoEf+al9NmPIlnPsSijMNJs/EIM6yOtjBb9lGfJ5DolcAaEbbP7V3 +Kf/xIsOCiNBlhKqi43YBcu14jKV/6zjklVpveW2Nx4E5crXtu8YqXFEUKdzifTOt +NWGBRqx0f/07tJvsxq9a6Jsrg3QXzSvdEHj5BeGVgFusPxuQ9KSrPXpLPmzSP4jJ +2SQRMAxzMmn6Nmg9jUtDgI7aPyNQHqGihwGbFBkq5uxbypcezjNuLrJlVWAIcQzS +V3gzVYdTflG4WI3RI6m3kSbVJDDjfDuXnjSTdrRmD1DWJHidTFLAFvE= +=9om2 +-----END PGP PUBLIC KEY BLOCK----- + +pub 928B20E9AD5298CC +uid Jakarta Contexts and Dependency Injection + +sub 0AA3E5C3D232E79B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +s5E5s0wc +=+V3C +-----END PGP PUBLIC KEY BLOCK----- + +pub 928FBF39003C0425 +uid Spring Builds (JAR Signing) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQINBGPF4agBEADsWnQn3m/dMw1Q6FLALQCEucRkRLw4wcmtzXuuYb2M17aHvEb5 ++OnXDdgQ2QcnnjK4S3zQp/Jt4ZQnnLORqx919+c+1gT24U06VxeGPW/TLRn/hnKA +ZM7bwGCz7em/GQ7JaIXPn3aqGrCiy8j8N5jAQ4ePP5ESQLeWisQFlbKMFVU09B7t +0IPG/LQ8xJs/SveQw8sGrz9zqyYE58EauyIKfiI91Ruk2jMcb/m+SRL9Bhen3Q12 +g6kFrHurLtEWzy1rwELt9g9OILv0FokPa2m0goQRHx4nFY0kIpJ/r9kDUg/tlg4H +OxP+5XTJxEXGW2gb9zpmDpdR8aUgi67/Kdm8+norzpTTMAuKCgclCv3bJz2D8Jnl +IgEXmSoznn1EnFkm0Qsr8JwkaPC6LkGcI7YqvEdCXtRXduot+9GgWytp/IxrlJ4X +vFEhOmChdVdn5lT1T0ka6NxEJcmf5mfgyz9jRUVHINNJxQKP1Gh7LyMFeWw6V/X7 +RAeU/th1pL2rAeBqn3gnK+CIR82/AVDJJa86BAHiQBYilgs+bGYriXYd0qmIFvYO +sSfC87Dbl3kzwcAGWB4d6tezLxrzscfbzWFIa9woy31/OcqK+uglSKbTFsIklhM8 +Rr2B0tQS1iNzq5gyWGKnh8FsqcAiGvDpwhF7irGhU7fNRVVSuamVDnV0BQARAQAB +tDZTcHJpbmcgQnVpbGRzIChKQVIgU2lnbmluZykgPHNwcmluZy1idWlsZHNAdm13 +YXJlLmNvbT4= +=DLt9 +-----END PGP PUBLIC KEY BLOCK----- + +pub 96B88EACD463B90B +uid DiffPlug LLC + +sub E09F6A4522F77DB9 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGBs2wABDAC+hlEcwcAqPBo183xD18nAU7fBJI3lkg8zCvMgpMzPH8uD54wS +fd0q+7k+2Ddf6L3VLW7+uxuQDNw1gLfIWHcSxGI151pyXkSmYlWsLmGRRwWNSIDS +Qhdi1nnQ+JERKXIo72IikoedbNJBhSTQLEWAeVY1RbeOEeJB61L9+ZEoG4BiB8UN +BRyZ6OCj6BrEL8tzV1wx1GL2kBHCxbxJGEoUxsePW6IM2lfvttC96VFWfZ2aoheI +cXExFxWyxBUJPSovE0708khSh9NmCtX7yYXAqQ/EwxLnMrVp7x/kVbQpQeQWQB3N +zRypv9QLWcp2XUx7oMZuomhyKNA36hmodCg04iIZUfP7ytc6yMIliCxLKT9mIbmb +jg+tr81v95U7j3EYG1/2mM7h9OblqWN6UQ+5ZKG/kra1/IBpqujd9L0AxvI8/RXj +yJU4q+UYgNer6ijFkpvHMsp+M/DBBtdChycCjhxHF/i7CKyrj1SWyC43HdAFB5pk +cOnnt2I+JodG3C8AEQEAAbQjRGlmZlBsdWcgTExDIDxzc2xjZXJ0QGRpZmZwbHVn +LmNvbT65AY0EYGzbAAEMAMBl7E9XNx+IjxwLQ8SBnsukk4NrO2DMUzb58l5pfUyX +agNZpZJVAgJNyb7ns+xN6YXErt9LQ/4HdiamBrAozVQ4ZNQVjekW7drtbPFzxJSY +mvTlGFOhfYRSZQOCexI9MmViYQ66CUi8RvqrgC4XOAofH5zfopSl75Gzpkjd3qle +kDPL2Cu7WvY3qIK7nktay9F4NRLSRrYbjGd7yzbZDXRrIPSLNyuO65rPkaC/hGOd +KbF74UJ93Xeoj1zrsWJbJq1eVfrUTlvNFl/cq6+m7mMl/7X3nIZdGsut/usc+cLy +bI3Vme85o5KqKWagT10QjXITAhTCVEeaczcdLKaV9JDQkCPY4UA2gvkvfazEVXfi +xFgF76+2ZDaaPLPb1cVKCxY8wRS80/XYX/AP15U1l5qPjKsK7mBMXLqPdk+6IZDH +w4dxD5g5319xGk4ISpiyfCli5jMbcizFhYJW7gKsbFkn21oHGKbG74gSScAE4xyK +sbTHB3jQC+bI6kD1MUY/0QARAQABiQG8BBgBCAAmFiEEZsph6g/H6eoSFvgzlriO +rNRjuQsFAmBs2wACGwwFCQPCZwAACgkQlriOrNRjuQumRgv+L4fwHgMTKkCaDklZ +zn0H1toWKCXHhhwdUrQX0UCeXctJ7bSpmsyI7XFs6rHPn06QpGVCK7vo58kcUNKn +mJUcqzNxWS6lUU6x9PoQI3IsCQoK1gx9dMJHCjf890YfyWZXxytBHl9p5sSbLvP1 +QF7sGMKN4ESOMvzgfV64j84W3Gv8PIdAuqrom7IySLXY3Onxo1PQ7CzQ1/f14ggc +NvZ6z0HXnIdIlBIxw6l8X0r9Kq6MoHojkcFa7VYN8qnIkxens46CiODslW/TqYbW +gjm7jKBLfUF4GCxlfCGjhcd7IBgvkSyDkfXr9ug1QcGlxh1kTX4m+UnGpP/cXHfB +cWDFDCj2Y3yiUOutcuxAWIvG0lfNuJZoS1lliUt0yam3uOKeiHNS/Er55WVGXFsg +L6Sqn51We6BHCOwRkbgKnHC7P+tBBz9ZcwgaaUDznWOa/Kc+PmH/EJEVkRb/VSwy +7BKzJCRkgSUK+0dwSoh3NyBxizsAWePMOK157AXfExz+iRUK +=3vkz +-----END PGP PUBLIC KEY BLOCK----- + +pub 971248996DF82053 +uid Adam Cozzette + +sub 098005D377747985 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGLYgmwBDADA1D9lwr5+zStRxk/ifx1qsn+5PjitNlWGEMkxn4QAhzL6yrVs +vMEMvbjMVjQG4fjJZzZ3PpNzxvASnZ8miXBOms4fx4SEcK9eUPVUE3ZIwzj89O7y +7HLe3TAsdhf0qOIJqV2SlLmJBf42ATrJvs2zprxzC/Lb0m+ymtcAXtntKU7+ecrp +E7nDOj4lUgXlMGezox5USXUIM7w05ea0V0Hyz4qjopavLFe3DI484dV3tRD1Ehhd +/PZT+Ny3PGPUX8IuMYLaKWKurQzQrNxbMiHLVIOMaWviUrnsay8voqhZnl6xzOW6 +JqnMU+aIH0Tj3iXv70sM5Rz48khFYMS++4eK39qjGMJ+5lCKs19P4+69dbJe9Dow +iG2PvKL8djMJZgqrOYNqMOTI/p/Cdt1YNoGZs4rmSRLfgdSk+sXSRjniUduTFmYt +Og/ylWhWZBgHoj9atvtatO0JsSIlsTRL1cx+XcIbWXpW+37HdoBN6QVMQWk0VU4m +ZB7W46Asyb0yUBEAEQEAAbQkQWRhbSBDb3p6ZXR0ZSA8YWNvenpldHRlQGdvb2ds +ZS5jb20+uQGNBGLYgmwBDAC6SpzTm1VIUJiPD+TZhogakhSeUtbGJ9CNqjo2vzst +thqciRVMkElMyMcAhWhYfGVCVzZLy8QbjaB6T8EjZI13OpRYkGehdeMxrAR/e3F+ +nGeEkC6+fwF3c91nADTeOzGYCoKK4FoyRqhN+OZdxkFmE8lZoKSo4NphW/6Hr7VT +you+pQUSZ1Mvauf9a3wGaBxcrC+jlCf4laSZyfYlMJ4hgvlMHA5hVQm7fouPWAyE +qH1zxTBxZqrZH0O4tsFAzdf/4/NjxjdLy1zHG6sL2ixReDiM7xoPTRgYBS9w3A4w +mmcumcwYQQ0rAucQCSykIFSnOT2O2gOHJJkU79qmazTJWU5mRX9bgp/gms9vAudD +AjmRoZx7FTQj2i3jpSotF3inwPcAFQw0kjbh07vBjcUCn0C8vUY0zzilVkJQwutf +5MzgQaTZTPKTgOQUmEKPdeaeFc6A2PV9J5z/5UktooR1k+vCKHSB/nLtl1ZyutI5 +oQ5yIJJWWPf+T2uzuB4Q8hEAEQEAAYkBvAQYAQoAJhYhBPms05MQtHe2kfTj+ZcS +SJlt+CBTBQJi2IJsAhsMBQkDwmcAAAoJEJcSSJlt+CBT9ewMAKWV7sW0lb1EYi0f +z0Ntv9kYPkSm9LRffjFPfJiA5DjLCEQ4QD8CVLSQaiGUc3eKCpFIP4zeFWskAWhk +OP3st8g6IRRKm8jnO06hA/JEncsAP/7yTzXo6CSWkeuu4yNBUrFk8iByZUyRZ0JL +Tu5d182gyDK2HW2DRi86pFoJndBSVXTUqTi+xygxlfCWB7P6/q/iul8o4UP1IOiY +rVD5DqTSqooDhLOpkDAufXYCO0fjiPt+V4YcO/5yDtkzdocHMWF+2VsDFhc0l7Z7 +hHs5S36v6jm6Dr7J0VRjbLwPfrKZiDlp0dTDjOARVzI+UdrJ9h/VSEKTiAPATp5a +fGgHg/47bURogsPi+7MxCA5oq565vr/3CaKfpe75p9h0KfwIHS/DhctqSr9jiUhn +eBi528FqknI+8EmJccTgyXRWzN1ME3qh5ISEqo5/rkTjoqOjQQkQiCOV3l9Q5D9C +tkj95CvoDYH4S+5P61xNSnhtBUiCnlVw7lIXvHVDX6HasYOQaw== +=5JK7 +-----END PGP PUBLIC KEY BLOCK----- + +pub 991EFB94DB91127D +uid Antoine Mottier + +sub C327DD2B96A50E1C +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=QLy8 +-----END PGP PUBLIC KEY BLOCK----- + +pub 9987B20C8F6A3064 +uid mkruskal + +sub 80CFA7C482552DC3 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGJGMxoBDADF9xkWwxwN72wRh0al9ARzTTIHpcVBIjDij1Xr768zMMRdKOsQ +aEHRTBKArAfGl6Xt6CfYnu3wMgEDUfh50s9NPOKvhpKtqdIlUxZLEJ807ebW3MD+ +BnwoRUe0OsTItUQA+vLH8K2Uywd9f3OV9KQnqItUFMptaFhUC144hZhj3c0xhITS +k45zucoXLKO9yqA+tlqav7taAJMrWbhRcRWXizK1wOZLyhu8NdIMUSL4Ei0blR90 +uA9i62XlOhpyvfpaC7oRh+jXHOCFK9sXe2vnvnTtJ1yqdXH4EOCYLjoheQN1R0u4 +6f6XoAy9c3tOSOZM9vwE56iOZJwv0bca6ZENnhHnYwWhbQwrY0JMIon0sUpx9RB2 +w4E7AeU8/maQG9hdB7s7vrAJFarlFQvc7kJ5FMTKFmWPalUTcT6yXntIQ3+xiH9l +Oq0jGlAmQWYUvzHJ0SFjz1xJGBDM3GH9KfHbeoS3Xz5Emmw8YwEDUe9gt9po8bmw +8qnA85uMZY2puh0AEQEAAbQebWtydXNrYWwgPG1rcnVza2FsQGdvb2dsZS5jb20+ +uQGNBGJGMxoBDAC1ypgR4chf/OzOM3IoPIs42hmmEjJ59iValutsAWDCAlURaIhY +ajUO7R/k/qDenb1AP3BImtnanPxNTBQiHCkLEDnRx5M/MReLnbfOepaVeY7B0G5X +peMPsGLRkQuD5Cu6Zl9IOUAZvt9To7f1OjWYOqDdIjWPJsGTo46U9h918gjvbP7W +yYRpSKQ6ld4ludfCqQBoHyNAGAaKRyIAJWu4/yMxHAQ6nUlwyPWFM4yOxs1hjHqz +c1jw48m+D1GpZ9YALVXp+wQERKVhWfDchTmwwnPD3j2HrRu2oUWOCDoYOMP1eTpE +lCMhm2L1dBWwg4CzBDa1QdiPsqaNf/mHpT7GZm0VFhKQ9cwCOPurfW3f4uPtWFyb +gVkaJ1jQDDBkBAs/q2JHatwS0nYTXFeqYAz2dPXl7JbB85WH9VW5T8MNo6VsFDKr +CVO4pjEKPhTJYZVWqBLAHIXNiloqRbD3VFfTTx5P3iP2yP6bdWp7lDxVPeVHCO75 +MFpDPRXpn+QqAmMAEQEAAYkBvAQYAQoAJhYhBBhzZqP/5r+PlLkTapmHsgyPajBk +BQJiRjMaAhsMBQkDwmcAAAoJEJmHsgyPajBkW9AL/j9CucsaDsKdb8wjEfmJSjQk +XEriC7PDd/80aIzM1y6BTggiwCkyL8mDrL3DGoae2jcDfQ2JUM0keG05mH4PSk2U +B75/adKukDnNk3fhUeEDaQ2tUWhD3uljvjqvrI2YzwMuWFvvpaOkTxnQbfLQDXR5 +iNloZJ4zY5/XFS7v0rnYPdRUljwRWAsRmCLJAzIPWRJvFr7rFW/cORtATlyf5EkG +fCX+ZpgG3zPkS1sCmONjxR1/hiBa+sYfMJRQY+AvA0hyCz+fC6S68TvToM1LzSb0 +EqsoM2n30am2UhVjLhFhp9Xj2zhng67MddOSBvb6FrObk8lDIvO+TSKAuZ50HzB3 +EWrOthmYo9Z7lqLhPl+CA4HNVcqvw3RfoSvEvfzrnnsmGUsXY2IKQfqjg2XZ7P8Y +bq6FPZJMgigvJOCtTFvzxw/QUkgP/XZE0KtHq5kCdkdkbLNA37l57/+6EGJjmh5e +1oqRDHgAffhmvyMjyB4YL48bYbjwFEar/jLCQJj/Dg== +=pXEQ +-----END PGP PUBLIC KEY BLOCK----- + +pub 9A259C7EE636C5ED +uid Liam Miller-Cushon + +sub D66472CF54179CC4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +cFYKw6eZhSnlf3dtLjLzKg== +=hIWn +-----END PGP PUBLIC KEY BLOCK----- + +pub 9A2C7A98E457C53D +uid Spring Buildmaster + +sub 92AECA6AC21DB816 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFjN6bABCADHL68BhnXVXyJhOA9kO9cBwJXKmav2RftpcpXfaeHJTy+CMQa4 +rFxokx5W7E1IPlLg0qJfKSMeWhimVLOsLhY1MZV8Mb4fkK+SlDz/ah+5ej6dzOs3 +kMSzmn3nBbeacv5szjB8dzF0ZGPPgciGp28KYrjfPbxrZvnX0PgL6C5RqNkI3cTh +oUZgYqXGUe/uj5gUiLr+eZvh5lajPqe2YF9fmxfRXklmX47TMYidFkcQKGwxIM47 +7AKa5mKCp9MPKmxA2TG5F74sOwtSe7PYfzraVgaK0GGDJhm0Xr537EdtJfOpDRJF +GizM3hYSgOp3Yo1wjPrkFA82EfB4hCNZK6ipABEBAAG0NFNwcmluZyBCdWlsZG1h +c3RlciA8YnVpbGRtYXN0ZXJAc3ByaW5nZnJhbWV3b3JrLm9yZz65AQ0EWM3psAEI +AKi9vYsJkKjFWAswJAWCTTsYsfU6WPtJnErx1q5ZZa3uYXibODcs9sd8LhmJD2u8 +iAQLtWuDl/SC6nln1ikCRYy7v1JbENmJw8gWQqIBLjmma9v5GPUe/Dg1QSJqrem6 +VEjNtgszGJGr4+GDSCJN/AkNKlyMFgSdpRrMCBZkvpwnvSM2EFbhxonbtD/jvqSl +x68OY32/2cesXPvS/Nj8RqQfj0RxcOK5AHGKFQGoMgK2NGXfAxdOhPOA3I2NwfQL +nCNbAVbPOauNcV9tg9vbRg0l75CAbW0tmM1i/8Geh248QAlQL5NtApB3az11wbCE +MAoFRh8maFLFtTJYTnKgW1MAEQEAAYkBHwQYAQIACQUCWM3psAIbDAAKCRCaLHqY +5FfFPapEB/0RqqVPeoL01BivlBtcO6JGzfse9c2JNJyMeKCrxgA79GjVdda4u7e2 +IIlSqgUBebS4fW+kHZn5jcwQwInbpMjQQCQAFpAiOdrA1pV6baj6s8wedPvj+v7j +fMXa7udRvpZ6GQo3YzVsf8n9a8Zb9bX/YwUPfhY4eW/tRu02Qj1us4JVClxwJkqS +EOGjj2mGKfILAT7NzdxHRfDd27JEZ5CL/YGbhj6HeSgtmM5YpoLwlZu0ywyFwON7 +Nf8pkuNl55/cAkDrcZwPxiHlii+mt/oPBqYSoDWsH3J9iNV6IU7lPPwRZekWMybY +uuUS60cr6DwXd1f1xbULR2+AL3uiePHO +=2CAN +-----END PGP PUBLIC KEY BLOCK----- + +pub 9DAADC1C9FCC82D0 +uid Benedikt Ritter (CODE SIGNING KEY) + +sub 923C08F9417B222D +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +zW9k+nXG/umtuGWBaZVODvhr9hDoUpp2+qte +=sNEF +-----END PGP PUBLIC KEY BLOCK----- + +pub 9EB80E92EB2135B1 +uid Slawomir Jaranowski + +sub E3F6790A5A167F5A +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=hVLP +-----END PGP PUBLIC KEY BLOCK----- + +pub A1AE06236CA2BA62 +uid DiffPlug LLC + +sub 030DD9087C31C9AF +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGPAYVUBDADCs9PkY8zzhzE38bRZX+vTrr3LdChGNBmObV858NGRrXeZtyLu +U7YwYVF7w2vHUI/JQWrlPZc5tBFicefucfUtKt790WzAk3NBjGtX4IWpG57C1Z5t +QRI23HqWr1If0UanH2vUjy4fUgNZdYlH2KzookoU0950dIcqwA/HwiosO5RmQ9iY +HztkwwvFW9QxiJgL+lR84EcaIVN1ukr0ZKrG1a6wOJ6HLf9S2F3DMe7fQ+O+TpT/ +A11RewOZHwE9spH8cEsNYgutBouw/MttuYHjZKD7O4hN12MmzecWeMAPyrvYgTJp +PHcjQaVeD27OGLRpy5n5LonvkzJbhTzM+Ps1qEj/4of3EFVhxNjR0gdrkX+0Ub1A +XXiw3gjqAQuLQVKIbwvCbfj2go+YHrfcXN6kpKkYZU8ERPxI/VBTw230PPdXXwXP +Ux/JRQIEXOuMIuELm/91H8TXKutw6NdNRu5q+LPcUkU7W6jsv28dmQHdC+ebVHlA +vNcBOWVSY5e8IasAEQEAAbQjRGlmZlBsdWcgTExDIDxzc2xjZXJ0QGRpZmZwbHVn +LmNvbT65AY0EY8BhVQEMAL4ZVuEVH9zbhY6AewA4T3u2XZ7k1KGOxoK74eygzYEp +fKMplWQtCxcxBXe2tboT7I8U3MrV6m7KDwcxLNVZM638fvfU3Px0yGs0jBzyjOcb +Vk6n18xX9UoNyoEqpxHhyPbTBr+U9OINcneXZ/iG9FfLURZjDxhNcQcnrnmvbUB6 +M+teZ6Gpb1Ye8ghVCJJNjRRQhFxXE7XnmX3C1pZoSoGcBx5zVspSuHjq7nTTw/rd +7OpC6sBK0ULk8GPAd2vJUfOtZcsLvOs2++bHxNULTXraTy/fYvXsTSe+PmbJo1Fd +5o3imI0eUy853UJmF/HbuWspFe8yONHjo0+uZITsAMq0jbzG8MTKMmgsXS/i/vaW +8BVUmLfhB7E+bUXJLJuQAan397NbYZqPF5agLZ1wHSki3iuYEttdMsy5PYCLeCqh +8Tv6VBNkEToKDAvNbaad4ZgBdwbBQaAIrWekWpiXSXizyGr/VTFE2hT5NC0d1BXy +sc9P2UCvHit6A1bCl7MSywARAQABiQG8BBgBCAAmFiEER5e09dzEbOphBZBxoa4G +I2yiumIFAmPAYVUCGwwFCQPCZwAACgkQoa4GI2yiumIHXwwAh4/tSXSQ9Btws4ZP +eLfihAb4ogHOsrJ8ZO+lZMyQOrEyzDK/y/1LpFVlHYEP51XS5h4u4XVivXGzsZ+r +tQoXaCS6n19dyyNeusehZx/BxxQrdV9OYEkgb3BC+05AWogdHXTP4prGdMtpSttd +gcxTuHwx9RUv/d6CsQ8DyKyjTv82hd3yuXQVl1829NwDbM7HJ8eq0uZPmez2ewbx +Ze9CxjKoOLfYSQ4k0DfcIFqz8CSqTVIz5aNLLXiY6NXPhS9B9/bXkRNAXzUgMrG4 +GmmP8XLYjBn9g8V+fAad67N0dUWDeAPzz3OXjp6bxyScgjT6OMlp55xXaE5HWW4a +aE9epjKjLuOD7LYdmv0GI1HhSrOnlqznB3TCwJgKMw6/37uGZnpsX0JoMs947ZIm +pcN1kNNR3e4aAFcpBwj2OSjds+G/DI3/WOXJj3aaRI4nBRr2/IB3TVhzLOizLTNQ +Q/IKL5Iy5doINK/iyjb/G/JLH1/TkhW9zEheiKUY6TiXeR3p +=v9Tm +-----END PGP PUBLIC KEY BLOCK----- + +pub A9321EDAA5CB3202 +uid Werner Randelshofer + +sub D36DB5C489BAAC5B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGBoC2ABDACyCWLqqAo9NeThE90hBoYomtgLci5I8+7PxSYeQfzUYjXzZcnh +6d/zHaeC0zxGhT2LNe5i3p2e36xSeFDobjG2Il/nv+4jFCgbn3TZ2hEingPuPsg5 +isodOXHBSY9iHPTKInpiu+J79MWP9GVZ6GeOOgQaNSrNN3uDE1w3rukB2SrXGdfT +/6YZIOtwWZVzc2m9lalPmOAyI4KLI/s37C8Ozfv3c+Bx11WRVzWVpBTo94fU4DPu +Yzkx2Wxuc4TT5k6bQJI/GHi36M7xkUauXhkRCNvBz+LFVcFjtsv6S37L6RZib6mz +jZTW+iyD4h66gqzg3hSRxv4YzHgR/Os26Br2ioZNzH6hJFtNktR4oN/2kydmj5Od +WYjvdMmd/dMbZheZE3f8sziUKCyvWMIddnHAM81uDTXgWcMgYSa3npOGZhfk41z+ +w9o2f1kXIfdurqlA1n8np07PLw5Rfpjvbs7EZxPTJwcc1enaNyL64fb+YIUtFrcW +Dt1zUMEDkbcZL1UAEQEAAbQ0V2VybmVyIFJhbmRlbHNob2ZlciA8d2VybmVyLnJh +bmRlbHNob2ZlckBibHVld2luLmNoPrkBjQRgaAtgAQwA9dZFGqc0/6pUKDUsT+2h +Mh0z5mISLc+x6v4wbAqiEcBE9uoKf0LniRfVeehmuJpiUPgOf3TyxNbxeWiFuJEL +ZbnrYztAeRE66Zxk6i2Mv+207fdlj3mhphdEWh4f/0AJa2PAmiwlcxq1O3VJ/Wfn +3huCqIU5cmqnmGKH9LPaW1aJBxWl9+x6mmPVySxpTaQRrnNnumZf9K5lwGEsccvp +kLP7J1Nlv7HLO8oliPCInEMcsrVqfiKU/bybxNW1wzPJxp8LNLaCNxuLNl4RCp7t +PQuZgjcoCnz+JwcxnmNGI+FKqSsFXBZyNTWiQJuaFUQa0QON/+Qj3p+OyW15f+Ff +LjHI/BkNAi4ncNeeazAwuLCMJGMS+dLarHMbbAKLaH0UI062ch3Aq2Sa3io1gU6v +YHvoKNMNfYdNwoGX85EkzX6A9fm9jBviios1RLkpfO70MoxpWjl/rwHG57GOItWZ +7O53ebs6HrFPdUYQs0Gz/lj+BaQPwDcMxADfYtGnYMepABEBAAGJAbwEGAEIACYW +IQRurXUrPis46OIjbXupMh7apcsyAgUCYGgLYAIbDAUJA8JnAAAKCRCpMh7apcsy +Aj39DACMEaGsskfZBBbF9BHklmN9OHbGKK4qfwY6f3Pl+QEC4m2y5Uaxgx4n0SJZ +/p4YdVopRj07cdVYEkqJC31co0XPvfbjyBfhcH1BXkKQiYAZMUTqc+ILGHrY/vzP +27Je+vck6M+ntQ/2rBBiPtD6Bj2RcuXupr6MiGavF5U5vzLUkYm49Oq2Wi5gIuBF +8+6ipjnzrVl4HqGUlFEt8RK3W4I/ZWTJBlwxaIWoAIfkE54FtSqN4dY+LoNllMKb +zjFBemXfZXHAFEH9cjNh5EvFKm53ff8X+WNgodiVaH+qv2VMZZngEtmj2Y94v5x5 +z+Q3vcoGH6FUdLjefYm5uwEhhBsTyz8gyBmoj8cBBnw3DZexyOPLGDj/3FSimww0 +HXf8RIR7Msc5GGMLXqSZ4WVZM59pFsqjmqfgl+C8WYWMLAt7sXJGuyl2LQoAtR5g +pkPZqA0wQiIXe7/RgIs6TpqdS4uLh52KzW7VUXqywr+qH53RFujkS0KijW96Lbbl +ENk54Kk= +=7ZAG +-----END PGP PUBLIC KEY BLOCK----- + +pub AC107B386692DADD +uid AWS SDKs and Tools + +sub BA7BF054B50BBA5B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=YQSO +-----END PGP PUBLIC KEY BLOCK----- + +pub AE5A7FB608A0221C +uid Robert Scholte + +sub 38185785755267BD +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=Kqmv +-----END PGP PUBLIC KEY BLOCK----- + +pub B0F3710FA64900E7 +uid ?amonn McManus + +sub 7892707E9657EBD4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFdbSfIBCACrFI0ai/abnV2U2Wa9QQZwGk3Fegc8laiuTKc0GoYdyptd83/H +hD5S61ppdkOugBjVTHdgda3xJ7zBZdnwjZvV/TyayQltbh6hU+BMlEolzXLgyvY7 +cAzKE+iKWbLLwfhRn1iuC7s5l1NLPsh44IUt3xDaFXNQrPO5OnRz8bqsGFVawxmu +2bPqIjkhxEiYpxwaZZbDkgBR6rbBth6A7QOadQcj/9wNdekoM9dyg+olOUmnLrtA +nMBhrvvbm2fZxTps3SZHlLV7+iSu71B5SqU/kT54/49n8vxrQiGvzp9K+t7c7EP2 +w4Ax1nYpRkCxYdHOX3YBdayUiP9ZaYH/YHtLABEBAAG0Je+/vWFtb25uIE1jTWFu +dXMgPGVhbW9ubkBtY21hbnVzLm5ldD65AQ0EV1tJ8gEIAJVavNan4WxxlwLwvnBj +3/wcEWqN+kfMHENMSjmRWOYSmC332hhGLmTDi++BPWt2OOvHUusJV8dZP5D9yUBR +FsKozIpyXyS76C5VYGMY8WZ6kyqn/mLCiwmnkOJ24kXLaaHPsQjv6i5f2KliDVhA +GUHmNMJgH8o/GL7zZ03Mb8ZlKFZobp0dn+/lxoOtQSzR+cBz8NvMBkOKD8r4PJA6 +BxCR1HVEHsq4xSnjr/UZOYvh+Kaxfnop7Rn9in5MoY2rCY+PV59Xbx4grqNpjupy +HEf1MHodJRj85JiClnLZk7dNJ/kr+zggwbsd12/GHkBt/pxuWhe0eFcAOJmvqC3c +4pUAEQEAAYkBHwQYAQoACQUCV1tJ8gIbDAAKCRCw83EPpkkA54FACACFZB2Tk96F +Qkr8+WHOz93CJs4UD88PosLaKmiXKP68arjH3y5jhNLBzqteZo0Crfw75DYWIZCh +df5uLGKCWXBEytF4uoHOy9Lv/3emoSeenluFVcNjL7CIOQDRmqw1t/LjnsLbgvlw +Hix5f7I6Txu/J0HKJbq0XpoTqCzFK6sxEPHH3gZto+XfHk85haKd73SOM4edkmJx ++jDXES1wb3K3SpYibt+uPVfLYXWxK7xAaztESTIqZ9RnYHzd/7z6DO4z//lfB7IV +AqvM8ga7Qj58ObeqZxx2iVit5WUZ4cE30crNGyXH/HKlAp+B9EvENnwr++TI1CGY +thPLFHFc831L +=obUO +-----END PGP PUBLIC KEY BLOCK----- + +pub B16698A4ADF4D638 +sub 32784D4F004B405B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFM1v9ABCADD0KoXq2ZKlUHeIVovQy3gFmW9oFAaraV48ouv8cYvqdf+s91H +NyqeyNPT/ihFeNqZJUAMyPdwN5xrWD6gxMrOCR7BFhA5kLmAKz4HfFCQ05ViyQdI +/HVNFvTdF8LNnuF+a5aNgg+jjLvFwzkyMFkuiPGuUDFnqEGxC+z9J8t40tpOTOIw +tPjSzkDN41AJDpUK/simKC5F0Im78nUbwMalE5z2IsZRWpYZyIhN1HhEdDvaDIh7 +3vENjH7enAjWh0iGRu+GTP/fayZnX0uhmausCCwMMhsr489e63ZOaJrqeC//wWrX +dtEJjcmvRmJ2hwLmgwMP4zSNKsnLGzP0sh69ABEBAAG5AQ0EUzW/0AEIAO62SMbq +gIzEFQEHlxNN5pZHd7msqDESILFYFkI1mxlkD0twFWMbk4nMH2VXhiuT3ulqKBOU +UUNQrO7egtfbGsgVv4bWbUHfeZkfvoWDlmbrvi1YLlR/ZxzGpCNc8e3aOcN3XKHl +BwfUaco6pcTBvLpKPA/TAjkTOtK4A5Azv1CSwpzSJf2bVVbrn7mi/rw78SmZAV2/ +rtiOU5a9S+3fzswLk1PO/z//d4VoCcL2s2WueVO1Q99kejkE55l3lYwEiBzVuAA9 +8Q0a5wg84vRGFZQWLIw8c20On2+dZcTLZc61ZjnsI1LSnLUUyQ/fzHQ+BynQF9l4 +3ZCPKFIl125MGikAEQEAAYkBHwQYAQIACQUCUzW/0AIbDAAKCRCxZpikrfTWOJel +B/9vDc3G/mrIHB1P/zl0Fdl5wQzaSVc9JB/ce0018ptplL711af0ZDvWqmZkJNkY +u0lHgnniaXB0l3GGUPIa/TZzVgFSRPj65FWTMkBbNnhGIwV5IVOPcSKSyDYn9/nQ +PpmWl5fDj8xiv6kKYxA4hjjRbRGuUXiI2dnyFHuFpacf/Af/Mc0U/CDDuz5a1jS4 +SYuYM/HFVL93POZzwLUR/+GDuVJFnm12rmjGnJVgR0rWcJKJt6vCsBPVfIamfl6v +G+N4TWQ9euj8Rd4hjsYPOwDfgVIUGIhpTUJ+fz046fkz9MWnX7RJh6hqLAXT7Hbc +0FTFsKYAbLJbm3Q+rU9jTdM8 +=mDDW +-----END PGP PUBLIC KEY BLOCK----- + +pub B4FABF12D1EFC080 +sub 6FC0F3E34B018A13 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=Qp2D +-----END PGP PUBLIC KEY BLOCK----- + +pub B6D3AB9BCC641282 +uid Eclipse Platform Project + +sub 700E4F39BC05364B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=uOQ4 +-----END PGP PUBLIC KEY BLOCK----- + +pub B943786E6702B77C +uid Aleksandar Seovic + +sub 5E3BA16420525DB2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +z3d0aHbZI5qxwahggEs2wHND +=+4n0 +-----END PGP PUBLIC KEY BLOCK----- + +pub BCF4173966770193 +sub C9F04E6E2DC4F7F8 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFKneXIBCACtnX3ZQmPujf6ocvdnhsBheze71DSl34TfebyW2Qt+g9NhMxo4 +DaJy+iFNnsaMwLZRr6k/qf+ISE3A4opWAQlbk+Wb5s6DPPA2cHH6W4GdkxtuJzqt +tFn6YtkFhA15Aahr/vz31NBjUJlBmO4PwvkyxiF/MYP6TQ/AHar4xP1RxSYEPcCi +dIQczQ8nXzya4OqOyTfibeGz/eiHHuwTLHi3Rd2kihQnlRQdhE1rmm8uTyzFe1H+ +P7WW7kQgygW6yxQ3J+DXrG8kG+nbe57ZY1oyv3F/fOBxzn/kuoKHZ3JJEMJmTIrT +Lr1ngCZApgteAynRHk4t/SYZiyoyqZCuBcwHABEBAAG5AQ0EUqd5cgEIAL3PEOzt +IFUibB6FYEkObVhsDbCnHw9yO5MAvAWB60Ohf1J4T9QK63jZ5/CiqcDrw+uab9I+ +Ruz/SgGyFS0UXAkwfTICUdhT5kUzZmGyoj2ul+iFDP9uUdEgSgyXXakrxBbBPzNa +Mx8+GyIXRVFyRTH7+1gWgPQsdN1sGYOgZ+f8TMzAv6sxu0JVzjKXAAbXdiZTyJh9 +d6h1jS5Icilu8vRwn3Qc/ZzstBRk+eLbb69wS9YGoUlzYvDBz+5tiNwvHUriKc6z +VT4Edngcr0mKWTdvD+AsvZffU0XK+vxbgMuRWi/51qb+VgK2gFeAseV6a+D1059u +2+5Pn3h/Fv/vRAEAEQEAAYkBJQQYAQIADwUCUqd5cgIbDAUJEswDAAAKCRC89Bc5 +ZncBk0qgCACdP8kyUZVqfncA2RsQH38NFYhBz5MAEOIhCm7qwPC6XG08CUZfpPXd +UbxZGUliE6vhfj7rZbvUKKHlcHDPobdTJqGof2jt2MfsjJ18JY0exSWuVTmNmqAC +3gsiMfEGIqjQFWonfm0Od4AvduLuc0TPkyfr0gobakgYvhDjk7eQvgC1QfKlk6hH +A/OAFW774qaQsyrANrFevRa7CBQEob6V6N8aV1vNxgl8a6fJzPTNBOOmP0mq7xk6 +nykQuqYTVFyqfXN0p1bbTxHBoW/fvdizi7zMSsuBkWUtfG1wyN70uoEQzSQwqgWC +IaddzrPZPmaZ8CtzzyB7+JdSNItBB2Sp +=wK3Q +-----END PGP PUBLIC KEY BLOCK----- + +pub BF1518E0160788A2 +uid Karl Heinz Marbaise (ASF Key) + +sub C163B490C5CDC967 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQQNBFT3VuYBIADPQxdM6fJajMSyeiKbfpSjllBkGA16DE9IFJ76B6281k8sfya2 +k6UOAKNIprxY3JCRulbnkn3BcdbY1vZDhaf/fbdkvJ+o/XVzrxojq1jS3tvSq95L +qOzITCHK1rSApWUuVFTlvdhJy8rVlAVfiV5Qkb2EFBQtqQPIdyjRDk7NkM5CfzQj +E54xPCAM/oVtr7bCAjtUKkOjXYjv/L33pSOeig1+Dah1OjDpkqmUspiFWJKJfYyw +1MvR/lZTAm+aZpfx40vlBIkhBtJBsufjBwxLOJXUzPHC8io103K9EjHgpxeuKj21 +HvbT4EbL8jMEts4uvkjGhQoa0yZ/X0//VOA+s9vNE4egPtQSZR7gT8y12s1x9EE4 +nn7XGCfYYbbkpFGLKKHr37wRkzQ0ABzLwPuOZMvq0jAYtS4BA5BRzT63JTTAH1gT +O141lSmRc36Xxqa0/KFN+UEsk2tNZy8c+KA9zRYW/rZfPz90S7V+BZqBfE/oyMwf +394FOVAcpldYWmlBzQQsrHIZ7c5Z3gygN8naQuHcqO89SlYOkvMk2jxmvvCi7qzG +W8j61lwrzV/HytULYRW/3gCbbjtBKP8IgeYVTzE+JTzZbd4FvUXv5jWtN8cxcBG7 +A1UaFG7n3XbXdGaifQ/qNrXUOQxqeFv1PTdxNhPSRG9/TvVmuGsTXXll++gc3J6P +nCW378EE9wqn9ti20TIaBus1+teZv3BjwFd5msSytrvDewLYrhqDyOaBR01ux4Ea +5FYAidqIJ9UqmGfLCJy+xF2re1Ra6Vmfk/jlkCCIyIp57+K+o0a6XIC9+fZXmdqY +PmCThaqTJxQix54Di+FmFmceiURMx70dyCs5Py51vlszDoOttJxGpU2qkVGLdnlu +BItKLvzt5e30HOnpj8KC37/2u7ahWBfFtwrflIWoC92DElp+dVdDfSw0wwvxadY+ +7/nGon/IAi+Nk7vQn0ngJA9QA5gm+bPuC4w1H+Nw2mUmoUvB/fd/fYS/bm2ggbyw +mNtaP1s9AQsKZ82SkRQgWiHi4RgV6xSSKCzA3sprYjGGFG3hCaRfdcXnfN75yi9p +rQv/H6GFvjKDcVRYCAWwIRRixDBnSFJuAPVlGUer2GLzimy+RMJx1owXjigW9ZZf +5Cm4+0JRESZqRUReY2hcUD5GE9bUCCiheHma8shU1/FDRYY87OFdXmkKSPZKSghO +4ANGScK0LWx9L5dXqlQM1uhrM+SW3Pd4eKmmsVVj1YhAgrJcYPJKEXWftuG2VdcM ++U2tTuYLAQz1uSUf1ShB60xTdFYu355qQfRFey9GAG20iPNY65ktkxWXbLBqCeCm +XyWiPPHo53w0GPbbKt1J0ycE/5HB3iKg5UQrABEBAAG0NUthcmwgSGVpbnogTWFy +YmFpc2UgKEFTRiBLZXkpIDxraG1hcmJhaXNlQGFwYWNoZS5vcmc+uQQNBFT3VuYB +IACYmSu8e3gsb5h8CBt9xPi8RDfMWgOAhDCWV8trJwycStlhSh1hUQ0MdH9CPELX +oi7DmKo0SG/+zPQfJ26zLumKUB9j27UqgHZJRxXqyYFaVizmo+mWrOtiwR2dpF1g +P37VT1OsELcLQYl5YKaJFLMCapjoZhUXZ7wleUY5dYijoaH74glU2TdFvcN2u46p +O0vqTnWe7YdANBPfVs1lrZr4Mml0OEVVGuUnBBxIAtuvIi6C/Sgbzd7AL/kXUJD5 +dqtWtXwO0OeBASBPjb5PfStjN56k8qJ8H4M9PflBc2jy+982j/aTZGAVsXw9hGJK +wwI25AI59MAKHzbuiqs3Vfm2xNqZ6PipvkhQ0HdlnKkMIkUsyr9sdQKWsF7JX5gS +cQEJ2jFptIYsD4548ijp/kMS7Lt2/DW0gh87S5HODy4VAhcUTLSzXMdsy9TYktJy +/cRC1cR9yNMp4/1mF9McdBvcQimGmF2Atlwr9OGJsF8weX/pQCgV4lFv7rLo0T/k +JzEa2bOSJrs1mrm/XHdwcyVEBA4rHXwQShOXyEym6tBWg0C4GhCdzCsjZTKtkn+8 +wAcyDx7V1z+jhMICZOtCNJCdcSV3OEg76b/vpYsiJxncEu6KG6S0ej/BY9U6laRd +Zx7ShV/9mLlOHgFHBZ6ZFT7ThpDU9SUTAtty/N/60jgDBiXzItIiOADU0eLw1+av +5bFGCoTI1uGqJkd5PHvTU/UT6zokzcEbNe1VCj16slCaalYIZMA1xjoBcz+fXM1D +JDTXCR4omNN/S9jlBIQ6frs5easBbIwLPqVYjh1oGdqvC16qbycKVYoYHBoWZMrf +EWjUcimYhL7fQOJb4aM3eBk7hXzdK80yVelkXxEjEZUGK3n5nO7z63rr7eXXtltA +FwtI+0s/QUpv6FeuWltSwEUH9FMWESsNgtkGhSM6VLOTx81VuHprlYL7IszZc8rH +od07BeQBnRaw+w2gp8+HRssYpK8nYaDp+jKC/94df61h0mlhzCe+QsQOGY+QZ8dA +u/z5pbVvGMRMpIsxvX0o2vWKNmRSmazdFKg8GoyWDOYIf42gGZuBGOaaNLCcviYS +MXp/1nwhcgoLEhe2kv/jrWT5+VhyFOTBzKEAfLNdZIiMHaxB7gjuop9zuwZzWuBl +6VwWYYFm+cGlBHaSn45R+Iy39Ol7SlthH4AdmeQLFNY6iiTzSIL7LcFvObJGRq5s +Q11DYERDheIsGmDqhhLwDJEWezCZbpcjbV5VfUik3pNB74ipJ+jBisd/9xcwgWKi +niLH1N3el95Ll2AqFj7qIFoUuL2NvMoD1bi5/e3RU8n3G3BIOhph/s5Kz6Sh0xgB +HbooL7MVqe/vHJwcrL3cve9pABEBAAGJBCUEGAEKAA8FAlT3VuYCGwwFCQPCZwAA +CgkQvxUY4BYHiKJgph/7BLXGMyQt6j8eESAKsPOzg4D1qQwwnrosy0SNWdOPYdez +7ZZatrglwwSXjsdbR4e/EhRd2y63gzdajpLki/7nNyg/NkiKVUKId8SKGOlnkfx4 +owU4DVjbsuLm/ms1Bv83jNXnWghCjib23KOASPjUahTw/VpNiLP5gWdnIwG4TxoL +s6iYLHX/elOPrNA0yNz55IsUxEOH2ueINPl7aE15TUPIjfoECq6G8ntna/htsSQQ +wPNAZ9WyknO46ggfzKzpQoQS3CQT3m7Z1jEd9tCacrSa4qXGpxKWVbIYNdWcUpl6 +VGQH5flD3lTqiSXWW5dU9g8ZKI2J7yki/sPvaHH11wYFGrGyy+Z1REByXAS3yOHm +/Zdo3UUdw3Qb3VDtMQtPSsM+qcO9qbTYOCkB7vraOnqverHQFk3wCh3zcgdjKyYb +C7UVXVebYw3u5qTjW1tBAKy9ywv08hB9YFvV1kKGEKgaRgv/zgpCIPgGofpsCT/B +7aFsD3K0maa66Q4zriMAk4ekB2gC/j/UToVYNBHo54qufY72/miQ7ksBADBigPTO +b+gjJxzUW9vVJe8Z8fQVh/Nkg/LopQGCKq7Z/+xQkGhaC+YeucbSR7W5vXxb0uNZ +ZQr0OLbOfcfKKXKq5CgVHAkHSWCSLoWrhAPGuncDwKn7mUAP3ev0eEd4sbhkoy7C +bnLxImO5nNs5y3CfKGiv1I1uQTemgtenieihXjeoBXs5rHe3CaXGediVTFF2jFm6 +QpmcMT6mVlJ3WRusJkoUoIcMv2SXItJhVE/ZjNNkhE9oprjPnbmpuiEp0UvZZ3+2 +YeSBJ41Yik4MGVoAKYMN61MSq4ZSYUgEP/Dj+wxFFhZoaEYvwnRP44Sh8OGVgZN0 +97t0Cae+rRTg6rJVatx/YzOmduunaRmVkslOWvz+Bwbf10IiSExntJY6hV7JUGkc +ohrNITu14T5A0/2x/TyZ8wtreThs2bnyHU4MORbYRDeQltp4UPE3xKIjOhcZ70/H +M+Em3ie9UsrAH9Ot0Xp6v8LgaNNRRsmq1LYWp630Kuw3my1CCtw/cOFfVKfwEFB1 +Lfy7WZPU9WzdK9e9esptI6F6uuq0A2wY/G/LYynEwyQfwSMp7IIyrjPTzNNzhWG5 +I33A5P1B24V56+/tKOJ2hFlzngbPFi7HKz89HHniYsPIgHNk7Kg0EgwiBkHUIjX0 +l2sRYdWRwuSJUeUb5tN5nlZT6owX1YeTdQ44qzYq3v4dbogiIPokLeEsq2/xL/QP +M0ZrFTGmfS0UxKtpuFBDXdtVHJS5g1N+vat8eBq/tlcFFFSXNxK1GZoYMFA0DDhX +VNzF1FVYsoxk6SP2Etdg+f5qaSsqiAmAHL+6tEDuwQ== +=1s5i +-----END PGP PUBLIC KEY BLOCK----- + +pub BF984B4145EA13F7 +uid Egor Andreevici + +sub 84761D363E7B0FC4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBF7rgogBCADU9OwoEFdIgN5U0JU5pI7s3T1T1LeDMzAQ8l2Hq4jFrhnrjcEA +ieDSut1YIv5NTBoZv4CrklaKvvQNUXPvKrFImA4OKhBodKV3wsq2efCATDGa1JAw +VEJx6nJxxMsCLCJvmZsD+YE8/DIBI6jjnjh8jagZVkxkSRPvUIxlZCxytIyqXI0t +O8pLh8+8p5e0PgGb9OoszxEQZdBavsixdpe+0feU9cz0l0jJYx3W4ErZeCGGwNat +UUiW0ctb3iz7BkNhhoV9zepxkSLzCf5zBeyA+WfD34028pAfPpyAfDYXF4x55sVP +/3MdWGB6eU6KzPG2/QV/6or5E+C1yCMrnMy1ABEBAAG0I0Vnb3IgQW5kcmVldmlj +aSA8ZWdvckBzcXVhcmV1cC5jb20+uQENBF7rgogBCADBMYkuALuhT0pTMowmk/BH +8T9OXsu/a2EkmXf4sZqslcyZF2G3/0iQgXl/fjbVlNyxLi9C/Vl4AAPWLNfDWicw +TAuJIkCX8lyuimpO7FH2Vlr8dwHdyLd+V+LLyTbkfRqKoLDrwg9Uj4CuzH03ABfH +uI9lFKoEZ4zOUunUWugB9rN2wo/BhPmEh/QINqLDXCgYKLDYr8NOLWIfrI8fFuXo +SmjhDKwQzvDjGFXoiBDrwSI7AmaSYAJzgT4f+8yEO9rT2vTrt5wFgcHYjwYKr+RU +yFZh1jHwCSkUQluK4toTeraBxq4yTIKG7cFuer04m2/NhBi3WNwReNQ0E9jBIjNV +ABEBAAGJATwEGAEIACYWIQQdCoted8Z4p8ckRFq/mEtBReoT9wUCXuuCiAIbDAUJ +A8JnAAAKCRC/mEtBReoT91VqB/9VIYofkP4iSHXbwWrVnc6YDntN6aSvaQlmdinq +bpCC20fG6V93KlIk2xQ91vsm662NJODnvYV3Jt63tDdhgHxFn7UZJ8Vx9EzHslqA +ZZXX0jOQ465YzPPFwCJJP09sHAEb9TwufSCGRijqYsSLReT6bGCCOGM5a4qVPfLF +wU0pSS1Nf1GWk+1zTmfTtfz1cQA6VSHh+jFXVoeFuwFf3WGeY3d9TW1w07cgyQVG +KIqtobtdPkTaKqtvFpiUBg/GqiLijqXgQPBIqy3EaAxhC0qmE5UMgvJ5fD+T4JBG +eQh3BspmZac4oUdxAqzyU5N/Um+w90sQluFqwoVd5FX5i4L3 +=jVt7 +-----END PGP PUBLIC KEY BLOCK----- + +pub C1ADD37CA0069309 +uid Spdx Gradle Plugin Owners (key generated by Appu Goundan) + +sub 3F078B16810B4EA4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=wfpM +-----END PGP PUBLIC KEY BLOCK----- + +pub C92C5FEC70161C62 +uid Herve Boutemy + +sub 64863FF4D1BF1809 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEdUhrIRBADCU9cuKc92CWQlZxwtRuSIV/36Qmj264YD+Lix+r1Qe1PqRr1I +/MObOo83ulorWigSkx1k81Mnr56NwmIeo2bMhjmgRgf7EG6XEbKdRKfJcJRR1lDV +Ml4ru40W958M3PX5fsi0m0g2TuVrAKIS4vscUt4L/Cf4IT2/0OhaT6bWswCgsNws +Qq6NtCkLkpWSBNYGT4zb6yUEALlhHMnfzPSDerKjDOaYHTz3PRc/GGUDSBTSVj6W +hQIDrgTqrPxoB5JMnfUz8BLSayk0d6HiwspJ4Wnxe2/jdIT+6xhX9xBYXVHZVs4R +cr8zbBNcW2kwFg5Mqy7TiAPzakzCslKAAX+cjAKSOWyRbmkEYnNgMlctdyENOR9+ +BpP+A/9anoVEfULqoETShmgWdi94gx713qymhNBpFZnPpm4j4JuxKopl/unQmw5i +Jwtu93cg38UfaOMJjTi6tJ6F6SE8xXv43nKs3Xb+Ll1MpTgaGUXEhCOeTZl223Qe +NBUp8kvfcys6aVX6GT93dmWxtMewlc6gc7HVQnUnyCFsVeoy/7QjSGVydmUgQm91 +dGVteSA8aGJvdXRlbXlAYXBhY2hlLm9yZz65Ag0ER1SGshAIAPzs1unq2BMWlk4y +O8D5w9br9S3qtlkYRtSOWH7ilOyvdUzIpQZvC/qgphdUBIO8hepmLXcF4zogNGKB +jlRHjSRC4SRSmTqHmaG/kdwwtOblLAZe8YtzYAfDLGoLOTeKvp6mUjGWhA5eSUeG +QIWAmQcucQZp75kT1C+dAgzdiASsR1TmlJZQSGQ7XbVR9+xsGlc17oT8bC4gDnid +vVtbfEayD/U40JT4c8Luz/Rat/yXApoRfMTpnJ98Hwmf1TLXhVafGk6+GjuLqNDv +x2IrG0rVMNmAxnv0Zl4jTg/AlxxToNP3OLXrbUYbZ5fDjt4UOLK2OXspgRuLZ1dN +pd/2NgsAAwYIANouVBiqlgyeOi74ktazcwSyxz7+xgEhYnEGOB8TE70RHQSHW/qd +vO2s6dJdIsWi0Dquh4EjGW3sURvw3Q0mpMZTq/pIpeTSZx5mfbV8xppyz9VqMUBH +NhVXRv4yk4OoM9sfQs9aUTMcQBzejrPnO4cWCmw+uPXwWxj4GTz9Dgo8Kx1X7t1m +jGnpONUMZxX5ObPmDRDZcvl33l9j7mC8CsLlZGCX7aqIVPW0cdKYXQ4EFmyGTFc4 +oca+ck8X5Ar5h5ayx5/pQDs9zd8YdEIfw6H1hAwHnvLpPqW8wl0jjdr+IjvZbB4P +sF2C0RAR8XRNBK3mbtlcwRWvYjdp4bSZ7kyISQQYEQIACQUCR1SGsgIbDAAKCRDJ +LF/scBYcYnKDAJ9NS1MPppAX0CRbDC3QqcfjjkWDzgCfWEb3wKP15906jEy3qUAQ +dfV4cuo= +=PKNA +-----END PGP PUBLIC KEY BLOCK----- + +pub C9FBAA83A8753994 +sub AFF3E378166B1F0F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFeWvEwBCAC7oSQ7XqcGDc6YL4KAGvDVZYigcJmv0y5hWT4wv9ABP4Jhzr1H +NDmmGyWzhzTeMxwuZnc9vhxCQRwyxj3gGI5lYPEARswbi2fWk//78/3Wk+YMHJw3 +/1EO3VqvvDUt39gbaSqMCQNHctnFdb2QYZ7nRFTQeCqG/wyMdB05beqEnWEXzjeP +FDF9y6gXkELn0lxUm2TKO8tU3h96TCuutDKJ0aE00lOeh/MbEaGHEbIU8kdfui6U +znZ1X80EWbkCY8cKxEZHKD0aONSVHXwE6nETvFW9/9+K+sj/I7ytlyxwHsaQpi1H +6aRGnq013VsIECrwkhmXBsLLXNjmhER+LkcDABEBAAG5AQ0EV5a8TAEIAN9uOpE3 +Ua9J/1WSMMNYGpfeEguI/HcMo+JIWZKwCiItISQ/yBEMEPLqmj857P2r5uBv1KT6 +IaJ8m9tU1mvv7zwtLFAQKytUv5mBMBnYuSoAFAnxdiH91M7oEwnmtIsf9g3ps71X +g2Nih3rtbm5ijH5oKnqR4TuJrt4EdyTbDKrGKQKq9XOYB248KSQ1JG47AuQ6C525 +d/BvsKDVGdpwwwR8N3235rrK1j/wkW7TUb75VXEUc7e+z/9Eg2ubQ7jEo+RPX45x +3j6HcOWGFG9Fe8j4wp4zS53Q6lRUIEoJmpsUpNWChGmwoL3bllFRKpubIFwiSrJi +PMPVp1pl2Srg8sUAEQEAAYkBJQQYAQIADwUCV5a8TAIbDAUJB4TOAAAKCRDJ+6qD +qHU5lDqzB/9WbSd0Fy90rSoKi5tH9Y6zKdLXB1DasYokLmhWxQ3hhUJmGD04yHAx +I7cQ4E93G2rgDxtJmn/xlaYcuiETxAcPwCBpAG1FnI2S8xGI3XntcaQ8QFFZ0fDp +cC/H+UTfVb7X2oVGcATwFsRETeCJ4lwbgIpbLkLLNeeNIz7Odm8NDwnsx8b4vEpu +vvNQdAf1layTxX0P4ZcOCm7Jlzhy3W00MtyfrvzgW5tx2sPdEsyI4BhJKApKCgQt +HMHzNl2z5YoW6IBhdlJ3MJuMknZWqcmdC1gc3tnmvfJKpsbvDetF6f4S23o9f0eu +9zUxPL9RR1vezTwLTAPTH5nMXOpRcpNm +=8B+l +-----END PGP PUBLIC KEY BLOCK----- + +pub D1031D14464180E0 +uid Viktor Klang + +sub 326BA6BD408BFA94 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=0Zos +-----END PGP PUBLIC KEY BLOCK----- + +pub D1AF992375BFF8E7 +uid Buf Technologies, Inc. + +sub 0276BEBE61B3EAAA +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQINBGQ/DCEBEADUXlfw+wgV5RYLSMi58qfuyHFOG0iKFxJFBPBmN/At6nqxxaxV +fyPORKg8fB0sqvWQi0P2mnmFn+hVMw3cmo1ZVNVz/iLsCOOYkpBbSQxo4OjijMqk +Lmx2Uv+igQH3vF6LCIN+LQMXycwqZjwzubedawtgnEyMe32jLpFieeMNC6w/XG5o +uaw2dWMjmy4I5kYDbpGwVzyFKSr0iGthZsE1xG2McbBhlYMNdXUwY1HsS20IFLNU +IT0GzqQyPy0u49ZgTjGFPlH7vLIAtRd/MPBACVIaMnSyzcE8h17rRpXw5elh0zL/ +Hi+xP2eEU0zO9OGr8SRUZmaEoVw1qZ7Vi+FKDeBXwqWbgg0x8oIHRvz/7s5xEUPG +cO4WX66xYklBSBZ+Kz441cTxRz8p5nJjXsdraYUn/Y6aXjk8i1QqztPeUnK5OwDh +uiYunL81/0NjQdzVKjn9jlbHIhFK7psg8A7mGaeRMLmPAWxly4+WIGQsZYm943yy +TY5swPSa4Vy8ZoSKNyR6YEtghNSSuhYL7VM6ot7/0yS3HUfvAbpE/UUXPt1aSG2R +N4UVVZ0PkBy5SLDN1U5Ud4PnlRpPo5VT4NCwWfTMPt7fIp5UTIL11E+btu5vQQSx +oll3TRUCL2H0dtU3/ri/0RuU6aa11bwawiaDrJ35Z0nqPtf+Xb0y9x0fBQARAQAB +tCZCdWYgVGVjaG5vbG9naWVzLCBJbmMuIDxncGdAYnVmLmJ1aWxkPrg4BGRAGvUS +CisGAQQBl1UBBQEBB0BakLMX4XWJ4BQOlsB6TOJSqyOPKoksxcWhxeUSxDkLVwMB +CAeJAjYEGAEIACAWIQQ008dJg8rr6vcRY1TRr5kjdb/45wUCZEAa9QIbDAAKCRDR +r5kjdb/454wFEACGKok1RXxwuQQ+y0AUoWlaBW+oSwFnq0qb9bS5egzXhJA2ymmh +NZa2be9grIdefqZV9ELB3z0uSO7M8L//nGdQFqQhGeutNZpD2Se5UgDKasVxv20k +zwXH1IGoim7bsDHaa/fVNbQ7RjYuA7Z2a+MtQwvr1ZdE0lAnSLj+EhZGhEn1sDqF +xZ2hB9V7oSA1DLTDwZW1ByC+weNcpThVLsbU15rJNizHvBHZTk/KRP5EjqDgiU30 +uFjaZPhd8otrE+ws6t2U4g+3ncFkY/gQFRQZ4So6dPwxy4tzeiJp2jKuEP5jIHAr +Hx+bjny8NOCWf1/4tLNOIUgfSOaQeId/TqCBInQbhmeGFW9hsICZEMPA7ufiWVlO +LxTyesYIIiSUwFSbRg7asHswaL0cfJOBlwae7/VFNsM4SBS68OHMWEpDUt8gIWRP +YsFjSmh+qEfTyLS0ElZckKULngXrjDpF03TDN0MQAJwxQVSORpxxH3WA1GgC88Ei +LtajYj4u8fNpZOh2JIZWNH5JYjUn7NeL6Ildb0/6aaOaezqZ7Q3l23GNF9z2Rnz3 +puTg6xlzs3DYRWj2f6zFgxDLQ+RLIhpw9w7ARH2fO4bz87rUJrB01uwMTAe0pZ7G +jNMaRcvFbLwPf9GFdU8U8Uyz+fz3WBPDafRvwdU9cK9L1erUzXGPWLBs4Q== +=ZZqh +-----END PGP PUBLIC KEY BLOCK----- + +pub D364ABAA39A47320 +uid Liam Miller-Cushon (Error Prone releases) + +sub 3F606403DCA455C8 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +xquhnpl2HvE= +=A/Aj +-----END PGP PUBLIC KEY BLOCK----- + +pub D7C92B70FA1C814D +uid Matthew Sicker (Signing Key) + +sub B4C70893B62BABE8 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +w5jwvCcFk4Ev5v/7yUgRrchYCKdQn0xUJQ== +=YBMg +-----END PGP PUBLIC KEY BLOCK----- + +pub D9C565AA72BA2FDD +uid grpc-java-team-sonatype + +sub 9121AD263441EEDD +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBFrjUQUBDADTMQL/4d9EyVhsO4XBH9wbGWxcEJvsu/HvppN5fY8hpMV0+Cr9 +wjAeJ7d9zdFJVB8vPLN7bb5dm6SNyK3KiOugqVgZrQ+ZPTvCCgFbFyEXuZwDiOa1 +9oMwKypq+GyAqXnfNkQTx8+7PAKslPoEKeft6g7T2+hb73nf2vpnOfpp5ljQhWPe +YEO2kXIikCxVXK5uSpuq1JLjLB+AFsnERCEGqOCueQgrLyPZnGrk6i3pEyz8b6Mh +8NdFjztqBWUta+e26Z00CKEpmGYzoV3sHD8Bhf8aHPWUHp9lGIAW3klLbsp1+FVM +20eF+a/f7XK9YBzd2dqIYWELdYUB+XU0EPFTgYAsXG1Z34ObgOVjU5gjDSNYfvz7 +tPPngDB7k9w7n2NatF3aHpHvkgekaLlflmZ5rQnMadhBUWgJoiwsx2q4TnSh70/t +TI3dPBbdVG+8YQ/LpNzOVshY2uMHHxJq6lUGVl6BIIy83Yslu0gFYHzL7H2tXKpg +Q0qAQBktmX6H/P0AEQEAAbQ8Z3JwYy1qYXZhLXRlYW0tc29uYXR5cGUgPGdycGMt +amF2YS10ZWFtLXNvbmF0eXBlQGdvb2dsZS5jb20+uQGNBFrjUQUBDACq5JHcBH/y +8KUIR8blOOov354cQgX4x+eF4znw42/5lb3pLpYF9gAtPMs0zQFhwgKFHCr8SxZY ++nYi9h1pULqaLJXeNLZipaoUufyXALyXJojvBf557UljlvZM4J6n0xHMVM5NuHxG +kkNoZyMrqDqsarbsLY35ssizc+fwXq4dPmyGn5hCSwwc1Z/DXqFadK8jSdo7klVx +wtnBlOFlSqQ3iT0o9ppB5h135ygkGY3vfSsqrxXE2Cg1Y7vQBdrhC3t12dICZAzq +I/sfYL5Ejw1DYY2H4c5vbWPIj5mRQNCsUkotF4Bt/IAOHN50lPpoDLMDrTAnBpvT +mU/vsLNWfZ06nMJj+Fm4zZ9rPfdgRnTdFqlh5iFEhRildPSdHTd1zw1tFW1SpgVI +o49pvQIjlSacwvza/oajw3p5FOJJccbAYRuvekIvBMVQlNh2S7TEYD1MKddONSw1 +bv4JyjptNSa0Rk4aiZEYGEjSob1SPveNZc1kuAu98ViPbtKNv+ylUBEAEQEAAYkB +tgQYAQoAIBYhBLAjNapUzPIeUrv5q9nFZapyui/dBQJa41EFAhsMAAoJENnFZapy +ui/d+yUMAJKh1e3YX2mFpMz1oCuVw2zPEwtJvSLE7q592b09LyTOXOKi3eVmvFVw +QMSSoz0JQfINoB/hkHeB5vzU0atgN2sUTA1hVrErX1rLdpjErJ+6n6vVXfZcrFMX +fjwmxuhnvbAqKDQ5Cm1meykOrXgGRIglHVJBs4KQnCcdS/b0uyujs3E3hBR11jAu +g4eUXA7nWOVI7WeCxjLlA5+gCzOfiRX3Njl4kBQX+ekIcxO88AJmf/NlSjTJzEC3 +t/o0Tc6dN+ZYxpOT0eICC5xrEj2WaToE3cU455Sq3ZWyUgxviTWlfsVFGy/M25ZM +k71LwM+WmDhaPNa279wdgJKrqHebCiOW36HtIDoK2XW4D66aJ28+nujO5tvGwZ0I +J3EZJWDjNf8vTaL7l8TNTuSQ9SkoHHqEeD/MmfBNUBj+Dj4jDoIfAGHD7b8qgymN +DrdWqPBBnr5UjB2xIKHjDMAmR/4OG8OYf8b2whrC7clxWPU/NrQjDeAt//3Fmtue +X4dQRyz4Xg== +=9DRM +-----END PGP PUBLIC KEY BLOCK----- + +pub E16AB52D79FD224F +uid Google Api Client Libraries (Releases) + +sub 5A34A5E06B936F93 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFF/4bYBCADTeOLZiVGNbjlPrwG7UcMl+yXmEqpf9dB1A9cuicH3PWXj0WOb +LSzHjzoRvRekEqSUmgoveey1lPuA2qjOUkXY6Kiyx+oLiG0/ObJHUQW2O+tjSQ0R +ZXKd4ftaw65SLbwYO2JHzj5fLC9j2mZQiRjGs1bWM58c/dOKp1XaOc1/ffcl3L3q +Up64jWH9r3yhPemh5SHo47UxNvItdaJJYnt20azpZj9oq1ebUuQFMaQDc/RTALhf +Xb4BWO+z2PCmChz60i/Ko2ZKPJV2TqPqWO+aklgxTTwZZ0IvgFm/5n3Dtn5p5iGf +qwKkHPJIDWc8cWYtxC608LFdqiAlYmp/oPi5ABEBAAG0T0dvb2dsZSBBcGkgQ2xp +ZW50IExpYnJhcmllcyAoUmVsZWFzZXMpIDxnb29nbGUtYXBpLWNsaWVudC1saWJy +YXJpZXNAZ29vZ2xlLmNvbT65AQ0EUX/htgEIALToF36j45OitNd4k17BSZJKnuS3 +uIL3tTw0fRqLv0/3EBaj4zD5Qc5YTKFgM66Bb5ybI63cwYhfSBHP2ZRS7oNdDbPd +/30jDKNvmcDjIhGLT7bZJwC9SJVifHuvtzr6wBR8xoItyYva5D3ax8ZvnzqIbMPe +Hou+0ZnRYSPjy2c2TxAJTjDOG461h9mVXDdK74wL8kQsIxqqYRIeEdmrXMrd/B8I +PwuIv8w7LwzadNgRnXaJ5Q5bnMvvhVLnWKRt5aiQVBxc67FTujjqFF4Y/1UJb311 +K+1LSqNrTT7As8nhf2Gu/Gb47kw1bb7wBdKv2Swx5mYqiW5+ARQU7jCiUVkAEQEA +AYkBHwQYAQIACQUCUX/htgIbDAAKCRDharUtef0iT2SyCADAznSkG/8EdIU5UQhp +/lY9h3WLzYI7aARw0IA6O4ijGLwcytO7TaWjEzUCMZdw01vAjVH1xNn9QvTgQV+2 +GyqyBNsjmgGt5/tK/+JtMgXUwr8+KsBf3908rOqAAZ3YGyM9N8sRsyfPB/PHfv28 +9sL2IKPxiFTGI0NGS3qOAKQ5TZvV7OPsP5+yHfeJG/XhCW8p+nkMGpH4rE8Z6NKg +Le/WC6J36aQ4kBfYneueH90Dc400rfGyL+0Gn1Rzuj2KFuUFK6q/GBlFaNo0azCq +tdpcO6C3GpJYtISxpQ1Rp9kSEzSCL3tOli8Xs6gsruc+vCSIy8lzRw19ZO9G7qhj +cHLc +=BZt3 +-----END PGP PUBLIC KEY BLOCK----- + +pub E270B36858DB4EAE +uid Alvaro Sanchez-Mariscal Arnaiz + +sub 5C93E86C3BB11F93 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +ZdsBsEmuo3E+/48zyvLEbrq9 +=ACN0 +-----END PGP PUBLIC KEY BLOCK----- + +pub E2F38302C8075E3D +uid Gradle Inc. + +sub 1B80C80E07BC7190 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=Rl7p +-----END PGP PUBLIC KEY BLOCK----- + +pub E3822B59020A349D +uid Kotlin Libraries Release + +sub 9351716690874F25 +sub 3D5839A2262CBBFB +sub 60EB70DDAAC2EC21 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=p27i +-----END PGP PUBLIC KEY BLOCK----- + +pub E6EC76B4C6D3AE8E +uid Sandy Zhang + +sub 52410ED7B05AD2E9 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGKRNiwBDAC56nNMaU1QEHCpOnvOHK1rjDKGDolxSyx9rgoTTWpaI9y7JbUT +iajEkzrtTsqjrabCltAY6QGQUz/TdS9MikCPUZM+l9EYKoBACDeKrYMcApHj4eVw +LVqpR2fYzhQQ2Q3kMo4pJ/458L0OiGLK1xh7FB0GUD3mXgVUOxDHPXpHD+NUK47x +YLmMIVxoZvLOentlIrrnx2VcUVR/IsgcKb5QwhmMs3SGkVrOWMgAB85xt/FgZFah +DjLzOi+HZCwQKRbUswo8AD7GiFzLmi2rk/4vu1tQbHZbGPcpu48/GLwrkDJCJSy0 +H9ZqE1AVH8s0cPfUjYyOjpg1BbaTC7Y7Om8PFo9xzQr+GnWqJbp9r5mQyMXBcCaT +lRop4uUznu5JDawoYhbEkn0bMIx3gM396J2jyp7tTcNeVCr7+VnjoinWzawDYxCH +qSxdSmVH4q8qgTPDtoIcKUdLJFUjJV+2Ea92Y/wcKHMvUYUfcjaqP3avl3AZrktP +DhMeqoyMMMKE0VsAEQEAAbQjU2FuZHkgWmhhbmcgPHNhbmR5emhhbmdAZ29vZ2xl +LmNvbT65AY0EYpE2LAEMAKyGd+sGmSrCMk5AuYVZBvymKDD7mAXvXTAmiFjFZmfj +55XTUk0EWFqhPP2Ck0WswlCefBout85Z3BONx2eN7OyVEljVK4zcr4P9A73mCCau +4iGpgYKWbhyLI9LOEkdd82zzuOO4Ts2qX7LddwZ8hZlZUUY9F0qED24hD+KptQOe +Tppviu/ybgR75tyzDQBymJ5N5fGssEREFLTsnVtoF39zfVsLODP7s2YtG+jcMf1f +KbN4Q5a9DhVrUIYuIQcsQKp8qPHK59Bp+42eEIZJcoW1sPMUnxejPjBUdAu0A3dQ +7sLLcdAMIy8tebmNXYeTIbz1Ws2Djh25KOdj04v2TAV3XfA8S0EQcFyv0C+zp14L +MLMZz0IGUibLT5R1tGlZMrn73TpOg/fqBCXDG6OfzN5j25a/j5HXgWQIS/m0Dfaz +62So08qSe+aS3co3m8UloU+lvKYqn5HYcSeY4rDVzEeQD2AM6lTsaWeaMnVSU2Pi +j//Glgz0WdQCY9wzlTnvtQARAQABiQG8BBgBCgAmFiEELltzxu/S60UxBMLq5ux2 +tMbTro4FAmKRNiwCGwwFCQPCZwAACgkQ5ux2tMbTro62dQwAp9grRDjnX+jWnC0a +l2IJJ63sIRCQvRoclc8OS0p0FipMkYm/vzFas1MRUJa4ekE+83eqP0BbfIjjNovL +gozJPAWHSuV3eBOK5+vSPZMcmO2vpaAIJ9pKctMbfVvF8KONukaF9dpzDmBdolFA +aSBQ/dywVjrGqb4AQJgEs0WkobX8bkRCWL+3seLJ2ABUDgQNJU4IGwe0TF1Ik7ce +IHFXuSNzZZNxj/0yB7kvbgq7y+Th5wNNxPWdvTWscSHm7L0ZPjTqsE/QgF4beTm4 +7ZhS+QUNEtGBQ5cKh8f6cw8vNFklB4SXFYf0YjbpiNuf7Po0W/rCveGsbLNpF9ZM +Tbv9T/7JwN/iYVVhGP4KTgOEb2MFLfTun9XD993vWwjdVvnKZmihCzZVagM8qfYp +S/nHJkyXBymYejD2ColWB1CGlpxCuwlkvOcsqXogp2AcNOTjOX5fiLQtNUnZnLad +1ZmTwxE1Ui0xMmIzscVR5uuvPq1m2aUkkKLFWLBqkpuelMmW +=Xlum +-----END PGP PUBLIC KEY BLOCK----- + +pub ED2378CD09A08CDE +uid Guillaume Nodet (CODE SIGNING KEY) + +sub 937F1470B7330556 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=nw+1 +-----END PGP PUBLIC KEY BLOCK----- + +pub F0D228D8FF31B515 +uid OpenZipkin + +sub 302D7F9E4DDCEB4B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=1/Ig +-----END PGP PUBLIC KEY BLOCK----- + +pub F2A01147D830C125 +uid Eddu Melendez + +sub 82047FB369DD111A +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFf0S68BCACovMXnHqnBYRmC+rsIIPOoT1vSusHWu56beDBG7t/og/nziZq1 +mcZhX4oFG/IKnY3af20Flcv0X0gNodH9fOErvQ7hZDvHBgB9HVpeKiMx7OQqRWke ++vV/vcUFkt0ICyMzDvEVod7asjAakKZHKiVpEb0mM8Zvn3MPUzFDveK+tHWdbuWo +WFmmNzmRpkK6hbMlXlyeTYs5jvYv9P5FHm3xYTcHJxrPYTF/uZTJu8Tqol8K1ImX +kH11pnhgTzI6l0oIm0JmH+40LGNYrsczW0JdxwQzfQbsQM3LR9kCAMr0LMEya70l +ozvY4LsX8Y7irBqlF1519pakI6Ss9Cz6sSLpABEBAAG0J0VkZHUgTWVsZW5kZXog +PGVkZHUubWVsZW5kZXpAZ21haWwuY29tPrkBDQRX9EuvAQgAwcy6UW6/C4HoSruO +hwnze51m7WyfPFu1HlC21PAv8KTpnAP/x2YVjUKGLylokmwfNJmmjo1SJpVGoGC9 +H+6Ywwc1N2VR+0p0r2lsbr+E95LDbznoL5wUe4koMB9toAiAxvYwgwBYvaJOV73N +zsgEz2XLSuP0vuGtbjpjFoEpkPhcawWCm//b9OeSralkzqi7+QPIABTbwDmRtrNJ +pTbn9ryM+nl0VbWoJmY00k3h3ZO+9dvqnHPv0Hnhp2ARBwY5yTXs+j1+ScP9Fx5f +lVsWlcg+5pTcZ0vSV57uAM5YZvJNuCeXHklPN6YaIOprL2jd8ykhGPPuZ5V/jUAU +R53G/QARAQABiQEfBBgBAgAJBQJX9EuvAhsMAAoJEPKgEUfYMMEl57kH/RAuYxie +4LNEjNk+eoBUEBwsALZE/EYMRN2rBx+D2/dvOGTprD74yTO9nOfX+VtJyCFNxhVO ++03LYzmaQIuwcpEDL4U3s6jCBKjLJ1aeBKVCkEwvQaFAdJuiiRdRZ2eqnhzM5K1k +eXDUB+7/0hlLaaqHF3YvCgyxG4XNibJv0bWJtPVfKFQ29MpT1PjSopydYlIEvYsn +vGL6+Hx8oFr2Mv2mMnCcRt7FjwBeUnOC7l+2OoBYDpUclnoDUhKnmgvOeJbiSGpq +zc0mylSOyg+E1ZLP0GVRV0KiErGf989rF9XFQvOVGvgKHQ6C88JAQrTHWrw228B8 +8FilLwwu9PNOBpQ= +=/V4m +-----END PGP PUBLIC KEY BLOCK----- + +pub F3D1600878E85A3D +uid Netty Project Bot + +sub 1C9F436B883DCCF6 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +WASB7yEJYwsl +=qHo0 +-----END PGP PUBLIC KEY BLOCK----- + +pub F42E87F9665015C9 +uid Jonathan Hedley + +sub 6064B04A9DC688E0 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEtsF2oRBACcai1CJgjBfgteTh61OuTg4dxFwvLSxXy8uM1ouJw5sMx+OKR9 +Uq6pAZ1+NAUckUrha9J6qhQ+WQtaO5PI1Cz2f9rY+FBRx3O+jeTaCgGxM8mGUM5e +9lFqWQOAuCIWB1XPzoy5iTRDquD2q9NrgldpcwLX3EVtloIPKF7QLq72cwCgrb5X +R25dB8PUdZKUt2TtJbjB+SMD/1UzAPirgX0/RpL9wUR1i14yIrTfpFP/yM9PE4ij +qcZ1yafVdw64E1k5W4k+Pyl4D8DvSJvbJHvYjg8/G9V66WzaKcv+987fetUuePvY +/rwxBPztqq8y6+hjBc8QVhZGWmAoGGEFO6MIGsSyN5ohqPMpNXkczIo+NMvDxGzz +ld5ZA/9awGTsigBdpBK2F6GOmbvBv+Xebu9rbaJvBvP+npNx01s/f5sHPCxmBTFk +m1vtaMdZ29RovrWPSZRj8WWes0bcisw80250r1CBlYzGzqEVZ7b0Hh2RfkfaxbYh +wikyfTfA2iX8TUGBgirsZbyegjUadElhwFNDASnvLTEuQKeVLLQlSm9uYXRoYW4g +SGVkbGV5IDxqb25hdGhhbkBoZWRsZXkubmV0PrkCDQRLbBdqEAgA0sZ0JZvWoKIG +b+o6MOwI6p3uMb+iWBwdYfoh2RPnUZdBwGhJjp32CiTt2Y3qYEcqC5NvF5FWdx1m +5KOQe1O+QFoqPKnC1bPj9uZOjLVql7x5tSwCePIaMNB+fMxEh5hYwLWtBz8nrdCP +gwm+nAwecoE8YfrpmrXZk/YLak54FOeEwLYaP8E4u2FHiEqN+WmKMjIRwLzVpYAr +WRCbTLhSSKyRBy7UxEovUH9mIa4YuU4Pb2R64LwopMHCBm5ow0U8kCw8vpW40GrB +c/2eaIeXCX2XJ77E9s9ZPgW6MoJ6Ic1xV6voLJKIEV8t44deKNSwDfVNZHxyemaK +a8/GgpjU5wADBQf/UzL5lXRmyTdJqRvHIfUV3g4A3X77d3vOroab8KKw4MFy2LiT +ioN7btKKxE97Jjp21YZFd7Kpmfu2i/kr9QVJo+DSxe2p2xcQozyS+layPK8h/61L +hyh8vjzV5AUWA5Zup+P7Jh/WRlh9Gxs0k0vimYMFKImw3mZr4EA8UCj2e85XIHNH +Bd0B1VIukq4OjU4QhRrutNebIy3GZ35ylcaXT5v18Rq/iRJAuJFoCzXUaE90/V9/ +2ob8A1CYEKGLocvOQgBsj7+2gP5WOP+WxI4TWPENRKMVchVBE8zV+7YZiahPCwOQ +r9TQWMaUIJxZ85yr7O8DhJOBX3B7EHIfpoADXYhJBBgRAgAJBQJLbBdqAhsMAAoJ +EPQuh/lmUBXJfs8An3O2/IQ/ThzLrM/2Ue3Spd2u5wN+AKCHU4hSTSkXM1gG3c9e +857IPkVBuQ== +=zu7E +-----END PGP PUBLIC KEY BLOCK----- + +pub F6D4A1D411E9D1AE +uid Christopher Povirk + +sub B5CB27F94F97173B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE89LqsBCAC/C7QToaRF8eZgGOxcvp9aG+mFFCMjaRAb4Mh59OYdmUb6ZjfO +9388HPebGbPNR8SHYs0dBIuWY4ZJ7oUTYPswasL8vB0iPFdyHhvkCca+yk0b8ZBM +DmFlISm9HkYpoVjcFUp1oivyeJ5LRTJTd5JGEd/SWFRbB4TimdKXBzej9fIm2zVl +KInEMMd8HnSYE6nm3aNkbyiqhx81bFvl8x6X3ZMWcKs+TAVXdP9uLVvWowUwcApk +xpee442Ld1QfzMqdDnA6bGrp8LN8PZF9AXQ9Z6LTQL3p9PIq/6LPueQjpJWM+2j8 +BfhbW/F2kyHRwVNkjaa68A544shgxJcrxWzJABEBAAG0J0NocmlzdG9waGVyIFBv +dmlyayA8Y3Bvdmlya0Bnb29nbGUuY29tPrkBDQRPPS6rAQgAuYRnTE225fVwuw1T +POrQdXPAOLDkiq49bLfcxwRJe+RozKrJC1iKxb751jTozEEJLe5Xj7WcojqgDsuT +jzaLHDNvDCzRFvwfkJ4scMTAZd+2GYsC8N3Gg0JRgC2lU4wZxsanLnVMbdX2L0lZ +7WnH6S+GJ5f0Et8PM/g+V2Gj2UraBhGGak8OBQ6NhmCJBcyYg8Bh90cgD9V1hMRM +LSW7gB1vnpLM7C8Yymd3etdZSIltmDuVb3uG9s4Uwq51s2MEKsXsuFYCHTz0xT2u ++6e7Puaq5V0218QGR1Wupkl29iIUF57hFR7f6oYKkecvPKc4Yev6Ii0Mbvc1H19k +LOXUrwARAQABiQEfBBgBAgAJBQJPPS6rAhsMAAoJEPbUodQR6dGunSQH/A+4/Zbr +2jB46q1JEN/UV4U3MBQiNvCOSD9tOPMnBvVzJ53HutvGGkmafbtbwDZaN+YMs6fi +itBMqjF/eQ/pJ54aFguTPGMFrlFyjz2n/pffkHLpVHgs8V5M4ALITttwCOo8Vv7u +3VjO+ea5kiCm9MqJySrUP2Dv4lPVB32eoEUqWDxoyeACihW+Utdo8TBDVd+R8w36 +W3CUSvujW2z9jMNTF+VoVWDQWc3up7Nqb+ztW9wrjqs73nJCv9bLPahUPNzfh742 +v9vak3TkwMcDR1eZv+KvA8GXSZM6ACALzTmqRHXjGF3UZ4vowQDfiTzZKr87eBaE +FoHco7Lnn+W+8qk= +=9+x+ +-----END PGP PUBLIC KEY BLOCK----- + +pub FDC09E28DF98A023 +uid Brent Shaffer + +sub 3F27C05CFD9C2229 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mDMEYedT8xYJKwYBBAHaRw8BAQdAGLX9QU2oZI8FYI/VFNE2aSCfcGYiOT9WVsti +ECHtIoq0JkJyZW50IFNoYWZmZXIgPGJldHRlcmJyZW50QGdvb2dsZS5jb20+uDgE +YedT8xIKKwYBBAGXVQEFAQEHQPjOk8ZBcwjEQRj8qQtQe1h+UFG+UeLuCcFEIurW +QcwxAwEIB4h+BBgWCgAmFiEE67SgDd77RYdMaYTT/cCeKN+YoCMFAmHnU/MCGwwF +CQPCZwAACgkQ/cCeKN+YoCOHUQEA5hFI3R2nISkQLcvwHuI6wFuIPZpIFH04gVV8 +QCCDJnMA/2gCOJreWlezmKutTdyczCVaWjDqSNasCztxqdnLnPgM +=0KgU +-----END PGP PUBLIC KEY BLOCK----- + +pub 012579464D01C06A +uid Herve Boutemy + +sub CB6D56B72FDDF8AA +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFgnlA8BCACVtx3oLXcanfvwtMRwal6pLQ8IVMG9+fr4xGdbSHXCRNbosDa5 +agU7WeQMPhusSxJGaA3w7NOdjAwD/LeHADhDPeI6llJg1Fb3EyqH0NZaODKU/Or/ +dID/i1onAX1dE914J4lf3XvIAxGiAjmr3UvWO9RiFxRUkecMAMlCBp2FuHuvxkcn +Mk8q9dP9Ef360wu8X5rj0kgP6vPhgl9/RhuPsUxlazb2Kn9Zxi/RmDKDiH/vDuwy +WdRGFOR1OPV7l3Ws01nrs4vKd2v5rsUmsjvQ8ldxdrA1xzX4IszHRDgSC9PI8ItZ +1VlbaKjE0L03acPfFTg/wRFSF5zsrGNbTmq1ABEBAAG0I0hlcnZlIEJvdXRlbXkg +PGhib3V0ZW15QGFwYWNoZS5vcmc+uQENBFgnlA8BCADBlqkE+XHE/0NTsqaDkBhG +Z/qEZIBHZ87fJo6O2jl3eqZDU5Ld/iwpJm/D6d/2t4mBH70rwWW29iW2PcZ5jPIw +bnFp6MNYsBD8RoVLrt45SKUbAsC5PrrS5DAC0ZKKF6mpw6FUVsblXhWDdGrPJ53Y +FoiU99Ip5zeL32kd8dxOv50ue86eSIIMWWLF00R29uZGqH/ZYJR8l3sqVu6rijj+ +EnhEu9D1VVJ2GQZS6Z1/GtprEbSYqLlsQr/5B52LI1utr3O56r1gLErHwU+tU1ce +8iPQnJFRQZ5KRtSPAvVqX3Efo/cmrqbYFDH63w0xYNwIqe3MzEqC+Cabu4wXF8vV +ABEBAAGJAR8EGAEKAAkFAlgnlA8CGwwACgkQASV5Rk0BwGqRkwf6AqArLie+te4K +XLhAF8VkwX3FyqOM/DmwXpNkVIdAGPWl40WEs8MG7VRUQtNRLK+0fW+UnGO1tUw0 +ASi9DkkWd48Mu/4QO5PD+8QKd5guPhXR2hzB/Jxs9iG1Ixlpd2KdNTUZ+I3PIHJx +56nFH3+z17ETFLSd3Z27CGDqwQG1ipXdO0VREFMmn4FH3RfXMXuj/7JUmcQEya5S +D73geW4HFQzDMNVEDaiS/S1j9iDO8XJYzgR2O46sKp0OKUREfdlc4S3bbHcBdB9U +rhEaQ8QQLom3ITKAn0NxxEfitpk1KCdOMaIOzELNmmjMEm3ptSzLzQWf5nxe0DGH +zFdp+62yJA== +=hl8O +-----END PGP PUBLIC KEY BLOCK----- + +pub 01D734EE5EE9C3F8 +sub C753427AB202DB9B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +zU2e0dHlGBhNVD+d31gs8Aq9 +=AVLN +-----END PGP PUBLIC KEY BLOCK----- + +pub 031EE010CA15D1EE +uid Matt Sicker + +sub 0181B45EA58677BC +sub 11A629398030E936 +sub 944EC8D1A08CF77A +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mDMEYiljShYJKwYBBAHaRw8BAQdA4ativA3OtR15B4YnoRwpm9rRgHdd0A0lzJ4u +6q7gsMO0I01hdHQgU2lja2VyIDxtYXR0c2lja2VyQGFwYWNoZS5vcmc+uDMEYilj +vhYJKwYBBAHaRw8BAQdAZu4+fS/JFKCVTzk4FGQdZUm2jVKoNmUYh4D90N7Md4yI +9QQYFgoAJhYhBIN4v6rYL+WqYCrDVgMe4BDKFdHuBQJiKWO+AhsCBQkLRzUAAIEJ +EAMe4BDKFdHudiAEGRYKAB0WIQTKYu0TDkBTlEQG32QBgbRepYZ3vAUCYiljvgAK +CRABgbRepYZ3vJtnAP0bBbIkexlDKrTeyTW3ah+KV2S1/OjA3WvtZZYdOengTgEA +7FxGQxTCEpL7ang6tEf335byU70z+Ctz4VbaoyCQUg0AhgD/SLe+JytxaIYw+VV7 +WvGj9UzoEFXqo6wAdu+nYEQcw+cBANgFCjQpgGEQCIEIjY/NrklZnMzXlHKZ1Ab8 +5KTuWCQEuDMEYilkGBYJKwYBBAHaRw8BAQdAPHx0bsFG7r3Zw3sZCc0GVVIPpxa3 +AA2YG8xg7QAvNFeIfgQYFgoAJhYhBIN4v6rYL+WqYCrDVgMe4BDKFdHuBQJiKWQY +AhsgBQkLRzUAAAoJEAMe4BDKFdHuMZ0BALB9hOZO2olaDYA4UmLx9AQXAXy99Bz5 +bmt9qVa+Vg+DAP9lmPUPXEdV8ogQBoExOifUOgLUoJ2BTcysUyVRkDvyA7g4BGIp +ZAkSCisGAQQBl1UBBQEBB0CV+Ve/INLL6O1x/JmGooG0QLfz2F9gNIOkMaNFxCQ+ +WAMBCAeIfgQYFgoAJhYhBIN4v6rYL+WqYCrDVgMe4BDKFdHuBQJiKWQJAhsMBQkL +RzUAAAoJEAMe4BDKFdHuHnAA/ikFk9ojtVvxHM70oLq5L2woJgpDHgcE7nGFbuh3 +dIdIAP9hlQ3vzHLiuuS66oIRz3pPD70mzFbcP4kdzkN3F8gWBg== +=SUpP +-----END PGP PUBLIC KEY BLOCK----- + +pub 0729A0AFF8999A87 +uid Kotlin Release + +sub 3FF44D37464BBB7E +sub 6A0975F8B1127B83 +sub 6005789E24E5AD1E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +B/X6XT3iAD8QsXnzTc+ApKE= +=jsGm +-----END PGP PUBLIC KEY BLOCK----- + +pub 0A4B343F2A55FDAE +uid Thomas Mueller Graf + +sub 26C765C5DBAF2E3E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +Ml8mxsWxam5wk3dKnf5OoThqicD+nQ== +=ik3D +-----END PGP PUBLIC KEY BLOCK----- + +pub 13D979595E6D01E1 +uid Maarten Mulders + +sub 8B794AD8CE1926C6 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBF8LXXYBCACuy3HnrpWl7boi98G4wG1ZrhBiYImyfQd1M+dvH3GF3Vqt2NYv +Nv8vryhUkMi8uu233KrYx2/kVK0RomMYWtUrSbQIdykytd0/VsoEk82ysN21ld9P +PfnNF7L0egnw1KEhcPzghqOsEY3ahqgTYqoiHLD/isLifMUJkJuoLlGx4XfQdpcy +RrSyjzf4/7XUYaYZ5OkhRHCZKGy75PNwibalNMm8H3+paqbwextv3PswVXOZWR6o +uyeiPgoemoM0T2ZcZdKIxrUZiVae8HJltyEca9hjqQF7zzofiTXW3qS3J3bPsylO +lPLr/NZ3vyUtuGc3V7nuUIVvpjy8nAzZOtGrABEBAAG0J01hYXJ0ZW4gTXVsZGVy +cyA8bXRobXVsZGVyc0BhcGFjaGUub3JnPrkBDQRfC112AQgApyhKFxKtBxc6x6m0 +m4G8LGB16PK0ZtuUvRUmQ9+VffXojLQI53p4+lN+m7ocQSogOQ21EysQ01wQ9mFo +Zymyv4E4YmChvBTPnSFZ5jkmphKIAbT5G0O5faK7Mlvmlnr2To8fwxTjyCg0eAtJ +4NfNF6HKyli8fx54T8tOm9qSxXYri+AkQ428F1KUapplob9JOsSfnEiMuaeL0C9Q +joCXy6bS5lstSWX6ZeXCIYtwVNFldjy7e/ParPL1czG1d5PwCzDVXU76sqvvipdY +0kcmf+9sHsT0bHxC+vpmzC0e1C2KDANaI5RrUtumeL2AA01azwKtjpi2+xfsGUiJ +B8NPMQARAQABiQE8BBgBCAAmAhsMFiEEgsnsDlLEepNqhJ4BE9l5WV5tAeEFAmB7 +OnoFCQrV3oQACgkQE9l5WV5tAeFGjwgAo/QkkB8s+mEHCbNP16ScQvbnDcDCjqRm +KRb/YVqJHVLWSa0sOEHCayssialUIJ4X+FNtdPzONwfzqD1MtAazl1+Vti/LpOKE +UwWKEB/8h/DwOtFKeobomWlyW8Aq72EHmc0WMbhVcmvi2h70G8f6vEwSN4VwO8et +mNu4HoX09pBo3eCgH6is/x9v9ixOHLddCWmybh6GPLcIDvGjJZ8xHNTFlI/dhu3g +nrHqAaXQQ+9bzv95Z4SG5Ou5w0O1W+A7aUCUVFqKJKoHvVsSYp1NK5Wjr6DJi7Qq +gDSidmx1abDsuiZkc5jmU8GOQTZaFQbcA3ejEFdqDmDrjH4tGHiSRQ== +=9Dkl +-----END PGP PUBLIC KEY BLOCK----- + +pub 148B1DA88010D4FA +uid Envoy Release Bot + +sub 3685876D55DF89EC +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBGDoiSoBCADNInU5Cw4ZR13r0MVmPDcRAyhd9Z9UeV+SxgFWk7MXjhKIfXlD +VkyCrlSLx8q4vob2BmXuhVeZcoWLitLR7fSW9Dq9UABDw4X2Q+67SZcW02L01+jW +OtzktCFT88KfHXAaSNoc7qGVX3RHOmX1grGUgiPwaSxQPp6OT7Ni7S3ldvGNB/8/ +MUS29jnYzPQYGY0HVPuB8RwP+dkaZ2rBnXos9Vvfz9gIMXUjVckZQLgmedIBy7D3 +rbGlFym68+O8mUhZ2zJvl5SZyumdPjLmAPabaxbOZ7Cnt1h3OROqvKkCJljofBOB +rUsyZoAtQyR2InakDLvxxzj5D49OO6q7UU/lABEBAAG0KUVudm95IFJlbGVhc2Ug +Qm90IDxub3JlcGx5QGVudm95cHJveHkuaW8+uQENBGDoiSoBCADYFM9jy3DWSsRx +/G3gDXN/qK32f/BM6zuRYU/26KtUG4EmfqRc+QJMZuCrTr47oSlCAf3bl4kenXFm +kL9o20PYI0Hv9/3VPpQ+vacIsnYmwxTRRTKSyc+9ODuiXkRaIYnD56AnWBuSWXCC +9/F0l7QMznDlp742LpGwj+fR38rppG/ra4xEriNBHLhQ6XJC7xF7TEWZ08BDRTeY +BTkIvWwVS6BSVwNuTuG3ZWMz/rgqjxKTo4OUZ+dtWFPldY5hX+i8DodSpuG7yzST +HrdPQj9Q/tGFDZgEDRS6qOBcMwrkD3DR4cOGcwVy+o1DyUua7my7oj90bhDCme80 +9ULF0Jx5ABEBAAGJATYEGAEIACAWIQTbYjod3HEQOldYL18Uix2ogBDU+gUCYOiJ +KgIbDAAKCRAUix2ogBDU+jKJB/9fWaa6zKDLrfEkkzAJLQofEDrNJGTTczwir83x +947Uhgxa+KJYQTWw9HOBXYQgQCXK6wvXDaf/lPsb3KGO45tNZF+Y81E3Z6kI2SFO +FjuYbGOtBa07QRg3TuhAHB3Z+qVF2rMNYRWwGU//vxcRXmHVoN97qucQwfbftZox +c7JHaf2mmEn3L32tr4NCbe64mtiPjkPOBtU1RlYhfggNjSKg7bOg1aU9VsdicE9Z +YsIqrISytoCkE+1bbfoijVi+sm+M/UTOSEgTfeDNfb65Pem5wBei5ekC4Dn0cYCx +Q6SCx4RDcao7rAaekESubpgLrR+AULWXdB9PPN6FnlabJRod +=2+Y9 +-----END PGP PUBLIC KEY BLOCK----- + +pub 17A27CE7A60FF5F0 +sub E86F52398AF20855 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBF/AfL8BCADpdkr7+1epRZLZJ6/si+Aj6fmELbzWHZmSSUYmRszcCgPq78xy +bsW/d0grOOEEn9I/5N22gOoEumcFAsN6hn1thjsZyXLmaBfRj+8vri/zigAqrE7W +zk7mKKK3IUuEi1rDqoEwGQbzHFP9UxiIouiWbYGhbkER0E8zDwmPlWZDXoQEzqWT +KcgxAXldiZ6l0FACtxgU3n9oOq0hNQBqfpn22BM2FPjZDrM4rEfbeSt8ztORIviw +7G9oUtYsbTbDvvADCL0wW05GcNz6BvcmDm79d+fk+5gb+GIaHurWuyTtmw5HCeXW +QcKN1S96Wfm5Dz6UMOMeXujlvK1rxmsIIl3BABEBAAG5AQ0EX8B8vwEIAOkm8U7a +QLAJ0FtUuY6ru+JQM3yHhIBA7dADpoyq+f/WN86Es9vw7gavO6tnJPnYh1IozEmQ +4/OaXfKir2G8geLR6hvCsclgXT+RUS9Z60XBFWWhYwX8OrkdfHNnZPeSM8pwiQbh +L8QGfF5AiJzG34ecIPekBWL0l0nYtVblAHQ5oKCv0h2e/cPylyBgJUGCtF0pLKuY +l/jeH44UPz6ZUfTL662zbz7AGn8yX62h5PXyH2ZVuuwA2+vuAZCeTP+cQ7OGlIj/ +EDmggsSrcjVa/G/v+O9lPw9SGnnjoEzX+Ng+tEJNUEx22gvAISajFfM+XWVxVEqs +z0B4U6PLa2feuVsAEQEAAYkBNgQYAQgAIBYhBD8F3anzFzAeknE21BeifOemD/Xw +BQJfwHy/AhsMAAoJEBeifOemD/XwJ3cH/27Z8H7Bx53msUwaNO0RbWJNz65xrecM +w5dvRVjjERYm+5UA5oQdySozlgrpWCAx8q13OMVpGRhodebFEqDZDHsjvJgm10Q7 +Q9fHkP56lCgxt68WPwmof8bkTYC8l9PmPfqdJgQlyX0zqOzxjETCfe+f1gc/m1lx +tgnUeD3/ktyTkYu1hTt8rWM1ceCnZ08bIcjwjFZJDHZl+BmQ52zxUHJ5JAExZNn3 +vWkvn9JHGWPh6M7evaCcNAdv20A9AB45/aZlYRUN8hCI6xpHiMt4/tDbiImzko74 +zzMvjuz0NEEhREM8f0ld3G/7Meh/OudSEgtQAmwJ0UMZWJWaZ0FhnLI= +=5I6i +-----END PGP PUBLIC KEY BLOCK----- + +pub 1939A2520BAB1D90 +sub D068F0D7B6A63980 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFHNxM8BCADYmt+HKkEwu89KQbwV7XIbgwZSfWc7y1HvA2YJpJRXJQsU/Pzv +BhsHnm9ZIScBLIlgE5OUnMNz8ktPDdsFg3j/L0HREXOAqkOFxWx2kANsRo2HmkM3 +67RAu42fJqJcjD2Rs37wMxlSRRGQ+/bp+Bw2HNO1pw7GwrSgmZwzwT4+1pE/TvXQ +Wl+Nhdf3swLyBaSuWHJZT3+JOR0kEGSQuurR+57r6fKDmouWSwAKn1z97JelHuXj +HKZeueCkQvX7dayPP4a1zpoXPcoZhYekFarLWJl411EA3aHIIV8whknsZx/lGGC5 +yF9AVIzHHnhqFC/Fr+GJbwa9oMFXj0pY06ZNABEBAAG5AQ0EUc3EzwEIAK6rZ7kR +p3uj0CrhvuTnLHU7nEs+KvoUZKLyhcIys76sJQ7cnhEygcG7tng/EtK8bI6skLwU +aF4fnPliDj/yIigY08p7TvFL/6HL4cLrIXR9uZe5IdvBKYhy23Ie2JXdLk6zH6jq +5+vBE0IA7ljJUQj0PgiIL92kB73Bn6dPayvtApzctajXvGajYNfOLTYc3n1L/Kqa +y+/UwjB5MJVlmFtZ1a/EAxyb5yHld/s3RKEaeEIpjaoPSJwXKOWNAcLdtgcPcsyf +rV4bkgjx7ABzPvf82gYucthyIx4zPZ29hZfktSV61h7cbJL5HGrk39UcSgfstHbf +BQiTY/1kVN9tuHkAEQEAAYkBHwQYAQIACQUCUc3EzwIbDAAKCRAZOaJSC6sdkEFj +CADEzcJtTbykHeSPGykEtUnApHYM8oZixHWFvDdjkGhePMTvBRJpByS/hdS4Mnb2 +AfBoV696eCFAtm+D6iuOA1OYgc1CnGhilxRVpzjgbD0S6bG0tyiKz1dk0HKkGh36 +wumST1bU2qdA/UN0CoRIA9Csb+mg+h8c+y3QixjbpTSS4shhXpzfj8QsZmPn38S1 +amaSTEv8zqF8pArPU93184TQfJBPrjAShTEitAmX3FQlSL5v5sZms7T5S/kOHkcH +m4zNlwXRJ9avqb8kq2rcDJX4sCe7PjoMX3y2mTk2YezY4LrYbhEeOGcMNg7XOXlh +tBBJ4OuqQtXo65LcT7dK1Uyb +=dJvi +-----END PGP PUBLIC KEY BLOCK----- + +pub 1A2A1C94BDE89688 +sub A3F393B5D034A0A3 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +zTU22/559YQ9Bb9kRR9Rqg== +=GVBF +-----END PGP PUBLIC KEY BLOCK----- + +pub 1D5903AF4582BCF4 +uid Sam Gammon + +sub 831EE9CA8C4D7525 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=6CfE +-----END PGP PUBLIC KEY BLOCK----- + +pub 1DB198F93525EC1A +uid SonarSource S.A. + +sub 2161D72E7DCD4258 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=Upka +-----END PGP PUBLIC KEY BLOCK----- + +pub 1E516D29843497DC +uid Matthew Kulukundis + +sub 548E4155A45A9569 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGOYtKoBDAC04phkfA04jKGGaIQX6L7wasDrXsQajEWxAmjE3tzK/ntCbofZ +iWblDkNDbOSKrrhEvqM1CcFwyejprfvsT8P5/9pg4/hjCZPmfmppTfGfgP+4+9Wr +W10Ah+MNC+hrw+PMz793RI3hxUX75noMFhaH8nWDdeCUQVq//J3uity/Dk+mItPj +42rLEhlQyKGA/Uq7kookEZGEpZFdyItyIy5CAEuImrQhQvCFlw9STOlsALtwTPpc +t6AQ4DDJw9S7KHj83H+jcky+oUO/fHSy0NvS19jTk7tNNIeAbKm3lVxPR0nSkn9h +9cWwbUa41Zq28FpnkIZ705ihCbMKr1Mc9bejSK0DluaXkt4p0HDmD/Fz3dY1UaH3 +UAi04PLtFTw8NgIKzjucBVfpWFB7Kuq1nwke2zg38FD5tlkvPDY5cnZ98MkY5SqX +cMwgZgkNekMLmhVBJqbtPVcjjRc1E6Mv4ADQsqkz6CSDfT6gTnnrBb5AwKDw9u2A ++3A5odPvVfiM4RkAEQEAAbQjTWF0dGhldyBLdWx1a3VuZGlzIDxrZm1AZ29vZ2xl +LmNvbT65AY0EY5i0qgEMAL1vf0e9qVE/CiPl/drPyPdM4p1BnFYMKjH83nuCxsbC ++RoblFSatzVT8ci799rCEjkQjR9bq/X51oa7QWBPK5WmpVSzxKqyiE5gPG/aGZY8 +/0z/PahzPFquvx4AHZ+AagM1ApTxjMnflrV/usngkHpX5/IaGQ7dzDRpfl6Z3g92 +5UKETq24K39JhJYQAY+YtmASxyIx4HA59uKOUtrbsM/9agW+WWHN6SIBc2FCbe6J +hRIpfpAuGOlJsqlZnSUiAIpOiOAoKrbaDPjv5+fAHkahOp+O4SbgwGzxz6XhNBnl +RHo70E3+gDISAittShuT1QUBt40IFpzssUU9XuX2Qk3pTAcye/J+eME5s+GFzs/p +/cu3ChiHPLT43rQOeSReEHcSsxy5p/FsA9QGQBDgop6TU1w8LsyNf2H1CkF2+Bo1 +aVaPj6qddCkFHB6BLlYSF9Ml16Z8gcbE66h+w5bQAtJ3ynZpXTvdV+ysIKRHBxHm +27SVyAG+4Ao70U3q8eTdMwARAQABiQG8BBgBCgAmFiEEPHyVawrc6KAG85IgHlFt +KYQ0l9wFAmOYtKoCGwwFCQPCZwAACgkQHlFtKYQ0l9wNygv/Quev4u+QNi9kkXms +1NP2V+/hoDi3qrpO6E3DptTK7qIMvgqm/tNjDaQ1xLMZ6BGokvZaJIq4QyIpNGMX +GDWaQPefBqf98PDe8JRJMP3aRI/3U92bVYTmvW1iBBcBb5nk5ja+0q0v4Mn4jALh +87NmwHWhMsNFs1i8gdJ5uvp6oMoTFjLb9x9ozFbwayULk7EDH+Rvpx3yrpMoLox3 +ku6ZzJxzWVMvuEKgUrKM4BobLI1CgU12y8yIM3Ps1zANwButxjZsQMrJ31SCkb9W +hai68Z1b1+/wDSaFclm9qDdbO7BjGfH6M9Zv+N1cieliR7XEh6Xzt+o9WT6wnoZ3 +3TDqxJZPnwJ4lCwMuQhUyX448+t03AGxAfnooJz8TPF6JEcPZr+dasba4Ek/qyuj +2RDozqTdaqabHVC57OBVvkPYZ5zKavXvDH3D1K6UtMw6VWnbcDS0mAJiSspMZYvt +f5xmd5kGFimPO8w8UoH42e8n+5hOtYP/pUgdX0xNxw+plBwr +=OUy/ +-----END PGP PUBLIC KEY BLOCK----- + +pub 1F7A8F87B9D8F501 +uid Download + +sub 7D1BE4480B61E2A7 +sub C2148900BCD3C2AF +sub CFF46EE3C17E53E9 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +a3HXnE2l2ony +=gs9m +-----END PGP PUBLIC KEY BLOCK----- + +pub 1FD507154FB9BA39 +uid Tam?s Cserven?k + +sub 8DC6F3D0ABDBD017 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +EA2DgG2xmo0JUOORyytRnNl2NeP7QMqAc7I= +=CY+c +-----END PGP PUBLIC KEY BLOCK----- + +pub 29579F18FA8FD93B +uid Tom Ball + +sub 9DF7F2349731D55B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik +h95RkbdeWsQSvduXWgQZsUDq9cLOkuS/ChAMkAAd3MPp1NMdFmAqS7BX5wU5s5I7 +XD+/p51SWLMvgrLxoenmoE04EuQqQiXd4DbU+HGPseiNx+mN0cxPssaZMBBsmi2r +RjwcQrFTaC1iffzh8FKLQvoTDzci//b5bWcxCLbsY9dYcUaDCbBAkL8HzyZUKNE9 +XwXh/Rq8wDakI/VEg/905a9c4xq6Rss6Yn5E4V2SAo2+B3hYmvHFsefaM9kkqvXk +MQ6zjx83LAtzavOzmthjhhPIgCAfoQ5Q5oDzABEBAAG0HVRvbSBCYWxsIDx0YmFs +bDcyNEBnbWFpbC5jb20+uQENBFYFiMABCACdvSlhh2hLe4F1fBMHiZK2HdNp8I3N +S8o1E9k0cBM2fTfalIlan6ZIJ2Z+JqRwk6MRaKpB2or/0A34+3KfI22SWtsI2lJA +2x9qWaiwRidLFFAWdSjTzNroYVkcwJ5hf2yKN/mH5YRiDSzaqHr5GKKPXHXpT94X +qXn+Pj1Lj5ipnqPOerpJ5mlkPPSz8C5Ve6I+sIqjGKdtrB6kxgIF3kf30izCu3dL +0j5vuey2XneRAqETHqmBVMEjFeuEY0zJCj7LxQRr0YaaSfrlkIjIxRbhatgxXjQV +bbnh0nYAh8dUz/YvsfuyZmLJhRZkcJxHW8Tt0xxV2oBUBq+IpmvqDoy3ABEBAAGJ +AR8EGAECAAkFAlYFiMACGwwACgkQKVefGPqP2TvmWQgAi9Q5WlckTYzccwvt9F+s +RspD8AncDERdwkY6HiInLLNqQSUWiHU2BaYN2wmSiSeSgwurPtN85nd3XZyhKtXx +H0XKC2fTzQWBdyBEh5zT5UevES9nIzIKurHoG4TsWr9d2XDiDp8q1s4G1cNGYDfD +97wpZRbYn8L7hedL07ISEWNdRvBpbrvhme7X0pD8MBKPqUXfLHHaJetmlFKOmu9a +wzjINlz1C89JdocSln3lLJLE+RGNN7HmXdwmKjmnC0fo2h8jnOTYekdTM3Ec+uWE +8M1WyqZV7WYzoITIfq0uHgyIxCpaOOejOLKShQW031G/kEvZApAVPHLFM8BdJ5P6 +Dw== +=INDk +-----END PGP PUBLIC KEY BLOCK----- + +pub 2B172E3E156466E8 +uid Tamas Cservenak (ASF) (Release key) + +sub 673B436865B87E35 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +9Ii8 +=Dnyj +-----END PGP PUBLIC KEY BLOCK----- + +pub 2BFD7825A8984FBE +uid Lerbscher + +sub 9F621F1AE6EF2591 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGI0UjABDAC98lMPbj3vwHKSwLc8o4oAbOf9PKi/zWxjEYj7KZky4ue9JE7R +QiaUCY387lWc/fXcq8Wa6/IteqekJBQw2KCrDaKBcAXLjnvO93q51ecc7Eo5U1w9 +xJj31YDQOR7R5XY2x2nvSSgk5CmV3czajM3ZeRYHoVqsqp6QwhjDllp+EaPJRtuS +Fk5mWk8e//iZcZa6GK5wFEtrZMCSjjofaeE5wrsatguhrXwbtDshbN7oW48vK5Kv +zM+zpwjLUu3gsvydyV4TPhl0Z5gzHef1GYe88WM5dus+/A8yED8BUJ7I6OkJKNbN +ivC5aJg3BGvLZQiLCsOLZCYIcJt3ADYBgMVwHLSLmCoNym6sS61Rklu5Ig5Ax1eh +X1aGL06v2B5oM+pHhEvl22iXIi+AQJYXYR8Lg1MBJzEz+aCaX+h46u+GcjEt0EV+ +WGzvQgBcA5qwEvbSKewu4fG/5SuyEk53ZXHwIJHC11kFQ9SPExPnqIdHHIMFjDj2 +8OG1WtLMdGzxMCkAEQEAAbQrTGVyYnNjaGVyIDxqZWFuLXBpZXJyZS5sZXJic2No +ZXJAanBlcmYuY29tPrkBjQRiNFIwAQwAqL0vVX+5uzucp6vQitUmOuEyiS0SWz2w +ldKVJXKABnNKSP7Irq0pF0FbfvEne8pRGz35NVcAi7KPYwnbXtX43tmUJsO8w0Yt +i/eKBJOzPq5bxLvMabKTLaO3y/NLmRuxCBwre1zkdQGMK21O0TdGu0bxJK6YEJKx +/8cX+8f8WiVIlcN7IXlTgkeyz4CohaQfJibuPi0YSYmbhnjIuS8m6S/aMduCvAim +qzIMk9rgRcbs27JafreWG+sLZ8sYYodixyBHBsLKVnGdkJXNAOwkBD6OCfQSW2DO +ZcNLpAb0yzwxk3sS6pMu7a8lqKDTmC6xCjNhdykoKn9r66AdFLZqRtld8S/iTwrd +RyLokVZU8cfn+g7uOLe6scKYnKh4cff++QHSjDm5elY/Gr3b371N4qtngUl5TECi +QK7M311nYBpiGnIu3e+IuB3VFET0HTTetQn5o8qTDoq0BOyhgOErQRvy9DmJpKfq +3cbMgRORbbJvCuZL3NSEJ8Y05rEKgmabABEBAAGJAbwEGAEIACYWIQT8LDH8Jf7e +TnrQ0Ywr/XglqJhPvgUCYjRSMAIbDAUJA8JnAAAKCRAr/XglqJhPvmJQDACS8HNp +MORfA+QT6/GGlk/lsrI26czkJaB/8iHoWj8cY+9l7AvBroVVF3x+HGsE5NfPpmOr +cqcV2DQDFtOGJltQAFE1OONXkPyU4ZM1xqMKe57miF8JP/XkExIPwkwWWAEHquxz +cHNVW1TVTCW9RlJ+C+tiEQvSWPxQfcl+gXQmZhnplJK/rYz37J1DTRZavj14sk7+ +BlEqvQTQxleStxAHQUii/v0CBRvsLeb7ahE9K4ur61w90jfohPaKwXBSmSDgkrbO +FlxqvO0CrMXnoLg9pd1f5SSscKlUf6h6Bc7I/sRO66vuMM934otQ6LTxFFCs4GnK +EekW28EKAWq2Nir1hf1Hfv8Yujm66nzmlCLfTyaE5nWdh+4j1ndkpF6hPjYT8eba +3EHUrlA6mkn9dULm/AK9iiuYcpm4n/gD0d2dkualqCnwXYkRa5aqZyBrzebS+P2s +Z/dgWN8Go/OXuVsg2aBbH3vXvKCvJ7ZXSx5DyrHl3ckKrNgsl4RkTgS6lxs= +=roL7 +-----END PGP PUBLIC KEY BLOCK----- + +pub 2C7B12F2A511E325 +uid Ceki Gulcu + +sub 10DA72CD7FBFA159 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS +2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN +bOjh4v9ZipD+px8w3o/RNrnZH/KRsoJg9yER6pf+pUZqTJfdg5lXezc1WF+/1qVo +ypldMGfrkfLsPrUZTT689ubbig978e7eYmJEqldtaIwaAzHQnB70wIJyg/rEwFUM +ldsvs6t6czSuJ4zPMvmh8TMpTg9e6+DMktPl1CWRONl8RPpgYMIC96gb4OnfDDjk +Ex6clSCwgbDwdeAyOjjR6pVq+pCNTo1Pcj5jABEBAAG0GENla2kgR3VsY3UgPGNl +a2lAcW9zLmNoPrkBDQRPmTvhAQgAtrGiCYnW3tqvDzaStXsguVw67pou65dO7LTc +rX+NTvejJZ9SrC89JsfiKBwtvyS3X/qiB+S7RP21PH7SYOy+orwDw1nacNNeiTdP +nxQCDQVNeWpSpmbLlA+0b6K3aPf/EaCKndXmnQyXVOoSXZJ9bqAe0um0NRbO7M+L +1KArVkWW56ms+DvHAeZaGnSDDHQpJI5haUqgSWWP/VoPEU1x0qiBZwY3lokSwRMI +SC4E/uiUvvm7rvfbBzfOiVrjNPLlsVPiQRgOTfQO7dUZAmt2yqWJt1Clliby4fgB +VcOYUx0QCMiz8MZGtSB17+hSrC2Cb1T6n0ypxuYyh4sV2LtqMQARAQABiQEfBBgB +AgAJBQJPmTvhAhsMAAoJECx7EvKlEeMlX0UIAKS+4ZAKrGG9jbWfzTTDbu9zzkXg +V13suMD+XcGz10DkdluTUBXj8wWlp289fXNm4E49ipsNK+dcZ+gOATjUvb1Llh6D +6bHz1QM7olxBCeU2feTmYYKBH8GYY9JZzfAXNMQhcNiiPj+ntZqePy/EFA4uZHM7 +We7vl2c7CBcDAq1NNeEczo0KvG7AWt6QoaMVmbvA14EKadNzrmEy9apkag1BKvwz +XInYCvIHMa9ZqicOSUcI5QCYu5TufvIE7Eq3Khh2Ex1FiOaEA+57LMrt6NsSKXrB +8JNYbI5pqE1rxJXZnYtx3ZpPAAEfLjPdi1AOkWhvhsoPmiGFC6ebYQ5eVbI= +=xA7Z +-----END PGP PUBLIC KEY BLOCK----- + +pub 32AC66C4FBF15ECB +sub D79E291A1BF549DC +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +maHbf6t1CXlmR4FYQpWqW7k7 +=jbrK +-----END PGP PUBLIC KEY BLOCK----- + +pub 330E308D796AD36F +uid Hugo Visser + +sub 3FCFA3B530AFDCE3 +sub 9E185DBB8F40F9EF +sub 1E90FCAAC332328C +sub A994DB3584B8E387 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +q19AGy8TGo3C0DhOHK08BRdlmTyhagksqVZBHz+SmIm55g0l6jOoymp6tsZpyELn +KJtrqZtqWOPeL/sFmEq4H1npx5b28aOSQ53GLW8qyYWLK2scLRBxNVVtABEBAAGJ +AjYEGAEKACACGyAWIQQz/++g+gShY9je6tgzDjCNeWrTbwUCZGIAYQAKCRAzDjCN +eWrTb97PEAC/f04qyKV7bYUFWj9grnmu5VbXj8yWKk5PWo9D1T9V0Rkps+4ZDWob +H2SkJ6Jpe1mziQ4HIVtPr7Bv/conpPV0bZGMwqmZIqGDhsyRIjSxIO5XDIJ5Fn/w +GRajq0hNyVtHn/ryIYddfEdK4p9+QHvRu0ZdDL1ZoDBSMvOEi60G3ya3eAen4xak +7i9w67aeUQ80TxcNvb/zAqrOnAmRWNJ/7ODjGCq5VKtbwNdJwQE4HfXwgykcbK8c +iRA8rJZ3MnUggVC2Vo6y05v3W+77JdqcTQMGSx9zwQucjJq85HS1yE/ardSDvZ5b +IQo+jmGVrUL0Zcdme+bbNXO8Co42EnGBOdpmFuRyey3H+HE+yPclmUTCVJ56N7SR +WR/bMZ83hSuF9syD0pj2AnK0Qr8f2O35l+QvpKahnOPlW9H+PaaFs5BKsA2xa7px +rKx39QI+fZwaNwhIAjESkP5c6qY6m6eKFlXjgFPh+STWmNFBqG5NT7PGurz81eiy +trfCvHbo0LtYUGtn76akHPx2hgcXqYbIIUv3UgHlQ+7xNUFcWJDR2LVlAqtOTBzd +5bJcKvG1xb991TD5Aaahx8R9WxLGUl+XyiR7ui/31tO2DRCynFYRGDoojFCa3kof +fQAWtlja/O1xxaWDsgK8HGScI/oSRAlH1Be3Z58XLfC18uPUx1TzR4kCPAQYAQoA +JgIbIBYhBDP/76D6BKFj2N7q2DMOMI15atNvBQJigLDtBQkFm218AAoJEDMOMI15 +atNvJYMP/jQWO/El/dbZg8fJSautvJ8LoxSkrirl8n2NFtJnK7K7M0J7Yk8JVeH9 +a1QVfP2i+ThYOL/Metsvq8/j2xCXsz397F3OxyOqKqVbkiMOfys5moReis5UKuzU +C/AiONTAiKchOnSm7bPN92Gh7/v4BIRF7qDn8eSn8DypJ3yt4nEAc3A59UtdsxPO +bJasaaTrtO8ZqE72tWZ3mDWZnRgXAYi9o57E1eM9H4KgDUSwZ3x3EdTQppI/kloL +L3A3IVShdBLsxwp3PwKSbGfuFVf4DpXz++DtKPvLYhGWhJFIsXhKsRhLOEI565/e +d/iWG70bMO5F7EDNw5suGNDxOnA4vhoiiV0JKGiE6ezZa7YP+ixBT7qrLmPlpgVT +U3AKu36tt7nqUCIc0E3dB/Eq6+k2al3jutTr5KO4vnIFBzvTyBlCQCyFFohrHSmG +vT8CamjEX+PqnCTOaSy50ZapuEo01umkoILdLjHUJJvBphulW02XVy9azNNzgOyA +cpYkAMvXtw/XQR6bjQgvEEkPcPz/G064IY8DgRnDB0OKdc2vBzDpXdq+dPWphOXr +xxoSeA/1bF6+LLCezJpjgdvoF12fPNxdDJMwLSCN1ONQSNzCPavtHIDuoQRL13cG +1yKfuBECPI1v3VsHYv0bfbK9vrQRlMz698fV/SFx/WR/jYVrHfl3iQI8BBgBCgAm +AhsgFiEEM//voPoEoWPY3urYMw4wjXlq028FAmCenZsFCQO5WioACgkQMw4wjXlq +028a2RAAiv9pXBjE+8+DqhC5yrBecxGbQo4hUIu/TbUIvfrFnDTpPgBC5WUzCbC6 +MMc2eVdxJ1qMzxb7f+50sj5Ro6eVBSF6OxDggsY/vtAciNkcedwRaHDsO333wDyv +Us2/5alhKPP7rumH05ncBrfuPg9NshtqFidq/pCCSZhVsksK9Etm3RNF/6gSA12x +nDepydrOVw5HS6/MszUDR59ISTLc53C3n54TMXRysDDEyI1viAtb+mZPLsNMDDSW +bIkTnGfJD/vdsq5KnTKtWkBMt4fdU2KIKyb97tTv+QqBI/idSrVhZDDFRptEcYYK +XEzjSU7Dx/rDq2r8sRahQedAdU752GsWWPe/WAu1LxY2xFXv39PimbFMDOVVHlIb +RV3K0S0YYu5two2VSjvVqAtPNE+aLKOjIxa0ji2WAXwA8cmaJM+kGofqhp914cy0 +u3/KOOxwScuy66G6iPIJg2jHvrHsHIQUGuoIpRJNsL7nolYfYmNLyhU9PGtxXuk7 +OKDbmNkO5jZJDCgarR+724S8JZqHE6nYlZ6eHhQvzQLM4u2YDqiWGBz+Ua9+8fEx +uUCT7eKoV1SO7fEkkwJsWtCLWfqBPXmZzblqvPy3dOc1zM+WO8BT1P3+a0j7P4os +p/JvYGbqlLG9OQdwxlCaH33j1JD4p0lXNLrMFbpKyZ7xqMqn5GqJAjwEGAEKACYW +IQQz/++g+gShY9je6tgzDjCNeWrTbwUCXsZ28QIbIAUJAeEzgAAKCRAzDjCNeWrT +b7W2D/9N3/yrY+INe9gd6q+Zj2RTfDAuwCx/wbKH0aQu0gTjzlxE65ALI8ord1cg +mH1AFEj/8wAHN4WC3NoHSJIGuFSP7Zjmqx2653tYvQBI6RTBN8nuX2/nCFpLTjjb +K50RO1jgdKUZNDFaNu0BlhNhe32OF96yTXWl0LgGndOKCqwX5mw2BSN19FuAyKP3 +sDeQ6Kn1YbVjJP2MiXi9076Rvp+tLKZXikYWTcaryzpbo1RO0t7xZ6cmbtoTWKL1 +W8xfBxYEJizd32mU3UeTBdNjH/3K7FCs3vCke3DRIDOFnsjeVBnkJj8Hu1CBSU/1 +3mz1ksfBcfd3mwpJoHVdYTPowRCyTnbcRGD7WVNrgrUTZ0CJehJlAYOVd3l4P4i4 +Nzpx6uuB8vuQKF/TttmuORWsB0CG1aYndpeNkqL605HgfkIdfBNB/Z/DTdQvuT6H +9VdrC9DZA7GJ4DmP1yPVPdsaRGXhGdPpvEbuDfBv1zpTbPDyWltvqaiOKZ9cFj8+ +InYzzmnuwRu0izKUWvCVwPMCwLdWn9pAsD2IIxL4xtYcENPtliEL28Jxpj80JRPN +DhNyE82WAfg7Q0TUBo3PnPcP56iRZ7kPwNqIzcGgicfEKGumry59cfL5gO5Ym1mz +xGRCn9v0Ai8Gc20FffsM9S9B+yyIgkTXhMwI/8/k9I/wEoprXrkCDQRexnVPARAA +xWclAMh4s+1Xza29wkgSI2F2j1iupdUpg+H9ftAeatH5V1mGYLxp/NhzVfpYQCpE +GostZZVcHQK4P+jHyG7jLIr6QRQW9bjrA5ORqOc8A8lcrg1B3y7Fm3SZNU8fcP99 +G3s+ASW9WiYyC3R6gvrfW1enNwTjVDnEp9AvUG6u3uB1EndtmP09xJxVs+zecKZN +MysTlnLs3RfCRbAJK1HIYaGQVUYxFWBL1jKVn6uMjIqVNqHDPsUR7ITdKfY27V1a +yTCqGyLVRwCvE6XU+NAemubrTxxOD1wc0yBDP+haEmWKxlyCRaAuLjyzNmo+uF9d +tGKy/vYkeZOWnt27aDvfnPe2Lqd0YBeDp4lpOdjBlA9KhWJ3rxOe7bSaZHZ+axMQ +AqF/QY18RXTd7HGZmfDFXLPrTaoASTbrU8pcFN5PVuoo3QV2aIcrYvwoX1HWMLPX +PcCYdqM/PtWLi7yojtti82dWb/T7gukbDSRSEk73sqaJf3coNdhaLwO9TOIO7SMn +sHc9kDG2kXNf+UxYhVv7knhspBdO2ljxujEV9R5HW0TT7nXOHtDhZLvM9rRO3a+L +1Q2sncQX2/R8rsiiUkohfF8XCZAbzMBA2cuxrh3n3YpC7l42APdRZWyfXE4ITc9R +CNLmiEd63MxsGXDoDIimSA58vFWaUR42HSYTn2w1+BMAEQEAAYkEbAQYAQoAIAIb +AhYhBDP/76D6BKFj2N7q2DMOMI15atNvBQJkYgBSAkDBdCAEGQEKAB0WIQQH2LXm +Q8hXFiqXwlOplNs1hLjjhwUCXsZ1TwAKCRCplNs1hLjjh217EAC1DtWmHjs0NLQg +tnQAiTJUqzBq02WRPcBMAhLkJi0IGt8BTF1X49bM/zMgfhjS5x5r8ne5uxzEyVVq +i2XStdrSd44KBXja33ZTO7QvFSlUjYAh0E6qyKmkCCcuaHOYP2UoW5Yp3hf1DatB +rs02XyQN847hjrktOqP01kWdglL+BDB4VMePMjqqprDthT+KvYhsRiKuJVKFsdbR +bkGRCrFkytwPFqhyjexh2qZQMru9cCaf2JzLK03w397GaX4SmNPK3g7jVvxinvxo +EAX9ada8oZC397y5AxaRBNk5QZKzDJjG70n091XfR9VtBsX3MQxHLHF36l+VOWBG ++lc74P6YVCx37UUEvmkSG20gV2UTZj0sfn/YTDX5ZxwtBvopuLEmt6bAGBD01Wg5 +KVLfpHUMgxDIdtjI3yqWl7YFAs1JjB5PSOe7IY/D2pbFP3B2NQiwHS3TCGMzqFnY +t2HmITVnV7Mj7XWlat7JP26B8bDC6q3uVsXhyd4z9ZqUlZnGPoxucIecR+Lm5el3 +M+JeTYxhBdDQqWCGoeR2Ut0yWQ6VcUmSNEqQOAZzSq36C33UnZh5anCgMkSCqbhU +vLycFsOTWsJkGksNh1h9pcKkqzGJ3JjeullL4mX8J5RHMlD9uQj3ogOsHrD0QY86 +vp69eCZOPAcxQIqqFNZixyRngVVr/QkQMw4wjXlq02/Mkg/+MoS+B2DBmFnJsRYF +po1f/shnoTolx9i55WHb4D/vd5wHEJl1Zau3ZEVFQPJOb00SbOXiBqdtQTo3Sm54 +pPZOF2Np8WnJC4qqwQUaGLfcyxOR0xu+lYHPts8XWhCGWgO+Gsy87k+Hkf7GbkBF +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 +=NEX5 +-----END PGP PUBLIC KEY BLOCK----- + +pub 3595395EB3D8E1BA +uid Ralph Goers (CODE SIGNING KEY) + +sub FE694B892910DD22 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +E4MKxXh0DGLPEPiyStLVF41310m6rA== +=n4Zz +-----END PGP PUBLIC KEY BLOCK----- + +pub 368557390486F2C5 +uid Johan Haleby + +sub DAAF529A0617110C +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBEy0nNEBCADshXJI4mky+ZX7QjginQoM+gXhz+OTjddV9FwR/8eJyLYwP7Ll +mdyIpboq64bqIekRZZ5VO5IhYRYbwYqmWtPPS20WkPbiaSynAw8xkZqrJcJl3LxV +1W80G871p3kGTpJIBGGgpR7xfsM8D4HGbAhrPPtc4oPkFKindtCbzoXNGk1OedS/ +3kdvcD0+J2cESp/XIwGEKU6QxYglbaXy75BvyMhCLcPll0GO9JPzrqLwPlXO6RHw +dmjT6wWBpu5UPJI57BCCNToCQf6VJTXqsEBYD2NBt+xgBP2DGqbCArGKRSUBXeTG +d1WXACnGfAv+73E1Ix66/40sfeJCGajV5wvZABEBAAG0JUpvaGFuIEhhbGVieSA8 +am9oYW4uaGFsZWJ5QGdtYWlsLmNvbT65AQ0ETLSc0QEIAJex01ld471jsN0qeBqS +YakofZQyh8+g5QOjY7C4i0EgwhPkoewUIQzEkYVk4QDpbpSz3CDjK8/t9edoRCrG +BHsR02/ekDW8AEsElaPvraTb1Sg8lJoKcmkg7k9IKJ9q4E8Sq3QDK/UcPnjchB7T +Zgk7wSrMJ1hX3aiLkaFqxFaWNt8dvqAsGd23n6SvhCyl4/awkuaVgg3eMu2TgWsk +4RfBYxhGIXDF+SnQb/OdCrg09L8vU0BONnVF91DJYw6Ci4rkLp/mjHrDoL9nm5Qs +DCg6TCM3St2Av83sXE37wnlibrtgbwEC47HiFxF9oKjxf0IL92vh2hrmUIcc3B/A +Y5EAEQEAAYkBHwQYAQIACQUCTLSc0QIbDAAKCRA2hVc5BIbyxZrDCADigpiOiK+x +cvzlAb2HZDZ9pYpN98qYA2buXQuE0yrSdyCfwZjlTywmb+Dp1i9b3udeWAT4vQU2 +WrzzOQ580qa9dNgjiT3Cj+G8lH57TnVfAg62x19/kHHsjdNXv0iYcmDdF2q2RaYD +HVIL4SyOcWr6xLOR/8LCuqOCoj6Em+8QtJGJpx1Ff02Q4vtQ1dmU9LcER/OwIyL1 +txJjcbF4p51kNKnlnyJ9fLTVswLBVdISqd3GGKXd/sBnmQ/J55u42rtbIqw2cQ9p +v3/+5YBkfaXQdf7CTJU6d7pNRyzOqIFZWFN32IHI2rBKBqnuvD/AAMOpf9vcuKE3 +gCZxkIfw0snZ +=RYot +-----END PGP PUBLIC KEY BLOCK----- + +pub 379CE192D401AB61 +uid Bintray (by JFrog) + +sub 0CFE993CDBE1D0A2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +E/XhP4QkRJrZI1F/ +=Jm2n +-----END PGP PUBLIC KEY BLOCK----- + +pub 37ECFC571637667C +uid Eclipse Project for Common Annotations + +sub 0E325BECB6962A24 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +rZ4= +=49+p +-----END PGP PUBLIC KEY BLOCK----- + +pub 38F47D3E410C47B1 +uid Vladimir Sitnikov + +sub 105CB91CAC2AEE0E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFUK4t8BCADnmE/Ejenq1qJhG/9d4L7iY35Fw/Qy+I/4x9yVlCAGf7Z5TfPX +405/aF7sjWv1manCCdbr22uR7slcCRUV9CmIRe0lMDXozy22XVnpdE9ApHD7Qw2P +6uNnrKcO32/v/lux2AQ7kc0OS+ChaD5rUdihAMIfokBPLuY9OGaCNMcWaQI/s0zv +X0xPebYYwSYHU0uhLQm1y8fzwvlSNb0J8nVR/ZqzzPvqfM49CVaU8PmtLXqx5naQ +VOytBT0vGUvQ6CcJPOYdxlVF8VI7vB2B7F6CuxKGdyJIOyFU5NqWBcjRq3oMHXyG +/vryt3D076ZB8dMfi2gol1m02io3czxnUR1PABEBAAG0L1ZsYWRpbWlyIFNpdG5p +a292IDxzaXRuaWtvdi52bGFkaW1pckBnbWFpbC5jb20+uQENBFUK4t8BCADfmgeJ +Y5yGgs8vOQ3kOKQ5B+UNGBnOq3y5NwEZzjwHsYv5WG1Mu11iGZGcu/II3MTC0YHI +xY377HyaqEPumzN1aFS/qfT4TGfGshYvVdOa7Vy778yWMrp7RXjJDpWfgN2HYSR6 +1CbQvwn5W7JXLXM9gJddkawlqWuLc8nxtq6I9vmJnOmNzzdUo56LvBUj0nwhmk8F +1OFvaxr5rx0zx29OtFx0nMMV6M+n0FiA37TskHLQmUnxSYHJG1Sq8jmU/i2yGxus +CRtFl1kx6Y2lrVVaFyyS9XoeGChpRRFtjnbYLvzGWhrSmenwHi0CkZvLt5zA66jA +7d4LH6EJN5RsCs43ABEBAAGJASUEGAECAA8FAlUK4t8CGwwFCRLMAwAACgkQOPR9 +PkEMR7GC+wf/aH8P8caJJcw26pkOLEr/+wXaJFf+u6jL2ksLIcDlMbY5njzbjWa6 +37QgcT7GqAX4Lq/ALHn1Vcj5tjD7iLrYLtI1hKHuklWn0lSh/O+dn+dVquSxHpTq +INjFO5yAMzpez5emgPa8jSib+MHu+vomphaKVuXml4tpOTCGWsiVSmTv1urEi8X/ +XBaQt/6PMXQ29A6+2iaoSjsdrHYIkmP1zoMnLMlVIqtSPjbLkGtrZHzmNjQoQZQY +s/hCm73XnJYkQp1urhsElETAZIeXis2lkUB20kDO2uxtTqpXG+MLw601ga2gORWi +1ObD218DIG7UqtCb8abuiObf0g/7jQbpSw== +=pwKc +-----END PGP PUBLIC KEY BLOCK----- + +pub 3AD93C3C677A106E +uid Carl Mastrangelo + +sub 9B2A1B698A113AAD +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=qc4l +-----END PGP PUBLIC KEY BLOCK----- + +pub 3D12CA2AC19F3181 +uid Tatu Saloranta (cowtowncoder) + +sub 575D6C921D84AC76 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +96Um/Inf +=ec6I +-----END PGP PUBLIC KEY BLOCK----- + +pub 3FAAD2CD5ECBB314 +uid Rob Tompkins + +sub 3260CB2DEF74135B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +o6QtwZ1S +=4qFv +-----END PGP PUBLIC KEY BLOCK----- + +pub 4BE41A4907BCD034 +uid Appu Goundan + +sub FE8C48C466F93AD2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=uKcH +-----END PGP PUBLIC KEY BLOCK----- + +pub 4DBF5995D492505D +uid Sean Leary + +sub BE0F021FCB5F68A0 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGBFmccBDADIusjFY82nMHFXYxY1b5eIWtyaXTQxv/bXfjR2Yb16dURgFjai +OeuYzapF7vVqNV8/H7Sya0W9z4OWf0ZttWhtQFcmhF90586OArXEikKcFgO8EL+l +u3CrufcWEsbr8P1EKRWJnfdZ0wgJlvvJ7HfF8lr9Wu56vVgfohdgsWfADWkUbg3X +XGwyxfYmXtvrSUEsuDwjzNvlbD5GijvC9/T0TeQosfaX7AyeXXwbxolFGFtxitBz +Afkym8nQCOF5jfSj7fzafmhtngQBfeenSsoxpkTxOx6+SdVMksWswBBueQWTYBCI +lULMmuRRkCHWgQ9+LDu3eypqCS9k0RU+EXkgpMLK63QYWj3pkZSdnR/HROTDvNTc +DCoRHWZm+ytdQVefFNpLybnMJacfdle2v8QcSgp4utplhz4sNn7/lyis4cMpvqxL +bB4jzNsd4jqvgBZUmjoVumppHhEqnj5HrMoP+Soq7zNgCFXVDazxWaKV7G666yVL +Kfh7wjV3cJmdqAkAEQEAAbQeU2VhbiBMZWFyeSA8c3RsZWFyeUBnbWFpbC5jb20+ +uQGNBGBFmccBDADoQoRd+G8n4axz1k8ynj1Xl6ClWaEOP+T6c0GZ+/MjsUtzxz/R +XxKQdgxvz7ECNHN41U/73SWisDBuYppUg/72urhzL9kPs6ePq6XMrV+1hWs4oK8F +0ECMw6yn80HIHmtEIDMuzZkjtxfsBPYpcKnoNDtVuqPxsMmmsetutKfInXrhbMWO +xutvxIKqBtVL+7Va18WdNIXPiS3K8kdpWa59h/wgWIb/GveVnqWACEvkaRyCeZrn +WYqznrM9lJDtFDNFPDh+PfGiuYsL8D8sT7U1eh9K3ms3KE5z63Ic5pjJuULsMgFg +fhnfZGAQqLSW2wsBWJEmX2u0c53njT5KRZRxvjPU8WvKQGMMrBT+ddyKRFj3+PaJ +qmTCRy04b0+RQC8ZiIGeYFK+JqAq8e4bDyXSVRhi30lpo38CXVry/InNmnOxqWcR +JF4xw9MaJt/TAO+/IZTgwRSX+1IH8SW8928is+5LLhvWKfSApZb9D254NqvFFO15 +UDxIoC/chcQXV5UAEQEAAYkBvAQYAQgAJhYhBIZhbNPE8IA+czdKQ02/WZXUklBd +BQJgRZnHAhsMBQkDwmcAAAoJEE2/WZXUklBdfmkL/1kUYZbreYCriYE4kQteZ0na +rPcGmAEJVxRzKBIMhnMF3r+kVBq1QZU4b3bI72YDj6MEfRcMsNtd2aLFfsnlHF++ +fyEhxtga9Y3tn4kuGb03sUE0YQhYqER70d4jzizMrMy7x98bYsTK82IdS1tBggzG +AWX+0NsMhoxTydXjkUenDd2/Kdh2PSijLLvwSNb1xTbTX2fpzD0bmwLQ4ZW62nYp +RpZ9uPHZj0NUSHd069EtlJQnY7b26AOFVWghL0qshq2AeVLdbCjzZ1HTgzf8Ow6r +unKpYRmeHDGbhOXpdPlUB3QKB154zkYYSX4U7t8yVZTc5QwkL0f1U2C4N0f+xIwP +LBqHWcOXH1B2SAILfV8oxpXbBnbHUKoi3C1nHGJZbC2DHy/1veXGWRSOZVmSu4Zp +oimb3DVP/jAM0OqTDNdwq4qS9nNs1kB4+DsACLWnwjVPQh+r4ejqH21EwmyxRCq5 +gX+dSFnfiXn5nGg4NAU6QuXCv40L42QGWo2w0iHMVw== +=wBmj +-----END PGP PUBLIC KEY BLOCK----- + +pub 52FC3551DA8DC57E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQINBGUt4osBEADibevxRkvJRgVtCwdHmSbWW35tipGmNc/8ur+4a5H56/HnigbA +HbsLBDKdU+MVg8pMXJIs9gB15SyB1zps+hW1IP6Sbu5redrdVB4JfSIBMYGm3gfw +qBUz7xLR6t0HhiUQzpoLSThDMVNWWxpVT7LUNYoXDiwDR/T3d6L2fB2wWH1uEFvm +SQtY3eJCX3oa1csZhscEEDiNOYL1ZI/W8QUX1KV9GClzSokI+PQrXq/pMEEnCfP8 +dzW2GeFUX50Iyrl7jQ9c2EeixiU5vW62RryuFdNZ3+9syvx/7Uae8+cI8GceSyc5 +D4uJwgmGg5a0PnfKldoJPZbdDOfBp7F2Y3x83M5rkQ2rob4N/Rk3eBuKx1YjuNk+ +5rWuAsP6EBxlxpr2ms3EOwMtNaKpQgVNy9p+a/sp0Nx8gcPOMaKOo9DRIWri8COe +1MFvxl8kTG1X7oc1cELcw0JNYG9ZbnIFPFr4FnAyPfTPD19c2JyidepH6EmzyKWA +1Q9P4MGjDQY27MyC6CgFSsZDuL4sO4VXd6sWbaII1b4tHxbZOnpcqDL3OPhrszXQ +ju3hYcrjMwPTHMbjwdG01/S+7Wp5NF2XIBbfLQntXy9jgjFmHLRe4N+06UqskHI4 +jc7VOe3ZvSYfAiTQ1qVoeCe5002ft0JNp37dQGdge/LNVW6KJCNzEvV0DQARAQAB +=hJvs +-----END PGP PUBLIC KEY BLOCK----- + +pub 55C7E5E701832382 +uid Andrey Somov (SnakeYAML) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mI0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH +PHgq59mLPVueo2/M5k/fFrCe36jHePP31gYpFtueeYDfsofHwod0WhsHyC7JfG8d +jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAG0 +MUFuZHJleSBTb21vdiAoU25ha2VZQU1MKSA8cHVibGljLnNvbW92QGdtYWlsLmNv +bT4= +=MKAK +-----END PGP PUBLIC KEY BLOCK----- + +pub 571A5291E827E1C7 +uid Central Repository sync with maven.java.net (Used for signing artifacts that support syncing maven.java.net with the Central Repository) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBE9iFawRBACJb4OMk3zqMDNvSJKYZ8fGYrPq7yCcf/ykKDkGb2dtPnAZGkSp +3mmNlTsU6s9ARn7BtkhIuM5TdbLs+z+okX62h3F0WW3h+CpfIXyKSgl7uWbhZ5G8 +RSCCRr7A8m6y83npkTVDW6m2oFN2cjFwPLm/vxg1gu5pO+NCwz5iBRHdewCg1idO +Gl6gBAZVNteCRMVnGnX4EhMD/RaYBO2j511h7gR+p+6BBeJTEIA1+tsi+GhTBkS9 +mUMGuD9Z8PyvwL7quGQyXJ/kTe3eB6iyDFn0oemB1w736FQe3vcIX6eePOEiDZs5 +1Uepv7bXI4wn1i3Z3kzynXNKcjCd5ZxAmML5VlQ0zWeE0W18reCjt1P5q5xxBFjw +0L8WA/9aPi4d5VPakzuDvxfKK29BogScTLn2C3fpEnqWsTfpoWSkNXkRsoB4jUU4 +oIqRFMTxwsjUmjVUPOG+YqoeAaVpj+RBpp+V+CqgfNWpnH4caxzODE9f+6RYRCGm +LSq/6OmgZg6t38M5XWVpvk7Ixygs6Vrd99VZyIQPJwSBM/pvA7SfQ2VudHJhbCBS +ZXBvc2l0b3J5IHN5bmMgd2l0aCBtYXZlbi5qYXZhLm5ldCAoVXNlZCBmb3Igc2ln +bmluZyBhcnRpZmFjdHMgdGhhdCBzdXBwb3J0IHN5bmNpbmcgbWF2ZW4uamF2YS5u +ZXQgd2l0aCB0aGUgQ2VudHJhbCBSZXBvc2l0b3J5KSA8Y2VudHJhbEBzb25hdHlw +ZS5jb20+ +=2jV3 +-----END PGP PUBLIC KEY BLOCK----- + +pub 5796E91EE6619C69 +sub 153E7A3C2B4E5118 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=IF9r +-----END PGP PUBLIC KEY BLOCK----- + +pub 586654072EAD6677 +uid Joel Orlina (Sonatype, Inc.) + +sub 2E74CACB6918A897 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBE1VSkkRBACkCgvt26sMi+0X+EOJDMqdK0Sziy06k47LJf1jOg4tTZ2T9QtP +OZ8fD+va/O5+q8Kna993jzcO5n0Nv+R/K3+MvUqSmdITshCIjBt3cC0n6FWndGyl +jY7rOmzdNnvSkMGE3V2fQ18stkJRleqk3EuWwv+EwpxcYeVfCO+UCJGz5wCgtqnZ +JYdRHcDkDYaIZ4eizpbV4d0D/3cgBdpcbSrwIGtft+lDxacaJrWpT5Jh5P0gLlYu ++6PFz8ZIC4+/aOSi4S4mgZxk8dBL8ZBqLqcW9rc//CYKNtPq33sdf9vxcusMIXvS +PBODjDpoOsTJwy51fgCEL14qnp0v14y9p7ejjN5+GipiNY/JHo9S9kTdVhMYqt6x +6a6MA/40vMejIbZ4q3Ia63jbHPi348fLDq3Gp8Wos7Sh2HnLC+pRdC46qX/5wL4t +Vzj78yW9FdH5yeeE6nQLOBWh7PnSfMt2wYHoarEnkkkycP7WLpRME7qsBYqkNUNa +2EQZSy8DnGiayYDij1YPNUHI9kpK6H/e3puhmgNkzrZj26T85LQzSm9lbCBPcmxp +bmEgKFNvbmF0eXBlLCBJbmMuKSA8am9ybGluYUBzb25hdHlwZS5jb20+uQINBE1V +SlkQCADrG964NxqHiAULSXYEVH1CwlTRILkiTBEkL/cZyoBBnkF/SLVX3TC67y23 ++MksiCdUoQUfJPNF5PDOgtlwPnNeAFVK7T1B5rHjud02NJ9lY2Q+ZrO0zmP3Kvg4 +XkwS85cTbCvOatI2VzitvkpYr/WkQSJf/N3NYkuZATO+n8y1marIrqkLC1LxL6Ap +lCNlks4Sd7OLN5whx7avrEJHGi2qdxTB9SD6MxRSVkpSUrCHhOtgMUeF63xrNcum +MQPQBIbv+kFgNtE+eZaFfU0+IHgy8sMROvHrtqzPOuwZdnH1OvrVuEVtErINjmJr +//nTXtWBK0YCpuSQI1kcadCc3OO7AAMFCADoDnwynvulS0K1WF8FGfOIqQRoKfyc +Kmoz88WvGKHTx9AnfG38Nt+kHHfUeTLsozW4uDNkSd6S5TRmrCArdqpaDzSagpok +3FRl13mit4Whuw7um16O3miZfqTF0aM9yU63UzyxzoT4DexHlrZAL/0G2zjabJzX +Morr7p3dSl9SWqBo+9dsZOyKwzuO3gO1XPqZctPKMCJZ47Tt1xtKOBm5GcexIImh +vNOY20VM/UOBR5yBNw4rZqOAay7MuqRtpCcr9GJEjOqQUhaXPyvOVg1eHxMD3QEt +4ZdK5U4RbsYEhzx9WezqjXQ52wCqfMRCpwJm/94cdeO31PlaBXd6nLnXiEkEGBEC +AAkFAk1VSlkCGwwACgkQWGZUBy6tZndAQwCgs/qSu+5vFRvBeGVsg7YSIxOHf8wA +oLIHbQ4IMkRivPgSpuxw53Hofe7A +=9YZ+ +-----END PGP PUBLIC KEY BLOCK----- + +pub 59A252FB1199D873 +sub 92BD2D0B5B21ABA2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFUBG7QBCADRWXf0Fw05qRhM4cRnGKlOW1ecue1DCxHAtFwoqmAXyTCO+tI0 +MEW5SyXUkX6FsWLl6A2y+KgOs669ogzfQ0rnZMEt4HisRp8wpgk3GWR1/9aKYz/c +ymy2N3BP9cz2fJ9+3PpBccUPL+ydFKpcnEnIwiQK+p9JjEWzJBlrdUc/UEJ0R+n/ +5r/+0+BHiTEMvjAF6/SwyntpTWpu7iEzLv/pfdCuhFKa4yn+9Ciwe3wGtSiue+dh +tqKcd4YxED3oAswObBca3CC2HWWsUEH6EmfT1jUdfy1cq4X5x7AZ26oFYfG+odqW +W5dcB+13VkJtJRzQTO/2HKtITJYC65a1jKt3ABEBAAG5AQ0EVQEbtAEIANsILuU9 +cH/EIEL+OpwIacr/y3/6LG+ok8SKDHIlF6cSpusSsWM6L+RGcZgvCDR0S0EEid44 +yy8wFMvoYSlsXHLN4SqH/rpLIc4CD8DdCLWraKaRZrhtqzNWSsYxEgqo7n1xO6+c +sU17VJArnpkGPHoA7ooZlaGrc0y/rlkTXH++LKqh8niO9Dap46pLFrdgvuyKbq1B +6faAf2JMRyvqy2+fuwfVGTc7DEUUFtwGg7FniDF0zl+3rFG1ud9kH8UWz+GwCwFT +6qhVglgOmtJgw1CSYNeDsQvDB4YTJNnMneMSdM6CkEcRhLp2+lz90+wR0K/a9QBE +1NPubAaRB2uQR4UAEQEAAYkBHwQYAQIACQUCVQEbtAIbDAAKCRBZolL7EZnYc2uJ +CADHHB/Bmc48Ye1xl6T6nbNEiMCdmpIba+JNFnEWcueq4xk0xoXXUSpBnjLaWPQr +VZKHXdMxmmR3BjhtFvsLgeajypLUkVDlKMkdGQtsWXL0abr4cNoMDiXURxlbXgxZ +8+hIs/rKSWKturrCD2V4MXLsQV4xArh1ezkJFEDA3tRGzjjgzg5MwmrmL7H5Pcd6 +vV1Ke60BmvFYvvjRwT4Uw1OD0XluuPOaaiTibhPECc5zLxBz9+eRSsRbxccNEzPY +JS8Xl9+hIw7Y7Od184cOoexxdoI/K52kH7A5yfEj2kXCZm5tYylyKvgGpczWdZuo +V3u1xg+t7/QlghTMoJAA0H5G +=hS0U +-----END PGP PUBLIC KEY BLOCK----- + +pub 5E975CB00C643DBF +uid Xiaoming Jia + +sub 91A4BA316974A467 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGHvIbQBDACpPdbz5UIVIWR4cfXyyZEMOG0ayCzJQPsT4eq8XR0o5Y9egfAq +dRXC8paInsaF/iVL8BJY6CNq4B3dUfJwKDcJiCiPbiQgknqF1HDBqQtCb4akW8f4 +Am1Q6qWxTcJBUtVjjlTMoWcCRwFNP1229ICL6XdfM5djqxOuIcCMIHC55YTldrDK +5WWgcXC2NZgUbRn7/8dpaCn8iFAyhYjYKAk1lS8kSxCDvQNU9DtdAWtaCosoWBZ7 +mWWIeWp21erk4jgC145GujHYeqynf7VmdIB80u5OeIV6CwJx2ap8AgrKcOCON3Kp +kYa7fsDGxq6Lbzbc0rzaIfK1wyGo56dMySDK1eZuOY9Es/wzaYfpzx88gn3rrcaw +HwTKBoug+9z09m/rWy1DThW1gruYMUrxjeyhcdXlEeVrv9EdNCbbfKcg6MbrZ1mu +Wc9DIAfSQ40Lv2sKxTyubZXxvoyEhD5LTqSKC0tRt9xKjHWWWSG+cyhXu/2hYmp1 +Dq7XvS1p8NKjD6cAEQEAAbQnWGlhb21pbmcgSmlhIDx4aWFvbWluZy5tLmppYUBn +bWFpbC5jb20+uQGNBGHvIbQBDADNSRxyLYyzfkdxF55RktDmgSKq9tskfR1QcrQg +Wvi96fJekLYL/a2hmJnbfUbqaILnkyUmIf7zONlCFv10U81prG9wxfXUTMuabpp+ +eXUFdbCZMc7R9JGXw5iaRWje+jh/GaeB8xY3cPbtfHkXZ7nWkQaq7b8DutJrAqo3 +9NuprRaaujfU9PXj93tunJExqi2w++fjT1aQ36PaplXRZ2qWiRxAkaIUGxjVgLuO +Y1FWZJjWX2XMypMesUSfUCV9IwlKCc8+55m4jfbtblPQHkbe5zvstxxfHdYQkGng +p1rNWLHHSCT+Tf4Y4aR2J/E3mp6wSBVxgfguS3u9h1mY9fEfe2vSHWkWmYNm4iDA +msPn8KTuccbZlB/cKIFS3AET8ZHwHqHuCb4TvUy8febp4yo5ZRniTVQSf2aA/izu +wmKSmq0bX0hjGRBVdGR2jlD2ND73lkJXU7+3sIwY1ebNVzvl75Y7slmJNHsij24f +keZtcSmRQ7BL7ZpZ3fYiyi1/MxsAEQEAAYkBvAQYAQoAJhYhBNX0a8C4avXcVt9Y +8F6XXLAMZD2/BQJh7yG0AhsMBQkDwmcAAAoJEF6XXLAMZD2/kY4MAKDX+NsPosjH +t95895Z2H8A6JXOEt2F/LqUZ6XOqW1AAeLj+cGMWBDDQYNp/IkizV4iMynmlHlzg +YivT+52xrUvEzOqMRUrDNTPrbkLUjc/Wm+TA2J2ZGUSjZZUmP1sBTqSIa1NCqWl1 +VRWZcmbckCHz5oyoeXKM0EKGnPwOZP0lf8M7f6QDUJY5DS/5RTIp+6BxHhtRi5uZ +BN5QLcamhIADwR9fIlfoFfXEwEAQl5Z2YTnyMf/6/5FWVgAS1PPFqvI9H0HiWPx+ +XSfgJV6K10GwRTtdhT12M4teNFsFUNhngsvO8WCZKsxz4CV+Ai8bSMmWpNsYk72C +bRMoEHMrHuVXKKaKv70eFd+BaGTuLPd8hZgsDuKxU83OpS+LGOYV7Lb3sZNEeqWa +sWMqjeQC/CzEAE+Qfj0RuucswEZGZ2NWvwouGJcTvLAKaUelMr5IuWTkTZYmXww7 +ffu+Fps7qSMnU+mxOl6TkfoQw/cNRpZdMqwI/7119TnFeK5/AORupA== +=YL2l +-----END PGP PUBLIC KEY BLOCK----- + +pub 5F69AD087600B22C +uid Eric Bruneton + +sub 0440006D577EAE4B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG +VnbtRrsIUdmNIFQmz71bBDFhRBbrSrkz927k8eUPhYtxE2NmmWSuKgrjF4qviPQv +m/7SqGx378m/qw4EvpgGUB8EYif98LYdWp5vsU/zx0Ps9auqvetAzJaL9489oE0F +q8FVhve6BMfUUV7zOTCmJnf438YO68upjU0PVBdfFE6Qx4cgCeWbQGy2cooW5azN +iIenhuYU1qikmxMHq2xZzN4uSTWLGDpimPyz+Y1aTSYJ/bgn9gPStbI9sojWo9SS +5gvNK3XqJzMwxwFow86UcIE0vPD2T6ZlBAXRABEBAAG0IUVyaWMgQnJ1bmV0b24g +PGVicnVuZXRvbkBmcmVlLmZyPrkBDQROyVEXAQgA2uNV77VI+ARj1d97b5cY3/er +0Mcc8/Q9ctMY+5YpSYDOQF100QBdOQ8q3IJsfhZeF/iMFlHIUikuSgatb/Ih4lk1 ++irnERPuV2MNoAw3Fvn3/vwl/Jy0ZsQCBSXO54U42TcOXSwNLkYOJaomDiiuo61R +xj7jqijpnydwoFvEi84v6q/Uota3MijGMbzU9QyTX8J9OKMeCSUq0uVuk4ezebjv +/bwA/ax/qQRIrEHDOOB1LJ5JyLacK4+h5J8tMkEmWxEQv7MNokRLgbaePqv+tdf1 +gee4f2fSE3EXKFxjTO2wjLPXCrHSSI5gecsilQn7ZNxH9g2YUJipn9yj3ywMxQAR +AQABiQEfBBgBAgAJBQJOyVEXAhsMAAoJEF9prQh2ALIsrWwH/3s8uN8/gDnbcbTX ++7N/ZfQBXJZ+H9GGikmYRJE1xoOeEt9MOqZyGDTZfGM/qNKeDGfar7pcRQlMK/A4 +Nts5E6d1OX8fBkUBtYanyyjNLlT3yDjO6VaV0SCsgAzNjUZqc4lxS9atN6md5m6l +WLAdHghrXuV6LsiKOS+96htchoCvTvm7mcPI7w146yJRSyCC5+PybG3ult5Y6QAS +kwI3ZWB0u0PKUoqglwWngplu+0Fib2rxQvL32is4YrYaZ+XwoR6u/Bgv0ZvZiypk +17Uk17rDb/JfeLqDn7oW6Hlgi9KOLbRRIg7vwZVo2Ixco7aGxZp5c4zSfaPvn241 +v813ZcA= +=a3mq +-----END PGP PUBLIC KEY BLOCK----- + +pub 5F7786DF73E61F56 +uid Ting-Yuan Huang + +sub 73F7734B17EC71F4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=w18e +-----END PGP PUBLIC KEY BLOCK----- + +pub 6425559C47CC79C4 +uid java_re + +sub D547B4A01F74AC1E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE3XFIUBCADcj1zw8m1evCgEMqxgOfl6L8y1tsYWsX7tVPvHEkYlXHrdcpkB +fGuWPrauvhBmB9sBkFfxzU98Ilz3Xk9pfISYiaMUk9Mk1ZxsCoYPVhxvOSvk5LgS +sviDzjYdZfZtskUM0sRmjmoQL//fVQbfLxJ2zses21za2VHuS3puUbdcm8+UIl/q +oyneDbzM7j2nYXXJPNXJOfvyVxi1+rsc7xcjMvAj5ievYlWwYlAIgYbAiz969NdL +RkoA1Wg+cQg+59k7Wvi6xwTfzMsO4jfkV2p24xn4fpcch9J49UhADh6O7XEls1Xr +80WjysMJWTOX1O2oTtV/BMjpI4gj08SgZRhzABEBAAG0ImphdmFfcmUgPEdGX1JF +TEVBU0VfV1dAb3JhY2xlLmNvbT65AQ0ETdcUhQEIALq5+uXjS4IHZBmOWOBSf6R1 +EnU4pUqEza0uwgIX5Xr2uSaaCMPCm5xrbtf/Iv45VEuR8zGKb8/0dV74me6nXnOe +qD27pkkliVE5nMPQnqKAUQmrA5aDR7Tzmey46Bmc+IFrvbWqiyA3yZwUpi1FKZR5 +VLEYhMGI0qOyoaa1NWjD3LDL7/AmQESe9QLCtT6QhNhmj/QWByRpmuIhayNyPGlh +5osFyiGgVcinlZE7x12uG76C1V7jo9eYrkjl/uHJHRqfB628oLubDFimKl1raYCl +RZ63jkbZBfC1fRYzxk6356mAxlB2OVDH3aYB97KKZkU8cX22IMawk4aBhCyhX8sA +EQEAAYkBHwQYAQIACQUCTdcUhQIbDAAKCRBkJVWcR8x5xIbAB/9HU+RuaFxAIVwy +SrAvBwycrq5qb850RU9+KgrKo8CSCKTLdmphgBSE3pCMr6A/Q1QtOUndbm7SSq+X +qODhij4FfUx0Kz669iPEVEZgZCausY7LH9aTmTJCRM+Ey2eM32Skz+ur0T812dN3 +iNd8HtC/iaJAoGFAnWRHetcH03QMEuogZp80NBg0CHV5Is8x0uh8JRHi8hWD1f6v +Vq9/GwbgRsDOppVa8Z2BgyHOsBDoec/fYC3i4iF8rHuuSGqajswzG9SnFN1zLcGh +LEUEOJzeDCANb1b2sJO2r9xEvfNcswj6ksY5lgItE1roCI61unkajH4ViHheqLZ/ +7wRm6eOF +=Tyvm +-----END PGP PUBLIC KEY BLOCK----- + +pub 6601E5C08DCCBB96 +uid Popma Remko + +sub 0AC07D0BBD11498C +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGBVUWMBDACXALXWXSrB2V95lR1L+i+sQsTQt8tCIgX0iX9UZ7Vw2K/lLnLw +WYtM3oTxYox4OdgkK9tK6771EdCH5wQtRdUQJjlsBfZDPMiGqmh1jrAxAugEkFyC +anVQ8VL1Z7uPeqw4UbtqA7Or/E0aOhF3zkkmhaiE9Yrp+I3KXWH4F0Cj3X9IUcf5 +Z93CPcEFQx7ajxSJ1xw/mSgbU4AtKZXUdK1ehnFAhH3rcMVW9paFSYaXD8f+vUbj +hdJOp3e9UYEFShsdwo2X0FRqI318ef3gPDpbTATyCaz6NMIybDgRGo9WOGwF+Ysf +snXwLU2UnT44kpAzHjFdjZhQGcY1w7d8yGNrYX4qw/RMPhmuVefuF2yodBtRxhWW +09dwNiIYFVuGS4S03vlnEfYZlhmRgvWZK9PDJXm0vE5GI7LdOKlqwZxvoznjGmUU +lscRU57DtrNlAjyXMZaGdNfPIG85B+ijJmIb0REHbszvG6csX4g1MiZ+i0WID8Jl +20YpJTUkkvIztXkAEQEAAbQeUG9wbWEgUmVta28gPHJlbWtvcEB5YWhvby5jb20+ +uQGNBGBVUWMBDACp9Vpf+IvWC5bHXRe6bYRYm4LO74f5GICC3cqfHNe0xzwnhDM1 +X8Kve87djZrWp/Q07yjh03iccddZsH1Wfme0b1Ue3UdrhYMuvvMQPI2k+IR7+wut +AsDlMPbyRcgnhaAO5URhn7PW0Hq2RxmRTPHrXzajEJUodT2VgjEC9DOD5cDAU2gc +SUJgBANOvIoPEQAMBsYMRgYUczjvr8wTPP3kuqBq0MhZrETpENIGOeNIDjhkewkb +BweOubP5FeAWeFCML/3LBLM1lA1bNaPJL2qAuYgSQcxvqYP95AesYDlLK8SWogkw +y9etGmegbWXYUWI2frTDK4H4XO1/H1iAqUknB0t+YMNBO5UidotTmJMq9ln26Hx6 +RqO1ifc1QRu8A3VIryCdapNGFUib/TBwF201WJPK1MfsIzQvS/HgVmmu7tzYrIVD +HYbj/RXEiiULMfPZE4PezahFO8/oHmvkR0KLOuwnOuMyWO/DWGn30Cdd8k+00zJ4 +crCR/FVfwrGeTacAEQEAAYkBtgQYAQgAIBYhBKpBdze9gFRW2zy93mYB5cCNzLuW +BQJgVVFjAhsMAAoJEGYB5cCNzLuW3OcL/15j9/sQ7mzMVeAQPQlhMaFhtrheMPyf +0eOorklsJ9afcBPsYPCtY33vibJzm43MiPeys+tW42B07i3wWnrcS0ZChgCHzGoq +nF1QRu+O+G8hZ7EARNXMu+GAmY2sxCdF6vJtgEY5tIM82I9dtMMlaqvx6hKsVox9 +YZkvK2yL4x0F/nVD1VQTf3zUvZNrrdrowIf3cIuBTzkgTE7FrfaLsvdBZC2sNYuu +NAY94zHsfqlppCGNjSB5Ig70S/YqPp1WYxU6yiXPRMY6qyNIO4NkAmtIJFEEDveY +bbpvMBYYo8vcVjEXuCOQWQuMbfnMWu70jCC/3E0zn8RebEI5kdXxk0D4+pDh3TFV +nqgi40dbwmHEv4p06IBCzaSoyzDfYH0Y5i9kZ4zUM1S9GEOtFwgEWxD80g1YU+Wg +Mr9k+0YfV/wXDbIPLodc1J9OCnwqrzJnxZiRO0q/xM719KVhsJqR0I9e5trpPrft +AA4fEAfsK22q/zZWGn1aDs1RyzdSprcN2g== +=CEC3 +-----END PGP PUBLIC KEY BLOCK----- + +pub 66B50994442D2D40 +uid Square Clippy + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQINBGDoYisBEACqUDZnT4h6ma6XIzdC6KR++uDbR2VKdhCuv0Og/sHEKkm6ZbG0 +OFB8tAaQx/WlsoQyf3DlLfUEOGDai875Aqor3fbM+E1hrZbQNfsOySKEE52k7PYe +0qGWlnAzINuQaEuZwNw+pjZqPraMlwc/hwzJB8yFNHCv25pCFohK7KXvFGr5Fc6y +NHBp6pM3pnDQ1kbkloDr32YZY2LdrfdkRqwa9STNMcZtM724aaInValFpVGEHolF +dklo9MIsMI6mVHlxi6UwFSSLltUfTXGYY+rt2Q2sLNnEKzK1GvVhK996vrNWCvpr +cdtbTzGE3WK4f2knhqzlaX99OLmkM1ah+p2EkK7HgWM9oEO7SYpNxKe/F/QfRNRS +4W0aokPsEtfKCD7vQ3cRWQXdqFwvksilv+b6pcSrwfAsaCzVuhB3lcIra4MevJcH +ZEbPrfGMi5/MIVtLayglLHSPoZtjQBhlqo8w3nuADR/aFlIUZ6NGOwaz5yXIGVEs +6E1wiuILRAd7ecJ3Zyr/URHjawfHfKMM2tNCJKl48cScBMY61FJ1EmYzwhDw+at5 +D4pCk75eM5/t6VdYQ1cDWm7J3LGXEANMU5aSZMqgVnb4SQEmRxkW7oq3Z+GIkQQf +Sj4OK6Oi4cUpM7b0m7Cbcsoqb6nD27VKD3J5KTYEq3e+78h0VRjhoi0Z+QARAQAB +tCdTcXVhcmUgQ2xpcHB5IDxvcGVuc291cmNlQHNxdWFyZXVwLmNvbT4= +=cBgo +-----END PGP PUBLIC KEY BLOCK----- + +pub 66D68DAA073BE985 +uid Ceki Gulcu + +sub A1766BE5F812AC2E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mJMEYvEGpBMFK4EEACMEIwQA6knc/2gtbqDhPh5EzrymR4Hwi1Xf2S0aqMopA1zg +IeZzBgSfL+4fEfpXL4eAzvrk29jIXSizDEOgFpw3PW3Om1gASxub4Jo6EQrRgOdd +OlJl1bajIRC4pAoZafDzhOb+FkjJ61lEJzJ6pQtG0Yi24QWDBfXHkSiQSbZFvcC/ +FTJpZua0GENla2kgR3VsY3UgPGNla2lAcW9zLmNoPriXBGLxBqQSBSuBBAAjBCME +AdqQOy84O/j7xo1rAaMB3jGHCn42wBJF8nMVZ1oh6WRN8d33JP0ojCpCK9oe3lyx +jZRvBsVkFhOF5lsb72kqR34hALXmZvhwFhzNoQlz4NuDLg6aQjAQEyiS7NqI2SVT +qbGoyIE6yg2ZLuv2svxk1dNlvtqtfOnmoeIZG3pybRRhyuIVAwEKCYi6BBgTCgAg +FiEEYCAKxK52HxYU1sRnZtaNqgc76YUFAmLxBqQCGwwACgkQZtaNqgc76YUkLAIH +aAcCM1niPs/kj3NEmFl3P9ivExlWa6Q45l8qPgitCLO2v932TElX+ux8O+fv0Ax2 +XJezAj+eMV+lYScyvXpmzbwCB36nuPmtsCJ31kYLXhN2WIJWPvPVesreI/GQUq0W +uAngfd6DOtCKYtNKP7xqDu/2bMU23cxGaRj2ToH4RfCClg1B +=rv9Q +-----END PGP PUBLIC KEY BLOCK----- + +pub 69B8E32E23138662 +uid Gary O'Neall (GPG Key created on Aug 26 2016) + +sub 4083687620E57086 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFfAYzkBCADRFsmQXLC6UbFNjCKrwy+AwiMNUchJdsPkbFrvueWKq0nPB6Rh +D2YGNdCdLlkeybHHaSjYi/Xdxv7Vgfp4d32tzoqQJe8Q8oYYW7KbTkfzwH7TNLcw +lDqgqONCzOzqYUBy3E3wPlBE8MCI2NyGmVKR4/kjii12Ok8nUmAel7IpUwQoV4cx +CiK7N9pInC4q1hOmeK6EddUEJnPRhFtMD/aiH2S2H1m5a+raBLtP+47h6XCphas/ +iyALtqtIyMOQgO/qrtyxLC1f4If176Ylhd8d/Yk90OYN4N1mWCXBRBY9yQyOMyys +ISyEA2GjxmLxgMLoMCfUOczcoLEqgkSXGvGvABEBAAG0RkdhcnkgTydOZWFsbCAo +R1BHIEtleSBjcmVhdGVkIG9uIEF1ZyAyNiAyMDE2KSA8Z2FyeUBzb3VyY2VhdWRp +dG9yLmNvbT65AQ0EV8BjOQEIANDDNLRDDgh+sGk7Y7yhUua4afu9ysnB5wwrfncc +mAurmc8s7J6r3WvLYh3XjOSW/8X/zF5Sh3w1v25kFVBMovKd+gJw/AO8kuQqgSkx +qxPUHWemjPWelBCto1YFpqproKL3wnXaUT6V5X3N275xE3pJnARO1KY702Yv7jNm +5Gl+meLqCsSGJr3PeVBiyULGi+WPVUTXRL3cGo2i9jp9yE/hFemU0FB0HBEd1H3q +TX68qO4tjIOWhFbxWxNK8Eh2mszbGKMJu6OyrhBWLyu+8QQwUpG3qSKlswIOQrla +oxMJ09AIyMGsW/V9viztbT+V/1M5n8srHtlkTkQydxb/Z4EAEQEAAYkBHwQYAQgA +CQUCV8BjOQIbDAAKCRBpuOMuIxOGYkSMCACKibjyHYDy5JEZ/qtH0AwqcxdC6bCT +hbd6hcyHKAu+jPGonlgwjp642zyAXl6Erg7A84jIMSRluSnQyCV0PfN2WGMA3+vG +YwFIi1RB+A/DCALl/z2+lkk3BRaXTXw6JyKQNSjrR5yzBbPBcJR8jNXc6opz0gH4 +1BliuMyc67jMt7A9NrClR+tbkXD0QGfbSS0FRc6j53SrKqLiHOMqza2NBsbJOmFT +xp2s20bSGmM5ewsbtwdZj3rwTD6lzTnVI+ztCpGCsvlsvDUWxQ/uS+gYZLN/onZS +1T07Spjh6tdKX3bX2oaYZLNvyN1vRmUa7dEDOKWICPopHZgoanR8IGd0 +=CuU1 +-----END PGP PUBLIC KEY BLOCK----- + +pub 6A65176A0FB1CD0B +uid Paul King + +sub EA8543C570FAF804 +sub CA890A5FA09CFD80 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQINBFgMcBMBEAC/xcIVVOOh+F7S0OTzBlFH34s5fDbi6Zto469tZyW1peyWtXAZ +m+2jzFfeTCHaUQO3YjoTy2fPygS4tVD+ew4EAzMG5Uti4kwWZw0PYKz2JO/gl1JY +fKpWWkpKfHsGIFkfsOX6J83J4GVpaNJBUHsmcdep8YNf1nYDGpIZCxufihQXhuuK +x9BPm2SUdeyFwUFdxhGN4JdalxZo+x0pvQ6sKO1hQKK14YZXQxLUV043p3me9lVy +Ubld8kcda0edx3cyhilehib3sZPVhOm8s18GmjV5/ApPnehJN7SueivB2dzzFPN7 +mUwrslti0j2DmTdOImzcz0IT7zErmiV7xtgsgP8jgKEp2LF23VFXuWsKO2yNubQP +shNDKpYMMgJn0PfD5gwYl8FN9Yzj3OKA5wiJpgPjPl2PveZ/+rOS91bQMG1hFc3W +v9ZWSisJAZlNQlfyv36rD12WhwQLlupLo0zPlqp7e/i5ZJBPg4unbAYECtJI5Wqj +Ljhyd0j68QWon1Ripi8ruqXA9MUe7JMy39ZmF3/fLT4rBiHyRVpWkVKjzLlm0Ks4 +f3cNAPxn4FWeTwM+oUzEbpkNpE/swIbR05u1J2y0f+GS6X5t0CSTcHk1VIOnOiTl +wLzSEJe9hNkBuNJjwM9Cod7dbdorq6Qwd0ffPJoTw1SVkHMPwIjikzxU7QARAQAB +tBxQYXVsIEtpbmcgPGtpbmdwQG9jaXdlYi5jb20+uQENBFgMcBMBCACSC8Tx2N3Z +ppqJ03AuDJrBOcNJU903XTp5l37lBl0JiNCDP4+ygkCTUyz0/K5YKQYJfyuVmM5q +0ydqhQ68nmrmlxqvFxRIug5VqaE7VWhksyNAOROtxGi9Lo6AukKH2vK52Vh1uqRP +mK44qtB1+bk8DE1YHuht00XB1Awu4ojIt3WKuRpM/oSYfbsol82dPt1XpDvN1et2 +bxeN9qRblCp7u83NRmdvAGiBMRES6yV6n8XWpQFTkRYf7wyVromOzz9m81dWAW5J +s5QIvh3GMbFMS+2bnT+OVIrnCtJCw0TvTX3xZxyMEuaCvYInCZA92frmpHwJMXau +7/1u12zuHLflABEBAAGJA0QEGAEKAA8FAlgMcBMFCQ8JnAACGyIBKQkQamUXag+x +zQvAXSAEGQEKAAYFAlgMcBMACgkQ6oVDxXD6+AQmRAf/U+Boj2/27Z310j145uPh +h8w119XcwVqCpgSAUwycwQNWUjwbN2cbPtHcpRup7x4XNPXKV1yYIhNVFiL7rDi1 +Zk/ZmIvPGIdtNDJBycrtSsqt+pDRyyF3stBvW+3CvoQTJBH3bNZCZZNFDv0suPNF +alqzw1CSI/0QdP8fL7kzGJ1GAXD/XVDKPNy1VoCzpe+JAbUKaDV9DlWAnnGdliLN +sf1KFRMXg1rC6HfBKwW23XEY/eyC8ErR5pxG9H/sSv+zvsks/epx63qXzUnNt9Tw +RyQkfkZGCTm/Dod/uVjM5BpTtmsS88xC6G4apQEXbzV8naNyk3mPJMYcVrWDk96S +Hz53D/4uF/b/g4EpIR7h3O9ZClCogXrRrglQBY2UtwwzSjb0coyZgF5igBZ5E64u +Mrt/kGBMLmVHkwUl8YdQmQrS6ju8lrTrd/7Xh9LH/MOxXBMZaXw+/ZPcrH3aQFSo +tcL2CXmBNvv4OsordiJoTeoIIFo+Y/8VyOgrU4PdG9MC/jNy+61NcB3VzeyA6r6c +Lu8+7DXjBiy4M1JwEcRo3VpehuJyTPsVvQ8HTggGEvrxqmv/C+4fAddB5e8SpPLs +7r5wrBsg+iKpClBjDBVFp2SIg2Gj9TooQhhlTS1s77HxlnT3X9m7tuww0ouPjbVb +98nkEmueBAtEEao66YqxNXdWH10UKohxeZveCQgzHafIiDnv2ILdxc6cxr5w6jEn +tbd0OpIC+V+3l99eZ4Jy5r1pGZYEsA3AzA3GedYLUWGNpDQCIVTPjhzebAKd3VBI +lyPfMtHYfrhhA+rKc4qPl4SNqypfU0xr1MuHvb2CU6wYYASoeQfcqdxb0QNxqplf +S+DOUCxotejo4YWbRsC0EoNv8YkpLahhlIQZjawrmaZtRTob07IKg7SsO2O90eNJ +3MLhf/AUfG1RE0GfHyo5wWn8owwdqEXmn9cddvA4gqs8bFBV+ZngWKuF58xwHv6d +39noOoj85DdEBot9wOetGljAKDBMGCXWM5lXplOeM+oFs0FC/LkBDQRYDHATAQgA +23T9HLJVBqU5MNuloA8KKv9SLoSx0WYZ64uDpMirLrHIJnTaJjqXh4dM83GGcM8/ +h6b7f+MeHzhBqfTU7ywkH+jgBJuKMCW8/AWKRonwaH+gpz4U7mRTAByKPh/x22B2 +ScYqXKgEWoR1/PMASJKVfQbtuKquoP6ZHpgzd4VsFNEp9lXCfBEyM0g3yfYVRSm8 +wpwZ7e/fgYv3t72qD4QwgFnpInF0poy28B8pgHpcbdQiaUFB1hChLw6MomOgfkzs +1Fjypv6/TwznP3jP51naYXnrOlZwiWhxghPh5WL/YnyG3KSDEgEFaI09/Jgusrev +aHsa1L7R7YxvCGFSKaM4aQARAQABiQNEBBgBCgAPBQJYDHATBQkPCZwAAhsMASkJ +EGplF2oPsc0LwF0gBBkBCgAGBQJYDHATAAoJEMqJCl+gnP2AOUwIAJeYeV1Dn8kN +VQK9w7K6JtDFBDtCTfwo/Lh+fMoZHFAIoA4XZ5ALthraTIM9/15Hl0IfL0WaxXaH +j8uf2GH5ZLHNj3OYUX9AhmCra/EUJCpowaXaaSXFVUyCuAM5IMfSpHRpslnhZlBD +Z9gg9/8UbBEzn39DxNEEB6uAK1BLIqoH92ICR4m7mVCD5dG5k73wx7Zi6mSk8Z7/ +ezi4DiFznoJBOsAxSd0QvSlEKCy1Tm0yPh/McANSl2BcmorVPEzEDPh5dOW8aA/o +d9x7ndHVKjk01hvKzZ4nfTXufeJxmpfpKpDVXBF5bvOYlMXlPQKpwJSF4d9SrJda +7FJnTyQ7aEfdoQ/+NGaTPTfhNLPQGfrSSjmcsX/mU8fo6by91OyaC5ghkIOF85Sl +9ANJ+xMb64nAA/IH4e+qqcE1YOXvFGUvbD4YEZf3ewU4oGUty/iG8lJUS+ZBtMCD +M6DOsKDIX3UN6oaAyGOUCYoPaHTxO1LlZ/1k0mCtO+5Gc+gre0bDTPwkfA+upQyl +Ad/JyoXF28sv1nz5sDbh0Uoa96sNEKsCHKBAPLFpjpW4BwZyNrpQleKqVsEgTr7B +WQEggKpbJanH1yx89LfMAsoqjQmO90gv2k17J22zVoEemxTOmJ9v/JvooRpdfO8g +gYH/PKORMyV4hTEMhtMdv6ySb27wWaTajQXChtdenBZxT/Cjgo+hX7gpWqmY4+yh +51+EJVFvmNCMPBOaYdWO7NYW0aAs3C3sqkYM1Cjl9d64/GjXRpIl/OEzOca3Oh/0 +I35pDtwXChtSobaP6WDMzKygERAMSENsfAIWl2VRJoJo8rNSAW/5lk2o4WYTww5V +msXRPGLIK8q3VyA1YLIIltSqKyaDMuthzS9W4XN0tInzj6iMTbll5BR9hivn1ra/ +wOw7J1slhBpPneQpBqMYyaepMiOpcn5FJmUXzIJkg8QcdZ6tuTq/a3k+FTiuyndX +JKywz933JlwaTw5RjrDqc5y+mC1OCYsB4Gx4XlnUpjR9iVjH1oML0H5i1H4= +=Cc4n +-----END PGP PUBLIC KEY BLOCK----- + +pub 6A97BB242496B68A +sub 374A2ECC99F4A7A0 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBGK88f8BDACqAfnTaZazrzbO9vM+3nAdmcW1QR84zwUKneFML/I45kihIW2t +zhcx5JIwl7gK6q9kzRGClMCkSGhq0y9Q8UGR+wAmLJ8bexS998c3rtFfg2/c1zBC +PIPma3rmsh2D+COIi/BppqkceTvnDdZDMu1Xa/ezhgUeb7M/ipYDwqWjKBtAQhsk +hR9XjpBqqG1YN7epFOll/WZ7B30eEEXJn7VBelGXuOPG3EUk91P+QJMToGj7gOmw +HjXVGCyXiBXVdgGo4DUMgwlmg23gsC/L8Z0RjKbx93wwaKmUn+X60ZkUFf0ULQRF +n2P7ZZm/PoSpOfAzpVYK5dTatJzMl3p94fHKA2XaEaW5J3NhzEYVw+x/uPqOrJzY +PxWhZPrvhvfWQwLKMF5Xz9Ti44YgxgF3XDgJglBmIeyVds6lpi53Z7Gkf0o1E8ox ++90AJGjUzZO9oHbGHkUw1DDVxI/N5bBlbyOepyWAjXnV88uKMO2NEWsxn8Apmecb +w/4/oa+yg54igw0AEQEAAbkBjQRivPH/AQwAq4uwPuaet1SeTs6FlyMYXXUhuY7w +1L2qo67WjEeBJUNpJk5DuItn+oZx59zqH1GLpBoESR0b52dc8FNQqcka3R5DZR7N +AZ7Z3CP0dzWp1L1jKnB0SfGimCPxV+T4p73PB0mcOU1OvfR7htVrP9YtNoQKPAmR +3GmrypRrB1KLiFGit2RQOHlC4d87GAB8Q3NAiYMyK//4ZXVJQJHwXg0xgETF/mGQ +TUEAS3AGosrReexPbq6BOQJc73VARRe2/bBspq5mLyVl4m1e5CKZ6iErUE8vwrdV +YAf8BTZ8H40rC4SVCO318z9Rad3pwF7F/ei32+dJBJxGbtYJK4sOrscuDQ2QxTMO +GMfR91mzdLzZqFPpIKuT9S71tEx2m5lVrRkJp08EizOKIKA7ZlxwTZWehbGmsrxy +wxpILfvaurjPrKzXOSkjKh3/CNApTjEQvwJhMUMnaYd0t54cuy4Q+1mv2meh/vvq +zEOTCuVZKHxFjge9UieYymGmJqQP9LvTsujjABEBAAGJAbwEGAEKACYWIQRoR7+m +QRlloj8IxjZql7skJJa2igUCYrzx/wIbDAUJA8JnAAAKCRBql7skJJa2iilGC/9c +qonEr/TezuZWPuoK3dIAj/PdejBXgXBuv6vJaok2TL4HDw2bvMikAKD03MWe54bM +xwXCtGcrUHbLx6dSB9CtcKDEo8I99U3HgS5CPv0eB9IZEgauffwI9AQlGyJk6N0B +2rIabzELrd/X3+IKdpdYHZpbN5bvW+loc833h2ywvOpsovmVEpLvGI0vIbJz5xd/ +ZgSZu8nD0yKT//yTNK6FXPSXroWHAsHpl83Boa96uWPaEiQ6xqRGdKssvrnFNbuO +CpgMHTRUDx3VNQ7WzEgAdFKWo/ykf8+xRN+nwN/Ee7OoUSBURuZ0geSRRsPJT3li +VzhkBZfvUdoo4d4lMfFPlotlsymFEiWhvyj5CP79cRqTvEJWGwWKmXh+UN5h8mLJ +ip/KFR2Hfs/DyiJCf+MW7RY08yP1eNsh1sjipK4sSIerCxTRvgOpq6xAGsv1PYUx +JAIZRCyLG+Ks5+RfmOJZJVIUQmU9i19ciHsBx8ZyPKdO06+rBbrnp6GpGzq11VE= +=9x2A +-----END PGP PUBLIC KEY BLOCK----- + +pub 6CCC36CC6C69FC17 +uid Gregory Kick + +sub C694465FAACEE66F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBEtrDFABCADLXGAhjPxdh+naC6XU5kficZYEVAURNRa8MTnaMKr+31v2zcAk +nyqyjihcXGQBCeaNsz2mQkc/MrKdnFNVSwp715JcmcqDJGfR9aIDMUs9PvoNkkqv +IDtx9Tn73piqbplT2xQxd7HjFvaVuy7oXI68gwcyAGDvQZeiFUodcbAsKrVwFT+R +94JU6UODFqE/Ihq15Za8Sc8WhWitm8XTQsCsLeh8abGhkvNEmRLi56fh8/Bz8LHv +8T7r8zkROoQFlUEYaOR2wH5bbipww9+HEg64hrcak2w5smNt0NJUXZ2O1l00u3sF +Qdu54hM9nZ51xxcqvo+tGft9kIr2AfTrJ28ZABEBAAG0HUdyZWdvcnkgS2ljayA8 +Z2FrQGdvb2dsZS5jb20+uQENBEtrDFABCADqp4wT0RY1+OwMZRfTSYczlBAidkGq +HszDnCkO0U5w4Tog4v085dDFyaKO5LZHkgDJTyF5WyvwtqqzNoU+tjv+RkkctXTx +K02ced5jSFk7E9MI0AoMXogLP/uW6nHmoUTuDxEtCye1UfsIglD99wiCvxGtnOjg +wfezkpctP0WPe41mzNccCrs3hx+R9ECkyZMtQiHYPmr3X3nhwQxKQotwWQOeSYgC +jLhTWJfkOMn/xaGCNGaihYSMCtDkC2PrpyD5V/qj8gek5DyI/bXCv3Hm6Td1XBbz +c1ZHKmF3ccFFPRtBsswtwXuN+6Ms5t0iVsNQ0XdhY8BXoi9H1jo8HH75ABEBAAGJ +AR8EGAECAAkFAktrDFACGwwACgkQbMw2zGxp/BdCxAf/TvMMBA7kY4nbH5WU6KTL +Nnaykv0zfxAf5XgRbDqrcO9dvnWEjYTPyyVWXIVkvMtESx0DAHeml/PaKCab5pIo +ybyYQfWLbh8Jhn0+NLnKOwE6m6OrWFv2gNa3zrPRwIy29VFkLxLC/velrIkES8CK +F+gGinmxupi2IpIiio4uCyUaeR1XV6U8UWl/50j0i2mrutle1yiV2lYBb0k8uMZ9 +nqYeHkVQAispv6bDZF20co9Zmn+GtbHat1jHYg0R0p960SrFBlb+x8ROOb0e1u4a +jdAZ2uFczoDRKHEQijvaQxIjpl7Cl1LwyQTq703XSVR19/5ufOR2XWtXa7UoBL90 +bA== +=d1Fs +-----END PGP PUBLIC KEY BLOCK----- + +pub 72FEFD1572EB75E1 +uid Spockframework Robot + +sub E95B8FF73F6B84E3 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFt1xhcBCADDofPZYtlG1I5NRG67j5Fn8KArIzKK9L3bH3MfJC+XYYPY2N11 +ckiF3JQ0kXH3BPL6r0+dOQm/9SGJYsRVRYYoz2HEf/bzLSxFvKeEdEsWh66IcEzp +xlxV7rXc3oeGCZ+EvobG7JVoRyyLegx/VareBwtBhW39lLGfBjGBzFuXEMVG4H4U +v304N7D4sEIBYWT8c2z5Q5/Iviiyu/VgHxczDn0H6Sl1kXP1vVhWff+OBlbO7JAF +TcW4ET3K/ASWL/CirLbyyVkO8DO5pQyuJqci7pJFWWp/56CpJBmxuyQRc4SEpPjC +ZUOs335j1+MxAJh6z1L/xZHF9OV0GgT8cs67ABEBAAG0M1Nwb2NrZnJhbWV3b3Jr +IFJvYm90IDxkZXZAZm9ydW0uc3BvY2tmcmFtZXdvcmsub3JnPrkBDQRbdcYXAQgA +xh+deGqkK22ydYsUjGkRe8BGN9QQfdY3KfuTIugU9nQBTtXetx2wGD2T0Oz0vLnG +FEVVR3wDOWvLBJ4BD9tJX76JeHf3Eurj3g8ctBMbla7GDwfDbW0p7vT2I7Mlryvo +I7XSyP0l8KfnNaKWo5tzFw2MpyYY7BN+giWbyCJV+10w2B7XMSwlDddNm0w1I0ec +rcCn8ju0gFPH+nYB2AUo4vvejC2pAgFemWZGv0AesSLCri+zHCHfdLf0ex8TcoKZ +VYkQin0JuK00aaidv7lwW1rGEQSGeamZekBu5Bw2yMGA6JZchR5ynuJOQ8ygX98L +MmAHMdXHfghX9cHOLhm5mQARAQABiQE8BBgBCAAmFiEEdulOj/CrWvO2+DZpcv79 +FXLrdeEFAlt1xhcCGwwFCQPCZwAACgkQcv79FXLrdeGvyggAvNhz/LfzuQKaEkSc +xaJ5Ww5xhDilQuPbJNhT2lhFCbEd0EjALxmRvE+WMVm+Cs+yd1Gce5VlS7/BNJWM +7JTRr1QDueirU+nmwj7DPEpJgx3cI9rPFytA8SmeokWJUOZrU0BddNARLNImcKei +B/SeaDiy+BVs1qY5+ZqwGKvPAJuEUOgvTUbYd6EWCYnxGttZtrAa/Dx2kShNOgNz +kLBXkjgSJxFIbaRjrOFvsH/wcSG3Teyv5g/kOXb6stVtoUi9RoyQCEe9JbxeH4pA +j4u9f5+Fcg4SfYIub6ONQy61an6LPty07DADRtYREyn+rmgzopI9KSB2iSZiwhrt +1RHXCQ== +=q/Ti +-----END PGP PUBLIC KEY BLOCK----- + +pub 734AEF3D43509290 +uid BJ Hargrave (bintray.com osgi organization) + +sub 49D2ED97DAA8B33F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFRZXAUBCACqPBEjQ7si90PYbccyR/K2tg78HzJfmECvmtE9mKaUpAWGkid8 +xvSWNIunJMqMEyAM6lbyGUE/lQX8k0Ap4qk/UIf9vxdFirmlzD1lhfxDls33Y6et +TxpsRP2Rm0f6fW01R3L275FAvHLkQcOUQVoD407Eb3al41sYy6vdRZpdTJ923w9X +ol0a/6G7wueIMNO4TtxLNGSe+WPjtAWmLOl1H2pg2eOcKR2+finbeWpPZPCjR4I1 +CaMcGfdwv/4goI1b/931t0TlKAyGVhCgTa/1DKtRsJazwtw6MQZkE+/8t4JIuSVx +GlOWUrlU2HCbN+eAHj/5/G0suIw0OZpdtNPBABEBAAG0QUJKIEhhcmdyYXZlIChi +aW50cmF5LmNvbSBvc2dpIG9yZ2FuaXphdGlvbikgPGhhcmdyYXZlQHVzLmlibS5j +b20+uQENBFRZXAUBCAC+ddgLBX0/BBS+EH6JiIqbFhclAnMEGwIAGyfk7rpvlwwW +CFQDYDSRW4AjWwcDV07ckKI+3HQQ+iLD9xwiMWRSyo8RRbuq2xypbPKd4ET4XtMU +uNweMpuyCgOMceMVUd4LbzilopWzOKCo2NBAExRjMoBGKdTyaCrQ/lEouEGATlzw +oOcrewUpWKfG0qb+D3XTZ5Dwqo/ylCtE1QlZASJGF8jGEMc9UXkMH2e4cg6GUBbg +iC0iKA4zwgLKCBaSWNUHt4fhO1pt3pVPrMaFL/3foLpa63xi9DdpL+LXDhIo165T +KOpXwDaeaZoRNC1qRggeLasxeMfL0Vm9P1DrZteTABEBAAGJAR8EGAECAAkFAlRZ +XAUCGwwACgkQc0rvPUNQkpCN5gf/THiGnRy7LT03PnA4J6AWtL19HLtRm4FXQQC+ +X5um8abd74HPzAgz0Z2o0rt2gq40xHxzyMWmtdpylSrRdfuwlVuVpf8cZDMiXNVX +TK/wnByEmqzfwNC5+21s/FHi0bQdbm5DjHz1jz6RwGUHdTZ0rRWV44VPxtYCZr/f +iu++Ra/ysUCCMrNh42UhMfH5yw9pQZxM5NTPeEXytraMhyldxRYsJNjO7ORKl3jM +FivAcnrZFlmiw24KDYEU3QNZZkNxpr7g2l9VLiFhkM2QIRGVPbVLHzG5wD2L5c9p +zhmFbXO1ZWoQMA83C4OFV0+ecnga/egW1kdpB50keEhf+cLDjw== +=ExEi +-----END PGP PUBLIC KEY BLOCK----- + +pub 7457CA33C3CE9E15 +uid Colin Decker + +sub ABE9F3126BB741C1 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa +x6twUmXV1yKjjtGrO+9fHvTOWBfSSP+fP9KTaTQYSasoJq2Mw4cQDy1i0zrxNZUw +N4/BiyjQA25sdfaOolhO0sFlZuTZpYy5wG72KkA1ygNq0L+8aBKhEF6zDU61YzCC +AxjcgTftgTeeoqkJtYa06lNz3jmJDN+zUQignfRa3ymoGtFHTzoXR9maE8RWDty4 +y+DY+8ibdGgSgKPZ0byTCDyNojgU1YTlADa/1/NY1ShYg617O1xicLNo0JEJlf2U +Tu4Ymql36+xSkYSISU97Q6Utgq27XMuZvDUDABEBAAG0IkNvbGluIERlY2tlciA8 +Y2dkZWNrZXJAZ29vZ2xlLmNvbT65AQ0EUhfJFAEIAN9NHRd2bYP/3CDi+n1ilSCh +ld0NR3DUBgS/AdqQ7IoAUfj7skyI/WyaMdV4uy6vRh5YgNg2g01nd0LLZR8Gf2Ck ++D6F88CdZaTxlkcxHV/dXMZ8yBO+0D6yFRZEL7Imsv8Ig4QXOVwfuiXEPk/Ef5Dy +9SdAVhcoErTGGR6BOGVVvexGtBwefsjMaOG0khkRbWIQ32WxfUFuAv5XBQ0ckLrl +KvYWUYhOlXg27GtFKH2EBBF0Z5ZWu7gaBFwSV0oLp9EWcD+C+WEwUSfBdqfRJtyX +vgf4kZdwdQ5caM8P2/Sdncl2l/LU1At2Smc+plr6zhIhDlLhlrzKGa16oARSBdUA +EQEAAYkCPgQYAQoACQUCUhfJFAIbLgEpCRB0V8ozw86eFcBdIAQZAQoABgUCUhfJ +FAAKCRCr6fMSa7dBwURMCADHrqwRNHkbG1QsXJr9oUK6KVkLsPhcngIhxRLlqe89 +omg9G7eGNauzs2PKsB3txotCFc7ROVNv/TAuSDYzkPos8G46p3bGesjfJb24zc6G +MT4RGIJoh1oNG1IciafIIHjp2ZJHRmEDwmvZG24OHJ+mlHLjaedtqlWu+zwwhH2V +ZrI/U3gW/x4imbk9UyyzciEIxrAc+fc19xl5PkUVcSDVC0cAqGpeZz8+SxFaf3Rr +0aGnSbeuHRjNupmoxkQOAey1ztmdWiCPf5RFfmFD+fENh+/xqYiGorYpcIN7UAsM +kvD5UHc5ZG2tTD41jM99w9Lm/xHJ9ks8gNwZESwIzr6ABKIH/1ulsflI216qPz5o +7uUxlTm8NfTyATfCUuZEDMYGOjDQPqQa8hFebqjWWYBUq2SlaKD2xMeEuEXV+M5k +88Cx6T2nvaZWMsrD7uGj+tTsFaKBGxP5p2OSEWOTETKKv6Cx7vcMTQmrqSFo47bF +KlNSs+aVM48UnQeFtTDyOhwa5jvtqtst4eQHwHWQ99BK0TEymNx0vF0nPjWA76CR +rfopOwXKdxJgoKq4MrxE92ot5I82AZBPeiWVJ+6wECeK/GoBIXZ5jEUqrQmmzIbo +WA5G5PMJ8egzLJNRJjTWHjCWrUTnwNcqaD4/qZxIlW4Lt0uvGlx6pKOJQ05u+9X/ +BzoVWrw= +=fJQM +-----END PGP PUBLIC KEY BLOCK----- + +pub 79752DB6C966F0B8 +sub AC9F6F1991913E30 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +cJR4YXWx +=IK4j +-----END PGP PUBLIC KEY BLOCK----- + +pub 7A8860944FAD5F62 +uid Sebastian Bazley (ASF CODE SIGNING KEY) + +sub C189C86B813330C4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=9dUG +-----END PGP PUBLIC KEY BLOCK----- + +pub 7B534D9959CF9EAC +uid BJ Hargrave (Open Source Development) + +sub AB8125964D2BDD05 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mDMEYT9TihYJKwYBBAHaRw8BAQdAaDrFN2sJgHdLg4bsOYutEx+pAp5vEbTH9nW1 +/bjy38q0N0JKIEhhcmdyYXZlIChPcGVuIFNvdXJjZSBEZXZlbG9wbWVudCkgPGJq +QGhhcmdyYXZlLmRldj64OARhP1OKEgorBgEEAZdVAQUBAQdADfEVv8zTV74gEBxM +ARGut1wS/56Cp0n902kpMCtZJksDAQgHiHgEGBYKACAWIQT0/Y0epKWQ13Smund7 +U02ZWc+erAUCYT9TigIbDAAKCRB7U02ZWc+erIV2AP9HcHsn34M+uSAh8dnXU/Cb +1ptM2r2E3atq3wfYplGg5wEAmUisih2mb96CIuFMotoG9mmPeaBkO1nYjJZKqlKp +zQw= +=grfu +-----END PGP PUBLIC KEY BLOCK----- + +pub 7C30F7B1329DBA87 +uid Ktor Release + +sub 0588BC69A286FF16 +sub 3967D4EDA591B991 +sub 72FF58594F983302 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGNBF+TCd4BDACbIA94MfIWL0SpvZwBddXgx36Lp9GYOWNgGoQCWSvk9vaMrLaI +rEll0xnoP98CfBQYrVSAmHDMhSLBCjNB3V1Sdz8GRdOG7HUffF7Cqwbm3Fxo3H/h ++Tsrodv23NuvKsDpgglUL6nJy5e/FO8y9dcxLXRRVdPFDhJubi08SiUJy9FQbnfA +yb2LuTzXtjDmjEsMZpdpQUlQkk0xNDkrrq+2miwxemVd35cnVQCFP0K7c4T0ksGg +Rf9A2r45DBbPfvwTL+ZbrGtCssUpCneWhPl79UsMxeY+vJjEggqqqRqbHRn6nOQd +3gKSaEqdALZURPzvkKxLUeUUtMk/tkFdsNe/ea7edk6G3MI4dbUY7p0XLS54S9cB +1JUAHNEFtuJQKGWNuwWO58Yun1EBtOdUEvnIIoQ+CIN/XeKrnEIXE3LSblB8BR3H +bqX54BMe9AzsmDQtc5pUOm2pfvCoiv8xFXQznBg24dGqo2A/jMoUnGj6oRj7k8mt +i9AdPLigldr0S0sAEQEAAbQhS3RvciBSZWxlYXNlIDxrdG9yQGpldGJyYWlucy5j +b20+uQGNBF+TCkEBDADafdzCGQlmG4e83+VsqAVCmiO1SlVkfwfgXpuXdnLx+rDz +f6FgkIwUcNwkBpTCQF3i457Mt50kKW4XIV9/uzSYM+VohUn273HmN0+2iExW0jW5 +LzxQf0jCnbPDnnfjc2qZ6B5ySmVks8zwsv9vLz6rcK3+IDJYMlTHLQaH+if2v8vz +MJ5r5DowJJOJcxhFZCBThXpWl1zAhpnv+Fwb9sNpoXfANwqzhpSi9PwDVqaw9at9 +fDRZgqlKqdIt7mlUA+Jl4jLe7t9zBquDuNeKCST97IdeTXV/NOGoVkp8pdLyEzQx +xdaCiLDdl8CaN/JVg9Jj/uwQRVq4KvRaUe+jMdQIpYu4RcHPQMkPkLXO5J3kSvk2 +cjtibogiN2HCPpa2G9H9Ar1TKKn1e5U4qy/fDryR11GVlEdFxVsugplbIXZLDzeA +FvEiFWVcMSINTnsKRp8W5yvvd58sEI+WbMLwym/825oRs1VocbTIfqjSmD68N/Ax +y7z0Vo3ZsUREArFvADUAEQEAAYkBvAQYAQoAJgIbDBYhBDlMtDbFaRb8Ae6kp3ww +97EynbqHBQJjUcQMBQkHgSDLAAoJEHww97EynbqH4rcL/0xgE9PanLa6WddRuN1k +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 +XwCWdYzvSwRp +=Hi5G +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 0000000..94c7c3f --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,474 @@ + + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..29d2731 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${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 "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# 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 ;; #( + MSYS* | 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" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat @@ -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/settings-gradle.lockfile b/settings-gradle.lockfile new file mode 100644 index 0000000..25f034e --- /dev/null +++ b/settings-gradle.lockfile @@ -0,0 +1,5 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +io.micronaut.platform:micronaut-platform:4.1.6=incomingCatalogForMn0 +empty=incomingCatalogForLibs0 diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..4ed64f7 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,74 @@ +@file:Suppress( + "UnstableApiUsage", + "DSL_SCOPE_VIOLATION", +) + +import build.less.plugin.settings.buildless + +pluginManagement { + repositories { + maven("https://gradle.pkg.st/") + maven("https://maven.pkg.st/") + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("build.less") version "1.0.0-beta1" + id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" +} + +val micronautVersion: String? by settings +val implementations = listOf( + "mysqlj", + "h2", // for testing +) + +val integrations = listOf( + "graalvm", + "micronaut", +) + +buildless { + // nothing at this time +} + +dependencyResolutionManagement { + repositoriesMode.set( + RepositoriesMode.FAIL_ON_PROJECT_REPOS + ) + repositories { + maven("https://gradle.pkg.st/") + maven("https://maven.pkg.st/") + mavenCentral() + gradlePluginPortal() + } + versionCatalogs { + create("mn") { + from("io.micronaut.platform:micronaut-platform:$micronautVersion") + } + } +} + +rootProject.name = "planetscale-connector-j" + +fun subproject(name: String) { + include(":subprojects:$name") +} + +listOf( + "catalog", + "core-api", + "driver", +).plus(implementations.map { + "impl-$it" +}).plus(integrations.map { + "integration-$it" +}).forEach( + ::subproject +) + +enableFeaturePreview("STABLE_CONFIGURATION_CACHE") +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +enableFeaturePreview("GROOVY_COMPILATION_AVOIDANCE") diff --git a/subprojects/catalog/build.gradle.kts b/subprojects/catalog/build.gradle.kts new file mode 100644 index 0000000..58bd583 --- /dev/null +++ b/subprojects/catalog/build.gradle.kts @@ -0,0 +1,11 @@ +import PlanetscaleBuild.publishable + +plugins { + id("common-conventions.kotlin") + id("planetscale-publishable.klib") +} + +publishable( + name = "planetscale-catalog", + description = "Gradle Version Catalog for Planetscale libraries", +) diff --git a/subprojects/catalog/gradle.lockfile b/subprojects/catalog/gradle.lockfile new file mode 100644 index 0000000..04b678d --- /dev/null +++ b/subprojects/catalog/gradle.lockfile @@ -0,0 +1,4 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +empty=compileClasspath,runtimeClasspath diff --git a/subprojects/core-api/build.gradle.kts b/subprojects/core-api/build.gradle.kts new file mode 100644 index 0000000..ea4fc22 --- /dev/null +++ b/subprojects/core-api/build.gradle.kts @@ -0,0 +1,34 @@ +import PlanetscaleBuild.publishable +import com.adarshr.gradle.testlogger.theme.ThemeType + +plugins { + id("planetscale-connector.klib") + id("planetscale-publishable.klib") + alias(libs.plugins.ksp) + alias(libs.plugins.sonar) + alias(libs.plugins.testLogger) + alias(libs.plugins.kover) +} + +testlogger { + theme = ThemeType.MOCHA +} + +dependencies { + api(libs.bundles.slf4j) + api(kotlin("stdlib")) + + testImplementation(libs.bundles.junit5) + testImplementation(libs.bundles.logback) + testImplementation(projects.subprojects.implH2) + testRuntimeOnly(libs.junit.jupiter.engine) +} + +kotlin { + compilerOptions.moduleName = "planetscale.connector" +} + +publishable( + name = "planetscale-api", + description = "Planetscale driver JDBC interfaces", +) diff --git a/subprojects/core-api/gradle.lockfile b/subprojects/core-api/gradle.lockfile new file mode 100644 index 0000000..e3b842c --- /dev/null +++ b/subprojects/core-api/gradle.lockfile @@ -0,0 +1,7 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,runtimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,runtimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,runtimeClasspath +empty= diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/Driver.kt b/subprojects/core-api/src/main/jvm/com/planetscale/Driver.kt new file mode 100644 index 0000000..cc2b673 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/Driver.kt @@ -0,0 +1,10 @@ +package com.planetscale + +import com.planetscale.jvm.driver.PlanetscaleDriver + +/** + * # Planetscale Connector/J + * + * TBD. + */ +public class Driver : PlanetscaleDriver() diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/DriverParameter.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/DriverParameter.kt new file mode 100644 index 0000000..e22d1a5 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/DriverParameter.kt @@ -0,0 +1,21 @@ +package com.planetscale.jvm + +/** + * TBD. + */ +public enum class DriverParameter ( + public val paramName: String, + internal val uriParam: String, + internal val vmProp: String, + internal val envVar: String? = null, +) { + /** + * TBD. + */ + ENABLE_BOOST( + "boost_cached_queries", + "enableBoost", + "planetscale.enableBoost", + "PLANETSCALE_ENABLE_BOOST", + ), +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleAdapter.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleAdapter.kt new file mode 100644 index 0000000..465c0cc --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleAdapter.kt @@ -0,0 +1,111 @@ +package com.planetscale.jvm + +import com.planetscale.jvm.err.PlanetscaleError +import java.io.Closeable +import java.sql.Connection +import java.sql.DriverPropertyInfo +import java.util.* +import java.util.logging.Logger + +/** + * # Planetscale Adapter + * + * Defines the API surface of internal logic for the Planetscale/J adapter; implementations of this interface must + * support querying on top of a backing database driver, like MySQL/J or H2 (for internal testing). The Planetscale + * adapter then manages the lifecycle of the underlying driver, connections, and so on. + * + *   + * + * ## Usage + * + * An implementation, such as `impl-mysqlj`, or `impl-h2`, must be included on the classpath and module path. The first + * implementation that is found is used through the regular adapter factory; it is an error to have multiple adapters on + * the classpath without declaring the adapter to use. + * + *   + * + * ### Declaring an Adapter + * + * The following methods are supported for declaring a forced implementation: + * + * - `PLANETSCALE_J_ADAPTER` environment variable, which must be set to one of `mysql` or `h2`. + * - `planetscale.adapter` VM property, which must be set to one of `mysql` or `h2`. + * + *   + * + * ### Using from JDBC + * + * For regular adapter users, the adapter is used transparently from JDBC. JDBC URLs with the prefix `planetscale` are + * registered for support through the backing driver implementation. JDBC URLs for this driver are expected to be + * expressed in the following format: + * + * #### JDBC URL Format + * + * - All driver URLs start with `jdbc:planetscale:`. + * - Next, following standard JDBC URL structure, the username and password are provided, as `username:password@`. + * - Next, the URL declares a connection symbol; valid connection symbols are defined in the next section. + * - The database name is provided, after a separating `/` + * - Finally, additional driver parameters are provided, as applicable, in URL param format. + * + *   + * + * #### Connection Symbols + * + * The driver is able to determine the optimal connection string to use based on the current cloud provider and database + * location. Thus, either the location must be provided, or the driver uses a generic connection endpoint. + * + * In addition to fully qualified domains provided within the Planetscale UI, the following special values are supported + * for smart connection management: + * + * - `cloud`: Connects to a generic, globally accelerated endpoint for Planetscale. If a provider can be detected in use + * (such as AWS), the connection string may be customized further by the driver. + * + * - `.`: Provider string (available options are `aws` or `gcp`), and the region of the database; when + * a connection symbol is provided in this format, an endpoint is used which is specific to the provider and region. + * + *   + * + * ### Driver Parameters + * + * This driver exposes several parameters, and allows control of the underlying driver through parameters documented by + * the MySQL Connector/J. The following parameters are supported: + * + * - (TBD). + */ +public interface PlanetscaleAdapter: Closeable, AutoCloseable { + /** + * TBD. + */ + public fun configure(config: PlanetscaleConfig) + + /** + * TBD. + */ + @Throws(PlanetscaleError::class) + public fun validate() + + /** + * TBD. + */ + public fun getMajorVersion(): Int + + /** + * TBD. + */ + public fun getMinorVersion(): Int + + /** + * TBD. + */ + public fun getPropertyInfo(url: String, info: Properties?): Array + + /** + * TBD. + */ + public fun getParentLogger(): Logger + + /** + * TBD. + */ + public fun connect(url: String, info: Properties? = null): Connection +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleConfig.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleConfig.kt new file mode 100644 index 0000000..514fa8d --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleConfig.kt @@ -0,0 +1,158 @@ +@file:Suppress("DataClassPrivateConstructor") + +package com.planetscale.jvm + +import com.planetscale.jvm.param.Defaults +import com.planetscale.jvm.param.ParameterSource +import com.planetscale.jvm.PlanetscaleParameter.EnableBoost +import com.planetscale.jvm.driver.Constants +import java.net.URI +import java.util.Properties +import java.util.SortedMap +import java.util.TreeMap + +/** + * TBD. + */ +public interface PlanetscaleConfig { + public companion object { + /** + * TBD. + */ + @JvmRecord public data class PlanetscaleConfigState internal constructor ( + override val uri: URI, + override val credential: PlanetscaleCredential, + val hosts: List, + val enableBoost: EnableBoost, + val extra: SortedMap, + ) : PlanetscaleConfig { + override val state: PlanetscaleConfigState get() = this + } + + /** + * TBD. + */ + private fun extractParams(uri: URI): Map { + return uri.query + ?.split("&") + ?.map { it.split("=") } + ?.associate { it[0] to it[1] } + ?: emptyMap() + } + + /** + * TBD. + */ + private fun extractHosts(uri: URI): List { + return uri.toString() + .substringAfter("@") + .substringBefore("/") + .trim() + .split(Constants.UrlTokens.HOST_SEPARATOR) + .map { it.trim() } + } + + /** + * TBD. + */ + private fun extraParamsOnly(map: Map): SortedMap { + return map.filterKeys { !PlanetscaleParameter.allKnownParamNames.contains(it) }.toSortedMap() + } + + /** + * TBD. + */ + @JvmStatic public fun parseUri(uri: String): URI { + return if (!uri.startsWith("jdbc:")) error("Cannot parse non-JDBC URIs") else URI.create( + // should be `planetscale://...` + uri.drop("jdbc:".length) + ) + } + + /** + * TBD. + */ + @JvmStatic public fun of( + uri: URI, + credential: PlanetscaleCredential, + source: ParameterSource = ParameterSource.PROGRAMMATIC, + enableBoost: Boolean = Defaults.enableBoost, + extra: SortedMap = TreeMap(), + ): PlanetscaleConfig = PlanetscaleConfigState( + uri, + credential, + hosts = extractHosts(uri), + enableBoost = EnableBoost.of(enableBoost, source), + extra = extra, + ) + + /** @return Set of default configurations for the provided [credential]. */ + @JvmStatic public fun defaults(uri: URI, credential: PlanetscaleCredential): PlanetscaleConfig = + extractParams(uri).let { params -> + PlanetscaleConfigState( + uri, + credential, + hosts = extractHosts(uri), + extra = extraParamsOnly(params), + enableBoost = EnableBoost.of( + EnableBoost.resolveOr(uri, params, null, Defaults.enableBoost) + ), + ) + } + + /** @return Configuration resolved from the provided [uri] and environment or VM property inputs. */ + @JvmStatic public fun resolve( + params: Map, + properties: Properties?, + uri: URI, + ): PlanetscaleConfig = PlanetscaleConfigState( + uri, + requireNotNull(PlanetscaleCredential.resolve(uri)) { "No Planetscale credential found" }, + hosts = extractHosts(uri), + enableBoost = EnableBoost.of(EnableBoost.resolveOr(uri, params, properties, Defaults.enableBoost)), + extra = extraParamsOnly(params), + ) + + /** @return Configuration resolved from provided args and environment or VM property inputs. */ + @JvmStatic public fun resolve(uri: URI, properties: Properties? = null): PlanetscaleConfig = resolve( + extractParams(uri), + properties, + uri, + ) + } + + /** + * TBD. + */ + public val state: PlanetscaleConfigState + + /** + * TBD. + */ + public val uri: URI + + /** + * TBD. + */ + public val credential: PlanetscaleCredential + + /** + * TBD. + */ + public fun enableBoost(): Boolean = state.enableBoost.value + + /** + * TBD. + */ + public fun multiHost(): Boolean = state.hosts.size > 1 + + /** + * TBD. + */ + public fun targetHosts(): List = state.hosts + + /** + * TBD. + */ + public fun extraParams(): SortedMap = state.extra +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleConnection.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleConnection.kt new file mode 100644 index 0000000..16fbe6b --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleConnection.kt @@ -0,0 +1,13 @@ +package com.planetscale.jvm + +import java.sql.Connection + +/** + * # Planetscale Connection + */ +public interface PlanetscaleConnection: Connection { + /** + * TBD. + */ + public val adapter: PlanetscaleAdapter +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleCredential.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleCredential.kt new file mode 100644 index 0000000..5ca701d --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleCredential.kt @@ -0,0 +1,95 @@ +package com.planetscale.jvm + +import com.planetscale.jvm.driver.Constants +import java.net.URI + +/** + * # Planetscale Credential + */ +public sealed interface PlanetscaleCredential { + /** + * TBD. + */ + public val database: String + + /** + * TBD. + */ + public val username: String + + /** + * TBD. + */ + public val password: String + + /** TBD. */ + public companion object { + private fun dbNameFromUri(uri: URI): String { + return uri.toString() + .drop("jdbc:planetscale://".length) + .substringAfter("/") + .substringBefore("?") + .trim() + } + + /** Lightweight wrapper for a validated Planetscale credential. */ + @JvmInline internal value class PlanetscaleUser( + private val credential: PlanetscaleCredentialInfo, + ): PlanetscaleCredential { + companion object { + @JvmStatic internal fun of(db: String, user: String, pass: String): PlanetscaleCredential { + return PlanetscaleUser(PlanetscaleCredentialInfo( + database = db, + username = user, + password = pass, + )) + } + } + + override val database: String get() = credential.database + override val username: String get() = credential.username + override val password: String get() = credential.password + } + + /** + * TBD. + */ + @JvmStatic public fun user(db: String, username: String, password: String): PlanetscaleCredential = + PlanetscaleUser.of(db, username, password) + + /** + * TBD. + */ + @JvmStatic public fun resolve(uri: URI): PlanetscaleCredential? { + val userInfo = uri.toString() + .substringAfter("://") + .substringBefore("@") + .trim() + + return userInfo.ifBlank { null }?.let { + when { + it.contains(":") -> it.split(":").let { split -> + if (split.size == 2) { + val user = split.first().ifEmpty { null } + val pass = split[1].ifEmpty { null } + if (user.isNullOrBlank() || pass.isNullOrBlank()) (null to null) else { + user to pass + } + } else error( + "Invalid user/password specification in database URI" + ) + } + else -> it to null + }.let { (user, pass) -> + ( + user ?: System.getProperty(Constants.USER_VM_PROPERTY, System.getenv(Constants.USER_ENV_VAR)) + ) to ( + pass ?: System.getProperty(Constants.PASS_VM_PROPERTY, System.getenv(Constants.PASS_ENV_VAR)) + ) + } + }?.let { (user, pass) -> + PlanetscaleUser.of(dbNameFromUri(uri), user, pass) + } + } + } +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleCredentialInfo.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleCredentialInfo.kt new file mode 100644 index 0000000..6bfdbd7 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleCredentialInfo.kt @@ -0,0 +1,10 @@ +package com.planetscale.jvm + +/** + * TBD. + */ +@JvmRecord internal data class PlanetscaleCredentialInfo( + val database: String, + val username: String, + val password: String, +) diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleParameter.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleParameter.kt new file mode 100644 index 0000000..f131211 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/PlanetscaleParameter.kt @@ -0,0 +1,69 @@ +package com.planetscale.jvm + +import com.planetscale.jvm.param.Parameter +import com.planetscale.jvm.param.ParameterName +import com.planetscale.jvm.param.ParameterSource +import java.util.SortedSet +import kotlin.reflect.KClass + +/** + * # Planetscale Parameter + */ +public sealed interface PlanetscaleParameter { + /** + * TBD. + */ + public val key: DriverParameter + + /** + * TBD. + */ + public val value: Type + + /** + * TBD. + */ + public val param: Parameter + + /** + * TBD. + */ + public val source: ParameterSource + + public companion object { + // All configured driver options. + private val allDriverOptions: List> = listOf( + EnableBoost.Companion, + ) + + // All parameter names that are specific to this meta-driver. + internal val allKnownParamNames: SortedSet = allDriverOptions.map { it.option.paramName }.toSortedSet() + } + + /** + * Parameter: `enableBoost`. + */ + @JvmInline public value class EnableBoost(private val status: Pair) : + PlanetscaleParameter { + override val key: DriverParameter get() = DriverParameter.ENABLE_BOOST + override val param: Parameter get() = Parameter.literal(key.name, status.second) + override val source: ParameterSource get() = status.first + override val value: Boolean get() = status.second + + public companion object: Parameter.BooleanOptionFactory(DriverParameter.ENABLE_BOOST) { + /** @return "Enable Boost" setting with the provided [enabled] status, and optional [source]. */ + @JvmStatic public fun of( + enabled: Boolean, + source: ParameterSource = ParameterSource.PROGRAMMATIC, + ): EnableBoost = EnableBoost(source to enabled) + + /** @return Enabled Boost setting, with optional [source]. */ + @JvmStatic public fun enabled(source: ParameterSource = ParameterSource.PROGRAMMATIC): EnableBoost = + of(true, source) + + /** @return Disabled Boost setting, with optional [source]. */ + @JvmStatic public fun disabled(source: ParameterSource = ParameterSource.PROGRAMMATIC): EnableBoost = + of(false, source) + } + } +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/AbstractPlanetscaleAdapter.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/AbstractPlanetscaleAdapter.kt new file mode 100644 index 0000000..8da12a8 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/AbstractPlanetscaleAdapter.kt @@ -0,0 +1,87 @@ +package com.planetscale.jvm.driver + +import com.planetscale.jvm.PlanetscaleAdapter +import com.planetscale.jvm.PlanetscaleConfig +import com.planetscale.jvm.PlanetscaleConnection +import java.io.Closeable +import java.net.URI +import java.sql.Connection +import java.sql.Driver +import java.sql.DriverPropertyInfo +import java.util.* +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference +import java.util.logging.Logger + +/** + * TBD. + */ +public abstract class AbstractPlanetscaleAdapter : PlanetscaleAdapter, Closeable, AutoCloseable { + private val configuration: AtomicReference = AtomicReference(null) + private val initialized: AtomicBoolean = AtomicBoolean(false) + + private val backing: Driver by lazy { + createDriver() + } + + override fun configure(config: PlanetscaleConfig) { + if (!initialized.get()) { + configuration.set(config) + initialized.compareAndSet(false, true) + } + } + + override fun validate() { + require(configuration.get() != null && initialized.get()) { + "Cannot create Planetscale adapter without configuration" + } + } + + override fun connect(url: String, info: Properties?): Connection { + return PlanetscaleConfig.resolve(PlanetscaleConfig.parseUri(url), info).let { config -> + configure(config) + config.connectBacking(config.toURI(), info) + } + } + + override fun close() { + // nothing at this time + } + + override fun getMajorVersion(): Int = withDriver { it.majorVersion } + override fun getMinorVersion(): Int = withDriver { it.minorVersion } + override fun getParentLogger(): Logger = withDriver { it.parentLogger } + override fun getPropertyInfo(url: String, info: Properties?): Array = withDriver { + it.getPropertyInfo(url, info) + } + + /** + * TBD. + */ + protected open fun withDriver(op: (Driver) -> R): R { + return op(backing) + } + + /** + * TBD. + */ + protected open fun PlanetscaleConfig.connectBacking(uri: URI, info: Properties?): PlanetscaleConnection { + return withDriver { driver -> + driver.connect(toURI().toString(), info).let { connection -> + object: PlanetscaleConnection, Connection by connection { + override val adapter: AbstractPlanetscaleAdapter get() = this@AbstractPlanetscaleAdapter + } + } + } + } + + /** + * TBD. + */ + protected abstract fun createDriver(): Driver + + /** + * TBD. + */ + protected abstract fun PlanetscaleConfig.toURI(): URI +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/CloudProvider.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/CloudProvider.kt new file mode 100644 index 0000000..d59daf1 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/CloudProvider.kt @@ -0,0 +1,9 @@ +package com.planetscale.jvm.driver + +/** + * TBD. + */ +public enum class CloudProvider { + AWS, + GCP +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/Constants.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/Constants.kt new file mode 100644 index 0000000..14c4071 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/Constants.kt @@ -0,0 +1,53 @@ +package com.planetscale.jvm.driver + +/** + * TBD. + */ +public data object Constants { + public const val MYSQL_PORT: Int = 3306 + public const val MYSQL_DRIVER: String = "com.mysql.cj.jdbc.Driver" + public const val CONNECT_DOMAIN: String = "connect.psdb.cloud" + public const val USER_VM_PROPERTY: String = "planetscale.username" + public const val USER_ENV_VAR: String = "PLANETSCALE_USERNAME" + public const val PASS_VM_PROPERTY: String = "planetscale.password" + public const val PASS_ENV_VAR: String = "PLANETSCALE_PASSWORD" + + public data object DriverParams { + public const val AUTO_RECONNECT: String = "autoReconnect" + public const val CACHE_SERVER_CONFIG: String = "cacheServerConfiguration" + public const val CACHE_RESULT_SET_METADATA: String = "cacheResultSetMetadata" + public const val SSL_MODE: String = "sslMode" + public const val SSL_MODE_VERIFY: String = "VERIFY_IDENTITY" + public const val SESSION_VARIABLES: String = "sessionVariables" + public const val ROUND_ROBIN_LOAD_BALANCE: String = "roundRobinLoadBalance" + } + + public data object UrlTokens { + public const val HOST_SEPARATOR: String = ".." + } + + public data object StringValue { + public const val TRUE: String = "true" + public const val FALSE: String = "false" + } + + public data object Prefix { + public const val MYSQL: String = "jdbc:mysql:" + public const val REPLICATION: String = "replication:" + public const val H2: String = "jdbc:h2:mem" + public const val PLANETSCALE: String = "jdbc:planetscale:" + } + + public data object SymbolicHosts { + public const val CLOUD: String = "cloud" + public const val AWS: String = Provider.AWS + public const val GCP: String = Provider.GCP + } + + public data object Provider { + public const val AWS: String = "aws" + public const val GCP: String = "gcp" + public const val GCP_CREDS_VAR: String = "GOOGLE_APPLICATION_CREDENTIALS" + public const val AWS_CREDS_VAR: String = "AWS_ACCESS_KEY_ID" + } +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/PlanetscaleDriver.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/PlanetscaleDriver.kt new file mode 100644 index 0000000..7ecd2f8 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/PlanetscaleDriver.kt @@ -0,0 +1,68 @@ +package com.planetscale.jvm.driver + +import com.planetscale.jvm.PlanetscaleAdapter +import java.io.Closeable +import java.sql.Connection +import java.sql.Driver +import java.sql.DriverPropertyInfo +import java.util.* +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference +import java.util.logging.Logger +import java.util.stream.Collectors + +/** + * TBD. + */ +public abstract class PlanetscaleDriver: Driver, Closeable, AutoCloseable { + private companion object { + @JvmStatic fun resolveImpl(): PlanetscaleAdapter { + val serviceImpls = ServiceLoader.load(PlanetscaleAdapter::class.java) + .stream() + .collect(Collectors.toUnmodifiableList()) + + require(serviceImpls.size == 1) { + "Expected exactly one Planetscale adapter implementation, but got ${serviceImpls.size}" + } + return serviceImpls.first().get() + } + } + + // Active adapter and state. + private val activeAdapter: AtomicReference = AtomicReference(null) + private val initialized: AtomicBoolean = AtomicBoolean(false) + + private fun obtainOrInitializeDriver() { + if (!initialized.get()) synchronized(this) { + activeAdapter.set(resolveImpl()) + initialized.compareAndSet(false, true) + } + } + + private fun withAdapter(op: PlanetscaleAdapter.() -> R): R { + if (!initialized.get()) { + obtainOrInitializeDriver() + } + return activeAdapter.get().op() + } + + private fun obtainDriver(url: String, info: Properties?): Connection { + obtainOrInitializeDriver() + return withAdapter { + connect(url, info) + } + } + + // -- API: JDBC Driver -- // + + override fun connect(url: String, info: Properties?): Connection = obtainDriver(url, info) + override fun getMajorVersion(): Int = withAdapter { getMajorVersion() } + override fun getMinorVersion(): Int = withAdapter { getMinorVersion() } + override fun jdbcCompliant(): Boolean = true // both H2 and mysql are JDBC compliant + override fun acceptsURL(url: String?): Boolean = url?.startsWith(Constants.Prefix.PLANETSCALE) ?: false + override fun getParentLogger(): Logger = withAdapter { getParentLogger() } + override fun close(): Unit = withAdapter { close() } + override fun getPropertyInfo(url: String, info: Properties?): Array = withAdapter { + getPropertyInfo(url, info) + } +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/package-info.java b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/package-info.java new file mode 100644 index 0000000..27defd7 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/driver/package-info.java @@ -0,0 +1,4 @@ +/** + * Abstract driver implementation; loads the driver and provides a connection factory. + */ +package com.planetscale.jvm.driver; diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/err/PlanetscaleError.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/err/PlanetscaleError.kt new file mode 100644 index 0000000..1c39cb3 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/err/PlanetscaleError.kt @@ -0,0 +1,6 @@ +package com.planetscale.jvm.err + +/** + * TBD. + */ +internal sealed class PlanetscaleError: Throwable() diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/err/package-info.java b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/err/package-info.java new file mode 100644 index 0000000..3ae2341 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/err/package-info.java @@ -0,0 +1,4 @@ +/** + * Defines error handling logic and exception cases for the Planetscale/J driver. + */ +package com.planetscale.jvm.err; diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/Defaults.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/Defaults.kt new file mode 100644 index 0000000..2f23c05 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/Defaults.kt @@ -0,0 +1,11 @@ +package com.planetscale.jvm.param + +/** + * + */ +public data object Defaults { + /** + * + */ + public const val enableBoost: Boolean = false +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/DriverParamTypes.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/DriverParamTypes.kt new file mode 100644 index 0000000..cb796f5 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/DriverParamTypes.kt @@ -0,0 +1,7 @@ +package com.planetscale.jvm.param + + +/** + * TBD. + */ +public typealias ParameterName = String diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/Parameter.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/Parameter.kt new file mode 100644 index 0000000..28a3bb5 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/Parameter.kt @@ -0,0 +1,85 @@ +package com.planetscale.jvm.param + +import com.planetscale.jvm.DriverParameter +import java.net.URI +import java.util.Properties + +/** + * # Driver Parameter + * + */ +public sealed interface Parameter { + /** + * TBD. + */ + public val name: ParameterName + + /** + * TBD. + */ + public val value: V? + + /** Models the concept of a literal value as a driver parameter. */ + @JvmInline public value class LiteralParameter(private val pair: Pair) : Parameter { + override val name: ParameterName get() = pair.first + override val value: V? get() = pair.second + } + + /** + * TBD. + */ + @FunctionalInterface public fun interface ParameterFactory { + /** + * TBD. + */ + public fun parse(optionValue: String): V? + } + + /** + * TBD. + */ + public sealed interface ParameterParser: ParameterFactory { + /** @return Driver parameter controlled by this namer. */ + public val option: DriverParameter + + /** @return URI parameter name for this option. */ + public fun uriName(): String = option.uriParam + + /** @return Environment variable name for this parser. */ + public fun envName(): String? = option.envVar + + /** @return VM property name for this parameter. */ + public fun vmPropName(): String = option.vmProp + + /** @return Resolved value of this parameter, if available, or `null`. */ + public fun resolve(uri: URI, params: Map, properties: Properties?): V? { + return params[uriName()]?.let { parse(it) } + ?: envName()?.let { System.getenv(it) }?.let { parse(it) } + ?: properties?.getProperty(vmPropName())?.let { parse(it) } + ?: System.getProperty(vmPropName())?.let { parse(it) } + } + + /** @return Resolved value of this parameter, if available, or `null`. */ + public fun resolveOr(uri: URI, params: Map, properties: Properties?, default: V): V { + return resolve(uri, params, properties) ?: default + } + } + + /** TBD. */ + public abstract class BooleanOptionFactory (override val option: DriverParameter): ParameterParser { + override fun parse(optionValue: String): Boolean? = optionValue.toBooleanStrictOrNull() + } + + /** TBD. */ + public abstract class StringOptionFactory (override val option: DriverParameter): ParameterParser { + override fun parse(optionValue: String): String? = optionValue.let { it.ifBlank { null } } + } + + public companion object { + /** + * TBD. + */ + @JvmStatic public fun literal(name: ParameterName, value: V?): Parameter = + LiteralParameter(name to value) + } +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/ParameterSource.kt b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/ParameterSource.kt new file mode 100644 index 0000000..a692716 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/ParameterSource.kt @@ -0,0 +1,18 @@ +package com.planetscale.jvm.param + +/** + * TBD. + */ +public enum class ParameterSource { + /** The value originates from the driver URL. */ + URL, + + /** The value originates from environment variables. */ + ENVIRONMENT, + + /** The value originates from VM properties. */ + VM_PROPERTY, + + /** The value is a default or provided programmatically. */ + PROGRAMMATIC, +} diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/package-info.java b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/package-info.java new file mode 100644 index 0000000..4929dc9 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/jvm/param/package-info.java @@ -0,0 +1,4 @@ +/** + * Defines parameter-parsing logic for the Planetscale/J driver. + */ +package com.planetscale.jvm.param; diff --git a/subprojects/core-api/src/main/jvm/com/planetscale/package-info.java b/subprojects/core-api/src/main/jvm/com/planetscale/package-info.java new file mode 100644 index 0000000..4263c8d --- /dev/null +++ b/subprojects/core-api/src/main/jvm/com/planetscale/package-info.java @@ -0,0 +1,4 @@ +/** + * Provides Planetscale-specific JDBC drivers and utilities. + */ +package com.planetscale; diff --git a/subprojects/core-api/src/main/jvm/module-info.java b/subprojects/core-api/src/main/jvm/module-info.java new file mode 100644 index 0000000..2199cf1 --- /dev/null +++ b/subprojects/core-api/src/main/jvm/module-info.java @@ -0,0 +1,16 @@ +/** + * # PlanetScale Connector/J + * + *

Wraps the MySQL Connector for Java with functionality specific to Planetscale, which leverages MySQL-compatible + * cloud databasing via Vitess.

+ */ +module planetscale.connector { + requires java.base; + requires java.sql; + requires kotlin.stdlib; + + exports com.planetscale.jvm; + exports com.planetscale.jvm.driver; + + provides java.sql.Driver with com.planetscale.Driver; +} diff --git a/subprojects/core-api/src/main/resources/META-INF/services/java.sql.Driver b/subprojects/core-api/src/main/resources/META-INF/services/java.sql.Driver new file mode 100644 index 0000000..ae325c9 --- /dev/null +++ b/subprojects/core-api/src/main/resources/META-INF/services/java.sql.Driver @@ -0,0 +1 @@ +com.planetscale.Driver diff --git a/subprojects/core-api/src/main/resources/logback-test.xml b/subprojects/core-api/src/main/resources/logback-test.xml new file mode 100644 index 0000000..203c544 --- /dev/null +++ b/subprojects/core-api/src/main/resources/logback-test.xml @@ -0,0 +1,13 @@ + + + true + + [%cyan(%d{HH:mm:ss.SSS}) %highlight(%5level)] %boldWhite(%logger) %msg%n + + + + + + + + diff --git a/subprojects/core-api/src/test/kotlin/com/planetscale/DriverTest.kt b/subprojects/core-api/src/test/kotlin/com/planetscale/DriverTest.kt new file mode 100644 index 0000000..a1ce466 --- /dev/null +++ b/subprojects/core-api/src/test/kotlin/com/planetscale/DriverTest.kt @@ -0,0 +1,50 @@ +package com.planetscale + +import org.junit.jupiter.api.assertDoesNotThrow +import java.util.ServiceLoader +import kotlin.test.Test +import kotlin.test.assertNotEquals +import kotlin.test.assertNotNull +import kotlin.test.assertTrue + +/** Tests for the main driver facade, at [com.planetscale.Driver]. */ +class DriverTest { + private val testDriver: Driver by lazy { + Driver() + } + + private fun withDriver(op: Driver.() -> Unit) { + assertNotNull(testDriver, "should be able to obtain test driver") + op.invoke(testDriver) + } + + @Test fun testDriverConstruct() { + assertDoesNotThrow { + Driver() + } + } + + @Test fun testDriverAPI() = withDriver { + assertNotNull(majorVersion, "majorVersion should not return `null`") + assertNotNull(minorVersion, "majorVersion should not return `null`") + } + + @Test fun testDriverMajorVersion() = withDriver { + assertNotNull(majorVersion, "majorVersion should not return `null`") + assertNotEquals(0, majorVersion, "majorVersion should not be `0`") + } + + @Test fun testDriverMinorVersion() = withDriver { + assertNotNull(minorVersion, "minorVersion should not return `null`") + assertNotEquals(0, minorVersion, "minorVersion should not be `0`") + } + + @Test fun testDriverServiceLoader() { + val all = ServiceLoader.load(java.sql.Driver::class.java) + .toList() + .map { it::class } + + assertNotEquals(0, all.size, "should have at least one driver") + assertTrue(all.contains(Driver::class), "should contain our driver") + } +} diff --git a/subprojects/core-api/src/test/kotlin/com/planetscale/jvm/PlanetscaleConfigTest.kt b/subprojects/core-api/src/test/kotlin/com/planetscale/jvm/PlanetscaleConfigTest.kt new file mode 100644 index 0000000..3e779ac --- /dev/null +++ b/subprojects/core-api/src/test/kotlin/com/planetscale/jvm/PlanetscaleConfigTest.kt @@ -0,0 +1,128 @@ +package com.planetscale.jvm + +import kotlin.test.* + +/** Tests for Planetscale configuration classes, like [PlanetscaleConfig]. */ +class PlanetscaleConfigTest { + @Test fun testConfigDefaults() { + val cfg = PlanetscaleConfig.defaults( + PlanetscaleConfig.parseUri("jdbc:planetscale://user:pass@us-west-1.aws/dbname"), + PlanetscaleCredential.user("dbname", "user", "pass"), + ) + assertNotNull(cfg, "config should not be null") + assertNotNull(cfg.uri, "URI in config should not be null") + assertNotNull(cfg.credential, "credential in config should not be null") + assertNotNull(cfg.enableBoost(), "`enableBoost` should never return null") + assertNotNull(cfg.multiHost(), "`multiHost` should never return null") + assertNotNull(cfg.targetHosts(), "`targetHosts` should never return null") + assertTrue(cfg.targetHosts().isNotEmpty(), "`targetHosts` should not be empty") + assertEquals(cfg.credential.database, "dbname", "database name should be extracted correctly") + assertEquals(cfg.credential.username, "user", "username should be extracted correctly") + assertEquals(cfg.credential.password, "pass", "password should be extracted correctly") + assertEquals(cfg.targetHosts().size, 1, "should have 1 target host") + assertEquals(cfg.targetHosts().first(), "us-west-1.aws") + assertFalse(cfg.enableBoost(), "boost should default to false") + } + + @Test fun testConfigManual() { + val cfg = PlanetscaleConfig.of( + PlanetscaleConfig.parseUri("jdbc:planetscale://user:pass@us-west-1.aws/dbname"), + PlanetscaleCredential.user("dbname", "user", "pass"), + ) + assertNotNull(cfg, "config should not be null") + assertNotNull(cfg.uri, "URI in config should not be null") + assertNotNull(cfg.credential, "credential in config should not be null") + assertNotNull(cfg.enableBoost(), "`enableBoost` should never return null") + assertNotNull(cfg.multiHost(), "`multiHost` should never return null") + assertNotNull(cfg.targetHosts(), "`targetHosts` should never return null") + assertTrue(cfg.targetHosts().isNotEmpty(), "`targetHosts` should not be empty") + assertEquals(cfg.credential.database, "dbname", "database name should be extracted correctly") + assertEquals(cfg.credential.username, "user", "username should be extracted correctly") + assertEquals(cfg.credential.password, "pass", "password should be extracted correctly") + assertEquals(cfg.targetHosts().size, 1, "should have 1 target host") + assertEquals(cfg.targetHosts().first(), "us-west-1.aws") + assertFalse(cfg.enableBoost(), "boost should default to false") + } + + @Test fun testConfigResolveFromUri() { + val cfg = PlanetscaleConfig.resolve( + PlanetscaleConfig.parseUri("jdbc:planetscale://user:pass@us-west-1.aws/dbname"), + ) + assertNotNull(cfg, "config should not be null") + assertNotNull(cfg.uri, "URI in config should not be null") + assertNotNull(cfg.credential, "credential in config should not be null") + assertNotNull(cfg.enableBoost(), "`enableBoost` should never return null") + assertNotNull(cfg.multiHost(), "`multiHost` should never return null") + assertNotNull(cfg.targetHosts(), "`targetHosts` should never return null") + assertTrue(cfg.targetHosts().isNotEmpty(), "`targetHosts` should not be empty") + assertEquals(cfg.credential.database, "dbname", "database name should be extracted correctly") + assertEquals(cfg.credential.username, "user", "username should be extracted correctly") + assertEquals(cfg.credential.password, "pass", "password should be extracted correctly") + assertEquals(cfg.targetHosts().size, 1, "should have 1 target host") + assertEquals(cfg.targetHosts().first(), "us-west-1.aws") + assertFalse(cfg.enableBoost(), "boost should default to false") + } + + @Test fun testConfigResolveFromUriMultiHost() { + val cfg = PlanetscaleConfig.resolve( + PlanetscaleConfig.parseUri("jdbc:planetscale://user:pass@us-west-1.aws..aws/dbname"), + ) + assertNotNull(cfg, "config should not be null") + assertNotNull(cfg.uri, "URI in config should not be null") + assertNotNull(cfg.credential, "credential in config should not be null") + assertNotNull(cfg.enableBoost(), "`enableBoost` should never return null") + assertNotNull(cfg.multiHost(), "`multiHost` should never return null") + assertNotNull(cfg.targetHosts(), "`targetHosts` should never return null") + assertTrue(cfg.targetHosts().isNotEmpty(), "`targetHosts` should not be empty") + assertEquals(cfg.credential.database, "dbname", "database name should be extracted correctly") + assertEquals(cfg.credential.username, "user", "username should be extracted correctly") + assertEquals(cfg.credential.password, "pass", "password should be extracted correctly") + assertEquals(cfg.targetHosts().size, 2, "should have 2 target hosts") + assertEquals(cfg.targetHosts().first(), "us-west-1.aws") + assertEquals(cfg.targetHosts()[1], "aws") + assertFalse(cfg.enableBoost(), "boost should default to false") + } + + @Test fun testConfigKnownOptions() { + val cfg = PlanetscaleConfig.resolve( + PlanetscaleConfig.parseUri("jdbc:planetscale://user:pass@us-west-1.aws..aws/dbname?enableBoost=true"), + ) + assertNotNull(cfg, "config should not be null") + assertNotNull(cfg.uri, "URI in config should not be null") + assertNotNull(cfg.credential, "credential in config should not be null") + assertNotNull(cfg.enableBoost(), "`enableBoost` should never return null") + assertNotNull(cfg.multiHost(), "`multiHost` should never return null") + assertNotNull(cfg.targetHosts(), "`targetHosts` should never return null") + assertTrue(cfg.targetHosts().isNotEmpty(), "`targetHosts` should not be empty") + assertEquals(cfg.credential.database, "dbname", "database name should be extracted correctly") + assertEquals(cfg.credential.username, "user", "username should be extracted correctly") + assertEquals(cfg.credential.password, "pass", "password should be extracted correctly") + assertEquals(cfg.targetHosts().size, 2, "should have 2 target hosts") + assertEquals(cfg.targetHosts().first(), "us-west-1.aws") + assertEquals(cfg.targetHosts()[1], "aws") + assertTrue(cfg.enableBoost(), "boost should be active") + } + + @Test fun testConfigPassthrough() { + val cfg = PlanetscaleConfig.resolve( + PlanetscaleConfig.parseUri("jdbc:planetscale://user:pass@us-west-1.aws..aws/dbname?someParam=hi"), + ) + assertNotNull(cfg, "config should not be null") + assertNotNull(cfg.uri, "URI in config should not be null") + assertNotNull(cfg.credential, "credential in config should not be null") + assertNotNull(cfg.enableBoost(), "`enableBoost` should never return null") + assertNotNull(cfg.multiHost(), "`multiHost` should never return null") + assertNotNull(cfg.targetHosts(), "`targetHosts` should never return null") + assertTrue(cfg.targetHosts().isNotEmpty(), "`targetHosts` should not be empty") + assertEquals(cfg.credential.database, "dbname", "database name should be extracted correctly") + assertEquals(cfg.credential.username, "user", "username should be extracted correctly") + assertEquals(cfg.credential.password, "pass", "password should be extracted correctly") + assertEquals(cfg.targetHosts().size, 2, "should have 2 target hosts") + assertEquals(cfg.targetHosts().first(), "us-west-1.aws") + assertEquals(cfg.targetHosts()[1], "aws") + assertFalse(cfg.enableBoost(), "boost should default to false") + assertTrue(cfg.extraParams().isNotEmpty(), "should have extra params") + assertTrue(cfg.extraParams().contains("someParam"), "unrecognized param should be in `someParams`") + assertEquals(cfg.extraParams()["someParam"], "hi", "`someParam` should be set to `hi`") + } +} diff --git a/subprojects/driver/build.gradle.kts b/subprojects/driver/build.gradle.kts new file mode 100644 index 0000000..1b74b83 --- /dev/null +++ b/subprojects/driver/build.gradle.kts @@ -0,0 +1,16 @@ +import PlanetscaleBuild.publishable + +plugins { + id("common-conventions.kotlin") + id("planetscale-publishable.klib") +} + +dependencies { + api(projects.subprojects.coreApi) + implementation(projects.subprojects.implMysqlj) +} + +publishable( + name = "planetscale-jvm", + description = "Planetscale JDBC meta-driver", +) diff --git a/subprojects/driver/gradle.lockfile b/subprojects/driver/gradle.lockfile new file mode 100644 index 0000000..496aa7c --- /dev/null +++ b/subprojects/driver/gradle.lockfile @@ -0,0 +1,9 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +com.google.protobuf:protobuf-java:3.21.9=runtimeClasspath +com.mysql:mysql-connector-j:8.2.0=runtimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,runtimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,runtimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,runtimeClasspath +empty= diff --git a/subprojects/impl-h2/build.gradle.kts b/subprojects/impl-h2/build.gradle.kts new file mode 100644 index 0000000..81404c1 --- /dev/null +++ b/subprojects/impl-h2/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("planetscale-connector.klib") +} + +dependencies { + api(projects.subprojects.coreApi) + implementation(libs.bundles.h2) +} + +kotlin { + compilerOptions.moduleName = "planetscale.connector.inmemory" +} diff --git a/subprojects/impl-h2/gradle.lockfile b/subprojects/impl-h2/gradle.lockfile new file mode 100644 index 0000000..22bbebf --- /dev/null +++ b/subprojects/impl-h2/gradle.lockfile @@ -0,0 +1,8 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +com.h2database:h2:2.2.224=compileClasspath,runtimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,runtimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,runtimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,runtimeClasspath +empty= diff --git a/subprojects/impl-h2/src/main/jvm/com/planetscale/jvm/h2/PlanetscaleH2Driver.kt b/subprojects/impl-h2/src/main/jvm/com/planetscale/jvm/h2/PlanetscaleH2Driver.kt new file mode 100644 index 0000000..e60fd26 --- /dev/null +++ b/subprojects/impl-h2/src/main/jvm/com/planetscale/jvm/h2/PlanetscaleH2Driver.kt @@ -0,0 +1,35 @@ +package com.planetscale.jvm.h2 + +import com.planetscale.jvm.PlanetscaleConfig +import com.planetscale.jvm.driver.AbstractPlanetscaleAdapter +import com.planetscale.jvm.driver.Constants +import java.net.URI +import java.sql.Connection +import java.sql.Driver +import java.sql.DriverManager +import java.sql.DriverPropertyInfo +import java.util.* +import java.util.logging.Logger + +/** + * TBD. + */ +public class PlanetscaleH2Driver : AbstractPlanetscaleAdapter() { + private companion object { + private const val H2_DRIVER = "org.h2.Driver" + } + + override fun PlanetscaleConfig.toURI(): URI { + return URI.create( + "jdbc:h2:mem:${credential.database};MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;" + ) + } + + override fun createDriver(): Driver { + return DriverManager.drivers().filter { + it.javaClass.canonicalName == H2_DRIVER + }.findFirst().orElse(null) ?: error( + "Failed to resolve H2 driver: check your classpath?" + ) + } +} diff --git a/subprojects/impl-h2/src/main/jvm/module-info.java b/subprojects/impl-h2/src/main/jvm/module-info.java new file mode 100644 index 0000000..191a8ee --- /dev/null +++ b/subprojects/impl-h2/src/main/jvm/module-info.java @@ -0,0 +1,9 @@ +/** + * Planetscale/J: H2-based implementation. + */ +module planetscale.connector.inmemory { + requires java.base; + requires java.sql; + requires kotlin.stdlib; + requires planetscale.connector; +} diff --git a/subprojects/impl-h2/src/main/resources/META-INF/native-image/proxy-config.json b/subprojects/impl-h2/src/main/resources/META-INF/native-image/proxy-config.json new file mode 100644 index 0000000..fbfaf87 --- /dev/null +++ b/subprojects/impl-h2/src/main/resources/META-INF/native-image/proxy-config.json @@ -0,0 +1,5 @@ +[ + { + "interfaces":["java.sql.Connection"] + } +] \ No newline at end of file diff --git a/subprojects/impl-h2/src/main/resources/META-INF/native-image/reflect-config.json b/subprojects/impl-h2/src/main/resources/META-INF/native-image/reflect-config.json new file mode 100644 index 0000000..99e9a90 --- /dev/null +++ b/subprojects/impl-h2/src/main/resources/META-INF/native-image/reflect-config.json @@ -0,0 +1,5 @@ +[ + { + "name":"com.planetscale.Driver" + } +] \ No newline at end of file diff --git a/subprojects/impl-h2/src/main/resources/META-INF/native-image/resource-config.json b/subprojects/impl-h2/src/main/resources/META-INF/native-image/resource-config.json new file mode 100644 index 0000000..a271675 --- /dev/null +++ b/subprojects/impl-h2/src/main/resources/META-INF/native-image/resource-config.json @@ -0,0 +1,12 @@ +{ + "resources": { + "includes": [ + { + "pattern": "\\QMETA-INF/services/java.sql.Driver\\E" + }, + { + "pattern": "\\QMETA-INF/services/com.planetscale.jvm.PlanetscaleAdapter\\E" + } + ] + } +} \ No newline at end of file diff --git a/subprojects/impl-h2/src/main/resources/META-INF/services/com.planetscale.jvm.PlanetscaleAdapter b/subprojects/impl-h2/src/main/resources/META-INF/services/com.planetscale.jvm.PlanetscaleAdapter new file mode 100644 index 0000000..a6a0a7c --- /dev/null +++ b/subprojects/impl-h2/src/main/resources/META-INF/services/com.planetscale.jvm.PlanetscaleAdapter @@ -0,0 +1 @@ +com.planetscale.jvm.h2.PlanetscaleH2Driver diff --git a/subprojects/impl-mysqlj/build.gradle.kts b/subprojects/impl-mysqlj/build.gradle.kts new file mode 100644 index 0000000..5e51678 --- /dev/null +++ b/subprojects/impl-mysqlj/build.gradle.kts @@ -0,0 +1,22 @@ +import PlanetscaleBuild.publishable + +plugins { + id("planetscale-connector.klib") + alias(libs.plugins.sonar) + alias(libs.plugins.testLogger) + alias(libs.plugins.kover) +} + +dependencies { + api(projects.subprojects.coreApi) + implementation(libs.bundles.mysql) +} + +kotlin { + compilerOptions.moduleName = "planetscale.connector.mysqlj" +} + +publishable( + name = "planetscale-mysqlj", + description = "Planetscale driver MySQL/J implementation (internal)", +) diff --git a/subprojects/impl-mysqlj/gradle.lockfile b/subprojects/impl-mysqlj/gradle.lockfile new file mode 100644 index 0000000..82918d5 --- /dev/null +++ b/subprojects/impl-mysqlj/gradle.lockfile @@ -0,0 +1,9 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +com.google.protobuf:protobuf-java:3.21.9=compileClasspath,runtimeClasspath +com.mysql:mysql-connector-j:8.2.0=compileClasspath,runtimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,runtimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,runtimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,runtimeClasspath +empty= diff --git a/subprojects/impl-mysqlj/src/main/jvm/com/planetscale/jvm/mysqlj/PlanetscaleMysqlDriver.kt b/subprojects/impl-mysqlj/src/main/jvm/com/planetscale/jvm/mysqlj/PlanetscaleMysqlDriver.kt new file mode 100644 index 0000000..69581e6 --- /dev/null +++ b/subprojects/impl-mysqlj/src/main/jvm/com/planetscale/jvm/mysqlj/PlanetscaleMysqlDriver.kt @@ -0,0 +1,160 @@ +package com.planetscale.jvm.mysqlj + +import com.planetscale.jvm.PlanetscaleConfig +import com.planetscale.jvm.PlanetscaleCredential +import com.planetscale.jvm.PlanetscaleParameter +import com.planetscale.jvm.driver.AbstractPlanetscaleAdapter +import com.planetscale.jvm.driver.CloudProvider +import com.planetscale.jvm.driver.Constants +import java.net.URI +import java.sql.Connection +import java.sql.Driver +import java.sql.DriverManager +import java.sql.DriverPropertyInfo +import java.util.* +import java.util.logging.Logger + +/** + * TBD. + */ +public class PlanetscaleMysqlDriver : AbstractPlanetscaleAdapter() { + public companion object { + private val defaultParams = mapOf( + Constants.DriverParams.AUTO_RECONNECT to Constants.StringValue.TRUE, + Constants.DriverParams.CACHE_SERVER_CONFIG to Constants.StringValue.TRUE, + Constants.DriverParams.CACHE_RESULT_SET_METADATA to Constants.StringValue.TRUE, + Constants.DriverParams.ROUND_ROBIN_LOAD_BALANCE to Constants.StringValue.TRUE, + Constants.DriverParams.SSL_MODE to Constants.DriverParams.SSL_MODE_VERIFY, + ) + + // Return a qualified Planetscale endpoint. + @JvmStatic public fun qualifiedEndpoint(qualifier: String): String = "$qualifier.${Constants.CONNECT_DOMAIN}" + + // Return a qualified Planetscale endpoint for AWS. + @JvmStatic public fun awsEndpoint(qualifier: String? = null): String = when (qualifier?.ifBlank { null }) { + null -> qualifiedEndpoint(Constants.Provider.AWS) + else -> qualifiedEndpoint("${Constants.Provider.AWS}.$qualifier") + } + + // Return a qualified Planetscale endpoint for GCP. + @JvmStatic public fun gcpEndpoint(qualifier: String? = null): String = when (qualifier?.ifBlank { null }) { + null -> qualifiedEndpoint(Constants.Provider.GCP) + else -> qualifiedEndpoint("${Constants.Provider.GCP}.$qualifier") + } + + // Resolve the active cloud provider, if any. + @JvmStatic public fun detectProvider(): CloudProvider? { + return listOf( + Constants.Provider.GCP_CREDS_VAR to CloudProvider.GCP, + Constants.Provider.AWS_CREDS_VAR to CloudProvider.AWS, + ).firstOrNull { + System.getenv(it.first) != null + }?.second + } + + // Resolve symbolic host names to their actual targets. + @JvmStatic public fun resolveHostSymbols(target: String): String { + // safeguard: if it contains more than one period, it's a hostname + return if (target.count { it == '.' } > 1) target else when (target) { + // covers literal `aws` + Constants.SymbolicHosts.AWS -> awsEndpoint() + + // covers literal `gcp` + Constants.SymbolicHosts.GCP -> gcpEndpoint() + + // dynamic resolution + Constants.SymbolicHosts.CLOUD -> detectProvider().let { + when (it) { + CloudProvider.AWS -> awsEndpoint() + CloudProvider.GCP -> gcpEndpoint() + else -> error("Unable to resolve Planetscale database endpoint") + } + } + + else -> when { + // covers `.aws` + target.endsWith(Constants.SymbolicHosts.AWS) -> awsEndpoint( + target.removeSuffix(Constants.SymbolicHosts.AWS) + ) + + // covers `.gcp` + target.endsWith(Constants.SymbolicHosts.GCP) -> awsEndpoint( + target.removeSuffix(Constants.SymbolicHosts.GCP) + ) + + // otherwise, we don't recognize it, and it should be preserved + else -> target + } + } + } + } + + private fun PlanetscaleCredential.toUriInfo(): StringBuilder = StringBuilder().apply { + append(username) + append(":") + append(password) + } + + private fun StringBuilder.appendHost(host: String) { + append(host) + append(":") + append(Constants.MYSQL_PORT) + } + + private fun PlanetscaleConfig.endpoints(): StringBuilder = StringBuilder().apply { + if (multiHost()) { + append(targetHosts().map { + StringBuilder().appendHost(resolveHostSymbols(it)) + }.joinToString(",")) + } else { + appendHost(targetHosts().first()) + } + } + + private fun PlanetscaleConfig.sessionVariables(): List>? { + return if (!enableBoost()) null else listOf( + PlanetscaleParameter.EnableBoost.option.paramName to Constants.StringValue.TRUE, + ) + } + + private fun PlanetscaleConfig.driverParameters(): List> { + return defaultParams.plus(extraParams().mapNotNull { + if (it.value.isNullOrEmpty() || it.value.isBlank()) { + null + } else { + it.key to it.value + } + }).toSortedMap().toList().plus(when (val sessionVariables = sessionVariables()) { + null -> emptyList() + else -> listOf( + Constants.DriverParams.SESSION_VARIABLES to + sessionVariables.joinToString(separator = ",") { (k, v) -> "$k=$v" } + ) + }) + } + + override fun PlanetscaleConfig.toURI(): URI { + return URI.create(StringBuilder().apply { + append(Constants.Prefix.MYSQL) + if (multiHost()) append(Constants.Prefix.REPLICATION) + append("//") + append(credential.toUriInfo()) + append("@") + append(endpoints()) + append("/") + append(credential.database) + append("?") + driverParameters().joinToString("&") { (k, v) -> + append(k) + append("=") + append(v) + } + }.toString()) + } + + override fun createDriver(): Driver = DriverManager.drivers().filter { + it.javaClass.canonicalName == Constants.MYSQL_DRIVER + }.findFirst().orElse(null) ?: error( + "Failed to resolve MySQL driver: check your classpath?" + ) +} diff --git a/subprojects/impl-mysqlj/src/main/jvm/module-info.java b/subprojects/impl-mysqlj/src/main/jvm/module-info.java new file mode 100644 index 0000000..33c05ed --- /dev/null +++ b/subprojects/impl-mysqlj/src/main/jvm/module-info.java @@ -0,0 +1,9 @@ +/** + * Planetscale/J: MySQL-based implementation. + */ +module planetscale.connector.mysqlj { + requires java.base; + requires java.sql; + requires kotlin.stdlib; + requires planetscale.connector; +} diff --git a/subprojects/impl-mysqlj/src/main/resources/META-INF/services/com.planetscale.jvm.PlanetscaleAdapter b/subprojects/impl-mysqlj/src/main/resources/META-INF/services/com.planetscale.jvm.PlanetscaleAdapter new file mode 100644 index 0000000..d9b37a5 --- /dev/null +++ b/subprojects/impl-mysqlj/src/main/resources/META-INF/services/com.planetscale.jvm.PlanetscaleAdapter @@ -0,0 +1 @@ +com.planetscale.jvm.mysqlj.PlanetscaleMysqlDriver diff --git a/subprojects/integration-graalvm/build.gradle.kts b/subprojects/integration-graalvm/build.gradle.kts new file mode 100644 index 0000000..a34d52a --- /dev/null +++ b/subprojects/integration-graalvm/build.gradle.kts @@ -0,0 +1,23 @@ +import PlanetscaleBuild.publishable + +plugins { + id("planetscale-connector.klib") + alias(libs.plugins.ksp) + alias(libs.plugins.kover) + alias(libs.plugins.micronaut.library) + alias(libs.plugins.sonar) + alias(libs.plugins.testLogger) +} + +dependencies { + api(projects.subprojects.coreApi) +} + +kotlin { + compilerOptions.moduleName = "planetscale.graalvm" +} + +publishable( + name = "planetscale-graalvm", + description = "Planetscale/GraalVM integration library", +) diff --git a/subprojects/integration-graalvm/gradle.lockfile b/subprojects/integration-graalvm/gradle.lockfile new file mode 100644 index 0000000..8a77958 --- /dev/null +++ b/subprojects/integration-graalvm/gradle.lockfile @@ -0,0 +1,101 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +com.amazonaws:aws-java-sdk-bom:1.12.566=compileClasspath,runtimeClasspath +com.azure:azure-sdk-bom:1.2.14=compileClasspath,runtimeClasspath +com.fasterxml.jackson:jackson-bom:2.15.2=compileClasspath,runtimeClasspath +com.google.protobuf:protobuf-bom:3.23.4=compileClasspath,runtimeClasspath +com.oracle.coherence.ce:coherence-bom:23.03=compileClasspath,runtimeClasspath +io.grpc:grpc-bom:1.56.1=compileClasspath,runtimeClasspath +io.ktor:ktor-bom:2.3.4=compileClasspath,runtimeClasspath +io.micrometer:micrometer-bom:1.11.1=compileClasspath,runtimeClasspath +io.micronaut.acme:micronaut-acme-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.aot:micronaut-aot-bom:2.1.1=compileClasspath,runtimeClasspath +io.micronaut.aws:micronaut-aws-bom:4.0.7=compileClasspath,runtimeClasspath +io.micronaut.azure:micronaut-azure-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.beanvalidation:micronaut-hibernate-validator-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.cache:micronaut-cache-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.cassandra:micronaut-cassandra-bom:6.0.2=compileClasspath,runtimeClasspath +io.micronaut.chatbots:micronaut-chatbots-bom:2.0.0-M6=compileClasspath,runtimeClasspath +io.micronaut.coherence:micronaut-coherence-bom:4.0.0=compileClasspath,runtimeClasspath +io.micronaut.controlpanel:micronaut-control-panel-bom:1.0.1=compileClasspath,runtimeClasspath +io.micronaut.crac:micronaut-crac-bom:2.0.3=compileClasspath,runtimeClasspath +io.micronaut.data:micronaut-data-bom:4.1.4=compileClasspath,runtimeClasspath +io.micronaut.discovery:micronaut-discovery-client-bom:4.0.3=compileClasspath,runtimeClasspath +io.micronaut.elasticsearch:micronaut-elasticsearch-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.email:micronaut-email-bom:2.2.1=compileClasspath,runtimeClasspath +io.micronaut.flyway:micronaut-flyway-bom:6.1.0=compileClasspath,runtimeClasspath +io.micronaut.gcp:micronaut-gcp-bom:5.0.4=compileClasspath,runtimeClasspath +io.micronaut.graphql:micronaut-graphql-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.groovy:micronaut-groovy-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.grpc:micronaut-grpc-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.jaxrs:micronaut-jaxrs-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.jms:micronaut-jms-bom:3.0.1=compileClasspath,runtimeClasspath +io.micronaut.jmx:micronaut-jmx-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.kafka:micronaut-kafka-bom:5.1.2=compileClasspath,runtimeClasspath +io.micronaut.kotlin:micronaut-kotlin-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.kubernetes:micronaut-kubernetes-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.liquibase:micronaut-liquibase-bom:6.0.2=compileClasspath,runtimeClasspath +io.micronaut.logging:micronaut-logging-bom:1.1.2=compileClasspath,runtimeClasspath +io.micronaut.micrometer:micronaut-micrometer-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.microstream:micronaut-microstream-bom:2.0.2=compileClasspath,runtimeClasspath +io.micronaut.mongodb:micronaut-mongo-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.mqtt:micronaut-mqtt-bom:3.0.2=compileClasspath,runtimeClasspath +io.micronaut.multitenancy:micronaut-multitenancy-bom:5.0.3=compileClasspath,runtimeClasspath +io.micronaut.nats:micronaut-nats-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.neo4j:micronaut-neo4j-bom:6.1.0=compileClasspath,runtimeClasspath +io.micronaut.objectstorage:micronaut-object-storage-bom:2.0.4=compileClasspath,runtimeClasspath +io.micronaut.openapi:micronaut-openapi-bom:5.1.1=compileClasspath,runtimeClasspath +io.micronaut.oraclecloud:micronaut-oraclecloud-bom:3.0.6=compileClasspath,runtimeClasspath +io.micronaut.picocli:micronaut-picocli-bom:5.0.2=compileClasspath,runtimeClasspath +io.micronaut.platform:micronaut-platform:4.1.6=compileClasspath,runtimeClasspath +io.micronaut.problem:micronaut-problem-json-bom:3.0.2=compileClasspath,runtimeClasspath +io.micronaut.pulsar:micronaut-pulsar-bom:2.0.1=compileClasspath,runtimeClasspath +io.micronaut.r2dbc:micronaut-r2dbc-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.rabbitmq:micronaut-rabbitmq-bom:4.1.0=compileClasspath,runtimeClasspath +io.micronaut.reactor:micronaut-reactor-bom:3.0.5=compileClasspath,runtimeClasspath +io.micronaut.redis:micronaut-redis-bom:6.0.2=compileClasspath,runtimeClasspath +io.micronaut.rss:micronaut-rss-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.rxjava2:micronaut-rxjava2-bom:2.0.1=compileClasspath,runtimeClasspath +io.micronaut.rxjava3:micronaut-rxjava3-bom:3.0.2=compileClasspath,runtimeClasspath +io.micronaut.security:micronaut-security-bom:4.1.0=compileClasspath,runtimeClasspath +io.micronaut.serde:micronaut-serde-bom:2.2.6=compileClasspath,runtimeClasspath +io.micronaut.servlet:micronaut-servlet-bom:4.1.1=compileClasspath,runtimeClasspath +io.micronaut.session:micronaut-session-bom:4.0.0=compileClasspath,runtimeClasspath +io.micronaut.spring:micronaut-spring-bom:5.0.2=compileClasspath,runtimeClasspath +io.micronaut.sql:micronaut-sql-bom:5.0.3=compileClasspath,runtimeClasspath +io.micronaut.test:micronaut-test-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.testresources:micronaut-test-resources-bom:2.0.0=compileClasspath,runtimeClasspath +io.micronaut.toml:micronaut-toml-bom:2.0.1=compileClasspath,runtimeClasspath +io.micronaut.tracing:micronaut-tracing-bom:5.0.2=compileClasspath,runtimeClasspath +io.micronaut.validation:micronaut-validation-bom:4.0.3=compileClasspath,runtimeClasspath +io.micronaut.views:micronaut-views-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.xml:micronaut-jackson-xml-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut:micronaut-core-bom:4.1.11=compileClasspath,runtimeClasspath +io.micronaut:micronaut-core:4.1.11=compileClasspath,runtimeClasspath +io.micronaut:micronaut-inject:4.1.11=compileClasspath,runtimeClasspath +io.netty:netty-bom:4.1.100.Final=compileClasspath,runtimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:1.26.0-alpha=compileClasspath,runtimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:1.26.0=compileClasspath,runtimeClasspath +io.opentelemetry:opentelemetry-bom-alpha:1.26.0-alpha=compileClasspath,runtimeClasspath +io.opentelemetry:opentelemetry-bom:1.26.0=compileClasspath,runtimeClasspath +io.projectreactor:reactor-bom:2022.0.12=compileClasspath,runtimeClasspath +io.rest-assured:rest-assured-bom:5.3.2=compileClasspath,runtimeClasspath +io.zipkin.brave:brave-bom:5.16.0=compileClasspath,runtimeClasspath +io.zipkin.reporter2:zipkin-reporter-bom:2.16.4=compileClasspath,runtimeClasspath +jakarta.annotation:jakarta.annotation-api:2.1.1=compileClasspath,runtimeClasspath +jakarta.inject:jakarta.inject-api:2.0.1=compileClasspath,runtimeClasspath +org.apache.groovy:groovy-bom:4.0.14=compileClasspath,runtimeClasspath +org.apache.logging.log4j:log4j-bom:2.20.0=compileClasspath,runtimeClasspath +org.jdbi:jdbi3-bom:3.39.1=compileClasspath,runtimeClasspath +org.jetbrains.kotlin:kotlin-bom:1.8.21=compileClasspath,runtimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,runtimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3=compileClasspath,runtimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,runtimeClasspath +org.junit:junit-bom:5.9.3=compileClasspath,runtimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,runtimeClasspath +org.spockframework:spock-bom:2.3-groovy-4.0=compileClasspath,runtimeClasspath +org.springframework:spring-framework-bom:6.0.11=compileClasspath,runtimeClasspath +org.testcontainers:testcontainers-bom:1.19.1=compileClasspath,runtimeClasspath +software.amazon.awssdk:bom:2.20.162=compileClasspath,runtimeClasspath +empty= diff --git a/subprojects/integration-graalvm/src/main/jvm/com/planetscale/PlanetscaleFeature.kt b/subprojects/integration-graalvm/src/main/jvm/com/planetscale/PlanetscaleFeature.kt new file mode 100644 index 0000000..ed8adea --- /dev/null +++ b/subprojects/integration-graalvm/src/main/jvm/com/planetscale/PlanetscaleFeature.kt @@ -0,0 +1,8 @@ +package com.planetscale + +/** + * TBD. + */ +public class PlanetscaleFeature { + // Nothing yet +} diff --git a/subprojects/integration-micronaut/build.gradle.kts b/subprojects/integration-micronaut/build.gradle.kts new file mode 100644 index 0000000..490b727 --- /dev/null +++ b/subprojects/integration-micronaut/build.gradle.kts @@ -0,0 +1,24 @@ +import PlanetscaleBuild.publishable + +plugins { + id("planetscale-connector.klib") + alias(libs.plugins.ksp) + alias(libs.plugins.kover) + alias(libs.plugins.micronaut.library) + alias(libs.plugins.sonar) + alias(libs.plugins.testLogger) +} + +dependencies { + api(projects.subprojects.coreApi) + ksp(mn.micronaut.inject.kotlin) +} + +kotlin { + compilerOptions.moduleName = "planetscale.micronaut" +} + +publishable( + name = "planetscale-micronaut", + description = "Planetscale/Micronaut integration library", +) diff --git a/subprojects/integration-micronaut/gradle.lockfile b/subprojects/integration-micronaut/gradle.lockfile new file mode 100644 index 0000000..8a77958 --- /dev/null +++ b/subprojects/integration-micronaut/gradle.lockfile @@ -0,0 +1,101 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +com.amazonaws:aws-java-sdk-bom:1.12.566=compileClasspath,runtimeClasspath +com.azure:azure-sdk-bom:1.2.14=compileClasspath,runtimeClasspath +com.fasterxml.jackson:jackson-bom:2.15.2=compileClasspath,runtimeClasspath +com.google.protobuf:protobuf-bom:3.23.4=compileClasspath,runtimeClasspath +com.oracle.coherence.ce:coherence-bom:23.03=compileClasspath,runtimeClasspath +io.grpc:grpc-bom:1.56.1=compileClasspath,runtimeClasspath +io.ktor:ktor-bom:2.3.4=compileClasspath,runtimeClasspath +io.micrometer:micrometer-bom:1.11.1=compileClasspath,runtimeClasspath +io.micronaut.acme:micronaut-acme-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.aot:micronaut-aot-bom:2.1.1=compileClasspath,runtimeClasspath +io.micronaut.aws:micronaut-aws-bom:4.0.7=compileClasspath,runtimeClasspath +io.micronaut.azure:micronaut-azure-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.beanvalidation:micronaut-hibernate-validator-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.cache:micronaut-cache-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.cassandra:micronaut-cassandra-bom:6.0.2=compileClasspath,runtimeClasspath +io.micronaut.chatbots:micronaut-chatbots-bom:2.0.0-M6=compileClasspath,runtimeClasspath +io.micronaut.coherence:micronaut-coherence-bom:4.0.0=compileClasspath,runtimeClasspath +io.micronaut.controlpanel:micronaut-control-panel-bom:1.0.1=compileClasspath,runtimeClasspath +io.micronaut.crac:micronaut-crac-bom:2.0.3=compileClasspath,runtimeClasspath +io.micronaut.data:micronaut-data-bom:4.1.4=compileClasspath,runtimeClasspath +io.micronaut.discovery:micronaut-discovery-client-bom:4.0.3=compileClasspath,runtimeClasspath +io.micronaut.elasticsearch:micronaut-elasticsearch-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.email:micronaut-email-bom:2.2.1=compileClasspath,runtimeClasspath +io.micronaut.flyway:micronaut-flyway-bom:6.1.0=compileClasspath,runtimeClasspath +io.micronaut.gcp:micronaut-gcp-bom:5.0.4=compileClasspath,runtimeClasspath +io.micronaut.graphql:micronaut-graphql-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.groovy:micronaut-groovy-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.grpc:micronaut-grpc-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.jaxrs:micronaut-jaxrs-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.jms:micronaut-jms-bom:3.0.1=compileClasspath,runtimeClasspath +io.micronaut.jmx:micronaut-jmx-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.kafka:micronaut-kafka-bom:5.1.2=compileClasspath,runtimeClasspath +io.micronaut.kotlin:micronaut-kotlin-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.kubernetes:micronaut-kubernetes-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.liquibase:micronaut-liquibase-bom:6.0.2=compileClasspath,runtimeClasspath +io.micronaut.logging:micronaut-logging-bom:1.1.2=compileClasspath,runtimeClasspath +io.micronaut.micrometer:micronaut-micrometer-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.microstream:micronaut-microstream-bom:2.0.2=compileClasspath,runtimeClasspath +io.micronaut.mongodb:micronaut-mongo-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.mqtt:micronaut-mqtt-bom:3.0.2=compileClasspath,runtimeClasspath +io.micronaut.multitenancy:micronaut-multitenancy-bom:5.0.3=compileClasspath,runtimeClasspath +io.micronaut.nats:micronaut-nats-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.neo4j:micronaut-neo4j-bom:6.1.0=compileClasspath,runtimeClasspath +io.micronaut.objectstorage:micronaut-object-storage-bom:2.0.4=compileClasspath,runtimeClasspath +io.micronaut.openapi:micronaut-openapi-bom:5.1.1=compileClasspath,runtimeClasspath +io.micronaut.oraclecloud:micronaut-oraclecloud-bom:3.0.6=compileClasspath,runtimeClasspath +io.micronaut.picocli:micronaut-picocli-bom:5.0.2=compileClasspath,runtimeClasspath +io.micronaut.platform:micronaut-platform:4.1.6=compileClasspath,runtimeClasspath +io.micronaut.problem:micronaut-problem-json-bom:3.0.2=compileClasspath,runtimeClasspath +io.micronaut.pulsar:micronaut-pulsar-bom:2.0.1=compileClasspath,runtimeClasspath +io.micronaut.r2dbc:micronaut-r2dbc-bom:5.0.1=compileClasspath,runtimeClasspath +io.micronaut.rabbitmq:micronaut-rabbitmq-bom:4.1.0=compileClasspath,runtimeClasspath +io.micronaut.reactor:micronaut-reactor-bom:3.0.5=compileClasspath,runtimeClasspath +io.micronaut.redis:micronaut-redis-bom:6.0.2=compileClasspath,runtimeClasspath +io.micronaut.rss:micronaut-rss-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.rxjava2:micronaut-rxjava2-bom:2.0.1=compileClasspath,runtimeClasspath +io.micronaut.rxjava3:micronaut-rxjava3-bom:3.0.2=compileClasspath,runtimeClasspath +io.micronaut.security:micronaut-security-bom:4.1.0=compileClasspath,runtimeClasspath +io.micronaut.serde:micronaut-serde-bom:2.2.6=compileClasspath,runtimeClasspath +io.micronaut.servlet:micronaut-servlet-bom:4.1.1=compileClasspath,runtimeClasspath +io.micronaut.session:micronaut-session-bom:4.0.0=compileClasspath,runtimeClasspath +io.micronaut.spring:micronaut-spring-bom:5.0.2=compileClasspath,runtimeClasspath +io.micronaut.sql:micronaut-sql-bom:5.0.3=compileClasspath,runtimeClasspath +io.micronaut.test:micronaut-test-bom:4.0.2=compileClasspath,runtimeClasspath +io.micronaut.testresources:micronaut-test-resources-bom:2.0.0=compileClasspath,runtimeClasspath +io.micronaut.toml:micronaut-toml-bom:2.0.1=compileClasspath,runtimeClasspath +io.micronaut.tracing:micronaut-tracing-bom:5.0.2=compileClasspath,runtimeClasspath +io.micronaut.validation:micronaut-validation-bom:4.0.3=compileClasspath,runtimeClasspath +io.micronaut.views:micronaut-views-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut.xml:micronaut-jackson-xml-bom:4.0.1=compileClasspath,runtimeClasspath +io.micronaut:micronaut-core-bom:4.1.11=compileClasspath,runtimeClasspath +io.micronaut:micronaut-core:4.1.11=compileClasspath,runtimeClasspath +io.micronaut:micronaut-inject:4.1.11=compileClasspath,runtimeClasspath +io.netty:netty-bom:4.1.100.Final=compileClasspath,runtimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:1.26.0-alpha=compileClasspath,runtimeClasspath +io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:1.26.0=compileClasspath,runtimeClasspath +io.opentelemetry:opentelemetry-bom-alpha:1.26.0-alpha=compileClasspath,runtimeClasspath +io.opentelemetry:opentelemetry-bom:1.26.0=compileClasspath,runtimeClasspath +io.projectreactor:reactor-bom:2022.0.12=compileClasspath,runtimeClasspath +io.rest-assured:rest-assured-bom:5.3.2=compileClasspath,runtimeClasspath +io.zipkin.brave:brave-bom:5.16.0=compileClasspath,runtimeClasspath +io.zipkin.reporter2:zipkin-reporter-bom:2.16.4=compileClasspath,runtimeClasspath +jakarta.annotation:jakarta.annotation-api:2.1.1=compileClasspath,runtimeClasspath +jakarta.inject:jakarta.inject-api:2.0.1=compileClasspath,runtimeClasspath +org.apache.groovy:groovy-bom:4.0.14=compileClasspath,runtimeClasspath +org.apache.logging.log4j:log4j-bom:2.20.0=compileClasspath,runtimeClasspath +org.jdbi:jdbi3-bom:3.39.1=compileClasspath,runtimeClasspath +org.jetbrains.kotlin:kotlin-bom:1.8.21=compileClasspath,runtimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,runtimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3=compileClasspath,runtimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,runtimeClasspath +org.junit:junit-bom:5.9.3=compileClasspath,runtimeClasspath +org.slf4j:slf4j-api:2.0.9=compileClasspath,runtimeClasspath +org.spockframework:spock-bom:2.3-groovy-4.0=compileClasspath,runtimeClasspath +org.springframework:spring-framework-bom:6.0.11=compileClasspath,runtimeClasspath +org.testcontainers:testcontainers-bom:1.19.1=compileClasspath,runtimeClasspath +software.amazon.awssdk:bom:2.20.162=compileClasspath,runtimeClasspath +empty=