/**
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
 * file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
 * to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
dependencyManagement {
  dependencies {
    dependency('ch.qos.logback:logback-classic:1.2.3')
    dependency('commons-codec:commons-codec:1.14')
    dependency('commons-net:commons-net:3.8.0')
    dependency('com.fasterxml.jackson.core:jackson-databind:2.13.3')
    dependency('com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3')
    dependency('com.github.jnr:jnr-ffi:2.1.9')
    dependency('com.github.kstyrc:embedded-redis:0.6')
    dependency('com.google.code.findbugs:jsr305:3.0.2')
    dependency('com.google.errorprone:error_prone_annotations:2.15.0')
    dependency('com.google.errorprone:error_prone_core:2.9.0')
    dependency('com.google.guava:guava:31.0.1-jre')
    dependency('com.h2database:h2:1.4.197')
    dependency('com.jolbox:bonecp:0.8.0.RELEASE')
    dependency('com.netflix.concurrency-limits:concurrency-limits-core:0.3.6')
    dependency('com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0')
    dependency('com.opentable.components:otj-pg-embedded:0.13.3')
    dependency('com.squareup.okhttp3:okhttp:3.12.0')
    dependency('com.winterbe:expekt:0.5.0')
    dependency('com.zaxxer:HikariCP:4.0.3')
    dependency('dnsjava:dnsjava:3.3.1')
    dependency('info.picocli:picocli:4.0.0-alpha-2')
    dependency('io.grpc:grpc-netty-shaded:1.38.0')
    dependency('io.ktor:ktor-client-core:1.4.2')
    dependency('io.ktor:ktor-client-json:1.4.2')
    dependency('io.ktor:ktor-client-serialization:1.4.2')
    dependency('io.ktor:ktor-client-cio:1.4.2')
    dependency('net.java.dev.jna:jna:5.11.0')
    dependency('org.hyperledger.besu:bls12-381:0.4.3')
    dependency('org.hyperledger.besu:altbn128:0.4.3')
    dependency('org.hyperledger.besu:secp256k1:0.4.3')

    dependency('io.ktor:ktor-network:1.4.2')
    dependency('io.ktor:ktor-server-core:1.4.2')
    dependency('io.ktor:ktor-server-netty:1.4.2')
    dependency('org.springframework.boot:spring-boot-starter-thymeleaf:2.4.1')

    dependency('io.opentelemetry:opentelemetry-api:1.2.0')
    dependency('io.opentelemetry:opentelemetry-api-metrics:1.2.0-alpha')
    dependency('io.opentelemetry:opentelemetry-exporter-otlp-metrics:1.2.0-alpha')
    dependency('io.opentelemetry:opentelemetry-exporter-otlp:1.2.0')
    dependency('io.opentelemetry:opentelemetry-exporter-prometheus:1.2.0-alpha')
    dependency('io.opentelemetry:opentelemetry-extension-trace-propagators:1.2.0')
    dependency('io.opentelemetry:opentelemetry-proto:1.2.0-alpha')
    dependency('io.opentelemetry:opentelemetry-sdk:1.2.0')
    dependency('io.opentelemetry:opentelemetry-sdk-trace:1.2.0')
    dependency('io.opentelemetry:opentelemetry-sdk-metrics:1.2.0-alpha')
    dependency('io.opentelemetry:opentelemetry-semconv:1.2.0-alpha')
    dependency('io.prometheus:simpleclient:0.8.1')
    dependency('io.prometheus:simpleclient_httpserver:0.8.1')
    dependency('io.lettuce:lettuce-core:5.1.3.RELEASE')
    dependency('io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.1')
    dependency('org.webjars:swagger-ui:3.50.0')

    dependencySet(group: 'io.vertx', version: '4.1.2') {
      entry 'vertx-core'
      entry 'vertx-lang-kotlin'
      entry 'vertx-lang-kotlin-coroutines'
      entry 'vertx-opentelemetry'
      entry 'vertx-web'
      entry 'vertx-web-client'
    }

    dependency('javax.servlet:javax.servlet-api:4.0.1')
    dependency('javax.persistence:javax.persistence-api:2.2')
    dependencySet(group: 'org.antlr', version: '4.10.1') {
      entry 'antlr4'
      entry 'antlr4-runtime'
    }
    dependency('javax.ws.rs:javax.ws.rs-api:2.1.1')
    dependency('javax.servlet:javax.servlet-api:4.0.1')
    dependency('org.apache.lucene:lucene-core:7.6.0')
    dependency('org.apache.openjpa:openjpa:3.1.0')
    dependency('org.assertj:assertj-core:3.11.1')
    dependencySet(group: 'org.bouncycastle', version: '1.66') {
      entry 'bcpkix-jdk15on'
      entry 'bcprov-jdk15on'
    }
    dependencySet(group: 'org.eclipse.jetty', version: '11.0.11') {
      entry 'jetty-server'
      entry 'jetty-servlet'
      entry 'jetty-servlets'
      entry 'jetty-util'
    }
    dependencySet(group: 'org.glassfish.jersey.core', version: '3.0.5') {
      entry 'jersey-server'
      entry 'jersey-client'
    }
    dependency('org.glassfish.jersey.containers:jersey-container-servlet:3.0.5')
    dependency('org.glassfish.jersey.inject:jersey-hk2:3.0.5')
    dependency('org.glassfish.jersey.media:jersey-media-json-jackson:3.0.5')
    dependency('javax.xml.bind:jaxb-api:2.3.1')
    dependency('org.flywaydb:flyway-core:7.8.1')

    dependency('org.fusesource.leveldbjni:leveldbjni-all:1.8')
    dependencySet(group: 'org.junit.jupiter', version: '5.6.2') {
      entry 'junit-jupiter-api'
      entry 'junit-jupiter-engine'
      entry 'junit-jupiter-params'
      entry 'junit-jupiter-migrationsupport'
    }
    dependency('org.infinispan:infinispan-core:12.1.3.Final')
    dependency('org.infinispan:infinispan-cachestore-rocksdb:12.1.3.Final')


    dependency('org.jetbrains:annotations:16.0.3')
    dependencySet(group: 'org.jetbrains.kotlin', version: '1.6.20') {
      entry 'kotlin-reflect'
      entry 'kotlin-stdlib'
      entry 'kotlin-stdlib-jdk8'
    }
    dependencySet(group: 'org.jetbrains.kotlinx', version: '1.6.0') {
      entry 'kotlinx-coroutines-core'
      entry 'kotlinx-coroutines-jdk8'
    }
    dependencySet(group: 'org.jetbrains.spek', version: '1.1.5') {
      entry 'spek-api'
      entry 'spek-junit-platform-engine'
    }
    dependency('org.mapdb:mapdb:3.0.7')
    dependency('org.miracl.milagro.amcl:milagro-crypto-java:0.4.0')
    dependency('org.mockito:mockito-junit-jupiter:3.3.3')
    dependency('org.postgresql:postgresql:42.2.19')

    dependency('org.rocksdb:rocksdbjni:7.3.1')
    dependency('org.slf4j:slf4j-api:1.7.30')
    dependency('org.connid:framework:1.3.2')
    dependency('org.connid:framework-internal:1.3.2')

    dependency('org.webjars:bootstrap:4.1.3')
    dependency('org.webjars:webjars-locator:0.40')

    dependency('org.xerial.snappy:snappy-java:1.1.8.4')
  }
}
